diff --git a/lib/HomeAssistantHelper/HomeAssistantHelper.h b/lib/HomeAssistantHelper/HomeAssistantHelper.h new file mode 100644 index 0000000..e301353 --- /dev/null +++ b/lib/HomeAssistantHelper/HomeAssistantHelper.h @@ -0,0 +1,73 @@ +#pragma once +#include + +class HomeAssistantHelper { +public: + HomeAssistantHelper(PubSubClient& client) : + client(&client) + { + } + + void setPrefix(String value) { + _prefix = value; + } + + void setDeviceVersion(String value) { + _deviceVersion = value; + } + + void setDeviceManufacturer(String value) { + _deviceManufacturer = value; + } + + void setDeviceModel(String value) { + _deviceModel = value; + } + + void setDeviceName(String value) { + _deviceName = value; + } + + void setDeviceConfigUrl(String value) { + _deviceConfigUrl = value; + } + + bool publish(const char* topic, JsonDocument& doc) { + doc[FPSTR(HA_DEVICE)][FPSTR(HA_IDENTIFIERS)][0] = _prefix; + doc[FPSTR(HA_DEVICE)][FPSTR(HA_SW_VERSION)] = _deviceVersion; + doc[FPSTR(HA_DEVICE)][FPSTR(HA_MANUFACTURER)] = _deviceManufacturer; + doc[FPSTR(HA_DEVICE)][FPSTR(HA_MODEL)] = _deviceModel; + doc[FPSTR(HA_DEVICE)][FPSTR(HA_NAME)] = _deviceName; + if (_deviceConfigUrl) { + doc[FPSTR(HA_DEVICE)][FPSTR(HA_CONF_URL)] = _deviceConfigUrl; + } + + client->beginPublish(topic, measureJson(doc), true); + serializeJson(doc, *client); + return client->endPublish(); + } + + bool publish(const char* topic) { + return client->publish(topic, NULL, true); + } + + String getTopic(const char* category, const char* name, const char* nameSeparator = "/") { + String topic = "homeassistant/"; + topic.concat(category); + topic.concat("/"); + topic.concat(_prefix); + topic.concat(nameSeparator); + topic.concat(name); + topic.concat("/config"); + return topic; + } + +protected: + PubSubClient* client; + String _prefix = ""; + String _deviceVersion = "1.0"; + String _deviceManufacturer = "Community"; + String _deviceModel = ""; + String _deviceName = ""; + String _deviceConfigUrl = ""; +}; diff --git a/lib/HomeAssistantHelper/strings.h b/lib/HomeAssistantHelper/strings.h new file mode 100644 index 0000000..be3118d --- /dev/null +++ b/lib/HomeAssistantHelper/strings.h @@ -0,0 +1,37 @@ +#pragma once +#ifndef PROGMEM +#define PROGMEM +#endif + +const char HA_DEVICE[] PROGMEM = "device"; +const char HA_IDENTIFIERS[] PROGMEM = "identifiers"; +const char HA_SW_VERSION[] PROGMEM = "sw_version"; +const char HA_MANUFACTURER[] PROGMEM = "manufacturer"; +const char HA_MODEL[] PROGMEM = "model"; +const char HA_NAME[] PROGMEM = "name"; +const char HA_CONF_URL[] PROGMEM = "configuration_url"; +const char HA_COMMAND_TOPIC[] PROGMEM = "command_topic"; +const char HA_COMMAND_TEMPLATE[] PROGMEM = "command_template"; +const char HA_ENABLED_BY_DEFAULT[] PROGMEM = "enabled_by_default"; +const char HA_UNIQUE_ID[] PROGMEM = "unique_id"; +const char HA_OBJECT_ID[] PROGMEM = "object_id"; +const char HA_ENTITY_CATEGORY[] PROGMEM = "entity_category"; +const char HA_STATE_TOPIC[] PROGMEM = "state_topic"; +const char HA_VALUE_TEMPLATE[] PROGMEM = "value_template"; +const char HA_OPTIONS[] PROGMEM = "options"; +const char HA_AVAILABILITY[] PROGMEM = "availability"; +const char HA_AVAILABILITY_MODE[] PROGMEM = "availability_mode"; +const char HA_TOPIC[] PROGMEM = "topic"; +const char HA_DEVICE_CLASS[] PROGMEM = "device_class"; +const char HA_UNIT_OF_MEASUREMENT[] PROGMEM = "unit_of_measurement"; +const char HA_ICON[] PROGMEM = "icon"; +const char HA_MIN[] PROGMEM = "min"; +const char HA_MAX[] PROGMEM = "max"; +const char HA_STEP[] PROGMEM = "step"; +const char HA_MODE[] PROGMEM = "mode"; +const char HA_STATE_ON[] PROGMEM = "state_on"; +const char HA_STATE_OFF[] PROGMEM = "state_off"; +const char HA_PAYLOAD_ON[] PROGMEM = "payload_on"; +const char HA_PAYLOAD_OFF[] PROGMEM = "payload_off"; +const char HA_STATE_CLASS[] PROGMEM = "state_class"; +const char HA_EXPIRE_AFTER[] PROGMEM = "expire_after"; \ No newline at end of file diff --git a/src/HaHelper.h b/src/HaHelper.h new file mode 100644 index 0000000..782eefd --- /dev/null +++ b/src/HaHelper.h @@ -0,0 +1,1154 @@ +#pragma once +#include + +class HaHelper : public HomeAssistantHelper { +public: + HaHelper(PubSubClient& client) : HomeAssistantHelper(client) {} + + bool publishSelectOutdoorSensorType(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"sensors\": {\"outdoor\": {\"type\": {% if value == 'Boiler' %}0{% elif value == 'Manual' %}1{% elif value == 'External' %}2{% endif %}}}}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_outdoor_sensor_type"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_outdoor_sensor_type"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Outdoor temperature source"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{% if value_json.sensors.outdoor.type == 0 %}Boiler{% elif value_json.sensors.outdoor.type == 1 %}Manual{% elif value_json.sensors.outdoor.type == 2 %}External{% endif %}"); + doc[FPSTR(HA_OPTIONS)][0] = F("Boiler"); + doc[FPSTR(HA_OPTIONS)][1] = F("Manual"); + doc[FPSTR(HA_OPTIONS)][2] = F("External"); + + return publish(getTopic("select", "outdoor_sensor_type").c_str(), doc); + } + + bool publishSelectIndoorSensorType(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"sensors\": {\"indoor\": {\"type\": {% if value == 'Manual' %}1{% elif value == 'External' %}2{% endif %}}}}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_indoor_sensor_type"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_indoor_sensor_type"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Indoor temperature source"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{% if value_json.sensors.indoor.type == 1 %}Manual{% elif value_json.sensors.indoor.type == 2 %}External{% endif %}"); + doc[FPSTR(HA_OPTIONS)][0] = F("Manual"); + doc[FPSTR(HA_OPTIONS)][1] = F("External"); + + return publish(getTopic("select", "indoor_sensor_type").c_str(), doc); + } + + bool publishNumberOutdoorSensorOffset(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/settings"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.sensors.outdoor.type != 1, 'online', 'offline') }}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_outdoor_sensor_offset"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_outdoor_sensor_offset"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Outdoor sensor offset"); + doc[FPSTR(HA_ICON)] = F("mdi:altimeter"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.sensors.outdoor.offset|float(0)|round(2) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"sensors\": {\"outdoor\" : {\"offset\" : {{ value }}}}}"); + doc[FPSTR(HA_MIN)] = -10; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "outdoor_sensor_offset").c_str(), doc); + } + + bool publishNumberIndoorSensorOffset(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/settings"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.sensors.indoor.type != 1, 'online', 'offline') }}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_indoor_sensor_offset"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_indoor_sensor_offset"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Indoor sensor offset"); + doc[FPSTR(HA_ICON)] = F("mdi:altimeter"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.sensors.indoor.offset|float(0)|round(2) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"sensors\": {\"indoor\" : {\"offset\" : {{ value }}}}}"); + doc[FPSTR(HA_MIN)] = -10; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "indoor_sensor_offset").c_str(), doc); + } + + + bool publishSwitchDebug(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_debug"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_debug"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Debug"); + doc[FPSTR(HA_ICON)] = F("mdi:code-braces"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.debug }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"debug\": true}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"debug\": false}"); + + return publish(getTopic("switch", "debug").c_str(), doc); + } + + + bool publishSwitchEmergency(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_emergency"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_emergency"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Use emergency"); + doc[FPSTR(HA_ICON)] = F("mdi:sun-snowflake-variant"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.emergency.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"emergency\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"emergency\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "emergency").c_str(), doc); + } + + bool publishNumberEmergencyTarget(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_emergency_target"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_emergency_target"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Emergency target temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-alert"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.emergency.target|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"emergency\": {\"target\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 5; + doc[FPSTR(HA_MAX)] = 50; + doc[FPSTR(HA_STEP)] = 0.5; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "emergency_target").c_str(), doc); + } + + bool publishSwitchEmergencyUseEquitherm(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/settings"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.sensors.outdoor.type != 1, 'online', 'offline') }}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_emergency_use_equitherm"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_emergency_use_equitherm"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Use equitherm in emergency"); + doc[FPSTR(HA_ICON)] = F("mdi:snowflake-alert"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.emergency.useEquitherm }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"emergency\": {\"useEquitherm\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"emergency\": {\"useEquitherm\" : false}}"); + + return publish(getTopic("switch", "emergency_use_equitherm").c_str(), doc); + } + + + bool publishSwitchHeating(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Heating"); + doc[FPSTR(HA_ICON)] = F("mdi:radiator"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"heating\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"heating\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "heating").c_str(), doc); + } + + bool publishSwitchHeatingTurbo(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_turbo"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_turbo"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Turbo heating"); + doc[FPSTR(HA_ICON)] = F("mdi:rocket-launch-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.turbo }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"heating\": {\"turbo\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"heating\": {\"turbo\" : false}}"); + + return publish(getTopic("switch", "heating_turbo").c_str(), doc); + } + + bool publishNumberHeatingTarget(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_target"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_target"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating target"); + doc[FPSTR(HA_ICON)] = F("mdi:radiator"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.target|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"heating\": {\"target\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = minTemp; + doc[FPSTR(HA_MAX)] = maxTemp; + doc[FPSTR(HA_STEP)] = 0.5; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "heating_target").c_str(), doc); + } + + bool publishNumberHeatingHysteresis(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_hysteresis"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_hysteresis"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating hysteresis"); + doc[FPSTR(HA_ICON)] = F("mdi:altimeter"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.hysteresis|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"heating\": {\"hysteresis\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 5; + doc[FPSTR(HA_STEP)] = 0.1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "heating_hysteresis").c_str(), doc); + } + + bool publishSensorHeatingSetpoint(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_setpoint"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_setpoint"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating setpoint"); + doc[FPSTR(HA_ICON)] = F("mdi:coolant-temperature"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}"); + + return publish(getTopic("sensor", "heating_setpoint").c_str(), doc); + } + + bool publishSensorCurrentHeatingMinTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_current_heating_min_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_current_heating_min_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Current heating min temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-down"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.parameters.heatingMinTemp|int(0) }}"); + + return publish(getTopic("sensor", "current_heating_min_temp").c_str(), doc); + } + + bool publishSensorCurrentHeatingMaxTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_current_heating_max_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_current_heating_max_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Current heating max temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-up"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.parameters.heatingMaxTemp|int(0) }}"); + + return publish(getTopic("sensor", "current_heating_max_temp").c_str(), doc); + } + + bool publishNumberHeatingMinTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_min_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_min_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating min temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-down"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.minTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"heating\": {\"minTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 99; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "heating_min_temp").c_str(), doc); + } + + bool publishNumberHeatingMaxTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_max_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_max_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating max temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-up"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.maxTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"heating\": {\"maxTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 1; + doc[FPSTR(HA_MAX)] = 100; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "heating_max_temp").c_str(), doc); + } + + + bool publishSwitchDHW(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("DHW"); + doc[FPSTR(HA_ICON)] = F("mdi:water-pump"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.dhw.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"dhw\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"dhw\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "dhw").c_str(), doc); + } + + bool publishNumberDHWTarget(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw_target"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw_target"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("DHW target"); + doc[FPSTR(HA_ICON)] = F("mdi:water-pump"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.dhw.target|int(0) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"dhw\": {\"target\" : {{ value|int(0) }}}}"); + doc[FPSTR(HA_MIN)] = minTemp; + doc[FPSTR(HA_MAX)] = maxTemp <= minTemp ? maxTemp : maxTemp; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "dhw_target").c_str(), doc); + } + + bool publishSensorCurrentDHWMinTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_current_dhw_min_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_current_dhw_min_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Current DHW min temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-down"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.parameters.dhwMinTemp|int(0) }}"); + + return publish(getTopic("sensor", "current_dhw_min_temp").c_str(), doc); + } + + bool publishSensorCurrentDHWMaxTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_current_dhw_max_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_current_dhw_max_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Current DHW max temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-up"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.parameters.dhwMaxTemp|int(0) }}"); + + return publish(getTopic("sensor", "current_dhw_max_temp").c_str(), doc); + } + + bool publishNumberDHWMinTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw_min_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw_min_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("DHW min temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-down"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.dhw.minTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"dhw\": {\"minTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 99; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "dhw_min_temp").c_str(), doc); + } + + bool publishNumberDHWMaxTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw_max_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw_max_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("DHW max temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-up"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.dhw.maxTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"dhw\": {\"maxTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 1; + doc[FPSTR(HA_MAX)] = 100; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "dhw_max_temp").c_str(), doc); + } + + + bool publishSwitchPID(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("PID"); + doc[FPSTR(HA_ICON)] = F("mdi:chart-bar-stacked"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"pid\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"pid\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "pid").c_str(), doc); + } + + bool publishNumberPIDFactorP(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid_p"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid_p"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("PID factor P"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-p-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.p_factor|float(0)|round(3) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"p_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0.001; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.001; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "pid_p_factor").c_str(), doc); + } + + bool publishNumberPIDFactorI(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid_i"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid_i"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("PID factor I"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-i-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.i_factor|float(0)|round(3) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"i_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.001; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "pid_i_factor").c_str(), doc); + } + + bool publishNumberPIDFactorD(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid_d"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid_d"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("PID factor D"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-d-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.d_factor|float(0)|round(3) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"d_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.001; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "pid_d_factor").c_str(), doc); + } + + bool publishNumberPIDMinTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid_min_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid_min_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("PID min temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-down"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.minTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"minTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 99; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "pid_min_temp").c_str(), doc); + } + + bool publishNumberPIDMaxTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pid_max_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pid_max_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("PID max temp"); + doc[FPSTR(HA_ICON)] = F("mdi:thermometer-chevron-up"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.maxTemp|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"maxTemp\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 1; + doc[FPSTR(HA_MAX)] = 100; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "pid_max_temp").c_str(), doc); + } + + + bool publishSwitchEquitherm(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_equitherm"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_equitherm"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Equitherm"); + doc[FPSTR(HA_ICON)] = F("mdi:sun-snowflake-variant"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.equitherm.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"equitherm\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"equitherm\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "equitherm").c_str(), doc); + } + + bool publishNumberEquithermFactorN(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_equitherm_n"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_equitherm_n"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Equitherm factor N"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-n-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.equitherm.n_factor|float(0)|round(3) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"equitherm\": {\"n_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0.001; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.001; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "equitherm_n_factor").c_str(), doc); + } + + bool publishNumberEquithermFactorK(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_equitherm_k"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_equitherm_k"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Equitherm factor K"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-k-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.equitherm.k_factor|float(0)|round(2) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"equitherm\": {\"k_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.01; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "equitherm_k_factor").c_str(), doc); + } + + bool publishNumberEquithermFactorT(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/settings"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.pid.enable, 'offline', 'online') }}"); + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_equitherm_t"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_equitherm_t"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Equitherm factor T"); + doc[FPSTR(HA_ICON)] = F("mdi:alpha-t-circle-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.equitherm.t_factor|float(0)|round(2) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"equitherm\": {\"t_factor\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 0; + doc[FPSTR(HA_MAX)] = 10; + doc[FPSTR(HA_STEP)] = 0.01; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "equitherm_t_factor").c_str(), doc); + } + + + bool publishSwitchTuning(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_tuning"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_tuning"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Tuning"); + doc[FPSTR(HA_ICON)] = F("mdi:tune-vertical"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_STATE_ON)] = true; + doc[FPSTR(HA_STATE_OFF)] = false; + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.tuning.enable }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/state/set"); + doc[FPSTR(HA_PAYLOAD_ON)] = F("{\"tuning\": {\"enable\" : true}}"); + doc[FPSTR(HA_PAYLOAD_OFF)] = F("{\"tuning\": {\"enable\" : false}}"); + + return publish(getTopic("switch", "tuning").c_str(), doc); + } + + bool publishSelectTuningRegulator(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_AVAILABILITY_MODE)] = F("all"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/state/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"tuning\": {\"regulator\": {% if value == 'Equitherm' %}0{% elif value == 'PID' %}1{% endif %}}}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_tuning_regulator"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_tuning_regulator"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_NAME)] = F("Tuning regulator"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{% if value_json.tuning.regulator == 0 %}Equitherm{% elif value_json.tuning.regulator == 1 %}PID{% endif %}"); + doc[FPSTR(HA_OPTIONS)][0] = F("Equitherm"); + doc[FPSTR(HA_OPTIONS)][1] = F("PID"); + + return publish(getTopic("select", "tuning_regulator").c_str(), doc); + } + + + bool publishBinSensorStatus(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_status"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_status"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("problem"); + doc[FPSTR(HA_NAME)] = F("Status"); + doc[FPSTR(HA_ICON)] = F("mdi:list-status"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/status"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value == 'online', 'OFF', 'ON') }}"); + doc[FPSTR(HA_EXPIRE_AFTER)] = 60; + + return publish(getTopic("binary_sensor", "status").c_str(), doc); + } + + bool publishBinSensorOtStatus(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_ot_status"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_ot_status"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("problem"); + doc[FPSTR(HA_NAME)] = F("Opentherm status"); + doc[FPSTR(HA_ICON)] = F("mdi:list-status"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}"); + + return publish(getTopic("binary_sensor", "ot_status").c_str(), doc); + } + + bool publishBinSensorHeating(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("running"); + doc[FPSTR(HA_NAME)] = F("Heating"); + doc[FPSTR(HA_ICON)] = F("mdi:radiator"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}"); + + return publish(getTopic("binary_sensor", "heating").c_str(), doc); + } + + bool publishBinSensorDHW(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("running"); + doc[FPSTR(HA_NAME)] = F("DHW"); + doc[FPSTR(HA_ICON)] = F("mdi:water-pump"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}"); + + return publish(getTopic("binary_sensor", "dhw").c_str(), doc); + } + + bool publishBinSensorFlame(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_flame"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_flame"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("running"); + doc[FPSTR(HA_NAME)] = F("Flame"); + doc[FPSTR(HA_ICON)] = F("mdi:fire"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}"); + + return publish(getTopic("binary_sensor", "flame").c_str(), doc); + } + + bool publishBinSensorFault(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/state"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.otStatus, 'online', 'offline') }}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_fault"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_fault"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("problem"); + doc[FPSTR(HA_NAME)] = F("Fault"); + doc[FPSTR(HA_ICON)] = F("mdi:water-boiler-alert"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}"); + + return publish(getTopic("binary_sensor", "fault").c_str(), doc); + } + + bool publishBinSensorDiagnostic(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_diagnostic"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_diagnostic"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("problem"); + doc[FPSTR(HA_NAME)] = F("Diagnostic"); + doc[FPSTR(HA_ICON)] = F("mdi:account-wrench"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}"); + + return publish(getTopic("binary_sensor", "diagnostic").c_str(), doc); + } + + bool publishSensorFaultCode(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/state"); + doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_VALUE_TEMPLATE)] = F("{{ iif(value_json.states.fault, 'online', 'offline') }}"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_fault_code"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_fault_code"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_NAME)] = F("Fault code"); + doc[FPSTR(HA_ICON)] = F("mdi:chat-alert-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}"); + + return publish(getTopic("sensor", "fault_code").c_str(), doc); + } + + bool publishSensorRssi(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_rssi"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_rssi"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("signal_strength"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("dBm"); + doc[FPSTR(HA_NAME)] = F("RSSI"); + doc[FPSTR(HA_ICON)] = F("mdi:signal"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.states.rssi|float(0)|round(1) }}"); + + return publish(getTopic("sensor", "rssi").c_str(), doc); + } + + + bool publishSensorModulation(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_modulation_level"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_modulation_level"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("power_factor"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("%"); + doc[FPSTR(HA_NAME)] = F("Modulation level"); + doc[FPSTR(HA_ICON)] = F("mdi:fire-circle"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}"); + + return publish(getTopic("sensor", "modulation").c_str(), doc); + } + + bool publishSensorPressure(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_pressure"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_pressure"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("pressure"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("bar"); + doc[FPSTR(HA_NAME)] = F("Pressure"); + doc[FPSTR(HA_ICON)] = F("mdi:gauge"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}"); + + return publish(getTopic("sensor", "pressure").c_str(), doc); + } + + + bool publishNumberIndoorTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_indoor_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_indoor_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Indoor temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:home-thermometer"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/state/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"temperatures\": {\"indoor\":{{ value }}}}"); + doc[FPSTR(HA_MIN)] = -99; + doc[FPSTR(HA_MAX)] = 99; + doc[FPSTR(HA_STEP)] = 0.01; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "indoor_temp").c_str(), doc); + } + + bool publishSensorIndoorTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][0][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_AVAILABILITY_MODE)] = F("any"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_indoor_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_indoor_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Indoor temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:home-thermometer"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}"); + + return publish(getTopic("sensor", "indoor_temp").c_str(), doc); + } + + bool publishNumberOutdoorTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_outdoor_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_outdoor_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Outdoor temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:home-thermometer-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = _prefix + F("/state/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"temperatures\": {\"outdoor\":{{ value }}}}"); + doc[FPSTR(HA_MIN)] = -99; + doc[FPSTR(HA_MAX)] = 99; + doc[FPSTR(HA_STEP)] = 0.01; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "outdoor_temp").c_str(), doc); + } + + bool publishSensorOutdoorTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][0][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_AVAILABILITY_MODE)] = F("any"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_outdoor_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_outdoor_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Outdoor temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:home-thermometer-outline"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}"); + + return publish(getTopic("sensor", "outdoor_temp").c_str(), doc); + } + + bool publishSensorHeatingTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("Heating temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:radiator"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}"); + + return publish(getTopic("sensor", "heating_temp").c_str(), doc); + } + + bool publishSensorDHWTemp(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw_temp"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw_temp"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("diagnostic"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("temperature"); + doc[FPSTR(HA_STATE_CLASS)] = F("measurement"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("°C"); + doc[FPSTR(HA_NAME)] = F("DHW temperature"); + doc[FPSTR(HA_ICON)] = F("mdi:water-pump"); + doc[FPSTR(HA_STATE_TOPIC)] = _prefix + F("/state"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}"); + + return publish(getTopic("sensor", "dhw_temp").c_str(), doc); + } + + + bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) { + StaticJsonDocument<2560> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_heating"); + doc[FPSTR(HA_NAME)] = F("Heating"); + doc[FPSTR(HA_ICON)] = F("mdi:radiator"); + + doc[F("current_temperature_topic")] = _prefix + F("/state"); + doc[F("current_temperature_template")] = F("{% if value_json.temperatures.indoor|float(0) != 0 %}{{ value_json.temperatures.indoor|float(0)|round(2) }}" + "{% else %}{{ value_json.temperatures.heating|float(0)|round(2) }}{% endif %}"); + + doc[F("temperature_command_topic")] = _prefix + F("/settings/set"); + doc[F("temperature_command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}"); + + doc[F("temperature_state_topic")] = _prefix + F("/settings"); + doc[F("temperature_state_template")] = F("{{ value_json.heating.target|float(0)|round(1) }}"); + + doc[F("mode_command_topic")] = _prefix + F("/settings/set"); + doc[F("mode_command_template")] = F("{% if value == 'heat' %}{\"heating\": {\"enable\" : true}}" + "{% elif value == 'off' %}{\"heating\": {\"enable\" : false}}{% endif %}"); + doc[F("mode_state_topic")] = _prefix + F("/settings"); + doc[F("mode_state_template")] = F("{{ iif(value_json.heating.enable, 'heat', 'off') }}"); + doc[F("modes")][0] = F("off"); + doc[F("modes")][1] = F("heat"); + + doc[F("action_topic")] = _prefix + F("/state"); + doc[F("action_template")] = F("{{ iif(value_json.states.heating, 'heating', 'idle') }}"); + + doc[F("preset_mode_command_topic")] = _prefix + F("/settings/set"); + doc[F("preset_mode_command_template")] = F("{% if value == 'boost' %}{\"heating\": {\"turbo\" : true}}" + "{% elif value == 'none' %}{\"heating\": {\"turbo\" : false}}{% endif %}"); + doc[F("preset_mode_state_topic")] = _prefix + F("/settings"); + doc[F("preset_mode_value_template")] = F("{{ iif(value_json.heating.turbo, 'boost', 'none') }}"); + doc[F("preset_modes")][0] = F("boost"); + + doc[F("min_temp")] = minTemp; + doc[F("max_temp")] = maxTemp; + doc[F("temp_step")] = 0.5; + + return publish(getTopic("climate", "heating", "_").c_str(), doc); + } + + bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) { + StaticJsonDocument<2560> doc; + doc[FPSTR(HA_AVAILABILITY)][F("topic")] = _prefix + F("/status"); + + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_OBJECT_ID)] = _prefix + F("_dhw"); + doc[FPSTR(HA_NAME)] = F("DHW"); + doc[FPSTR(HA_ICON)] = F("mdi:water-pump"); + + doc[F("current_temperature_topic")] = _prefix + F("/state"); + doc[F("current_temperature_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(1) }}"); + + doc[F("temperature_command_topic")] = _prefix + F("/settings/set"); + doc[F("temperature_command_template")] = F("{\"dhw\": {\"target\" : {{ value|int(0) }}}}"); + + doc[F("temperature_state_topic")] = _prefix + F("/settings"); + doc[F("temperature_state_template")] = F("{{ value_json.dhw.target|int(0) }}"); + + doc[F("mode_command_topic")] = _prefix + F("/settings/set"); + doc[F("mode_command_template")] = F("{% if value == 'heat' %}{\"dhw\": {\"enable\" : true}}" + "{% elif value == 'off' %}{\"dhw\": {\"enable\" : false}}{% endif %}"); + doc[F("mode_state_topic")] = _prefix + F("/settings"); + doc[F("mode_state_template")] = F("{{ iif(value_json.dhw.enable, 'heat', 'off') }}"); + doc[F("modes")][0] = F("off"); + doc[F("modes")][1] = F("heat"); + + doc[F("action_topic")] = _prefix + F("/state"); + doc[F("action_template")] = F("{{ iif(value_json.states.dhw, 'heating', 'idle') }}"); + + doc[F("min_temp")] = minTemp; + doc[F("max_temp")] = maxTemp; + + return publish(getTopic("climate", "dhw", "_").c_str(), doc); + } + + + bool deleteNumberOutdoorTemp() { + return publish(getTopic("number", "outdoor_temp").c_str()); + } + + bool deleteSensorOutdoorTemp() { + return publish(getTopic("sensor", "outdoor_temp").c_str()); + } + + bool deleteNumberIndoorTemp() { + return publish(getTopic("number", "indoor_temp").c_str()); + } + + bool deleteSensorIndoorTemp() { + return publish(getTopic("sensor", "indoor_temp").c_str()); + } + + bool deleteSwitchDHW() { + return publish(getTopic("switch", "dhw").c_str()); + } + + bool deleteSensorCurrentDHWMinTemp() { + return publish(getTopic("sensor", "current_dhw_min_temp").c_str()); + } + + bool deleteSensorCurrentDHWMaxTemp() { + return publish(getTopic("sensor", "current_dhw_max_temp").c_str()); + } + + bool deleteNumberDHWMinTemp() { + return publish(getTopic("number", "dhw_min_temp").c_str()); + } + + bool deleteNumberDHWMaxTemp() { + return publish(getTopic("number", "dhw_max_temp").c_str()); + } + + bool deleteBinSensorDHW() { + return publish(getTopic("binary_sensor", "dhw").c_str()); + } + + bool deleteSensorDHWTemp() { + return publish(getTopic("sensor", "dhw_temp").c_str()); + } + + bool deleteNumberDHWTarget() { + return publish(getTopic("number", "dhw_target").c_str()); + } + + bool deleteClimateDHW() { + return publish(getTopic("climate", "dhw", "_").c_str()); + } +}; diff --git a/src/HomeAssistantHelper.h b/src/HomeAssistantHelper.h deleted file mode 100644 index a978711..0000000 --- a/src/HomeAssistantHelper.h +++ /dev/null @@ -1,1727 +0,0 @@ -#pragma once -extern PubSubClient client; - -class HomeAssistantHelper { -public: - void setPrefix(String value) { - _prefix = value; - } - - void setDeviceVersion(String value) { - _deviceVersion = value; - } - - void setDeviceManufacturer(String value) { - _deviceManufacturer = value; - } - - void setDeviceModel(String value) { - _deviceModel = value; - } - - void setDeviceName(String value) { - _deviceName = value; - } - - void setDeviceConfigUrl(String value) { - _deviceConfigUrl = value; - } - - bool publishSelectOutdoorSensorType(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"sensors\": {\"outdoor\": {\"type\": {% if value == 'Boiler' %}0{% elif value == 'Manual' %}1{% elif value == 'External' %}2{% endif %}}}}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_outdoor_sensor_type"); - doc[F("object_id")] = _prefix + F("_outdoor_sensor_type"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Outdoor temperature source"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{% if value_json.sensors.outdoor.type == 0 %}Boiler{% elif value_json.sensors.outdoor.type == 1 %}Manual{% elif value_json.sensors.outdoor.type == 2 %}External{% endif %}"); - doc[F("options")][0] = F("Boiler"); - doc[F("options")][1] = F("Manual"); - doc[F("options")][2] = F("External"); - - client.beginPublish((F("homeassistant/select/") + _prefix + F("/outdoor_sensor_type/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSelectIndoorSensorType(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"sensors\": {\"indoor\": {\"type\": {% if value == 'Manual' %}1{% elif value == 'External' %}2{% endif %}}}}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_indoor_sensor_type"); - doc[F("object_id")] = _prefix + F("_indoor_sensor_type"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Indoor temperature source"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{% if value_json.sensors.indoor.type == 1 %}Manual{% elif value_json.sensors.indoor.type == 2 %}External{% endif %}"); - doc[F("options")][0] = F("Manual"); - doc[F("options")][1] = F("External"); - - client.beginPublish((F("homeassistant/select/") + _prefix + F("/indoor_sensor_type/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberOutdoorSensorOffset(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/settings"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.sensors.outdoor.type != 1, 'online', 'offline') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_outdoor_sensor_offset"); - doc[F("object_id")] = _prefix + F("_outdoor_sensor_offset"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Outdoor sensor offset"); - doc[F("icon")] = F("mdi:altimeter"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.sensors.outdoor.offset|float(0)|round(2) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"sensors\": {\"outdoor\" : {\"offset\" : {{ value }}}}}"); - doc[F("min")] = -10; - doc[F("max")] = 10; - doc[F("step")] = 0.1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_sensor_offset/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberIndoorSensorOffset(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/settings"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.sensors.indoor.type != 1, 'online', 'offline') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_indoor_sensor_offset"); - doc[F("object_id")] = _prefix + F("_indoor_sensor_offset"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Indoor sensor offset"); - doc[F("icon")] = F("mdi:altimeter"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.sensors.indoor.offset|float(0)|round(2) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"sensors\": {\"indoor\" : {\"offset\" : {{ value }}}}}"); - doc[F("min")] = -10; - doc[F("max")] = 10; - doc[F("step")] = 0.1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_sensor_offset/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchDebug(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_debug"); - doc[F("object_id")] = _prefix + F("_debug"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Debug"); - doc[F("icon")] = F("mdi:code-braces"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.debug }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"debug\": true}"); - doc[F("payload_off")] = F("{\"debug\": false}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/debug/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchEmergency(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_emergency"); - doc[F("object_id")] = _prefix + F("_emergency"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Use emergency"); - doc[F("icon")] = F("mdi:sun-snowflake-variant"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.emergency.enable }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"emergency\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"emergency\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberEmergencyTarget(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_emergency_target"); - doc[F("object_id")] = _prefix + F("_emergency_target"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Emergency target temp"); - doc[F("icon")] = F("mdi:thermometer-alert"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.emergency.target|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"emergency\": {\"target\" : {{ value }}}}"); - doc[F("min")] = 5; - doc[F("max")] = 50; - doc[F("step")] = 0.5; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/emergency_target/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSwitchEmergencyUseEquitherm(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/settings"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.sensors.outdoor.type != 1, 'online', 'offline') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_emergency_use_equitherm"); - doc[F("object_id")] = _prefix + F("_emergency_use_equitherm"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Use equitherm in emergency"); - doc[F("icon")] = F("mdi:snowflake-alert"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.emergency.useEquitherm }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"emergency\": {\"useEquitherm\" : true}}"); - doc[F("payload_off")] = F("{\"emergency\": {\"useEquitherm\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency_use_equitherm/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchHeating(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating"); - doc[F("object_id")] = _prefix + F("_heating"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Heating"); - doc[F("icon")] = F("mdi:radiator"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.heating.enable }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"heating\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"heating\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSwitchHeatingTurbo(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_turbo"); - doc[F("object_id")] = _prefix + F("_heating_turbo"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Turbo heating"); - doc[F("icon")] = F("mdi:rocket-launch-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.heating.turbo }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"heating\": {\"turbo\" : true}}"); - doc[F("payload_off")] = F("{\"heating\": {\"turbo\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating_turbo/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberHeatingTarget(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_target"); - doc[F("object_id")] = _prefix + F("_heating_target"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating target"); - doc[F("icon")] = F("mdi:radiator"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.heating.target|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}"); - doc[F("min")] = minTemp; - doc[F("max")] = maxTemp; - doc[F("step")] = 0.5; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_target/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberHeatingHysteresis(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_hysteresis"); - doc[F("object_id")] = _prefix + F("_heating_hysteresis"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating hysteresis"); - doc[F("icon")] = F("mdi:altimeter"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.heating.hysteresis|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"heating\": {\"hysteresis\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 5; - doc[F("step")] = 0.1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_hysteresis/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorHeatingSetpoint(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_setpoint"); - doc[F("object_id")] = _prefix + F("_heating_setpoint"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating setpoint"); - doc[F("icon")] = F("mdi:coolant-temperature"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_setpoint/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorCurrentHeatingMinTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_current_heating_min_temp"); - doc[F("object_id")] = _prefix + F("_current_heating_min_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Current heating min temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-down"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.parameters.heatingMinTemp|int(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/current_heating_min_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorCurrentHeatingMaxTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_current_heating_max_temp"); - doc[F("object_id")] = _prefix + F("_current_heating_max_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Current heating max temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-up"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.parameters.heatingMaxTemp|int(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/current_heating_max_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberHeatingMinTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_min_temp"); - doc[F("object_id")] = _prefix + F("_heating_min_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating min temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-down"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.heating.minTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"heating\": {\"minTemp\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 99; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_min_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberHeatingMaxTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_max_temp"); - doc[F("object_id")] = _prefix + F("_heating_max_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating max temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-up"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.heating.maxTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"heating\": {\"maxTemp\" : {{ value }}}}"); - doc[F("min")] = 1; - doc[F("max")] = 100; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_max_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchDHW(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw"); - doc[F("object_id")] = _prefix + F("_dhw"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("DHW"); - doc[F("icon")] = F("mdi:water-pump"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.dhw.enable }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"dhw\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"dhw\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberDHWTarget(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw_target"); - doc[F("object_id")] = _prefix + F("_dhw_target"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("DHW target"); - doc[F("icon")] = F("mdi:water-pump"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.dhw.target|int(0) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"dhw\": {\"target\" : {{ value|int(0) }}}}"); - doc[F("min")] = minTemp; - doc[F("max")] = maxTemp <= minTemp ? maxTemp : maxTemp; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorCurrentDHWMinTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_current_dhw_min_temp"); - doc[F("object_id")] = _prefix + F("_current_dhw_min_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Current DHW min temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-down"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.parameters.dhwMinTemp|int(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_min_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorCurrentDHWMaxTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_current_dhw_max_temp"); - doc[F("object_id")] = _prefix + F("_current_dhw_max_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Current DHW max temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-up"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.parameters.dhwMaxTemp|int(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_max_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberDHWMinTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw_min_temp"); - doc[F("object_id")] = _prefix + F("_dhw_min_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("DHW min temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-down"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.dhw.minTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"dhw\": {\"minTemp\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 99; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_min_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberDHWMaxTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw_max_temp"); - doc[F("object_id")] = _prefix + F("_dhw_max_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("DHW max temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-up"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.dhw.maxTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"dhw\": {\"maxTemp\" : {{ value }}}}"); - doc[F("min")] = 1; - doc[F("max")] = 100; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_max_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchPID(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_pid"); - doc[F("object_id")] = _prefix + F("_pid"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("PID"); - doc[F("icon")] = F("mdi:chart-bar-stacked"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.pid.enable }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"pid\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"pid\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/pid/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberPIDFactorP(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_pid_p"); - doc[F("object_id")] = _prefix + F("_pid_p"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("PID factor P"); - doc[F("icon")] = F("mdi:alpha-p-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.pid.p_factor|float(0)|round(3) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"pid\": {\"p_factor\" : {{ value }}}}"); - doc[F("min")] = 0.001; - doc[F("max")] = 10; - doc[F("step")] = 0.001; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_p_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberPIDFactorI(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_pid_i"); - doc[F("object_id")] = _prefix + F("_pid_i"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("PID factor I"); - doc[F("icon")] = F("mdi:alpha-i-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.pid.i_factor|float(0)|round(3) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"pid\": {\"i_factor\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 10; - doc[F("step")] = 0.001; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_i_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberPIDFactorD(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_pid_d"); - doc[F("object_id")] = _prefix + F("_pid_d"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("PID factor D"); - doc[F("icon")] = F("mdi:alpha-d-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.pid.d_factor|float(0)|round(3) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"pid\": {\"d_factor\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 10; - doc[F("step")] = 0.001; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_d_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberPIDMinTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_pid_min_temp"); - doc[F("object_id")] = _prefix + F("_pid_min_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("PID min temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-down"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.pid.minTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"pid\": {\"minTemp\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 99; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_min_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberPIDMaxTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_pid_max_temp"); - doc[F("object_id")] = _prefix + F("_pid_max_temp"); - doc[F("entity_category")] = F("config"); - doc[F("device_class")] = F("temperature"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("PID max temp"); - doc[F("icon")] = F("mdi:thermometer-chevron-up"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.pid.maxTemp|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"pid\": {\"maxTemp\" : {{ value }}}}"); - doc[F("min")] = 1; - doc[F("max")] = 100; - doc[F("step")] = 1; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_max_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchEquitherm(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_equitherm"); - doc[F("object_id")] = _prefix + F("_equitherm"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Equitherm"); - doc[F("icon")] = F("mdi:sun-snowflake-variant"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.equitherm.enable }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("payload_on")] = F("{\"equitherm\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"equitherm\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/equitherm/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberEquithermFactorN(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_equitherm_n"); - doc[F("object_id")] = _prefix + F("_equitherm_n"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Equitherm factor N"); - doc[F("icon")] = F("mdi:alpha-n-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.equitherm.n_factor|float(0)|round(3) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"equitherm\": {\"n_factor\" : {{ value }}}}"); - doc[F("min")] = 0.001; - doc[F("max")] = 5; - doc[F("step")] = 0.001; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_n_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberEquithermFactorK(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_equitherm_k"); - doc[F("object_id")] = _prefix + F("_equitherm_k"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Equitherm factor K"); - doc[F("icon")] = F("mdi:alpha-k-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.equitherm.k_factor|float(0)|round(2) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"equitherm\": {\"k_factor\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 10; - doc[F("step")] = 0.01; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_k_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberEquithermFactorT(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/settings"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.pid.enable, 'offline', 'online') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("unique_id")] = _prefix + F("_equitherm_t"); - doc[F("object_id")] = _prefix + F("_equitherm_t"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Equitherm factor T"); - doc[F("icon")] = F("mdi:alpha-t-circle-outline"); - doc[F("state_topic")] = _prefix + F("/settings"); - doc[F("value_template")] = F("{{ value_json.equitherm.t_factor|float(0)|round(2) }}"); - doc[F("command_topic")] = _prefix + F("/settings/set"); - doc[F("command_template")] = F("{\"equitherm\": {\"t_factor\" : {{ value }}}}"); - doc[F("min")] = 0; - doc[F("max")] = 10; - doc[F("step")] = 0.01; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_t_factor/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSwitchTuning(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_tuning"); - doc[F("object_id")] = _prefix + F("_tuning"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Tuning"); - doc[F("icon")] = F("mdi:tune-vertical"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("state_on")] = true; - doc[F("state_off")] = false; - doc[F("value_template")] = F("{{ value_json.tuning.enable }}"); - doc[F("command_topic")] = _prefix + F("/state/set"); - doc[F("payload_on")] = F("{\"tuning\": {\"enable\" : true}}"); - doc[F("payload_off")] = F("{\"tuning\": {\"enable\" : false}}"); - - client.beginPublish((F("homeassistant/switch/") + _prefix + F("/tuning/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSelectTuningRegulator(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("availability_mode")] = F("all"); - doc[F("command_topic")] = _prefix + F("/state/set"); - doc[F("command_template")] = F("{\"tuning\": {\"regulator\": {% if value == 'Equitherm' %}0{% elif value == 'PID' %}1{% endif %}}}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_tuning_regulator"); - doc[F("object_id")] = _prefix + F("_tuning_regulator"); - doc[F("entity_category")] = F("config"); - doc[F("name")] = F("Tuning regulator"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{% if value_json.tuning.regulator == 0 %}Equitherm{% elif value_json.tuning.regulator == 1 %}PID{% endif %}"); - doc[F("options")][0] = F("Equitherm"); - doc[F("options")][1] = F("PID"); - - client.beginPublish((F("homeassistant/select/") + _prefix + F("/tuning_regulator/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishBinSensorStatus(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_status"); - doc[F("object_id")] = _prefix + F("_status"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("problem"); - doc[F("name")] = F("Status"); - doc[F("icon")] = F("mdi:list-status"); - doc[F("state_topic")] = _prefix + F("/status"); - doc[F("value_template")] = F("{{ iif(value == 'online', 'OFF', 'ON') }}"); - doc[F("expire_after")] = 60; - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/status/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorOtStatus(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_ot_status"); - doc[F("object_id")] = _prefix + F("_ot_status"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("problem"); - doc[F("name")] = F("Opentherm status"); - doc[F("icon")] = F("mdi:list-status"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/ot_status/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorHeating(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating"); - doc[F("object_id")] = _prefix + F("_heating"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("running"); - doc[F("name")] = F("Heating"); - doc[F("icon")] = F("mdi:radiator"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorDHW(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw"); - doc[F("object_id")] = _prefix + F("_dhw"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("running"); - doc[F("name")] = F("DHW"); - doc[F("icon")] = F("mdi:water-pump"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorFlame(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_flame"); - doc[F("object_id")] = _prefix + F("_flame"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("running"); - doc[F("name")] = F("Flame"); - doc[F("icon")] = F("mdi:fire"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/flame/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorFault(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/state"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.states.otStatus, 'online', 'offline') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_fault"); - doc[F("object_id")] = _prefix + F("_fault"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("problem"); - doc[F("name")] = F("Fault"); - doc[F("icon")] = F("mdi:water-boiler-alert"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/fault/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishBinSensorDiagnostic(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_diagnostic"); - doc[F("object_id")] = _prefix + F("_diagnostic"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("problem"); - doc[F("name")] = F("Diagnostic"); - doc[F("icon")] = F("mdi:account-wrench"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}"); - - client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/diagnostic/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorFaultCode(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/state"); - doc[F("availability")][F("value_template")] = F("{{ iif(value_json.states.fault, 'online', 'offline') }}"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_fault_code"); - doc[F("object_id")] = _prefix + F("_fault_code"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("name")] = F("Fault code"); - doc[F("icon")] = F("mdi:chat-alert-outline"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/fault_code/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorRssi(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc["device"]["identifiers"][0] = _prefix; - doc["device"]["sw_version"] = _deviceVersion; - doc["device"]["manufacturer"] = _deviceManufacturer; - doc["device"]["model"] = _deviceModel; - doc["device"]["name"] = _deviceName; - if (_deviceConfigUrl) { - doc["device"]["configuration_url"] = _deviceConfigUrl; - } - - doc["enabled_by_default"] = enabledByDefault; - doc["unique_id"] = _prefix + "_rssi"; - doc["object_id"] = _prefix + "_rssi"; - doc["entity_category"] = "diagnostic"; - doc["device_class"] = "signal_strength"; - doc["state_class"] = "measurement"; - doc["unit_of_measurement"] = "dBm"; - doc["name"] = "RSSI"; - doc["icon"] = "mdi:signal"; - doc["state_topic"] = _prefix + F("/state"); - doc["value_template"] = "{{ value_json.states.rssi|float(0)|round(1) }}"; - - client.beginPublish((F("homeassistant/sensor/") + _prefix + "/rssi/config").c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishSensorModulation(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_modulation_level"); - doc[F("object_id")] = _prefix + F("_modulation_level"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("power_factor"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("%"); - doc[F("name")] = F("Modulation level"); - doc[F("icon")] = F("mdi:fire-circle"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/modulation/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorPressure(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_pressure"); - doc[F("object_id")] = _prefix + F("_pressure"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("pressure"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("bar"); - doc[F("name")] = F("Pressure"); - doc[F("icon")] = F("mdi:gauge"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/pressure/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishNumberIndoorTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_indoor_temp"); - doc[F("object_id")] = _prefix + F("_indoor_temp"); - doc[F("entity_category")] = F("config"); - //doc[F("entity_registry_visible_default")] = false; - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Indoor temperature"); - doc[F("icon")] = F("mdi:home-thermometer"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/state/set"); - doc[F("command_template")] = F("{\"temperatures\": {\"indoor\":{{ value }}}}"); - doc[F("min")] = -99; - doc[F("max")] = 99; - doc[F("step")] = 0.01; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorIndoorTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][0][F("topic")] = _prefix + F("/status"); - doc[F("availability_mode")] = F("any"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_indoor_temp"); - doc[F("object_id")] = _prefix + F("_indoor_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Indoor temperature"); - doc[F("icon")] = F("mdi:home-thermometer"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishNumberOutdoorTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_outdoor_temp"); - doc[F("object_id")] = _prefix + F("_outdoor_temp"); - doc[F("entity_category")] = F("config"); - //doc[F("entity_registry_visible_default")] = false; - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Outdoor temperature"); - doc[F("icon")] = F("mdi:home-thermometer-outline"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}"); - doc[F("command_topic")] = _prefix + F("/state/set"); - doc[F("command_template")] = F("{\"temperatures\": {\"outdoor\":{{ value }}}}"); - doc[F("min")] = -99; - doc[F("max")] = 99; - doc[F("step")] = 0.01; - doc[F("mode")] = "box"; - - client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorOutdoorTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][0][F("topic")] = _prefix + F("/status"); - doc[F("availability_mode")] = F("any"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_outdoor_temp"); - doc[F("object_id")] = _prefix + F("_outdoor_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Outdoor temperature"); - doc[F("icon")] = F("mdi:home-thermometer-outline"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorHeatingTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating_temp"); - doc[F("object_id")] = _prefix + F("_heating_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("Heating temperature"); - doc[F("icon")] = F("mdi:radiator"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishSensorDHWTemp(bool enabledByDefault = true) { - StaticJsonDocument<1536> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw_temp"); - doc[F("object_id")] = _prefix + F("_dhw_temp"); - doc[F("entity_category")] = F("diagnostic"); - doc[F("device_class")] = F("temperature"); - doc[F("state_class")] = F("measurement"); - doc[F("unit_of_measurement")] = F("°C"); - doc[F("name")] = F("DHW temperature"); - doc[F("icon")] = F("mdi:water-pump"); - doc[F("state_topic")] = _prefix + F("/state"); - doc[F("value_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}"); - - client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) { - StaticJsonDocument<2560> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_heating"); - doc[F("object_id")] = _prefix + F("_heating"); - doc[F("name")] = F("Heating"); - doc[F("icon")] = F("mdi:radiator"); - - doc[F("current_temperature_topic")] = _prefix + F("/state"); - doc[F("current_temperature_template")] = F("{% if value_json.temperatures.indoor|float(0) != 0 %}{{ value_json.temperatures.indoor|float(0)|round(2) }}" - "{% else %}{{ value_json.temperatures.heating|float(0)|round(2) }}{% endif %}"); - - doc[F("temperature_command_topic")] = _prefix + F("/settings/set"); - doc[F("temperature_command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}"); - - doc[F("temperature_state_topic")] = _prefix + F("/settings"); - doc[F("temperature_state_template")] = F("{{ value_json.heating.target|float(0)|round(1) }}"); - - doc[F("mode_command_topic")] = _prefix + F("/settings/set"); - doc[F("mode_command_template")] = F("{% if value == 'heat' %}{\"heating\": {\"enable\" : true}}" - "{% elif value == 'off' %}{\"heating\": {\"enable\" : false}}{% endif %}"); - doc[F("mode_state_topic")] = _prefix + F("/settings"); - doc[F("mode_state_template")] = F("{{ iif(value_json.heating.enable, 'heat', 'off') }}"); - doc[F("modes")][0] = F("off"); - doc[F("modes")][1] = F("heat"); - - doc[F("action_topic")] = _prefix + F("/state"); - doc[F("action_template")] = F("{{ iif(value_json.states.heating, 'heating', 'idle') }}"); - - doc[F("preset_mode_command_topic")] = _prefix + F("/settings/set"); - doc[F("preset_mode_command_template")] = F("{% if value == 'boost' %}{\"heating\": {\"turbo\" : true}}" - "{% elif value == 'none' %}{\"heating\": {\"turbo\" : false}}{% endif %}"); - doc[F("preset_mode_state_topic")] = _prefix + F("/settings"); - doc[F("preset_mode_value_template")] = F("{{ iif(value_json.heating.turbo, 'boost', 'none') }}"); - doc[F("preset_modes")][0] = F("boost"); - - doc[F("min_temp")] = minTemp; - doc[F("max_temp")] = maxTemp; - doc[F("temp_step")] = 0.5; - - client.beginPublish((F("homeassistant/climate/") + _prefix + F("_heating/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) { - StaticJsonDocument<2560> doc; - doc[F("availability")][F("topic")] = _prefix + F("/status"); - doc[F("device")][F("identifiers")][0] = _prefix; - doc[F("device")][F("sw_version")] = _deviceVersion; - doc[F("device")][F("manufacturer")] = _deviceManufacturer; - doc[F("device")][F("model")] = _deviceModel; - doc[F("device")][F("name")] = _deviceName; - if (_deviceConfigUrl) { - doc[F("device")][F("configuration_url")] = _deviceConfigUrl; - } - - doc[F("enabled_by_default")] = enabledByDefault; - doc[F("unique_id")] = _prefix + F("_dhw"); - doc[F("object_id")] = _prefix + F("_dhw"); - doc[F("name")] = F("DHW"); - doc[F("icon")] = F("mdi:water-pump"); - - doc[F("current_temperature_topic")] = _prefix + F("/state"); - doc[F("current_temperature_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(1) }}"); - - doc[F("temperature_command_topic")] = _prefix + F("/settings/set"); - doc[F("temperature_command_template")] = F("{\"dhw\": {\"target\" : {{ value|int(0) }}}}"); - - doc[F("temperature_state_topic")] = _prefix + F("/settings"); - doc[F("temperature_state_template")] = F("{{ value_json.dhw.target|int(0) }}"); - - doc[F("mode_command_topic")] = _prefix + F("/settings/set"); - doc[F("mode_command_template")] = F("{% if value == 'heat' %}{\"dhw\": {\"enable\" : true}}" - "{% elif value == 'off' %}{\"dhw\": {\"enable\" : false}}{% endif %}"); - doc[F("mode_state_topic")] = _prefix + F("/settings"); - doc[F("mode_state_template")] = F("{{ iif(value_json.dhw.enable, 'heat', 'off') }}"); - doc[F("modes")][0] = F("off"); - doc[F("modes")][1] = F("heat"); - - doc[F("action_topic")] = _prefix + F("/state"); - doc[F("action_template")] = F("{{ iif(value_json.states.dhw, 'heating', 'idle') }}"); - - doc[F("min_temp")] = minTemp; - doc[F("max_temp")] = maxTemp; - - client.beginPublish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), measureJson(doc), true); - serializeJson(doc, client); - return client.endPublish(); - } - - - bool deleteNumberOutdoorTemp() { - return client.publish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), NULL, true); - } - - bool deleteSensorOutdoorTemp() { - return client.publish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), NULL, true); - } - - bool deleteNumberIndoorTemp() { - return client.publish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), NULL, true); - } - - bool deleteSensorIndoorTemp() { - return client.publish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), NULL, true); - } - - bool deleteSwitchDHW() { - return client.publish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), NULL, true); - } - - bool deleteSensorCurrentDHWMinTemp() { - return client.publish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_min_temp/config")).c_str(), NULL, true); - } - - bool deleteSensorCurrentDHWMaxTemp() { - return client.publish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_max_temp/config")).c_str(), NULL, true); - } - - bool deleteNumberDHWMinTemp() { - return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_min_temp/config")).c_str(), NULL, true); - } - - bool deleteNumberDHWMaxTemp() { - return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_max_temp/config")).c_str(), NULL, true); - } - - bool deleteBinSensorDHW() { - return client.publish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), NULL, true); - } - - bool deleteSensorDHWTemp() { - return client.publish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), NULL, true); - } - - bool deleteNumberDHWTarget() { - return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), NULL, true); - } - - bool deleteClimateDHW() { - return client.publish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), NULL, true); - } - -private: - String _prefix = "opentherm"; - String _deviceVersion = "1.0"; - String _deviceManufacturer = "Community"; - String _deviceModel = "Opentherm Gateway"; - String _deviceName = "Opentherm Gateway"; - String _deviceConfigUrl = ""; -}; diff --git a/src/MqttTask.h b/src/MqttTask.h index fbe762b..3270b3e 100644 --- a/src/MqttTask.h +++ b/src/MqttTask.h @@ -1,11 +1,11 @@ #include #include #include -#include "HomeAssistantHelper.h" +#include "HaHelper.h" WiFiClient espClient; PubSubClient client(espClient); -HomeAssistantHelper haHelper; +HaHelper haHelper(client); class MqttTask : public Task { @@ -22,6 +22,8 @@ protected: client.setCallback(__callback); haHelper.setPrefix(settings.mqtt.prefix); haHelper.setDeviceVersion(OT_GATEWAY_VERSION); + haHelper.setDeviceModel("Opentherm Gateway"); + haHelper.setDeviceName("Opentherm Gateway"); sprintf(buffer, CONFIG_URL, WiFi.localIP().toString().c_str()); haHelper.setDeviceConfigUrl(buffer); @@ -192,21 +194,21 @@ protected: } if (!doc["pid"]["p_factor"].isNull() && doc["pid"]["p_factor"].is()) { - if (doc["pid"]["p_factor"].as() >= 0 && doc["pid"]["p_factor"].as() <= 20) { + if (doc["pid"]["p_factor"].as() > 0 && doc["pid"]["p_factor"].as() <= 10) { settings.pid.p_factor = round(doc["pid"]["p_factor"].as() * 1000) / 1000; flag = true; } } if (!doc["pid"]["i_factor"].isNull() && doc["pid"]["i_factor"].is()) { - if (doc["pid"]["i_factor"].as() >= 0 && doc["pid"]["i_factor"].as() <= 20) { + if (doc["pid"]["i_factor"].as() >= 0 && doc["pid"]["i_factor"].as() <= 10) { settings.pid.i_factor = round(doc["pid"]["i_factor"].as() * 1000) / 1000; flag = true; } } if (!doc["pid"]["d_factor"].isNull() && doc["pid"]["d_factor"].is()) { - if (doc["pid"]["d_factor"].as() >= 0 && doc["pid"]["d_factor"].as() <= 20) { + if (doc["pid"]["d_factor"].as() >= 0 && doc["pid"]["d_factor"].as() <= 10) { settings.pid.d_factor = round(doc["pid"]["d_factor"].as() * 1000) / 1000; flag = true; } @@ -233,21 +235,21 @@ protected: } if (!doc["equitherm"]["n_factor"].isNull() && doc["equitherm"]["n_factor"].is()) { - if (doc["equitherm"]["n_factor"].as() >= 0 && doc["equitherm"]["n_factor"].as() <= 20) { + if (doc["equitherm"]["n_factor"].as() > 0 && doc["equitherm"]["n_factor"].as() <= 10) { settings.equitherm.n_factor = round(doc["equitherm"]["n_factor"].as() * 1000) / 1000; flag = true; } } if (!doc["equitherm"]["k_factor"].isNull() && doc["equitherm"]["k_factor"].is()) { - if (doc["equitherm"]["k_factor"].as() >= 0 && doc["equitherm"]["k_factor"].as() <= 20) { + if (doc["equitherm"]["k_factor"].as() >= 0 && doc["equitherm"]["k_factor"].as() <= 10) { settings.equitherm.k_factor = round(doc["equitherm"]["k_factor"].as() * 1000) / 1000; flag = true; } } if (!doc["equitherm"]["t_factor"].isNull() && doc["equitherm"]["t_factor"].is()) { - if (doc["equitherm"]["t_factor"].as() >= 0 && doc["equitherm"]["t_factor"].as() <= 20) { + if (doc["equitherm"]["t_factor"].as() >= 0 && doc["equitherm"]["t_factor"].as() <= 10) { settings.equitherm.t_factor = round(doc["equitherm"]["t_factor"].as() * 1000) / 1000; flag = true; } @@ -330,7 +332,6 @@ protected: if (!doc["restart"].isNull() && doc["restart"].is() && doc["restart"].as()) { DEBUG("Received restart message..."); eeSettings.updateNow(); - Scheduler.delay(10000); DEBUG("Restart..."); ESP.restart();