From 456fd5bb44da0f9c401f3bcb4033bf86f5a6157c Mon Sep 17 00:00:00 2001 From: sunkai Date: Tue, 15 Mar 2022 20:45:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=99=BA=E8=83=BD=E8=B7=B3=E8=BF=87=E8=8A=82=E5=81=87?= =?UTF-8?q?=E6=97=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- html/index.html | 1 + html/index.js | 7 +- html/release/index.html.gz | Bin 5636 -> 5657 bytes html/release/index.js.gz | Bin 8700 -> 8745 bytes plug2.0/app/include/user_plug.h | 11 +++ plug2.0/app/include/user_web.h | 2 +- plug2.0/app/user/user_plug.c | 165 +++++++++++++++++++++++++++++++- plug2.0/app/user/user_wifi.c | 25 +---- 9 files changed, 186 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 4548b5c..6db01bd 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,7 @@ SmartConfig是安信可提供的一种快捷配网方式,将esp8266设置为 - “关联延时”:该定时任务执行完成后会自动启动关联的延时任务。 -- “重复”:若周一到周日都没选择则该任务只执行一次。 +- “重复”:若周一到周日都没选择则该任务只执行一次。(新加功能:智能跳过节假日,从互联网获取节假日信息只在法定节假日生效。) ![](media/6a8322aed50869bf983582514a592960.png) @@ -423,7 +423,7 @@ SmartConfig是安信可提供的一种快捷配网方式,将esp8266设置为 无 -**响应码:**200:成功,其他:失败 +**响应码:** 200:成功,其他:失败 **响应:** diff --git a/html/index.html b/html/index.html index 345f57d..3aca535 100644 --- a/html/index.html +++ b/html/index.html @@ -710,6 +710,7 @@

定时

