mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-24 23:07:17 +00:00
Fix Shelly3EM energy calculation
This commit is contained in:
parent
a956f8a0f0
commit
40d231875f
@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
#define ADE7880_ENERGY_OPTION // Use energy pulse for calculation energy usage
|
||||||
|
|
||||||
//#define ADE7880_DEBUG
|
//#define ADE7880_DEBUG
|
||||||
//#define ADE7880_PROFILING
|
//#define ADE7880_PROFILING
|
||||||
|
|
||||||
@ -485,8 +487,33 @@ void Ade7880Cycle(void) {
|
|||||||
Energy.active_power[phase] = (float)Ade7880ReadVerify(ADE7880_AWATT + phase) / 100; // 0xE513 - 0xFFFFF524 = -27.79 W
|
Energy.active_power[phase] = (float)Ade7880ReadVerify(ADE7880_AWATT + phase) / 100; // 0xE513 - 0xFFFFF524 = -27.79 W
|
||||||
Energy.apparent_power[phase] = (float)Ade7880ReadVerify(ADE7880_AVA + phase) / 100; // 0xE519 - 0xFFFFF50D
|
Energy.apparent_power[phase] = (float)Ade7880ReadVerify(ADE7880_AVA + phase) / 100; // 0xE519 - 0xFFFFF50D
|
||||||
Energy.frequency[phase] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD + phase); // 0xE905 - Page 34 and based on ADE7880_FREQ_INIT
|
Energy.frequency[phase] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD + phase); // 0xE905 - Page 34 and based on ADE7880_FREQ_INIT
|
||||||
Ade7880.active_energy[phase] = Ade7880ReadVerify(ADE7880_AWATTHR + phase); // 0xE400 - 0xFFFFFF8F = -0.112 kWhr ??
|
Ade7880.active_energy[phase] = Ade7880ReadVerify(ADE7880_AWATTHR + phase); // 0xE400 - 0xFFFFFF8F = -0.112
|
||||||
|
#ifdef ADE7880_ENERGY_OPTION
|
||||||
|
if (Ade7880.active_energy[phase] != 0) {
|
||||||
|
// Suppose constant load during period of 100 periods as set by ADE7880_LINECYC disregards load change inbetween.
|
||||||
|
// ADE7880_AWATT = 6713 = 67,13 W
|
||||||
|
// 67,13 * 1000 / 36 = 1864 decaWh
|
||||||
|
// Energy.kWhtoday_delta[phase] += Energy.active_power[phase] * 1000 / 36;
|
||||||
|
|
||||||
|
// By measuring load 1024000 times/second load change in 100 periods can be accounted for.
|
||||||
|
// ADE7880_AWATT = 6713 = 67,13 W
|
||||||
|
// ADE7880_AWATTHR = 273
|
||||||
|
// AWATT multiplier is 16 (Figure 77)
|
||||||
|
// ADE7880_WTHR = 3 (default)
|
||||||
|
// Active power accumulation rate is 1.024MHz (Page 49)
|
||||||
|
// 1024000 * 16 * ADE7880_AWATT / ADE7880_WTHR * 0x8000000 = ADE7880_AWATTHR
|
||||||
|
// 1024000 * 16 * 6713 / 3 * 134217728 = 273
|
||||||
|
// 16384000 * 6713 / 402653184 = 273
|
||||||
|
// 273 * 402653184 / 16384000 = 6709 = 67,09W * 1000 / 36 = 1863 decaWh (Tasmota needs decaWh)
|
||||||
|
// 273 * 402653184 / 16384 = 6709248 = 67092,48W / 3600 = 1863 decaWh
|
||||||
|
// 273 * 24576 = 6709248 / 3600 = 1863 decaWh
|
||||||
|
Energy.kWhtoday_delta[phase] += Ade7880.active_energy[phase] * 24576 / 3600;
|
||||||
|
}
|
||||||
|
#endif // ADE7880_ENERGY_OPTION
|
||||||
}
|
}
|
||||||
|
EnergyUpdateToday();
|
||||||
|
|
||||||
|
// AddLog(LOG_LEVEL_DEBUG, PSTR("A78: WattHr %d/%d/%d"), Ade7880.active_energy[0], Ade7880.active_energy[1], Ade7880.active_energy[2]);
|
||||||
|
|
||||||
#ifdef ADE7880_PROFILING
|
#ifdef ADE7880_PROFILING
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Cycle in %d ms"), millis() - start);
|
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Cycle in %d ms"), millis() - start);
|
||||||
@ -510,6 +537,7 @@ void IRAM_ATTR Ade7880Isr0(void) {
|
|||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef ADE7880_ENERGY_OPTION
|
||||||
void Ade7880EnergyEverySecond(void) {
|
void Ade7880EnergyEverySecond(void) {
|
||||||
for (uint32_t i = 0; i < 3; i++) {
|
for (uint32_t i = 0; i < 3; i++) {
|
||||||
if (Ade7880.active_energy[i] != 0) {
|
if (Ade7880.active_energy[i] != 0) {
|
||||||
@ -518,6 +546,7 @@ void Ade7880EnergyEverySecond(void) {
|
|||||||
}
|
}
|
||||||
EnergyUpdateToday();
|
EnergyUpdateToday();
|
||||||
}
|
}
|
||||||
|
#endif // Not ADE7880_ENERGY_OPTION
|
||||||
|
|
||||||
bool Ade7880SetDefaults(const char* json) {
|
bool Ade7880SetDefaults(const char* json) {
|
||||||
// {"rms":{"current_a":3166385,"current_b":3125691,"current_c":3131983,"current_s":1756557,"voltage_a":-767262,"voltage_b":-763439,"voltage_c":-749854},"angles":{"angle0":180,"angle1":176,"angle2":176},"powers":{"totactive": {"a":-1345820,"b":-1347328,"c":-1351979}},"freq":0}
|
// {"rms":{"current_a":3166385,"current_b":3125691,"current_c":3131983,"current_s":1756557,"voltage_a":-767262,"voltage_b":-763439,"voltage_c":-749854},"angles":{"angle0":180,"angle1":176,"angle2":176},"powers":{"totactive": {"a":-1345820,"b":-1347328,"c":-1351979}},"freq":0}
|
||||||
@ -664,9 +693,11 @@ bool Xnrg23(uint8_t function) {
|
|||||||
case FUNC_LOOP:
|
case FUNC_LOOP:
|
||||||
if (Ade7880.irq0_state) { Ade7880Service0(); }
|
if (Ade7880.irq0_state) { Ade7880Service0(); }
|
||||||
break;
|
break;
|
||||||
|
#ifndef ADE7880_ENERGY_OPTION
|
||||||
case FUNC_ENERGY_EVERY_SECOND:
|
case FUNC_ENERGY_EVERY_SECOND:
|
||||||
Ade7880EnergyEverySecond();
|
Ade7880EnergyEverySecond();
|
||||||
break;
|
break;
|
||||||
|
#endif // Not ADE7880_ENERGY_OPTION
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = Ade7880Command();
|
result = Ade7880Command();
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user