Closed hacksics closed 3 years ago
The requested template is incomplete, so we don't have enough information for helping you. Your seriallog is 2. It should be 0 if you are using TX RX pins with your PZEM. Using TX and RX pins is recommended for PZEM, due to those are hardware serial and not software serial.
Please, could you be so kind on completing the troubleshooting template in order to have more information so as to properly help you?
Remember to read the Contributing Guideline and Policy. Thanks.
See Docs for more information. See Chat for more user experience. See Community for forum. See Code of Conduct
Sorry @ascillato2 for the trouble. I've gathered all the information I could at the time when I was able to reproduce the issue. I'm not using TX/RX and currently PZEM is connected with software serial emulation as below: GPIO4 -> PZEM16 RX GPIO5 -> PZEM0XX TX
The reason I choose GPIO pins because I wanted to make 3P power monitor with 3 PZEM devices and utilise all GPIO pins available.
This is another example of wrong total energy being sent. You can see Total has reduced from 1.459KWh to 1.184KWh between 18:16:20 and 18:21:20
I'm collecting this logs from syslogd and current Syslog Level configuration is set to 3-Debug. I cannot see any error or additional information printed to understand what is going on.
Jan 13 18:16:20 enregy_mt_floor2-8108 ESP-MQT: tele/enregy_mt_floor2/SENSOR = {"Time":"2021-01-13T18:16:20","ENERGY":{"TotalStartTime":"2021-01-13T12:14:48","Total":1.459,"Yesterday":0.000,"Today":1.459,"Period":21,"Power":257,"ApparentPower":339,"ReactivePower":222,"Factor":0.76,"Frequency":50,"Voltage":239,"Current":1.423}}
Jan 13 18:21:20 enregy_mt_floor2-8108 ESP-MQT: tele/enregy_mt_floor2/STATE = {"Time":"2021-01-13T18:21:20","Uptime":"0T01:20:11","UptimeSec":4811,"Heap":21,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Wifi":{"AP":1,"SSId":"Redmi_CE97","BSSId":"9C:9D:7E:E2:07:64","Channel":2,"RSSI":100,"Signal":-30,"LinkCount":1,"Downtime":"0T00:00:05"}}
Jan 13 18:21:20 enregy_mt_floor2-8108 ESP-MQT: tele/enregy_mt_floor2/SENSOR = {"Time":"2021-01-13T18:21:20","ENERGY":{"TotalStartTime":"2021-01-13T12:14:48","Total":1.184,"Yesterday":0.000,"Today":1.184,"Period":42949400,"Power":253,"ApparentPower":333,"ReactivePower":217,"Factor":0.76,"Frequency":50,"Voltage":239,"Current":1.395}}
Jan 13 18:26:20 enregy_mt_floor2-8108 ESP-MQT: tele/enregy_mt_floor2/STATE = {"Time":"2021-01-13T18:26:20","Uptime":"0T01:25:11","UptimeSec":5111,"Heap":21,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Wifi":{"AP":1,"SSId":"Redmi_CE97","BSSId":"9C:9D:7E:E2:07:64","Channel":2,"RSSI":100,"Signal":-30,"LinkCount":1,"Downtime":"0T00:00:05"}}
Jan 13 18:26:20 enregy_mt_floor2-8108 ESP-MQT: tele/enregy_mt_floor2/SENSOR = {"Time":"2021-01-13T18:26:20","ENERGY":{"TotalStartTime":"2021-01-13T12:14:48","Total":1.206,"Yesterday":0.000,"Today":1.206,"Period":22,"Power":268,"ApparentPower":351,"ReactivePower":226,"Factor":0.76,"Frequency":50,"Voltage":240,"Current":1.464}}
How are you powering the 5V to your PZEM? The totals (as you have configured) are the ones from the PZEM and not the ones from Tasmota. So your PZEM is informing those. Seems that the 5V power is insufficient.
For testing purposes, please move to hardware serial and add a better power source for the 5V of the PZEM.
Anyway, If you use the Totals from Tasmota, you shouldn't see that, but the problem in your PZEM of losing totals is not normal.
I'm powering the PZEM from NodeMCU 5v out. NodeMCU is powered by USB cable and USB Adapter is 5V/1000mA adaptor. How do you say that I'm using the total from PZEM? I've already set the option "SetOption72 0" so tasmota will use the software calculation.
"SetOption72 0" so tasmota will use the software calculation.
Oh, you are right. Sorry. I saw it wrongly in your description.
So, Tasmota today's totals are resetted only if your device is restarting. From your lasts logs, seems that is not resetting (the uptime is increasing).
I have several PZEMs and I never saw this behavior.
Please, try using Hardware Serial just for testing.
So, Tasmota today's totals are resetted only if your device is restarting. From your lasts logs, seems that is not resetting (the uptime is increasing).
Correct. It looks like a bug isn't it?
Please, try using Hardware Serial just for testing.
I will try this out. Can you tell me the connection mapping? Will it be PZEM TX to NodeMCU RX and PZEM RX to NodeMCU TX. And in Tasmota, GPIO3 -> PZEM0XX TX and GPIO 1 -> PZEM16 RX
Also is this the source code for tasmota energy calculation? xdrv_03_energy.ino
It looks like a bug isn't it?
I really don't know. I can't reproduce it. That is why I asked you if you can test Hardware Serial. With all your latest information, your issue is unique. We never saw this. (I have removed the duplicated label as now it is clear that is not the same report as older issues).
this the source code for tasmota energy calculation xdrv_03_energy.ino
Yes, exactly.
I've done some digging on this.
Can someone tell me the reason to reset Energy.start_energy to zero in function EnergyEverySecond in the file xdrv_03_energy.ino?
I need to dig in to more details but it looks like ENERGY_WATCHDOG timer expires (possibily pzem is not sending data during the timeframe defined in ENERGY_WATCHDOG) and when Energy.start_energy sets to zero, Energy.kWhtoday starts from the beginning.
Since I'm not using sdm120 or le01mr, can I just comment out Energy.start_energy = 0; and use it with PZEM? Any thoughts?
// Invalid data reset
uint32_t data_valid = Energy.phase_count;
//AddLog_P(LOG_LEVEL_INFO, PSTR("NRG: phase_count: %d"), Energy.phase_count);
for (uint32_t i = 0; i < Energy.phase_count; i++) {
if (Energy.data_valid[i] <= ENERGY_WATCHDOG) {
Energy.data_valid[i]++;
if (Energy.data_valid[i] > ENERGY_WATCHDOG) {
// Reset energy registers
Energy.voltage[i] = 0;
Energy.current[i] = 0;
Energy.active_power[i] = 0;
if (!isnan(Energy.apparent_power[i])) { Energy.apparent_power[i] = 0; }
if (!isnan(Energy.reactive_power[i])) { Energy.reactive_power[i] = 0; }
if (!isnan(Energy.frequency[i])) { Energy.frequency[i] = 0; }
if (!isnan(Energy.power_factor[i])) { Energy.power_factor[i] = 0; }
if (!isnan(Energy.export_active[i])) { Energy.export_active[i] = 0; }
data_valid--;
AddLog_P(LOG_LEVEL_INFO, PSTR("NRG: Energy Register Reset: %d, %d"), data_valid, Energy.data_valid[i]);
}
}
}
if (!data_valid) {
Energy.start_energy = 0;
AddLog_P(LOG_LEVEL_INFO, PSTR("NRG: start_energy reset to 0"));
XnrgCall(FUNC_ENERGY_RESET);
}
An update on this:
I've commented out the Energy.start_energy = 0; as below and running the new build without energy being reset randomly. But I don't know any other consequence of not resetting start_energy when ENERGY_WATCHDOG times out. I looked through the code but I didn't see any reason to reset the start_energy to 0.
if (!data_valid) {
//Energy.start_energy = 0;
AddLog_P(LOG_LEVEL_INFO, PSTR("NRG: start_energy reset to 0"));
XnrgCall(FUNC_ENERGY_RESET);
}
If communication is lost between the PZEM and Tasmota for a prolonged time users requested to see a value of zero here. In the past I left it as it was but then they complained that they couldn't detect a broken PZEM or diconnected.
So it seems your comms between the PZEM and Tasmota fails sometimes for a number of retries and therefor resets total energy.
Thanks now it's clear..
I've tested this with ENERGY_WATCHDOG = 9 (10 seconds) but I can still see data_valid = 0 entries in my log. If this is for the purpose of identifying broken/disconnected PZEM only, is there any downside if we increase the ENERGY_WATCHDOG to higher value, say 300 seconds?
Give it a try and let us know what happens
So it seems your comms between the PZEM and Tasmota fails sometimes for a number of retries and therefor resets total energy.
We should add an entry in the console log when this reset is applied in order to help the troubleshooting. What do you think?
I will check this on Sunday and let you guys know. I’m not at home during the weekend
I agree that it would be nice to print this as console log error.
Theo have added the console log error message.
Please try it in latest version from development branch.
Thanks.
Can the message be INFO or ERROR so it’s visible in lower log level ?
Enable higher log for now and see if it occurs.
#grep "Energy reset by" /var/log/syslog*
/var/log/syslog:Jan 18 02:09:34 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog:Jan 18 04:21:06 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog:Jan 18 06:32:37 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog:Jan 18 06:46:56 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog.1:Jan 17 18:16:24 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog.1:Jan 17 19:20:39 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog.1:Jan 17 21:32:11 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog.1:Jan 17 23:43:43 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
/var/log/syslog.1:Jan 17 23:58:02 tasmota_08DFAC-8108 ESP-NRG: Energy reset by 4 seconds invalid data
PROBLEM DESCRIPTION
I have flashed nodemcu with tasmota and using PZEM-004T V3 for energy monitor. I've switched off energy monitor counter with SetOption72 0. However it appears that energy calculation reset time or show incorrect values time to time.
Please see the console output below.
I'm not using TX/RX and currently PZEM is connected with software serial emulation as below: GPIO4 -> PZEM16 RX GPIO5 -> PZEM0XX TX
REQUESTED INFORMATION
Make sure your have performed every step and checked the applicable boxes before submitting your issue. Thank you!
Backlog Template; Module; GPIO 255
:Status 0
:TO REPRODUCE
Steps to reproduce the behavior:
EXPECTED BEHAVIOUR
A clear and concise description of what you expected to happen.
SCREENSHOTS
If applicable, add screenshots to help explain your problem.
ADDITIONAL CONTEXT
Add any other context about the problem here.
(Please, remember to close the issue when the problem has been addressed)