mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
restructered code
synced sdm230 driver default registers to generic energy driver values made maximum power, phase angle and resettable energy optional
This commit is contained in:
parent
f58c06daee
commit
84da3deea9
@ -781,9 +781,9 @@
|
|||||||
// #define SDM72_IMPEXP // Show additonal import/export active energy and power in MQTT and Web (+0k5 code)
|
// #define SDM72_IMPEXP // Show additonal import/export active energy and power in MQTT and Web (+0k5 code)
|
||||||
//#define USE_SDM120 // Add support for Eastron SDM120-Modbus energy monitor (+1k1 code)
|
//#define USE_SDM120 // Add support for Eastron SDM120-Modbus energy monitor (+1k1 code)
|
||||||
#define SDM120_SPEED 2400 // SDM120-Modbus RS485 serial speed (default: 2400 baud)
|
#define SDM120_SPEED 2400 // SDM120-Modbus RS485 serial speed (default: 2400 baud)
|
||||||
//#define USE_SDM230 // Add support for Eastron SDM230-Modbus energy monitor (+?? code)
|
//#define USE_SDM230 // Add support for Eastron SDM230-Modbus energy monitor (+1k6 code)
|
||||||
#define SDM230_SPEED 9600 // SDM230-Modbus RS485 serial speed (default: 9600 baud)
|
#define SDM230_SPEED 9600 // SDM230-Modbus RS485 serial speed (default: 9600 baud)
|
||||||
// #define SDM230_IMPORT // Show import active energy in MQTT and Web (+0k3 code)
|
// #define SDM230_MORE_REGS // read more registers (see xnrg_21_sdm230.ino, may cause timing issues (at your own risk, +0k4 code))
|
||||||
//#define USE_SDM630 // Add support for Eastron SDM630-Modbus energy monitor (+0k6 code)
|
//#define USE_SDM630 // Add support for Eastron SDM630-Modbus energy monitor (+0k6 code)
|
||||||
#define SDM630_SPEED 9600 // SDM630-Modbus RS485 serial speed (default: 9600 baud)
|
#define SDM630_SPEED 9600 // SDM630-Modbus RS485 serial speed (default: 9600 baud)
|
||||||
// #define SDM630_IMPORT // Show import active energy in MQTT and Web (+0k3 code)
|
// #define SDM630_IMPORT // Show import active energy in MQTT and Web (+0k3 code)
|
||||||
|
@ -1108,7 +1108,7 @@ void EnergyShow(bool json) {
|
|||||||
EnergyFormatSum(value2_chr, Energy.daily, Settings->flag2.energy_resolution, json));
|
EnergyFormatSum(value2_chr, Energy.daily, Settings->flag2.energy_resolution, json));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) || defined(SDM230_IMPORT)
|
#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
|
||||||
if (!isnan(Energy.import_active[0])) {
|
if (!isnan(Energy.import_active[0])) {
|
||||||
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"),
|
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"),
|
||||||
EnergyFormat(value_chr, Energy.import_active, Settings->flag2.energy_resolution, json));
|
EnergyFormat(value_chr, Energy.import_active, Settings->flag2.energy_resolution, json));
|
||||||
@ -1117,7 +1117,7 @@ void EnergyShow(bool json) {
|
|||||||
EnergyFormatIndex(value_chr, energy_return, Settings->flag2.energy_resolution, json, 2));
|
EnergyFormatIndex(value_chr, energy_return, Settings->flag2.energy_resolution, json, 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // SDM630_IMPORT || SDM72_IMPEXP || SDM230_IMPORT
|
#endif // SDM630_IMPORT || SDM72_IMPEXP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!isnan(Energy.export_active[0])) {
|
if (!isnan(Energy.export_active[0])) {
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include <TasmotaModbus.h>
|
#include <TasmotaModbus.h>
|
||||||
TasmotaModbus *Sdm230Modbus;
|
TasmotaModbus *Sdm230Modbus;
|
||||||
|
|
||||||
|
// read all default registers for generic energy driver
|
||||||
const uint16_t sdm230_start_addresses[] {
|
const uint16_t sdm230_start_addresses[] {
|
||||||
0x0000, // SDM230_VOLTAGE [V]
|
0x0000, // SDM230_VOLTAGE [V]
|
||||||
0x0006, // SDM230_CURRENT [A]
|
0x0006, // SDM230_CURRENT [A]
|
||||||
@ -53,15 +54,18 @@ const uint16_t sdm230_start_addresses[] {
|
|||||||
0x0018, // SDM230_POWER (Reactive) [VAr]
|
0x0018, // SDM230_POWER (Reactive) [VAr]
|
||||||
0x001E, // SDM230_POWER_FACTOR
|
0x001E, // SDM230_POWER_FACTOR
|
||||||
0x0046, // SDM230_FREQUENCY [Hz]
|
0x0046, // SDM230_FREQUENCY [Hz]
|
||||||
0X004A, // SDM230_EXPORT_ACTIVE [kWh]
|
|
||||||
0X0180, // SDM230_RESETTABLE_TOTAL_ENERGY_ACTIVE [kWh]
|
|
||||||
0X0056, // SDM230_MAXIMUM_TOTAL_DEMAND_POWER_ACTIVE [W]
|
|
||||||
0x0024, // SDM230_PHASE ANGLE [Degree]
|
|
||||||
#ifdef SDM230_IMPORT
|
|
||||||
0X0048, // SDM230_IMPORT_ACTIVE [kWh]
|
0X0048, // SDM230_IMPORT_ACTIVE [kWh]
|
||||||
#endif // SDM230_IMPORT
|
0X004A, // SDM230_EXPORT_ACTIVE [kWh]
|
||||||
0X0156, // SDM230_TOTAL_ENERGY_ACTIVE [kWh]
|
// 0X0156, // SDM230_TOTAL_ENERGY_ACTIVE [kWh] // = SDM230_IMPORT_ACTIVE = Energy.total
|
||||||
|
|
||||||
|
// read more registers offered by SDM230 (may cause timing issues)
|
||||||
|
#ifdef SDM230_MORE_REGS
|
||||||
|
0x0024, // SDM230_PHASE ANGLE [Degree]
|
||||||
|
0X0056, // SDM230_MAXIMUM_TOTAL_DEMAND_POWER_ACTIVE [W]
|
||||||
|
0X0180, // SDM230_RESETTABLE_TOTAL_ENERGY_ACTIVE [kWh]
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
|
|
||||||
|
// for documentation / further use or implementation
|
||||||
// 0X0158, // SDM230_TOTAL_ENERGY_REACTIVE [kVArh]
|
// 0X0158, // SDM230_TOTAL_ENERGY_REACTIVE [kVArh]
|
||||||
// 0X0182, // SDM230_RESETTABLE_TOTAL_ENERGY_REACTIVE [kVArh]
|
// 0X0182, // SDM230_RESETTABLE_TOTAL_ENERGY_REACTIVE [kVArh]
|
||||||
// 0X004C, // SDM230_IMPORT_REACTIVE [kVArh]
|
// 0X004C, // SDM230_IMPORT_REACTIVE [kVArh]
|
||||||
@ -76,9 +80,11 @@ const uint16_t sdm230_start_addresses[] {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct SDM230 {
|
struct SDM230 {
|
||||||
float resettable_total_energy = 0;
|
#ifdef SDM230_MORE_REGS
|
||||||
float maximum_total_demand_power = 0;
|
|
||||||
float phase_angle = 0;
|
float phase_angle = 0;
|
||||||
|
float maximum_total_demand_power_active = 0;
|
||||||
|
float resettable_total_energy = 0;
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
uint8_t read_state = 0;
|
uint8_t read_state = 0;
|
||||||
uint8_t send_retry = 0;
|
uint8_t send_retry = 0;
|
||||||
} Sdm230;
|
} Sdm230;
|
||||||
@ -139,35 +145,34 @@ void SDM230Every250ms(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
Energy.export_active[0] = value; // 478.492 kWh
|
Energy.import_active[0] = value; // 6.216 kWh => used in EnergyUpdateTotal()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
Sdm230.resettable_total_energy = value;
|
Energy.export_active[0] = value; // 478.492 kWh
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef SDM230_MORE_REGS
|
||||||
case 9:
|
case 9:
|
||||||
Sdm230.maximum_total_demand_power = value;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
Sdm230.phase_angle = value; // 0.00 Deg
|
Sdm230.phase_angle = value; // 0.00 Deg
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 10:
|
||||||
Energy.import_active[0] = value; // 6.216 kWh
|
Sdm230.maximum_total_demand_power_active = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 11:
|
||||||
EnergyUpdateTotal();
|
Sdm230.resettable_total_energy = value;
|
||||||
//Energy.export_active[0] = value; // 484.708 kWh = import_active + export_active
|
|
||||||
break;
|
break;
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
}
|
}
|
||||||
|
|
||||||
Sdm230.read_state++;
|
Sdm230.read_state++;
|
||||||
if (sizeof(sdm230_start_addresses)/2 == Sdm230.read_state) {
|
if (sizeof(sdm230_start_addresses)/2 == Sdm230.read_state) {
|
||||||
Sdm230.read_state = 0;
|
Sdm230.read_state = 0;
|
||||||
|
EnergyUpdateTotal(); // update every cycle after all registers have been read
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} // end data ready
|
} // end data ready
|
||||||
|
|
||||||
@ -199,36 +204,42 @@ void Sdm230DrvInit(void)
|
|||||||
|
|
||||||
void Sdm230Reset(void)
|
void Sdm230Reset(void)
|
||||||
{
|
{
|
||||||
Sdm230.resettable_total_energy = 0;
|
#ifdef SDM230_MORE_REGS
|
||||||
Sdm230.maximum_total_demand_power = 0;
|
|
||||||
Sdm230.phase_angle = 0;
|
Sdm230.phase_angle = 0;
|
||||||
|
Sdm230.maximum_total_demand_power_active = 0;
|
||||||
|
Sdm230.resettable_total_energy = 0;
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SDM230_MORE_REGS
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
const char HTTP_ENERGY_SDM230[] PROGMEM =
|
const char HTTP_ENERGY_SDM230[] PROGMEM =
|
||||||
"{s}" D_RESETTABLE_TOTAL_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}"
|
"{s}" D_PHASE_ANGLE "{m}%s " D_UNIT_ANGLE "{e}"
|
||||||
"{s}" D_MAX_POWER "{m}%s " D_UNIT_WATT "{e}"
|
"{s}" D_MAX_POWER "{m}%s " D_UNIT_WATT "{e}"
|
||||||
"{s}" D_PHASE_ANGLE "{m}%s " D_UNIT_ANGLE "{e}";
|
"{s}" D_RESETTABLE_TOTAL_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}";
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
|
|
||||||
|
#ifdef SDM230_MORE_REGS
|
||||||
void Sdm230Show(bool json)
|
void Sdm230Show(bool json)
|
||||||
{
|
{
|
||||||
char resettable_energy_chr[FLOATSZ];
|
|
||||||
dtostrfd(Sdm230.resettable_total_energy, Settings->flag2.energy_resolution, resettable_energy_chr);
|
|
||||||
char maximum_demand_chr[FLOATSZ];
|
|
||||||
dtostrfd(Sdm230.maximum_total_demand_power, Settings->flag2.wattage_resolution, maximum_demand_chr);
|
|
||||||
char phase_angle_chr[FLOATSZ];
|
char phase_angle_chr[FLOATSZ];
|
||||||
dtostrfd(Sdm230.phase_angle, 2, phase_angle_chr);
|
dtostrfd(Sdm230.phase_angle, 2, phase_angle_chr);
|
||||||
|
char maximum_demand_chr[FLOATSZ];
|
||||||
|
dtostrfd(Sdm230.maximum_total_demand_power_active, Settings->flag2.wattage_resolution, maximum_demand_chr);
|
||||||
|
char resettable_energy_chr[FLOATSZ];
|
||||||
|
dtostrfd(Sdm230.resettable_total_energy, Settings->flag2.energy_resolution, resettable_energy_chr);
|
||||||
|
|
||||||
if (json) {
|
if (json) {
|
||||||
ResponseAppend_P(PSTR(",\"" D_JSON_RESETTABLE_TOTAL_ACTIVE "\":%s,\"" D_JSON_POWERMAX "\":%s,\"" D_JSON_PHASE_ANGLE "\":%s"),
|
ResponseAppend_P(PSTR(",\"" D_JSON_PHASE_ANGLE "\":%s,\"" D_JSON_POWERMAX "\":%s,\"" D_JSON_RESETTABLE_TOTAL_ACTIVE "\":%s"),
|
||||||
resettable_energy_chr, maximum_demand_chr, phase_angle_chr);
|
phase_angle_chr, maximum_demand_chr, resettable_energy_chr);
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
} else {
|
} else {
|
||||||
WSContentSend_PD(HTTP_ENERGY_SDM230, resettable_energy_chr, maximum_demand_chr, phase_angle_chr);
|
WSContentSend_PD(HTTP_ENERGY_SDM230, phase_angle_chr, maximum_demand_chr, resettable_energy_chr);
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
@ -242,6 +253,7 @@ bool Xnrg21(uint8_t function)
|
|||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
SDM230Every250ms();
|
SDM230Every250ms();
|
||||||
break;
|
break;
|
||||||
|
#ifdef SDM230_MORE_REGS
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
Sdm230Show(1);
|
Sdm230Show(1);
|
||||||
break;
|
break;
|
||||||
@ -250,6 +262,7 @@ bool Xnrg21(uint8_t function)
|
|||||||
Sdm230Show(0);
|
Sdm230Show(0);
|
||||||
break;
|
break;
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
|
#endif // SDM230_MORE_REGS
|
||||||
case FUNC_ENERGY_RESET:
|
case FUNC_ENERGY_RESET:
|
||||||
Sdm230Reset();
|
Sdm230Reset();
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user