Merge pull request #2 from arendst/development

update
This commit is contained in:
tammo0 2019-06-03 15:39:28 +02:00 committed by GitHub
commit a008da5246
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 141 additions and 84 deletions

View File

@ -4,9 +4,11 @@ from base64 import b64decode
env.Replace(UPLOADER="pio\espupload.py")
env.Replace(UPLOADERFLAGS="")
env.Replace(UPLOADCMD="$UPLOADER -u " + b64decode(ARGUMENTS.get("UPLOAD_PORT")) + " -f $SOURCES")
env.Replace(UPLOADCMD="$UPLOADER -u $UPLOAD_PORT -f $SOURCES")
'''
env.Replace(UPLOADCMD="$UPLOADER -u domus1:80/api/upload-arduino.php -f $SOURCES")
env.Replace(UPLOADCMD="$UPLOADER -u " + b64decode(ARGUMENTS.get("UPLOAD_PORT")) + " -f $SOURCES")
env.Replace(UPLOADCMD="pio\espupload.py -f $SOURCES") # Windows
env.Replace(UPLOADCMD="pio/espupload.py -f $SOURCES") # Linux
'''

View File

@ -11,34 +11,34 @@
src_dir = sonoff
; *** Uncomment one of the lines below to build/upload only one environment
;env_default = sonoff
;env_default = sonoff-minimal
;env_default = sonoff-basic
;env_default = sonoff-classic
;env_default = sonoff-knx
;env_default = sonoff-sensors
;env_default = sonoff-display
;env_default = sonoff-BG
;env_default = sonoff-BR
;env_default = sonoff-CN
;env_default = sonoff-CZ
;env_default = sonoff-DE
;env_default = sonoff-ES
;env_default = sonoff-FR
;env_default = sonoff-GR
;env_default = sonoff-HE
;env_default = sonoff-HU
;env_default = sonoff-IT
;env_default = sonoff-KO
;env_default = sonoff-NL
;env_default = sonoff-PL
;env_default = sonoff-PT
;env_default = sonoff-RU
;env_default = sonoff-SE
;env_default = sonoff-SK
;env_default = sonoff-TR
;env_default = sonoff-TW
;env_default = sonoff-UK
;default_envs = sonoff
;default_envs = sonoff-minimal
;default_envs = sonoff-basic
;default_envs = sonoff-classic
;default_envs = sonoff-knx
;default_envs = sonoff-sensors
;default_envs = sonoff-display
;default_envs = sonoff-BG
;default_envs = sonoff-BR
;default_envs = sonoff-CN
;default_envs = sonoff-CZ
;default_envs = sonoff-DE
;default_envs = sonoff-ES
;default_envs = sonoff-FR
;default_envs = sonoff-GR
;default_envs = sonoff-HE
;default_envs = sonoff-HU
;default_envs = sonoff-IT
;default_envs = sonoff-KO
;default_envs = sonoff-NL
;default_envs = sonoff-PL
;default_envs = sonoff-PT
;default_envs = sonoff-RU
;default_envs = sonoff-SE
;default_envs = sonoff-SK
;default_envs = sonoff-TR
;default_envs = sonoff-TW
;default_envs = sonoff-UK
[esp82xx_defaults]
build_flags = -D NDEBUG

View File

