diff --git a/src/AmsConfiguration.cpp b/src/AmsConfiguration.cpp index 1b6d3f9e..3f391e99 100644 --- a/src/AmsConfiguration.cpp +++ b/src/AmsConfiguration.cpp @@ -517,6 +517,7 @@ bool AmsConfiguration::getEnergyAccountingConfig(EnergyAccountingConfig& config) } bool AmsConfiguration::setEnergyAccountingConfig(EnergyAccountingConfig& config) { + if(config.hours > 5) config.hours = 5; EnergyAccountingConfig existing; if(getEnergyAccountingConfig(existing)) { for(int i = 0; i < 9; i++) { diff --git a/src/mqtt/HomeAssistantMqttHandler.cpp b/src/mqtt/HomeAssistantMqttHandler.cpp index ff273e3e..3791e99e 100644 --- a/src/mqtt/HomeAssistantMqttHandler.cpp +++ b/src/mqtt/HomeAssistantMqttHandler.cpp @@ -33,7 +33,7 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En snprintf_P(json, BufferSize, HA1_JSON, data->getActiveImportPower() ); - mqtt->publish(topic + "/power", json); + return mqtt->publish(topic + "/power", json); } else if(data->getListType() >= 2) { // publish power counts and volts/amps snprintf_P(json, BufferSize, HA3_JSON, data->getListId().c_str(), @@ -54,34 +54,9 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En data->getPowerFactor() == 0 ? 1 : data->getL2PowerFactor(), data->getPowerFactor() == 0 ? 1 : data->getL3PowerFactor() ); - mqtt->publish(topic + "/power", json); + return mqtt->publish(topic + "/power", json); } - - String peaks = ""; - uint8_t peakCount = ea->getConfig()->hours; - if(peakCount > 5) peakCount = 5; - for(uint8_t i = 1; i <= peakCount; i++) { - if(!peaks.isEmpty()) peaks += ","; - peaks += String(ea->getPeak(i), 2); - } - snprintf_P(json, BufferSize, REALTIME_JSON, - ea->getMonthMax(), - peaks.c_str(), - ea->getCurrentThreshold(), - ea->getUseThisHour(), - ea->getCostThisHour(), - ea->getProducedThisHour(), - ea->getUseToday(), - ea->getCostToday(), - ea->getProducedToday(), - ea->getUseThisMonth(), - ea->getCostThisMonth(), - ea->getProducedThisMonth() - ); - mqtt->publish(topic + "/realtime", json); - - return true; -} + return false;} bool HomeAssistantMqttHandler::publishTemperatures(AmsConfiguration* config, HwTools* hw) { int count = hw->getTempSensorCount(); @@ -212,7 +187,7 @@ bool HomeAssistantMqttHandler::publishPrices(EntsoeApi* eapi) { ts3hr, ts6hr ); - return mqtt->publish(topic + "/prices", json, true, 0); + return mqtt->publish(topic + "/prices", json); } bool HomeAssistantMqttHandler::publishSystem(HwTools* hw, EntsoeApi* eapi, EnergyAccounting* ea) { @@ -242,48 +217,28 @@ bool HomeAssistantMqttHandler::publishSystem(HwTools* hw, EntsoeApi* eapi, Energ #endif String haUrl = "http://" + haUID + ".local/"; // Could this be necessary? haUID.replace("-", "_"); - uint8_t peakCount = ea->getConfig()->hours; - if(peakCount > 5) peakCount = 5; - uint8_t peaks = 0; - for(int i=0;igetCurrency()); - } - if(strncmp(sensor.path, "peaks[", 6) == 0) { - if(peaks >= peakCount) continue; - peaks++; - } + for(int i=0;i<17;i++){ snprintf_P(json, BufferSize, HADISCOVER_JSON, - FPSTR(sensor.name), - topic.c_str(), FPSTR(sensor.topic), - haUID.c_str(), uid.c_str(), - haUID.c_str(), uid.c_str(), - uom.c_str(), - FPSTR(sensor.path), - FPSTR(sensor.devcl), + FPSTR(HA_NAMES[i]), + topic.c_str(), FPSTR(HA_TOPICS[i]), + haUID.c_str(), FPSTR(HA_PARAMS[i]), + haUID.c_str(), FPSTR(HA_PARAMS[i]), + FPSTR(HA_UOM[i]), + FPSTR(HA_PARAMS[i]), + FPSTR(HA_DEVCL[i]), haUID.c_str(), haName.c_str(), haModel.c_str(), VERSION, haManuf.c_str(), haUrl.c_str(), - strlen_P(sensor.stacl) > 0 ? ", \"stat_cla\" :" : "", - strlen_P(sensor.stacl) > 0 ? (char *) FPSTR(sensor.stacl) : "" + strlen_P(HA_STACL[i]) > 0 ? ", \"stat_cla\" :" : "", + strlen_P(HA_STACL[i]) > 0 ? (char *) FPSTR(HA_STACL[i]) : "" ); - mqtt->publish(haTopic + haUID + "_" + uid.c_str() + "/config", json, true, 0); + mqtt->publish(haTopic + haUID + "_" + FPSTR(HA_PARAMS[i]) + "/config", json, true, 0); } - autodiscoverInit = true; } if(listType>0) sequence++; - return true; -} + return true;} diff --git a/src/mqtt/HomeAssistantStatic.h b/src/mqtt/HomeAssistantStatic.h index 7428959a..afc5e600 100644 --- a/src/mqtt/HomeAssistantStatic.h +++ b/src/mqtt/HomeAssistantStatic.h @@ -3,69 +3,12 @@ #include "Arduino.h" -struct HomeAssistantSensor { - char* name; - char* topic; - char* path; - char* uom; - char* devcl; - char* stacl; -}; +const char* HA_TOPICS[17] PROGMEM = {"/state", "/state", "/state", "/power", "/power", "/power", "/power", "/power", "/power", "/power", "/power", "/power", "/power", "/energy", "/energy", "/energy", "/energy"}; +const char* HA_NAMES[17] PROGMEM = {"Status", "Supply volt", "Temperature", "Active import", "Reactive import", "Active export", "Reactive export", "L1 current", "L2 current", "L3 current", + "L1 voltage", "L2 voltage", "L3 voltage", "Accumulated active import", "Accumulated active export", "Accumulated reactive import", "Accumulated reactive export"}; +const char* HA_PARAMS[17] PROGMEM = {"rssi", "vcc", "temp", "P", "Q", "PO", "QO", "I1", "I2", "I3", "U1", "U2", "U3", "tPI", "tPO", "tQI", "tQO"}; +const char* HA_UOM[17] PROGMEM = {"dBm", "V", "C", "W", "W", "W", "W", "A", "A", "A", "V", "V", "V", "kWh", "kWh", "kWh", "kWh"}; +const char* HA_DEVCL[17] PROGMEM = {"signal_strength", "voltage", "temperature", "power", "power", "power", "power", "current", "current", "current", "voltage", "voltage", "voltage", "energy", "energy", "energy", "energy"}; +const char* HA_STACL[17] PROGMEM = {"", "", "", "\"measurement\"", "\"measurement\"", "\"measurement\"", "\"measurement\"", "", "", "", "", "", "", "\"total_increasing\"", "\"total_increasing\"", "\"total_increasing\"", "\"total_increasing\""}; - -const uint8_t HA_SENSOR_COUNT PROGMEM = 50; -HomeAssistantSensor HA_SENSORS[HA_SENSOR_COUNT] PROGMEM = { - {"Status", "/state", "rssi", "dBm", "signal_strength", "\"measurement\""}, - {"Supply volt", "/state", "vcc", "V", "voltage", "\"measurement\""}, - {"Temperature", "/state", "temp", "C", "temperature", "\"measurement\""}, - {"Active import", "/power", "P", "W", "power", "\"measurement\""}, - {"Reactive import", "/power", "Q", "VAr", "reactive_power", "\"measurement\""}, - {"Active export", "/power", "PO", "W", "power", "\"measurement\""}, - {"Reactive export", "/power", "QO", "VAr", "reactive_power", "\"measurement\""}, - {"L1 current", "/power", "I1", "A", "current", "\"measurement\""}, - {"L2 current", "/power", "I2", "A", "current", "\"measurement\""}, - {"L3 current", "/power", "I3", "A", "current", "\"measurement\""}, - {"L1 voltage", "/power", "U1", "V", "voltage", "\"measurement\""}, - {"L2 voltage", "/power", "U2", "V", "voltage", "\"measurement\""}, - {"L3 voltage", "/power", "U3", "V", "voltage", "\"measurement\""}, - {"Accumulated active import", "/energy", "tPI", "kWh", "energy", "\"total_increasing\""}, - {"Accumulated active export", "/energy", "tPO", "kWh", "energy", "\"total_increasing\""}, - {"Accumulated reactive import","/energy", "tQI", "kVArh","energy", "\"total_increasing\""}, - {"Accumulated reactive export","/energy", "tQO", "kVArh","energy", "\"total_increasing\""}, - {"Price current hour", "/prices", "prices['0']", "", "monetary", ""}, - {"Price next hour", "/prices", "prices['1']", "", "monetary", ""}, - {"Price in two hour", "/prices", "prices['2']", "", "monetary", ""}, - {"Price in three hour", "/prices", "prices['3']", "", "monetary", ""}, - {"Price in four hour", "/prices", "prices['4']", "", "monetary", ""}, - {"Price in five hour", "/prices", "prices['5']", "", "monetary", ""}, - {"Price in six hour", "/prices", "prices['6']", "", "monetary", ""}, - {"Price in seven hour", "/prices", "prices['7']", "", "monetary", ""}, - {"Price in eight hour", "/prices", "prices['8']", "", "monetary", ""}, - {"Price in nine hour", "/prices", "prices['9']", "", "monetary", ""}, - {"Price in ten hour", "/prices", "prices['10']", "", "monetary", ""}, - {"Price in eleven hour", "/prices", "prices['11']", "", "monetary", ""}, - {"Minimum price ahead", "/prices", "prices.min", "", "monetary", ""}, - {"Maximum price ahead", "/prices", "prices.max", "", "monetary", ""}, - {"Cheapest 1hr period ahead", "/prices", "prices.cheapest1hr","", "timestamp", ""}, - {"Cheapest 3hr period ahead", "/prices", "prices.cheapest3hr","", "timestamp", ""}, - {"Cheapest 6hr period ahead", "/prices", "prices.cheapest6hr","", "timestamp", ""}, - {"Month max", "/realtime","max", "kWh", "energy", "\"total_increasing\""}, - {"Tariff threshold", "/realtime","threshold", "kWh", "energy", "\"total_increasing\""}, - {"Current hour used", "/realtime","hour.use", "kWh", "energy", "\"total_increasing\""}, - {"Current hour cost", "/realtime","hour.cost", "", "monetary", "\"total_increasing\""}, - {"Current hour produced", "/realtime","hour.produced", "kWh", "energy", "\"total_increasing\""}, - {"Current day used", "/realtime","day.use", "kWh", "energy", "\"total_increasing\""}, - {"Current day cost", "/realtime","day.cost", "", "monetary", "\"total_increasing\""}, - {"Current day produced", "/realtime","day.produced", "kWh", "energy", "\"total_increasing\""}, - {"Current month used", "/realtime","month.use", "kWh", "energy", "\"total_increasing\""}, - {"Current month cost", "/realtime","month.cost", "", "monetary", "\"total_increasing\""}, - {"Current month produced", "/realtime","month.produced", "kWh", "energy", "\"total_increasing\""}, - {"Current month peak 1", "/realtime","peaks[0]", "kWh", "energy", ""}, - {"Current month peak 2", "/realtime","peaks[1]", "kWh", "energy", ""}, - {"Current month peak 3", "/realtime","peaks[2]", "kWh", "energy", ""}, - {"Current month peak 4", "/realtime","peaks[3]", "kWh", "energy", ""}, - {"Current month peak 5", "/realtime","peaks[4]", "kWh", "energy", ""}, -}; - - -#endif +#endif \ No newline at end of file