+
diff --git a/html/index.js b/html/index.js index ce1be0d..f0bd980 100644 --- a/html/index.js +++ b/html/index.js @@ -496,6 +496,9 @@ function weekConversionString( week ) { if ( week == 96 ){ return "周末"; } + if ( week == 128 ){ + return "跳过节假日"; + } var str=""; for ( var i = 0; i < 7; i++ ){ @@ -522,6 +525,7 @@ function stringConversionWeek() { if( $("#week5").is(':checked') ){week=week|(1<<4)} if( $("#week6").is(':checked') ){week=week|(1<<5)} if( $("#week7").is(':checked') ){week=week|(1<<6)} + if( $("#week8").is(':checked') ){week=week|(1<<7)} return week; } @@ -1014,7 +1018,7 @@ function tabTimerSubmit(){ $("#timerCascodeNum").val(data[0].CascodeNum); $("#timerCascodeEnable").attr('checked',data[0].Cascode); var week= parseInt(data[0].Week); - for ( var i = 0; i < 7; i++ ){ + for ( var i = 0; i < 8; i++ ){ switch(i){ case 0: $("#week1").prop('checked',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 vF)1fHUm$0HDY09fuckOYYQ(W>#kNQ6v5zuI@< delta 5571 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 RLK;=#{{di4f1W6n0031t!czbM diff --git a/html/release/index.js.gz b/html/release/index.js.gz index ac2be9216ea4cc86bea75dc9c4f05ef426aa7ef6..e8f2ec300526a71b5a0d320d5a42363134513483 100644 GIT binary patch literal 8745 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 a!PGKGF}zMiiYg0%6#fq^!my=8y#N68c8LN2 diff --git a/plug2.0/app/include/user_plug.h b/plug2.0/app/include/user_plug.h index a10c8ae..5ca4d1e 100644 --- a/plug2.0/app/include/user_plug.h +++ b/plug2.0/app/include/user_plug.h @@ -67,10 +67,20 @@ typedef enum REPET_SAT = 0x20, /* ÿ */ REPET_SUN = 0x40, /* ÿ */ REPET_ALL = 0x7F, /* ÿ */ + REPET_AUTO = 0x80, /* ڼ */ REPET_BUFF }PLUG_REPETITION_E; +typedef enum +{ + DAY_Weekday = 0, /* */ + DAY_Weekends, /* ĩ */ + DAY_Festivals, /* */ + DAY_Compensatory, /* */ + + DAY_BUFF +}PLUG_DAY_E; typedef struct tagPLUG_TIMER /* ʱģ */ { @@ -318,6 +328,7 @@ UINT PLUG_ParseDate( CHAR* pDateStr); UINT PLUG_ParseTimerData( CHAR* pData ); UINT PLUG_ParseRelayStatus( CHAR* pDataStr); UINT PLUG_ParseWebSetData( CHAR* pData ); +UINT8 PLUG_Isholiday(); VOID PLUG_StartJudgeTimeHanderTimer( VOID ); diff --git a/plug2.0/app/include/user_web.h b/plug2.0/app/include/user_web.h index f286942..de062a0 100644 --- a/plug2.0/app/include/user_web.h +++ b/plug2.0/app/include/user_web.h @@ -12,7 +12,7 @@ #define WEB_SENDBUF_SIZE (1024) //ͻС -#define WEB_MAX_FD 2 //ɽݿջС,齫ֵ󣬳иõŻʡڴ棩 +#define WEB_MAX_FD 3 //ɽݿջС,齫ֵ󣬳иõŻʡڴ棩 #define WEB_CONTINUE_TMOUT 5 //ӳʱʱ䣬ʱδݽϿ VOID WEB_StartWebServerTheard( VOID ); diff --git a/plug2.0/app/user/user_plug.c b/plug2.0/app/user/user_plug.c index 8e610b1..57e9b79 100644 --- a/plug2.0/app/user/user_plug.c +++ b/plug2.0/app/user/user_plug.c @@ -15,6 +15,7 @@ static VOID PLUG_TimerCascade( PLUG_TIMER_S *pstTimer ); static VOID PLUG_JudgeDelay( VOID ); VOID PLUG_GetNextDelayTime( PLUG_DELAY_S *pstDelay ); VOID PLUG_StartDelayTime( PLUG_DELAY_S *pstDelay ); +UINT PLUG_ParseHolidayToday( VOID* pData ); PLUG_TIMER_S g_astPLUG_Timer[PLUG_TIMER_MAX]; PLUG_DELAY_S g_astPLUG_Delay[PLUG_DELAY_MAX]; @@ -2310,6 +2311,7 @@ static VOID PLUG_JudgeTimer( VOID ) UINT8 ucWeek = 0; PLUG_DATE_S stDate = {0, 0, 0, 0, 0, 0, 0}; PLUG_TIMER_S *pstTimer = NULL; + UINT8 ucHoliday = 0; static BOOL bIsJudged = FALSE; static PLUG_DATE_S stDateLast = {0, 0, 0, 0, 0, 0, 0}; @@ -2339,7 +2341,23 @@ static VOID PLUG_JudgeTimer( VOID ) FALSE == bIsJudged) { /* жظ */ - if ( pstTimer->eWeek & (1 << (ucWeek-1)) ) + + // ڼ + if ( pstTimer->eWeek == REPET_AUTO ) + { + ucHoliday = PLUG_Isholiday(); + if ( ucHoliday == DAY_Weekends || + ucHoliday == DAY_Festivals || + ucHoliday == DAY_BUFF ) + { + // ĩ + continue; + } + + PLUG_SetRelayOn( TRUE ); + bIsJudged = TRUE; + } + else if ( pstTimer->eWeek & (1 << (ucWeek-1)) ) { PLUG_SetRelayOn( TRUE ); bIsJudged = TRUE; @@ -2362,7 +2380,22 @@ static VOID PLUG_JudgeTimer( VOID ) pstTimer->stOffTime.iMinute == stDate.iMinute && FALSE == bIsJudged) { - if ( pstTimer->eWeek & (1 << (ucWeek-1)) ) + if ( pstTimer->eWeek == REPET_AUTO ) + { + // ڼ + ucHoliday = PLUG_Isholiday(); + if ( ucHoliday == DAY_Weekends || + ucHoliday == DAY_Festivals || + ucHoliday == DAY_BUFF ) + { + // ĩ + continue; + } + + PLUG_SetRelayOff( TRUE ); + bIsJudged = TRUE; + } + else if ( pstTimer->eWeek & (1 << (ucWeek-1)) ) { PLUG_SetRelayOff( TRUE ); bIsJudged = TRUE; @@ -2650,4 +2683,132 @@ VOID PLUG_StartJudgeTimeHanderTimer( VOID ) } } +typedef struct tagParseHolidayPara{ + HTTP_CLIENT_S* pstCli; + UINT8 uiHoliday; +}MQTT_ParseHolidayPara_S; + + +UINT8 PLUG_Isholiday() +{ + HTTP_CLIENT_S* pstCli = NULL; + CHAR szBuf[120] = {0}; + UINT uiRet = 0; + UINT8 uiRetry = 0; + PLUG_DATE_S stDate; + MQTT_ParseHolidayPara_S stHolidayPara; + + if ( WIFI_GetWifiConnStatus() != STATION_GOT_IP ) + { + LOG_OUT(LOGOUT_ERROR, "not connect wifi"); + return DAY_BUFF; + } + +retry: + if ( uiRetry >= 3 ) + { + LOG_OUT(LOGOUT_ERROR, "HTTP_ClientDoRequest timeout, retry exceeds maximum"); + goto end; + } + + PLUG_GetDate( &stDate ); + sprintf(szBuf, "/api/holiday/info/%d-%02d-%02d", stDate.iYear, stDate.iMonth, stDate.iDay); + pstCli = HTTP_NewClient("GET", "timor.tech", szBuf, "", 0); + if ( pstCli == NULL ) + { + LOG_OUT(LOGOUT_ERROR, "HTTP_NewClient failed"); + goto end; + } + + uiRet = HTTP_ClientDoRequest(pstCli); + if ( uiRet != 0 ) + { + LOG_OUT(LOGOUT_ERROR, "HTTP_ClientDoRequest failed"); + goto end; + } + + stHolidayPara.pstCli = pstCli; + stHolidayPara.uiHoliday = DAY_BUFF; + uiRet = HTTP_ClientDoResponse(pstCli, PLUG_ParseHolidayToday, (VOID*)&stHolidayPara); + if ( uiRet == -1 ) + { + LOG_OUT(LOGOUT_ERROR, "HTTP_ClientDoRequest failed"); + goto end; + } + // ճʱ + else if ( uiRet == -2 ) + { + LOG_OUT(LOGOUT_ERROR, "HTTP_ClientDoRequest timeout, retry..."); + HTTP_DestoryClient(pstCli); + goto retry; + } + +end: + HTTP_DestoryClient(pstCli); + return stHolidayPara.uiHoliday; +} + + +UINT PLUG_ParseHolidayToday( VOID* pData ) +{ + cJSON *pJsonRoot = NULL; + cJSON *pJsonIteam = NULL; + MQTT_ParseHolidayPara_S *stHolidayPara = pData; + HTTP_CLIENT_S *pstCli = NULL; + UINT uiRet = OK; + + if ( stHolidayPara == NULL ) + { + LOG_OUT(LOGOUT_ERROR, "stHolidayPara is NULL"); + return FAIL; + } + + pstCli = stHolidayPara->pstCli; + if ( pstCli == NULL ) + { + LOG_OUT(LOGOUT_ERROR, "pstCli:%p", pstCli); + return FAIL; + } + + if (pstCli->stReson.eHttpCode != HTTP_CODE_Ok ) + { + LOG_OUT(LOGOUT_ERROR, "get response code: %s", szHttpCodeMap[pstCli->stReson.eHttpCode]); + return FAIL; + } + + pJsonRoot = cJSON_Parse( pstCli->stReson.pcBody ); + if ( pJsonRoot == NULL ) + { + LOG_OUT(LOGOUT_ERROR, "cJSON_Parse failed, pcBody:%s", pstCli->stReson.pcBody); + uiRet = FAIL; + goto exit; + } + + pJsonIteam = cJSON_GetObjectItem(pJsonRoot, "code"); + if (pJsonIteam && pJsonIteam->type == cJSON_Number && pJsonIteam->valueint != 0 ) + { + LOG_OUT(LOGOUT_ERROR, "expect 0 but got %d", pJsonIteam->valueint); + uiRet = FAIL; + goto exit; + } + + pJsonIteam = cJSON_GetObjectItem(pJsonRoot, "type"); + if (pJsonIteam && pJsonIteam->type == cJSON_Object ) + { + pJsonIteam = cJSON_GetObjectItem(pJsonIteam, "type"); + if (pJsonIteam && pJsonIteam->type == cJSON_Number ) + { + stHolidayPara->uiHoliday = pJsonIteam->valueint; + uiRet = OK; + } + } + + LOG_OUT(LOGOUT_INFO, "holiday type %d", stHolidayPara->uiHoliday); + +exit: + cJSON_Delete(pJsonRoot); + return uiRet; +} + + diff --git a/plug2.0/app/user/user_wifi.c b/plug2.0/app/user/user_wifi.c index 8fa4283..fe6dc6d 100644 --- a/plug2.0/app/user/user_wifi.c +++ b/plug2.0/app/user/user_wifi.c @@ -904,29 +904,8 @@ UINT WIFI_DeviceInfoMarshalJson( CHAR* pcBuf, UINT uiBufLen) return strlen(pcBuf); } -UINT WIFI_TemperatureMarshalJson( CHAR* pcBuf, UINT uiBufLen) +UINT WIFI_GetWifiConnStatus() { - cJSON *pJson = NULL; - CHAR *pJsonStr = NULL; - CHAR szBuf[20]; - - pJson = cJSON_CreateObject(); - - cJSON_AddNumberToObject( pJson, "Temperature", PLUG_GetRunTime()); - - pJsonStr = cJSON_PrintUnformatted(pJson); - if ( pJsonStr != NULL ) - { - strncpy(pcBuf, pJsonStr, uiBufLen); - } - else - { - snprintf(pcBuf, uiBufLen, "{}"); - } - - cJSON_Delete(pJson); - FREE_MEM(pJsonStr); - - return strlen(pcBuf); + return uiCurStatus; }