mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-24 14:57:16 +00:00
Prep for frequency display
Prep for energy frequency display and update xnrg_05_pzem2.ino with correct register values
This commit is contained in:
parent
b659444c3a
commit
f517755303
@ -181,6 +181,7 @@
|
||||
#define D_CMND_PRESSURE_RESOLUTION "PressRes"
|
||||
#define D_CMND_POWER_RESOLUTION "WattRes"
|
||||
#define D_CMND_VOLTAGE_RESOLUTION "VoltRes"
|
||||
#define D_CMND_FREQUENCY_RESOLUTION "FreqRes"
|
||||
#define D_CMND_CURRENT_RESOLUTION "AmpRes"
|
||||
#define D_CMND_ENERGY_RESOLUTION "EnergyRes"
|
||||
#define D_CMND_MODULE "Module"
|
||||
|
@ -112,8 +112,7 @@ typedef union {
|
||||
uint32_t spare08 : 1;
|
||||
uint32_t spare09 : 1;
|
||||
uint32_t spare10 : 1;
|
||||
uint32_t spare11 : 1;
|
||||
uint32_t spare12 : 1;
|
||||
uint32_t frequency_resolution : 2;
|
||||
uint32_t axis_resolution : 2;
|
||||
uint32_t current_resolution : 2;
|
||||
uint32_t voltage_resolution : 2;
|
||||
|
@ -77,8 +77,8 @@
|
||||
enum TasmotaCommands {
|
||||
CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_FANSPEED, CMND_STATUS, CMND_STATE, CMND_POWERONSTATE, CMND_PULSETIME,
|
||||
CMND_BLINKTIME, CMND_BLINKCOUNT, CMND_SENSOR, CMND_SAVEDATA, CMND_SETOPTION, CMND_TEMPERATURE_RESOLUTION, CMND_HUMIDITY_RESOLUTION,
|
||||
CMND_PRESSURE_RESOLUTION, CMND_POWER_RESOLUTION, CMND_VOLTAGE_RESOLUTION, CMND_CURRENT_RESOLUTION, CMND_ENERGY_RESOLUTION, CMND_MODULE, CMND_MODULES,
|
||||
CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE,
|
||||
CMND_PRESSURE_RESOLUTION, CMND_POWER_RESOLUTION, CMND_VOLTAGE_RESOLUTION, CMND_FREQUENCY_RESOLUTION, CMND_CURRENT_RESOLUTION, CMND_ENERGY_RESOLUTION,
|
||||
CMND_MODULE, CMND_MODULES, CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE,
|
||||
CMND_COUNTERDEBOUNCE, CMND_BUTTONDEBOUNCE, CMND_SWITCHDEBOUNCE, CMND_SLEEP, CMND_UPGRADE, CMND_UPLOAD, CMND_OTAURL, CMND_SERIALLOG, CMND_SYSLOG,
|
||||
CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME,
|
||||
CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE,
|
||||
@ -87,8 +87,8 @@ enum TasmotaCommands {
|
||||
const char kTasmotaCommands[] PROGMEM =
|
||||
D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_FANSPEED "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|"
|
||||
D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SENSOR "|" D_CMND_SAVEDATA "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|"
|
||||
D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|"
|
||||
D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|"
|
||||
D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_FREQUENCY_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|"
|
||||
D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|"
|
||||
D_CMND_COUNTERDEBOUNCE "|" D_CMND_BUTTONDEBOUNCE "|" D_CMND_SWITCHDEBOUNCE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_SYSLOG "|"
|
||||
D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_IPADDRESS "|" D_CMND_NTPSERVER "|" D_CMND_AP "|" D_CMND_SSID "|" D_CMND_PASSWORD "|" D_CMND_HOSTNAME "|"
|
||||
D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|"
|
||||
@ -794,6 +794,12 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.voltage_resolution);
|
||||
}
|
||||
else if (CMND_FREQUENCY_RESOLUTION == command_code) {
|
||||
if ((payload >= 0) && (payload <= 3)) {
|
||||
Settings.flag2.frequency_resolution = payload;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.frequency_resolution);
|
||||
}
|
||||
else if (CMND_CURRENT_RESOLUTION == command_code) {
|
||||
if ((payload >= 0) && (payload <= 3)) {
|
||||
Settings.flag2.current_resolution = payload;
|
||||
|
@ -44,11 +44,13 @@ const char kEnergyCommands[] PROGMEM =
|
||||
float energy_voltage = 0; // 123.1 V
|
||||
float energy_current = 0; // 123.123 A
|
||||
float energy_power = 0; // 123.1 W
|
||||
float energy_frequency = 0; // 123.1 Hz
|
||||
float energy_power_factor = 0; // 0.12
|
||||
float energy_power_factor = NAN; // 0.12
|
||||
int energy_calc_power_factor = 0; // Do not calculate power factor from data
|
||||
float energy_frequency = NAN; // 123.1 Hz
|
||||
float energy_start = 0; // 12345.12345 kWh total previous
|
||||
|
||||
float energy_daily = 0; // 123.123 kWh
|
||||
float energy_total = 0; // 12345.12345 kWh
|
||||
float energy_start = 0; // 12345.12345 kWh total previous
|
||||
unsigned long energy_kWhtoday_delta = 0; // 1212312345 Wh 10^-5 (deca micro Watt hours) - Overflows to energy_kWhtoday (HLW and CSE only)
|
||||
unsigned long energy_kWhtoday; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = energy_daily
|
||||
unsigned long energy_period = 0; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = energy_daily
|
||||
@ -123,12 +125,14 @@ void Energy200ms()
|
||||
|
||||
XnrgCall(FUNC_EVERY_200_MSECOND);
|
||||
|
||||
float power_factor = 0;
|
||||
if (energy_voltage && energy_current && energy_power) {
|
||||
power_factor = energy_power / (energy_voltage * energy_current);
|
||||
if (power_factor > 1) power_factor = 1;
|
||||
if (energy_calc_power_factor) {
|
||||
float power_factor = 0;
|
||||
if (energy_voltage && energy_current && energy_power) {
|
||||
power_factor = energy_power / (energy_voltage * energy_current);
|
||||
if (power_factor > 1) power_factor = 1;
|
||||
}
|
||||
energy_power_factor = power_factor;
|
||||
}
|
||||
energy_power_factor = power_factor;
|
||||
}
|
||||
|
||||
void EnergySaveState()
|
||||
@ -537,11 +541,18 @@ void EnergySnsInit()
|
||||
}
|
||||
|
||||
#ifdef USE_WEBSERVER
|
||||
const char HTTP_ENERGY_SNS[] PROGMEM = "%s"
|
||||
const char HTTP_ENERGY_SNS1[] PROGMEM = "%s"
|
||||
"{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"
|
||||
"{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"
|
||||
"{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}"
|
||||
"{s}" D_POWER_FACTOR "{m}%s{e}"
|
||||
"{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS2[] PROGMEM = "%s"
|
||||
"{s}" D_POWER_FACTOR "{m}%s{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS3[] PROGMEM = "%s"
|
||||
"{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS4[] PROGMEM = "%s"
|
||||
"{s}" D_ENERGY_TODAY "{m}%s " D_UNIT_KILOWATTHOUR "{e}"
|
||||
"{s}" D_ENERGY_YESTERDAY "{m}%s " D_UNIT_KILOWATTHOUR "{e}"
|
||||
"{s}" D_ENERGY_TOTAL "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
|
||||
@ -555,31 +566,43 @@ void EnergyShow(boolean json)
|
||||
char energy_power_chr[10];
|
||||
char energy_voltage_chr[10];
|
||||
char energy_current_chr[10];
|
||||
char energy_frequency_chr[10];
|
||||
char energy_power_factor_chr[10];
|
||||
char energy_yesterday_chr[10];
|
||||
char speriod[20];
|
||||
char spfactor[20];
|
||||
char sfrequency[20];
|
||||
|
||||
bool show_energy_period = (0 == tele_period);
|
||||
|
||||
dtostrfd(energy_power, Settings.flag2.wattage_resolution, energy_power_chr);
|
||||
dtostrfd(energy_voltage, Settings.flag2.voltage_resolution, energy_voltage_chr);
|
||||
dtostrfd(energy_current, Settings.flag2.current_resolution, energy_current_chr);
|
||||
dtostrfd(energy_total, Settings.flag2.energy_resolution, energy_total_chr);
|
||||
dtostrfd(energy_daily, Settings.flag2.energy_resolution, energy_daily_chr);
|
||||
dtostrfd((float)Settings.energy_kWhyesterday / 100000, Settings.flag2.energy_resolution, energy_yesterday_chr);
|
||||
|
||||
float energy = 0;
|
||||
if (show_energy_period) {
|
||||
if (energy_period) energy = (float)(energy_kWhtoday - energy_period) / 100;
|
||||
energy_period = energy_kWhtoday;
|
||||
dtostrfd(energy, Settings.flag2.wattage_resolution, energy_period_chr);
|
||||
snprintf_P(speriod, sizeof(speriod), PSTR(",\"" D_JSON_PERIOD "\":%s"), energy_period_chr);
|
||||
}
|
||||
if (!isnan(energy_frequency)) {
|
||||
dtostrfd(energy_frequency, Settings.flag2.frequency_resolution, energy_frequency_chr);
|
||||
snprintf_P(sfrequency, sizeof(sfrequency), PSTR(",\"" D_JSON_FREQUENCY "\":%s"), energy_frequency_chr);
|
||||
}
|
||||
if (!isnan(energy_power_factor)) {
|
||||
dtostrfd(energy_power_factor, 2, energy_power_factor_chr);
|
||||
snprintf_P(spfactor, sizeof(spfactor), PSTR(",\"" D_JSON_POWERFACTOR "\":%s"), energy_power_factor_chr);
|
||||
}
|
||||
|
||||
dtostrfd(energy_total, Settings.flag2.energy_resolution, energy_total_chr);
|
||||
dtostrfd(energy_daily, Settings.flag2.energy_resolution, energy_daily_chr);
|
||||
dtostrfd(energy, Settings.flag2.wattage_resolution, energy_period_chr);
|
||||
dtostrfd(energy_power, Settings.flag2.wattage_resolution, energy_power_chr);
|
||||
dtostrfd(energy_voltage, Settings.flag2.voltage_resolution, energy_voltage_chr);
|
||||
dtostrfd(energy_current, Settings.flag2.current_resolution, energy_current_chr);
|
||||
dtostrfd(energy_power_factor, 2, energy_power_factor_chr);
|
||||
dtostrfd((float)Settings.energy_kWhyesterday / 100000, Settings.flag2.energy_resolution, energy_yesterday_chr);
|
||||
|
||||
if (json) {
|
||||
snprintf_P(speriod, sizeof(speriod), PSTR(",\"" D_JSON_PERIOD "\":%s"), energy_period_chr);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s%s,\"" D_JSON_POWERUSAGE "\":%s,\"" D_JSON_POWERFACTOR "\":%s,\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s}"),
|
||||
mqtt_data, energy_total_chr, energy_yesterday_chr, energy_daily_chr, (show_energy_period) ? speriod : "", energy_power_chr, energy_power_factor_chr, energy_voltage_chr, energy_current_chr);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s%s,\""
|
||||
D_JSON_POWERUSAGE "\":%s%s,\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s%s}"),
|
||||
mqtt_data, energy_total_chr, energy_yesterday_chr, energy_daily_chr, (show_energy_period) ? speriod : "",
|
||||
energy_power_chr, (!isnan(energy_power_factor)) ? spfactor : "", energy_voltage_chr, energy_current_chr, (!isnan(energy_frequency)) ? sfrequency : "");
|
||||
#ifdef USE_DOMOTICZ
|
||||
if (show_energy_period) { // Only send if telemetry
|
||||
dtostrfd(energy_total * 1000, 1, energy_total_chr);
|
||||
@ -593,7 +616,7 @@ void EnergyShow(boolean json)
|
||||
KnxSensor(KNX_ENERGY_VOLTAGE, energy_voltage);
|
||||
KnxSensor(KNX_ENERGY_CURRENT, energy_current);
|
||||
KnxSensor(KNX_ENERGY_POWER, energy_power);
|
||||
KnxSensor(KNX_ENERGY_POWERFACTOR, energy_power_factor);
|
||||
if (!isnan(energy_power_factor)) { KnxSensor(KNX_ENERGY_POWERFACTOR, energy_power_factor); }
|
||||
KnxSensor(KNX_ENERGY_DAILY, energy_daily);
|
||||
KnxSensor(KNX_ENERGY_TOTAL, energy_total);
|
||||
KnxSensor(KNX_ENERGY_START, energy_start);
|
||||
@ -601,7 +624,10 @@ void EnergyShow(boolean json)
|
||||
#endif // USE_KNX
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_ENERGY_SNS, mqtt_data, energy_voltage_chr, energy_current_chr, energy_power_chr, energy_power_factor_chr, energy_daily_chr, energy_yesterday_chr, energy_total_chr);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_ENERGY_SNS1, mqtt_data, energy_voltage_chr, energy_current_chr, energy_power_chr);
|
||||
if (!isnan(energy_power_factor)) { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_ENERGY_SNS2, mqtt_data, energy_power_factor_chr); }
|
||||
if (!isnan(energy_frequency)) { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_ENERGY_SNS3, mqtt_data, energy_frequency_chr); }
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_ENERGY_SNS4, mqtt_data, energy_daily_chr, energy_yesterday_chr, energy_total_chr);
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
|
@ -41,26 +41,26 @@
|
||||
|
||||
#define HLW_POWER_PROBE_TIME 10 // Number of seconds to probe for power before deciding none used
|
||||
|
||||
static byte hlw_select_ui_flag;
|
||||
static byte hlw_ui_flag = 1;
|
||||
static byte hlw_load_off;
|
||||
static byte hlw_cf1_timer;
|
||||
static unsigned long hlw_cf_pulse_length;
|
||||
static unsigned long hlw_cf_pulse_last_time;
|
||||
static unsigned long hlw_cf1_pulse_length;
|
||||
static unsigned long hlw_cf1_pulse_last_time;
|
||||
static unsigned long hlw_cf1_summed_pulse_length;
|
||||
static unsigned long hlw_cf1_pulse_counter;
|
||||
static unsigned long hlw_cf1_voltage_pulse_length;
|
||||
static unsigned long hlw_cf1_current_pulse_length;
|
||||
static unsigned long hlw_energy_period_counter;
|
||||
byte hlw_select_ui_flag;
|
||||
byte hlw_ui_flag = 1;
|
||||
byte hlw_load_off;
|
||||
byte hlw_cf1_timer;
|
||||
unsigned long hlw_cf_pulse_length;
|
||||
unsigned long hlw_cf_pulse_last_time;
|
||||
unsigned long hlw_cf1_pulse_length;
|
||||
unsigned long hlw_cf1_pulse_last_time;
|
||||
unsigned long hlw_cf1_summed_pulse_length;
|
||||
unsigned long hlw_cf1_pulse_counter;
|
||||
unsigned long hlw_cf1_voltage_pulse_length;
|
||||
unsigned long hlw_cf1_current_pulse_length;
|
||||
unsigned long hlw_energy_period_counter;
|
||||
|
||||
static unsigned long hlw_power_ratio = 0;
|
||||
static unsigned long hlw_voltage_ratio = 0;
|
||||
static unsigned long hlw_current_ratio = 0;
|
||||
unsigned long hlw_power_ratio = 0;
|
||||
unsigned long hlw_voltage_ratio = 0;
|
||||
unsigned long hlw_current_ratio = 0;
|
||||
|
||||
static unsigned long hlw_cf1_voltage_max_pulse_counter;
|
||||
static unsigned long hlw_cf1_current_max_pulse_counter;
|
||||
unsigned long hlw_cf1_voltage_max_pulse_counter;
|
||||
unsigned long hlw_cf1_current_max_pulse_counter;
|
||||
|
||||
#ifndef USE_WS2812_DMA // Collides with Neopixelbus but solves exception
|
||||
void HlwCfInterrupt() ICACHE_RAM_ATTR;
|
||||
@ -217,6 +217,7 @@ void HlwDrvInit()
|
||||
{
|
||||
if (!energy_flg) {
|
||||
if ((pin[GPIO_HLW_SEL] < 99) && (pin[GPIO_HLW_CF1] < 99) && (pin[GPIO_HLW_CF] < 99)) { // Sonoff Pow or any HLW8012 based device
|
||||
energy_calc_power_factor = 1; // Calculate power factor from data
|
||||
energy_flg = XNRG_01;
|
||||
}
|
||||
}
|
||||
|
@ -185,6 +185,7 @@ void CseDrvInit()
|
||||
if ((SONOFF_S31 == Settings.module) || (SONOFF_POW_R2 == Settings.module)) { // Sonoff S31 or Sonoff Pow R2
|
||||
baudrate = 4800;
|
||||
serial_config = SERIAL_8E1;
|
||||
energy_calc_power_factor = 1; // Calculate power factor from data
|
||||
energy_flg = XNRG_02;
|
||||
}
|
||||
}
|
||||
|
@ -215,6 +215,7 @@ void PzemDrvInit()
|
||||
{
|
||||
if (!energy_flg) {
|
||||
if ((pin[GPIO_PZEM_RX] < 99) && (pin[GPIO_PZEM_TX] < 99)) { // Any device with a Pzem004T
|
||||
energy_calc_power_factor = 1; // Calculate power factor from data
|
||||
energy_flg = XNRG_03;
|
||||
}
|
||||
}
|
||||
|
@ -89,61 +89,29 @@ bool Pzem2ModbusReceiveReady()
|
||||
return (Pzem2Serial->available() >= 5); // 5 - Error frame, 21 or 25 - Ok frame
|
||||
}
|
||||
|
||||
uint8_t Pzem2ModbusReceive()
|
||||
uint8_t Pzem2ModbusReceive(uint8_t *buffer, uint8_t register_count)
|
||||
{
|
||||
uint8_t buffer[26];
|
||||
|
||||
// 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
|
||||
// FE 04 14 08 98 03 E8 00 00 08 98 00 00 00 00 00 00 01 F4 00 64 00 00 HH LL = PZEM-014
|
||||
// Id Cc Sz Volt- Current---- Power------ Energy----- Frequ PFact Alarm Crc--
|
||||
// FE 04 10 27 10 00 64 03 E8 00 00 00 00 00 00 00 00 00 00 HH LL = PZEM-017
|
||||
// Id Cc Sz Volt- Curre Power------ Energy----- HiAlm LoAlm Crc--
|
||||
// 0 1 2 3 4 5 6
|
||||
// FE 04 02 08 98 HH LL
|
||||
// Id Cc Sz Regis Crc--
|
||||
|
||||
uint8_t len = 0;
|
||||
while (Pzem2Serial->available() > 0) {
|
||||
while ((Pzem2Serial->available() > 0) && (len < (register_count *2) + 5)) {
|
||||
buffer[len++] = (uint8_t)Pzem2Serial->read();
|
||||
if (3 == len) {
|
||||
if (buffer[1] & 0x80) { // fe 84 02 f2 f1
|
||||
return buffer[2]; // 1 = Illegal Function, 2 = Illegal Address, 3 = Illegal Data, 4 = Slave Error
|
||||
}
|
||||
}
|
||||
if (sizeof(buffer) == len) { break; }
|
||||
}
|
||||
|
||||
AddLogSerial(LOG_LEVEL_DEBUG_MORE, buffer, len);
|
||||
|
||||
if (len < 5) { return 8; } // 8 = Not enough data
|
||||
if (len != buffer[2] + 5) { return 9; } // 9 = Unexpected result
|
||||
if (len < 7) { return 7; } // 7 = Not enough data
|
||||
if (len != buffer[2] + 5) { return 8; } // 8 = Unexpected result
|
||||
|
||||
uint16_t crc = (buffer[len -2] << 8) | buffer[len -1];
|
||||
if (Pzem2ModbusCalculateCRC(buffer, len -3) == crc) {
|
||||
float energy = 0;
|
||||
if (0x10 == buffer[2]) { // PZEM-003,017
|
||||
pzem2_type = PZEM2_TYPES_003_017;
|
||||
energy_voltage = (float)((buffer[3] << 8) + buffer[4]) / 10.0; // 65535.x V
|
||||
energy_current = (float)((buffer[5] << 8) + buffer[6]); // 65535.xx A
|
||||
energy_power = (float)((uint32_t)buffer[9] << 24 + (uint32_t)buffer[10] << 16 + (uint32_t)buffer[7] << 8 + buffer[8]); // 65535 W
|
||||
energy = (float)((uint32_t)buffer[13] << 24 + (uint32_t)buffer[14] << 16 + (uint32_t)buffer[11] << 8 + buffer[12]); // 65535 Wh
|
||||
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and hanlde roll-over if any
|
||||
energy_kWhtoday += (energy - energy_start) * 100;
|
||||
energy_start = energy;
|
||||
EnergyUpdateToday();
|
||||
}
|
||||
else if (0x14 == buffer[2]) { // PZEM-014,016
|
||||
pzem2_type = PZEM2_TYPES_014_016;
|
||||
energy_voltage = (float)((buffer[3] << 8) + buffer[4]) / 10.0; // 65535.x V
|
||||
energy_current = (float)((uint32_t)buffer[7] << 24 + (uint32_t)buffer[8] << 16 + (uint32_t)buffer[5] << 8 + buffer[6]); // 65535.xx A
|
||||
energy_power = (float)((uint32_t)buffer[11] << 24 + (uint32_t)buffer[12] << 16 + (uint32_t)buffer[9] << 8 + buffer[10]); // 65535 W
|
||||
energy_frequency = (float)((buffer[13] << 8) + buffer[14]) / 10.0; // 50.0 Hz
|
||||
energy = (float)((uint32_t)buffer[15] << 24 + (uint32_t)buffer[16] << 16 + (uint32_t)buffer[13] << 8 + buffer[14]); // 65535 Wh
|
||||
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and hanlde roll-over if any
|
||||
energy_kWhtoday += (energy - energy_start) * 100;
|
||||
energy_start = energy;
|
||||
EnergyUpdateToday();
|
||||
}
|
||||
} else {
|
||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "Pzem2 crc error"));
|
||||
}
|
||||
if (Pzem2ModbusCalculateCRC(buffer, len -3) != crc) { return 9; } // 9 = crc error
|
||||
|
||||
return 0; // 0 = No error
|
||||
}
|
||||
@ -152,11 +120,56 @@ uint8_t Pzem2ModbusReceive()
|
||||
|
||||
uint8_t pzem2_sendRetry = 0;
|
||||
|
||||
void Pzem2EverySecond()
|
||||
void Pzem2Every200ms()
|
||||
{
|
||||
bool data_ready = Pzem2ModbusReceiveReady();
|
||||
|
||||
if (data_ready) { Pzem2ModbusReceive(); }
|
||||
if (data_ready) {
|
||||
uint8_t buffer[26];
|
||||
uint8_t error = Pzem2ModbusReceive(buffer, pzem2_type);
|
||||
if (error) {
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DEBUG "PZEM2 response error %d"), error);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
// if (9 == error) {
|
||||
if (PZEM2_TYPES_014_016 == pzem2_type) {
|
||||
pzem2_type = PZEM2_TYPES_003_017;
|
||||
} else {
|
||||
pzem2_type = PZEM2_TYPES_014_016;
|
||||
}
|
||||
// }
|
||||
} else {
|
||||
float energy = 0;
|
||||
|
||||
if (PZEM2_TYPES_003_017 == pzem2_type) {
|
||||
// 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
|
||||
// FE 04 10 27 10 00 64 03 E8 00 00 00 00 00 00 00 00 00 00 HH LL = PZEM-017
|
||||
// Id Cc Sz Volt- Curre Power------ Energy----- HiAlm LoAlm Crc--
|
||||
energy_voltage = (float)((buffer[3] << 8) + buffer[4]) / 100.0; // 655.00 V
|
||||
energy_current = (float)((buffer[5] << 8) + buffer[6]) / 100.0; // 655.00 A
|
||||
energy_power = (float)((uint32_t)buffer[9] << 24 + (uint32_t)buffer[10] << 16 + (uint32_t)buffer[7] << 8 + buffer[8]) / 10.0; // 429496729.0 W
|
||||
energy = (float)((uint32_t)buffer[13] << 24 + (uint32_t)buffer[14] << 16 + (uint32_t)buffer[11] << 8 + buffer[12]); // 4294967295 Wh
|
||||
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and hanlde roll-over if any
|
||||
energy_kWhtoday += (energy - energy_start) * 100;
|
||||
energy_start = energy;
|
||||
EnergyUpdateToday();
|
||||
}
|
||||
else if (PZEM2_TYPES_014_016 == pzem2_type) { // PZEM-014,016
|
||||
// 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
|
||||
// FE 04 14 08 98 03 E8 00 00 08 98 00 00 00 00 00 00 01 F4 00 64 00 00 HH LL = PZEM-014
|
||||
// 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)((uint32_t)buffer[7] << 24 + (uint32_t)buffer[8] << 16 + (uint32_t)buffer[5] << 8 + buffer[6]) / 1000.0; // 4294967.000 A
|
||||
energy_power = (float)((uint32_t)buffer[11] << 24 + (uint32_t)buffer[12] << 16 + (uint32_t)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
|
||||
energy = (float)((uint32_t)buffer[15] << 24 + (uint32_t)buffer[16] << 16 + (uint32_t)buffer[13] << 8 + buffer[14]); // 4294967295 Wh
|
||||
if (!energy_start || (energy < energy_start)) { energy_start = energy; } // Init after restart and hanlde roll-over if any
|
||||
energy_kWhtoday += (energy - energy_start) * 100;
|
||||
energy_start = energy;
|
||||
EnergyUpdateToday();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == pzem2_sendRetry || data_ready) {
|
||||
pzem2_sendRetry = 5;
|
||||
@ -203,8 +216,8 @@ int Xnrg05(byte function)
|
||||
case FUNC_INIT:
|
||||
Pzem2SnsInit();
|
||||
break;
|
||||
case FUNC_EVERY_SECOND:
|
||||
Pzem2EverySecond();
|
||||
case FUNC_EVERY_200_MSECOND:
|
||||
Pzem2Every200ms();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -246,7 +246,7 @@ void SDM120Show(boolean json)
|
||||
dtostrfd(sdm120_apparent_power, Settings.flag2.wattage_resolution, apparent_power);
|
||||
dtostrfd(sdm120_reactive_power, Settings.flag2.wattage_resolution, reactive_power);
|
||||
dtostrfd(sdm120_power_factor, 2, power_factor);
|
||||
dtostrfd(sdm120_frequency, 2, frequency);
|
||||
dtostrfd(sdm120_frequency, Settings.flag2.frequency_resolution, frequency);
|
||||
dtostrfd(sdm120_energy_total, Settings.flag2.energy_resolution, energy_total);
|
||||
|
||||
if (json) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user