mirror of https://github.com/arendst/Tasmota.git
[SolaxX1] Energy calculation (#22568)
This commit is contained in:
parent
e1fc36361e
commit
0ea8889997
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
// #define SOLAXX1_READCONFIG // enable to read inverters config; disable to save codespace (3k1)
|
// #define SOLAXX1_READCONFIG // enable to read inverters config; disable to save codespace (3k1)
|
||||||
|
|
||||||
|
#define SOLAXX1_BUFFERSIZE 256
|
||||||
#define INVERTER_ADDRESS 0x0A
|
#define INVERTER_ADDRESS 0x0A
|
||||||
|
|
||||||
#define D_SOLAX_X1 "SolaxX1"
|
#define D_SOLAX_X1 "SolaxX1"
|
||||||
|
@ -100,6 +101,7 @@ union {
|
||||||
struct SOLAXX1_LIVEDATA {
|
struct SOLAXX1_LIVEDATA {
|
||||||
int16_t temperature = 0;
|
int16_t temperature = 0;
|
||||||
float energy_today = 0;
|
float energy_today = 0;
|
||||||
|
float energy_total = 0;
|
||||||
float dc1_voltage = 0;
|
float dc1_voltage = 0;
|
||||||
float dc2_voltage = 0;
|
float dc2_voltage = 0;
|
||||||
float dc1_current = 0;
|
float dc1_current = 0;
|
||||||
|
@ -329,7 +331,7 @@ void solaxX1_SwitchMeterMode(bool MeterMode) {
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
void solaxX1_CyclicTask(void) { // Every 100/250 milliseconds
|
void solaxX1_CyclicTask(void) { // Every 100/250 milliseconds
|
||||||
uint8_t DataRead[256] = {0};
|
uint8_t DataRead[SOLAXX1_BUFFERSIZE] = {0};
|
||||||
uint8_t TempData[16] = {0};
|
uint8_t TempData[16] = {0};
|
||||||
char TempDataChar[32];
|
char TempDataChar[32];
|
||||||
float TempFloat;
|
float TempFloat;
|
||||||
|
@ -399,7 +401,7 @@ void solaxX1_CyclicTask(void) { // Every 100/250 milliseconds
|
||||||
Energy->frequency[0] = ((DataRead[25] << 8) | DataRead[26]) * 0.01f; // AC Frequency
|
Energy->frequency[0] = ((DataRead[25] << 8) | DataRead[26]) * 0.01f; // AC Frequency
|
||||||
Energy->active_power[0] = ((DataRead[27] << 8) | DataRead[28]); // AC Power
|
Energy->active_power[0] = ((DataRead[27] << 8) | DataRead[28]); // AC Power
|
||||||
//temporal = (float)((DataRead[29] << 8) | DataRead[30]) * 0.1f; // Not Used
|
//temporal = (float)((DataRead[29] << 8) | DataRead[30]) * 0.1f; // Not Used
|
||||||
Energy->import_active[0] = ((DataRead[31] << 24) | (DataRead[32] << 16) | (DataRead[33] << 8) | DataRead[34]) * 0.1f; // Energy Total
|
solaxX1.energy_total = ((DataRead[31] << 24) | (DataRead[32] << 16) | (DataRead[33] << 8) | DataRead[34]) * 0.1f; // Energy Total
|
||||||
uint32_t runtime_total = (DataRead[35] << 24) | (DataRead[36] << 16) | (DataRead[37] << 8) | DataRead[38]; // Work Time Total
|
uint32_t runtime_total = (DataRead[35] << 24) | (DataRead[36] << 16) | (DataRead[37] << 8) | DataRead[38]; // Work Time Total
|
||||||
if (runtime_total) solaxX1.runtime_total = runtime_total; // Work Time valid
|
if (runtime_total) solaxX1.runtime_total = runtime_total; // Work Time valid
|
||||||
solaxX1.runMode = (DataRead[39] << 8) | DataRead[40]; // Work mode
|
solaxX1.runMode = (DataRead[39] << 8) | DataRead[40]; // Work mode
|
||||||
|
@ -413,7 +415,10 @@ void solaxX1_CyclicTask(void) { // Every 100/250 milliseconds
|
||||||
solaxX1.errorCode = (DataRead[58] << 24) | (DataRead[57] << 16) | (DataRead[56] << 8) | DataRead[55]; // Error Code
|
solaxX1.errorCode = (DataRead[58] << 24) | (DataRead[57] << 16) | (DataRead[56] << 8) | DataRead[55]; // Error Code
|
||||||
solaxX1.dc1_power = solaxX1.dc1_voltage * solaxX1.dc1_current;
|
solaxX1.dc1_power = solaxX1.dc1_voltage * solaxX1.dc1_current;
|
||||||
solaxX1.dc2_power = solaxX1.dc2_voltage * solaxX1.dc2_current;
|
solaxX1.dc2_power = solaxX1.dc2_voltage * solaxX1.dc2_current;
|
||||||
EnergyUpdateTotal(); // 484.708 kWh
|
if (Settings->flag3.hardware_energy_total) { // SetOption72 - Enable hardware energy total counter as reference (#6561)
|
||||||
|
Energy->import_active[0] = solaxX1.energy_total;
|
||||||
|
EnergyUpdateTotal(); // 484.708 kWh
|
||||||
|
}
|
||||||
DEBUG_SENSOR_LOG(PSTR("SX1: received live data"));
|
DEBUG_SENSOR_LOG(PSTR("SX1: received live data"));
|
||||||
return;
|
return;
|
||||||
} // end received "Response for query (live data)"
|
} // end received "Response for query (live data)"
|
||||||
|
@ -569,9 +574,16 @@ void solaxX1_CyclicTask(void) { // Every 100/250 milliseconds
|
||||||
return;
|
return;
|
||||||
} // end solaxX1_CyclicTask
|
} // end solaxX1_CyclicTask
|
||||||
|
|
||||||
|
void solaxX1_EverySecond(void) {
|
||||||
|
if (Settings->flag3.hardware_energy_total) return; // SetOption72 - Enable hardware energy total counter as reference (#6561)
|
||||||
|
if (Energy->data_valid[0]) return;
|
||||||
|
Energy->kWhtoday_delta[0] += Energy->active_power[0] * 1000 / 36;
|
||||||
|
EnergyUpdateToday();
|
||||||
|
} // end solaxX1_EverySecond
|
||||||
|
|
||||||
void solaxX1_SnsInit(void) {
|
void solaxX1_SnsInit(void) {
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("SX1: Init - RX-pin: %d, TX-pin: %d, RTS-pin: %d"), Pin(GPIO_SOLAXX1_RX), Pin(GPIO_SOLAXX1_TX), Pin(GPIO_SOLAXX1_RTS));
|
AddLog(LOG_LEVEL_INFO, PSTR("SX1: Init - RX-pin: %d, TX-pin: %d, RTS-pin: %d"), Pin(GPIO_SOLAXX1_RX), Pin(GPIO_SOLAXX1_TX), Pin(GPIO_SOLAXX1_RTS));
|
||||||
solaxX1Serial = new TasmotaSerial(Pin(GPIO_SOLAXX1_RX), Pin(GPIO_SOLAXX1_TX), 1, 0, 256);
|
solaxX1Serial = new TasmotaSerial(Pin(GPIO_SOLAXX1_RX), Pin(GPIO_SOLAXX1_TX), 1, 1, SOLAXX1_BUFFERSIZE);
|
||||||
if (solaxX1Serial->begin(SOLAXX1_SPEED)) {
|
if (solaxX1Serial->begin(SOLAXX1_SPEED)) {
|
||||||
if (solaxX1Serial->hardwareSerial()) { ClaimSerial(); }
|
if (solaxX1Serial->hardwareSerial()) { ClaimSerial(); }
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
|
@ -655,6 +667,10 @@ void solaxX1_Show(uint32_t function) {
|
||||||
char pv2_power[33];
|
char pv2_power[33];
|
||||||
dtostrfd(solaxX1.dc2_power, Settings->flag2.wattage_resolution, pv2_power);
|
dtostrfd(solaxX1.dc2_power, Settings->flag2.wattage_resolution, pv2_power);
|
||||||
#endif
|
#endif
|
||||||
|
char inverter_today[33];
|
||||||
|
dtostrfd(solaxX1.energy_today, Settings->flag2.energy_resolution, inverter_today);
|
||||||
|
char inverter_total[33];
|
||||||
|
dtostrfd(solaxX1.energy_total, Settings->flag2.energy_resolution, inverter_total);
|
||||||
char status[33];
|
char status[33];
|
||||||
GetTextIndexed(status, sizeof(status), solaxX1.runMode + 2, kSolaxMode);
|
GetTextIndexed(status, sizeof(status), solaxX1.runMode + 2, kSolaxMode);
|
||||||
|
|
||||||
|
@ -702,6 +718,10 @@ void solaxX1_Show(uint32_t function) {
|
||||||
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_PV2_CURRENT, table_align.c_str(), pv2_current, D_UNIT_AMPERE);
|
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_PV2_CURRENT, table_align.c_str(), pv2_current, D_UNIT_AMPERE);
|
||||||
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_PV2_POWER, table_align.c_str(), pv2_power, D_UNIT_WATT);
|
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_PV2_POWER, table_align.c_str(), pv2_power, D_UNIT_WATT);
|
||||||
#endif
|
#endif
|
||||||
|
if (!Settings->flag3.hardware_energy_total) { // SetOption72 - Enable hardware energy total counter as reference (#6561)
|
||||||
|
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_ENERGY_TODAY, table_align.c_str(), inverter_today, D_UNIT_KILOWATTHOUR);
|
||||||
|
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_ENERGY_TOTAL, table_align.c_str(), inverter_total, D_UNIT_KILOWATTHOUR);
|
||||||
|
}
|
||||||
char SXTemperature[16];
|
char SXTemperature[16];
|
||||||
dtostrfd(solaxX1.temperature, Settings->flag2.temperature_resolution, SXTemperature);
|
dtostrfd(solaxX1.temperature, Settings->flag2.temperature_resolution, SXTemperature);
|
||||||
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_TEMPERATURE, table_align.c_str(), SXTemperature, D_UNIT_DEGREE D_UNIT_CELSIUS);
|
WSContentSend_PD(HTTP_SNS_solaxX1_Num, D_TEMPERATURE, table_align.c_str(), SXTemperature, D_UNIT_DEGREE D_UNIT_CELSIUS);
|
||||||
|
@ -733,6 +753,9 @@ bool Xnrg12(uint32_t function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (!solaxX1_global.MeterMode) solaxX1_CyclicTask();
|
if (!solaxX1_global.MeterMode) solaxX1_CyclicTask();
|
||||||
break;
|
break;
|
||||||
|
case FUNC_EVERY_SECOND:
|
||||||
|
solaxX1_EverySecond();
|
||||||
|
break;
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
case FUNC_WEB_COL_SENSOR:
|
case FUNC_WEB_COL_SENSOR:
|
||||||
case FUNC_WEB_SENSOR:
|
case FUNC_WEB_SENSOR:
|
||||||
|
|
Loading…
Reference in New Issue