Fix Sonoff Pow period data display

This commit is contained in:
arendst 2017-08-10 16:21:31 +02:00
parent 2efb5cd1cd
commit 13ed472eb9
3 changed files with 33 additions and 32 deletions

View File

@ -1,5 +1,6 @@
/* 5.5.2a /* 5.5.2b
* Fix intermittent exception 0 on Sonoff Pow * Fix Sonoff Pow intermittent exception 0
* Change Sonoff Pow sending Domoticz telemetry data only
* *
* 5.5.2 20170808 * 5.5.2 20170808
* Extent max number of WS2812 pixels from 256 to 512 (#667) * Extent max number of WS2812 pixels from 256 to 512 (#667)

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)" - Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/ ====================================================*/
#define VERSION 0x05050201 // 5.5.2a #define VERSION 0x05050202 // 5.5.2b
enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
enum week_t {Last, First, Second, Third, Fourth}; enum week_t {Last, First, Second, Third, Fourth};

View File

@ -1,7 +1,7 @@
/* /*
xsns_hlw8012.ino - sonoff pow HLW8012 energy sensor support for Sonoff-Tasmota xsns_hlw8012.ino - sonoff pow HLW8012 energy sensor support for Sonoff-Tasmota
Copyright (C) 2017 Heiko Krupp and Theo Arends Copyright (C) 2017 Theo Arends
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -175,6 +175,9 @@ void hlw_savestate()
void hlw_readEnergy(byte option, float &et, float &ed, uint16_t &e, uint16_t &w, float &u, float &i, float &c) void hlw_readEnergy(byte option, float &et, float &ed, uint16_t &e, uint16_t &w, float &u, float &i, float &c)
{ {
/* option 0 = do not calculate period energy usage
* option 1 = calculate period energy usage
*/
unsigned long cur_kWhtoday = hlw_kWhtoday; unsigned long cur_kWhtoday = hlw_kWhtoday;
unsigned long hlw_len; unsigned long hlw_len;
unsigned long hlw_temp; unsigned long hlw_temp;
@ -189,22 +192,18 @@ void hlw_readEnergy(byte option, float &et, float &ed, uint16_t &e, uint16_t &w,
//addLog(LOG_LEVEL_DEBUG, log); //addLog(LOG_LEVEL_DEBUG, log);
et = (float)(rtcMem.hlw_kWhtotal + (cur_kWhtoday / 1000)) / 100000; et = (float)(rtcMem.hlw_kWhtotal + (cur_kWhtoday / 1000)) / 100000;
ed = 0;
if (cur_kWhtoday) { if (cur_kWhtoday) {
ed = (float)cur_kWhtoday / 100000000; ed = (float)cur_kWhtoday / 100000000;
} else {
ed = 0;
} }
e = 0;
if (option) { if (option) {
if (!hlw_lasttime) { if (!hlw_lasttime) {
hlw_period = sysCfg.tele_period; hlw_period = sysCfg.tele_period;
} else { } else {
hlw_period = rtc_loctime() - hlw_lasttime; hlw_period = rtc_loctime() - hlw_lasttime;
} }
if (!hlw_period) { if (hlw_period) {
hlw_period = sysCfg.tele_period;
}
hlw_lasttime = rtc_loctime(); hlw_lasttime = rtc_loctime();
hlw_interval = 3600 / hlw_period; hlw_interval = 3600 / hlw_period;
if (hlw_Ecntr) { if (hlw_Ecntr) {
@ -212,37 +211,31 @@ void hlw_readEnergy(byte option, float &et, float &ed, uint16_t &e, uint16_t &w,
hlw_Ecntr = 0; hlw_Ecntr = 0;
hlw_temp = ((HLW_PREF * sysCfg.hlw_pcal) / hlw_len) / hlw_interval; hlw_temp = ((HLW_PREF * sysCfg.hlw_pcal) / hlw_len) / hlw_interval;
e = hlw_temp / 10; e = hlw_temp / 10;
} else {
e = 0;
} }
} }
}
w = 0;
if (hlw_cf_plen) { if (hlw_cf_plen) {
hlw_w = (HLW_PREF * sysCfg.hlw_pcal) / hlw_cf_plen; hlw_w = (HLW_PREF * sysCfg.hlw_pcal) / hlw_cf_plen;
w = hlw_w / 10; w = hlw_w / 10;
} else {
w = 0;
} }
u = 0;
if (hlw_cf1u_plen && (w || (power &1))) { if (hlw_cf1u_plen && (w || (power &1))) {
hlw_u = (HLW_UREF * sysCfg.hlw_ucal) / hlw_cf1u_plen; hlw_u = (HLW_UREF * sysCfg.hlw_ucal) / hlw_cf1u_plen;
u = (float)hlw_u / 10; u = (float)hlw_u / 10;
} else {
u = 0;
} }
i = 0;
if (hlw_cf1i_plen && w) { if (hlw_cf1i_plen && w) {
hlw_i = (HLW_IREF * sysCfg.hlw_ical) / hlw_cf1i_plen; hlw_i = (HLW_IREF * sysCfg.hlw_ical) / hlw_cf1i_plen;
i = (float)hlw_i / 1000; i = (float)hlw_i / 1000;
} else {
i = 0;
} }
c = 0;
if (hlw_i && hlw_u && hlw_w && w) { if (hlw_i && hlw_u && hlw_w && w) {
hlw_temp = (hlw_w * 100) / ((hlw_u * hlw_i) / 1000); hlw_temp = (hlw_w * 100) / ((hlw_u * hlw_i) / 1000);
if (hlw_temp > 100) { if (hlw_temp > 100) {
hlw_temp = 100; hlw_temp = 100;
} }
c = (float)hlw_temp / 100; c = (float)hlw_temp / 100;
} else {
c = 0;
} }
} }
@ -617,6 +610,9 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue) void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
{ {
/* option 0 = do not show period energy usage
* option 1 = show period energy usage
*/
char stemp0[10]; char stemp0[10];
char stemp1[10]; char stemp1[10];
char stemp2[10]; char stemp2[10];
@ -643,13 +639,18 @@ void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
snprintf_P(svalue, ssvalue, PSTR("%s\"Total\":%s, \"Yesterday\":%s, \"Today\":%s%s, \"Power\":%d, \"Factor\":%s, \"Voltage\":%s, \"Current\":%s}"), snprintf_P(svalue, ssvalue, PSTR("%s\"Total\":%s, \"Yesterday\":%s, \"Today\":%s%s, \"Power\":%d, \"Factor\":%s, \"Voltage\":%s, \"Current\":%s}"),
svalue, stemp4, stemp0, stemp1, (option) ? speriod : "", pw, stemp2, stemp5, stemp3); svalue, stemp4, stemp0, stemp1, (option) ? speriod : "", pw, stemp2, stemp5, stemp3);
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (option) { // Only send if telemetry
dtostrf(pet * 1000, 1, 1, stemp1); dtostrf(pet * 1000, 1, 1, stemp1);
domoticz_sensor4(pw, stemp1); domoticz_sensor4(pw, stemp1);
}
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
} }
void hlw_mqttPresent(byte option) void hlw_mqttPresent(byte option)
{ {
/* option 0 = do not show period energy usage
* option 1 = show period energy usage
*/
// {"Time":"2017-03-04T13:37:24", "Total":0.013, "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000} // {"Time":"2017-03-04T13:37:24", "Total":0.013, "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}
char svalue[200]; // was MESSZ char svalue[200]; // was MESSZ
@ -694,7 +695,6 @@ String hlw_webPresent()
uint16_t pw; uint16_t pw;
hlw_readEnergy(0, pet, ped, pe, pw, pu, pi, pc); hlw_readEnergy(0, pet, ped, pe, pw, pu, pi, pc);
dtostrf(pu, 1, sysCfg.flag.voltage_resolution, stemp6); dtostrf(pu, 1, sysCfg.flag.voltage_resolution, stemp6);
dtostrf(pi, 1, 3, stemp); dtostrf(pi, 1, 3, stemp);
dtostrf(pc, 1, 2, stemp2); dtostrf(pc, 1, 2, stemp2);