@ -1,4 +1,9 @@
/* 6.5.0.13 20190527
/* 6.5.0.14 20190602
* Change webserver HTML input, button, textarea, and select name based on id
* Fix webserver multiple Javascript window.onload functionality
* Fix PZem startup issue (#5875)
*
* 6.5.0.13 20190527
* Add command SetOption38 6..255 to set IRReceive protocol detection sensitivity mimizing UNKNOWN protocols (#5853)
* Fix missing white channel for WS2812 (#5869)
* Add reset of Energy values when connection to sensor is lost for over 4 seconds (#5874, #5881)

View File

@ -119,6 +119,9 @@
#ifndef COLOR_TIMER_TAB_BACKGROUND
#define COLOR_TIMER_TAB_BACKGROUND "#999" // Config timer tab background color - Light grey
#endif
#ifndef IR_RCV_MIN_UNKNOWN_SIZE
#define IR_RCV_MIN_UNKNOWN_SIZE 6 // Set the smallest sized "UNKNOWN" message packets we actually care about (default 6, max 255)
#endif
enum WebColors {
COL_TEXT, COL_BACKGROUND, COL_FORM,

View File

@ -20,6 +20,6 @@
#ifndef _SONOFF_VERSION_H_
#define _SONOFF_VERSION_H_
const uint32_t VERSION = 0x0605000D;
const uint32_t VERSION = 0x0605000E;
#endif // _SONOFF_VERSION_H_

View File

@ -58,13 +58,24 @@ const char HTTP_HEAD[] PROGMEM =
"function eb(s){"
"return document.getElementById(s);" // Save code space
"}"
"function qs(s){" // Alias to save code space
"function qs(s){" // Alias to save code space
"return document.querySelector(s);"
"}"
"function idn(){"
"var t=0,i=document.querySelectorAll('input,button,textarea,select'); while(i.length>=t){ if(i[t]) {i[t]['name']=(i[t].hasAttribute('id')&&(!i[t].hasAttribute('name')))?i[t]['id']:i[t]['name'];}t++;}"
"}"
"window.onload=idn;idn();";
// https://www.htmlgoodies.com/beyond/javascript/article.php/3724571/Using-Multiple-JavaScript-Onload-Functions.htm
"function wl(f){" // Execute multiple window.onload
"var o=window.onload;"
"if(typeof window.onload!='function'){"
"window.onload=f;"
"}else{"
"window.onload=function(){"
"if(o){"
"o();"
"}"
"f();"
"}"
"}"
"}";
const char HTTP_SCRIPT_COUNTER[] PROGMEM =
"var cn=180;" // seconds
@ -75,7 +86,7 @@ const char HTTP_SCRIPT_COUNTER[] PROGMEM =
"setTimeout(u,1000);"
"}"
"}"
"window.onload=u;";
"wl(u);";
const char HTTP_SCRIPT_ROOT[] PROGMEM =
"function la(p){"
@ -102,7 +113,7 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM =
"function lc(p){"
"la('&t='+p);" // &t related to WebGetArg("t", tmp, sizeof(tmp));
"}"
"window.onload=la();";
"wl(la);";
const char HTTP_SCRIPT_WIFI[] PROGMEM =
"function c(l){"
@ -152,7 +163,7 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"lt=setTimeout(l,%d);"
"return false;"
"}"
"window.onload=l;";
"wl(l);";
const char HTTP_MODULE_TEMPLATE_REPLACE[] PROGMEM =
"}2%d'>%s (%d}3"; // }2 and }3 are used in below os.replace
@ -218,7 +229,10 @@ const char HTTP_SCRIPT_TEMPLATE[] PROGMEM =
"sk(17,99);" // 17 = WEMOS
"st(" STR(USER_MODULE) ");"
"}"
"window.onload=ld('tp?m=1',x2);"; // ?m related to WebServer->hasArg("m")
"function sl(){"
"ld('tp?m=1',x2);" // ?m related to WebServer->hasArg("m")
"}"
"wl(sl);";
const char HTTP_SCRIPT_MODULE1[] PROGMEM =
"function x1(a){" // Module Type
@ -240,7 +254,7 @@ const char HTTP_SCRIPT_MODULE2[] PROGMEM =
"ld('md?a=1',x3);" // ?a related to WebServer->hasArg("a")
"}"
"}"
"window.onload=sl;";
"wl(sl);";
const char HTTP_SCRIPT_INFO_BEGIN[] PROGMEM =
"function i(){"
@ -250,11 +264,22 @@ const char HTTP_SCRIPT_INFO_END[] PROGMEM =
"s=o.replace(/}1/g,\"</td></tr><tr><th>\").replace(/}2/g,\"</th><td>\");"
"eb('i').innerHTML=s;"
"}"
"window.onload=i;";
"wl(i);";
const char HTTP_HEAD_LAST_SCRIPT[] PROGMEM =
"function id(){" // Add label name='' based on provided id=''
"var t=0,i=document.querySelectorAll('input,button,textarea,select');"
"while(i.length>=t){"
"if(i[t]){"
"i[t]['name']=(i[t].hasAttribute('id')&&(!i[t].hasAttribute('name')))?i[t]['id']:i[t]['name'];"
"}"
"t++;"
"}"
"}"
"wl(id);" // Add name='' to any id='' in input,button,textarea,select
"</script>";
const char HTTP_HEAD_STYLE1[] PROGMEM =
"</script>"
"<style>"
"div,fieldset,input,select{padding:5px;font-size:1em;}"
"fieldset{background:#%06x;}" // COLOR_FORM, Also update HTTP_TIMER_STYLE
@ -322,7 +347,7 @@ const char HTTP_FORM_TEMPLATE_FLAG[] PROGMEM =
const char HTTP_FORM_MODULE[] PROGMEM =
"<fieldset><legend><b>&nbsp;" D_MODULE_PARAMETERS "&nbsp;</b></legend>"
"<form method='get' action='md'>"
"<p></p><b>" D_MODULE_TYPE "</b> (%s)<br><select id='g99' name='g99'></select><br>"
"<p></p><b>" D_MODULE_TYPE "</b> (%s)<br><select id='g99'></select><br>"
"<br><table>";
const char HTTP_FORM_WIFI[] PROGMEM =
@ -725,6 +750,8 @@ void WSContentSendStyle_P(const char* formatP, ...)
WSContentSend_P(HTTP_SCRIPT_COUNTER);
}
}
WSContentSend_P(HTTP_HEAD_LAST_SCRIPT);
WSContentSend_P(HTTP_HEAD_STYLE1, WebColor(COL_FORM), WebColor(COL_INPUT), WebColor(COL_INPUT_TEXT), WebColor(COL_INPUT), WebColor(COL_INPUT_TEXT), WebColor(COL_CONSOLE), WebColor(COL_CONSOLE_TEXT), WebColor(COL_BACKGROUND));
WSContentSend_P(HTTP_HEAD_STYLE2, WebColor(COL_BUTTON), WebColor(COL_BUTTON_TEXT), WebColor(COL_BUTTON_HOVER), WebColor(COL_BUTTON_RESET), WebColor(COL_BUTTON_RESET_HOVER), WebColor(COL_BUTTON_SAVE), WebColor(COL_BUTTON_SAVE_HOVER));
if (formatP != nullptr) {
@ -761,7 +788,7 @@ void WSContentSendStyle(void)
void WSContentButton(uint8_t title_index)
{
char action[4];
char title[32];
char title[64];
if (title_index <= BUTTON_RESET_CONFIGURATION) {
char confirm[64];
@ -1126,8 +1153,8 @@ void HandleTemplateConfiguration(void)
WSContentSend_P(HTTP_TABLE100);
for (uint8_t i = 0; i < 17; i++) {
if ((i < 6) || ((i > 8) && (i != 11))) { // Ignore flash pins GPIO06, 7, 8 and 11
WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>" D_GPIO "%d</font></b></td><td%s><select id='g%d' name='g%d'></select></td></tr>"),
((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? " style='width:200px'" : "", i, i);
WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>" D_GPIO "%d</font></b></td><td%s><select id='g%d'></select></td></tr>"),
((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? " style='width:200px'" : "", i);
}
}
WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>" D_ADC "0</font></b></td><td><select id='g17'></select></td></tr>"), WebColor(COL_TEXT));
@ -1250,8 +1277,8 @@ void HandleModuleConfiguration(void)
snprintf_P(stemp, 3, PINS_WEMOS +i*2);
char sesp8285[40];
snprintf_P(sesp8285, sizeof(sesp8285), PSTR("<font color='#%06x'>ESP8285</font>"), WebColor(COL_TEXT_WARNING));
WSContentSend_P(PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:176px'><select id='g%d' name='g%d'></select></td></tr>"),
(WEMOS==my_module_type)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :((9==i)||(10==i))? sesp8285 :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i, i);
WSContentSend_P(PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:176px'><select id='g%d'></select></td></tr>"),
(WEMOS==my_module_type)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :((9==i)||(10==i))? sesp8285 :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i);
}
}
#ifndef USE_ADC_VCC
@ -1462,7 +1489,7 @@ void HandleLoggingConfiguration(void)
WSContentStart_P(S_CONFIGURE_LOGGING);
WSContentSendStyle();
WSContentSend_P(HTTP_FORM_LOG1);
char stemp1[32];
char stemp1[45];
char stemp2[32];
uint8_t dlevel[3] = { LOG_LEVEL_INFO, LOG_LEVEL_INFO, LOG_LEVEL_NONE };
for (uint8_t idx = 0; idx < 3; idx++) {
@ -1470,7 +1497,7 @@ void HandleLoggingConfiguration(void)
WSContentSend_P(PSTR("<p><b>%s</b> (%s)<br><select id='l%d'>"),
GetTextIndexed(stemp1, sizeof(stemp1), idx, kLoggingOptions),
GetTextIndexed(stemp2, sizeof(stemp2), dlevel[idx], kLoggingLevels),
idx, idx);
idx);
for (uint8_t i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) {
WSContentSend_P(PSTR("<option%s value='%d'>%d %s</option>"),
(i == llevel) ? " selected" : "", i, i,
@ -1535,10 +1562,10 @@ void HandleOtherConfiguration(void)
if (SONOFF_IFAN02 == my_module_type) { maxfn = 1; }
for (uint8_t i = 0; i < maxfn; i++) {
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), i +1);
WSContentSend_P(PSTR("<b>" D_FRIENDLY_NAME " %d</b> (" FRIENDLY_NAME "%s)<br><input id='a%d' name='a%d' placeholder='" FRIENDLY_NAME "%s' value='%s'><p></p>"),
WSContentSend_P(PSTR("<b>" D_FRIENDLY_NAME " %d</b> (" FRIENDLY_NAME "%s)<br><input id='a%d' placeholder='" FRIENDLY_NAME "%s' value='%s'><p></p>"),
i +1,
(i) ? stemp : "",
i, i,
i,
(i) ? stemp : "",
Settings.friendlyname[i]);
}

View File

@ -455,7 +455,7 @@ void HandleDomoticzConfiguration(void)
return;
}
char stemp[32];
char stemp[40];
WSContentStart_P(S_CONFIGURE_DOMOTICZ);
WSContentSendStyle();

View File

@ -627,7 +627,7 @@ const char HTTP_TIMER_SCRIPT5[] PROGMEM =
"}"
"eb('bt').innerHTML=s;" // Create tabs
"if(%d>0){" // Create Output and Action drop down boxes
"eb('oa').innerHTML=\"<b>" D_TIMER_OUTPUT "</b>&nbsp;<span><select style='width:60px;' id='d1' name='d1'></select></span>&emsp;<b>" D_TIMER_ACTION "</b>&nbsp;<select style='width:99px;' id='p1' name='p1'></select>\";"
"eb('oa').innerHTML=\"<b>" D_TIMER_OUTPUT "</b>&nbsp;<span><select style='width:60px;' id='d1'></select></span>&emsp;<b>" D_TIMER_ACTION "</b>&nbsp;<select style='width:99px;' id='p1'></select>\";"
"o=qs('#p1');ce('" D_OFF "',o);ce('" D_ON "',o);ce('" D_TOGGLE "',o);" // Create offset direction select options
#if defined(USE_RULES) || defined(USE_SCRIPT)
"ce('" D_RULE "',o);"
@ -646,11 +646,11 @@ const char HTTP_TIMER_SCRIPT6[] PROGMEM =
"o=qs('#mw');for(i=0;i<=15;i++){ce((i<10)?('0'+i):i,o);}" // Create window minutes select options
"o=qs('#d1');for(i=0;i<%d;i++){ce(i+1,o);}" // Create outputs
"var a='" D_DAY3LIST "';"
"s='';for(i=0;i<7;i++){s+=\"<input id='w\"+i+\"' name='w\"+i+\"' type='checkbox'><b>\"+a.substring(i*3,(i*3)+3)+\"</b> \"}"
"s='';for(i=0;i<7;i++){s+=\"<input id='w\"+i+\"' type='checkbox'><b>\"+a.substring(i*3,(i*3)+3)+\"</b> \"}"
"eb('ds').innerHTML=s;" // Create weekdays
"eb('dP').click();" // Get the element with id='dP' and click on it
"}"
"window.onload=it;";
"wl(it);";
const char HTTP_TIMER_STYLE[] PROGMEM =
".tl{float:left;border-radius:0;border:1px solid #%06x;padding:1px;width:6.25%%;}"; // COLOR_FORM, Border color needs to be the same as Fieldset background color from HTTP_HEAD_STYLE1 (transparent won't work)
const char HTTP_FORM_TIMER1[] PROGMEM =

View File

@ -768,9 +768,9 @@ const char HTTP_FORM_KNX_OPT[] PROGMEM =
"<option value='%d'>%s</option>";
const char HTTP_FORM_KNX_GA[] PROGMEM =
"<input style='width:12%%;' type='number' id='%s' name='%s' min='0' max='31' value='0'> / "
"<input style='width:12%%;' type='number' id='%s' name='%s' min='0' max='7' value='0'> / "
"<input style='width:12%%;' type='number' id='%s' name='%s' min='0' max='255' value='0'> ";
"<input style='width:12%%;' type='number' id='%s' min='0' max='31' value='0'> / "
"<input style='width:12%%;' type='number' id='%s' min='0' max='7' value='0'> / "
"<input style='width:12%%;' type='number' id='%s' min='0' max='255' value='0'> ";
const char HTTP_FORM_KNX_ADD_BTN[] PROGMEM =
"<button type='submit' onclick='%s()' %s name='btn_add' value='%d' style='width:18%%;'>" D_ADD "</button><br><br>"
@ -895,7 +895,7 @@ void HandleKNXConfiguration(void)
}
}
WSContentSend_P(PSTR("</select> -> "));
WSContentSend_P(HTTP_FORM_KNX_GA, "GA_FNUM", "GA_FNUM", "GA_AREA", "GA_AREA", "GA_FDEF", "GA_FDEF");
WSContentSend_P(HTTP_FORM_KNX_GA, "GA_FNUM", "GA_AREA", "GA_FDEF");
WSContentSend_P(HTTP_FORM_KNX_ADD_BTN, "GAwarning", (Settings.knx_GA_registered < MAX_KNX_GA) ? "" : "disabled", 1);
for (uint8_t i = 0; i < Settings.knx_GA_registered ; ++i)
{
@ -907,7 +907,7 @@ void HandleKNXConfiguration(void)
}
WSContentSend_P(HTTP_FORM_KNX3);
WSContentSend_P(HTTP_FORM_KNX_GA, "CB_FNUM", "CB_FNUM", "CB_AREA", "CB_AREA", "CB_FDEF", "CB_FDEF");
WSContentSend_P(HTTP_FORM_KNX_GA, "CB_FNUM", "CB_AREA", "CB_FDEF");
WSContentSend_P(HTTP_FORM_KNX4);
uint8_t j;

View File

@ -344,7 +344,7 @@ void HueLightStatus2(uint8_t device, String *response)
// generate a unique lightId mixing local IP address and device number
// it is limited to 16 devices.
// last 16 bits of Mac address + 4 bits of local light
// last 24 bits of Mac address + 4 bits of local light
uint32_t EncodeLightId(uint8_t idx)
{
uint8_t mac[6];
@ -422,7 +422,7 @@ void HueLights(String *path)
else if (path->endsWith("/state")) { // Got ID/state
path->remove(0,8); // Remove /lights/
path->remove(path->indexOf("/state")); // Remove /state
device = atoi(path->c_str());
device = DecodeLightId(atoi(path->c_str()));
if ((device < 1) || (device > maxhue)) {
device = 1;
}
@ -434,7 +434,7 @@ void HueLights(String *path)
if (hue_json.containsKey("on")) {
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id", String(device));
response.replace("{id", String(EncodeLightId(device)));
response.replace("{cm", "on");
on = hue_json["on"];

View File

@ -36,6 +36,24 @@
#include <TasmotaModbus.h>
TasmotaModbus *PzemAcModbus;
/*
uint16_t PzemCalculateCRC(uint8_t *buffer, uint8_t num)
{
uint16_t crc = 0xFFFF;
for (uint8_t i = 0; i < num; i++) {
crc ^= buffer[i];
for (uint8_t j = 8; j; j--) {
if ((crc & 0x0001) != 0) { // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
} else { // Else LSB is not set
crc >>= 1; // Just shift right
}
}
}
return crc;
}
*/
void PzemAcEverySecond(void)
{
static uint8_t send_retry = 0;
@ -51,24 +69,26 @@ void PzemAcEverySecond(void)
if (error) {
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "PzemAc response error %d"), error);
} else {
energy_data_valid = 0;
// if ((PzemCalculateCRC(buffer, 23)) == ((buffer[24] << 8) | buffer[23])) {
energy_data_valid = 0;
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// 01 04 14 08 D1 00 6C 00 00 00 F4 00 00 00 26 00 00 01 F4 00 64 00 00 51 34
// Id Cc Sz Volt- Current---- Power------ Energy----- Frequ PFact Alarm Crc--
energy_voltage = (float)((buffer[3] << 8) + buffer[4]) / 10.0; // 6553.0 V
energy_current = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0; // 4294967.000 A
energy_active_power = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0; // 429496729.0 W
energy_frequency = (float)((buffer[17] << 8) + buffer[18]) / 10.0; // 50.0 Hz
energy_power_factor = (float)((buffer[19] << 8) + buffer[20]) / 100.0; // 1.00
float energy = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]); // 4294967295 Wh
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// 01 04 14 08 D1 00 6C 00 00 00 F4 00 00 00 26 00 00 01 F4 00 64 00 00 51 34
// Id Cc Sz Volt- Current---- Power------ Energy----- Frequ PFact Alarm Crc--
energy_voltage = (float)((buffer[3] << 8) + buffer[4]) / 10.0; // 6553.0 V
energy_current = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0; // 4294967.000 A
energy_active_power = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0; // 429496729.0 W
energy_frequency = (float)((buffer[17] << 8) + buffer[18]) / 10.0; // 50.0 Hz
energy_power_factor = (float)((buffer[19] << 8) + buffer[20]) / 100.0; // 1.00
float energy = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]); // 4294967295 Wh
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and handle roll-over if any
if (energy != energy_start) {
energy_kWhtoday += (unsigned long)((energy - energy_start) * 100);
energy_start = energy;
}
EnergyUpdateToday();
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and handle roll-over if any
if (energy != energy_start) {
energy_kWhtoday += (unsigned long)((energy - energy_start) * 100);
energy_start = energy;
}
EnergyUpdateToday();
// }
}
}
@ -118,7 +138,7 @@ int Xnrg05(uint8_t function)
PzemAcSnsInit();
break;
case FUNC_ENERGY_EVERY_SECOND:
PzemAcEverySecond();
if (uptime > 4) { PzemAcEverySecond(); } // Fix start up issue #5875
break;
}
}

View File

@ -117,7 +117,7 @@ int Xnrg06(uint8_t function)
PzemDcSnsInit();
break;
case FUNC_ENERGY_EVERY_SECOND:
PzemDcEverySecond();
if (uptime > 4) { PzemDcEverySecond(); } // Fix start up issue #5875
break;
}
}