mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-11 18:54:28 +05:00
1284 lines
53 KiB
C++
1284 lines
53 KiB
C++
#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 publishSelectOutdoorTempSource(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = F("{\"outdoorTempSource\": {% if value == 'Boiler' %}0{% elif value == 'Manual' %}1{% elif value == 'External' %}2{% endif %}}");
|
|
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 + "_outdoorTempSource";
|
|
doc["object_id"] = _prefix + "_outdoorTempSource";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Outdoor temperature source";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = F("{% if value_json.outdoorTempSource == 0 %}Boiler{% elif value_json.outdoorTempSource == 1 %}Manual{% elif value_json.outdoorTempSource == 2 %}External{% endif %}");
|
|
doc["options"][0] = F("Boiler");
|
|
doc["options"][1] = F("Manual");
|
|
doc["options"][2] = F("External");
|
|
|
|
client.beginPublish((F("homeassistant/select/") + _prefix + "/outdoorTempSource/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSwitchDebug(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 + "_debug";
|
|
doc["object_id"] = _prefix + "_debug";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Debug";
|
|
doc["icon"] = "mdi:code-braces";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.debug }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"debug\": true}";
|
|
doc["payload_off"] = "{\"debug\": false}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/debug/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchEmergency(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 + "_emergency";
|
|
doc["object_id"] = _prefix + "_emergency";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Use emergency";
|
|
doc["icon"] = "mdi:sun-snowflake-variant";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.emergency.enable }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"emergency\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"emergency\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/emergency/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberEmergencyTarget(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 + "_emergency_target";
|
|
doc["object_id"] = _prefix + "_emergency_target";
|
|
doc["entity_category"] = "config";
|
|
doc["device_class"] = "temperature";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Emergency target temp";
|
|
doc["icon"] = "mdi:thermometer-alert";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.emergency.target|float(0)|round(1) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"emergency\": {\"target\" : {{ value }}}}";
|
|
doc["min"] = 5;
|
|
doc["max"] = 50;
|
|
doc["step"] = 0.5;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/emergency_target/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSwitchEmergencyUseEquitherm(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/settings");
|
|
doc["availability"]["value_template"] = F("{{ iif(value_json.outdoorTempSource != 1, 'online', 'offline') }}");
|
|
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 + "_emergency_use_equitherm";
|
|
doc["object_id"] = _prefix + "_emergency_use_equitherm";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Use equitherm in emergency";
|
|
doc["icon"] = "mdi:snowflake-alert";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.emergency.useEquitherm }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"emergency\": {\"useEquitherm\" : true}}";
|
|
doc["payload_off"] = "{\"emergency\": {\"useEquitherm\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/emergency_use_equitherm/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchHeating(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating";
|
|
doc["object_id"] = _prefix + "_heating";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Heating";
|
|
doc["icon"] = "mdi:radiator";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.heating.enable }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"heating\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"heating\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/heating/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberHeatingTarget(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating_target";
|
|
doc["object_id"] = _prefix + "_heating_target";
|
|
doc["entity_category"] = "config";
|
|
doc["device_class"] = "temperature";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Heating target";
|
|
doc["icon"] = "mdi:radiator";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.heating.target|float(0)|round(1) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"heating\": {\"target\" : {{ value }}}}";
|
|
doc["min"] = minTemp;
|
|
doc["max"] = maxTemp;
|
|
doc["step"] = 0.5;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/heating_target/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberHeatingHysteresis(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 + "_heating_hysteresis";
|
|
doc["object_id"] = _prefix + "_heating_hysteresis";
|
|
doc["entity_category"] = "config";
|
|
doc["device_class"] = "temperature";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Heating hysteresis";
|
|
doc["icon"] = "mdi:altimeter";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.heating.hysteresis|float(0)|round(1) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"heating\": {\"hysteresis\" : {{ value }}}}";
|
|
doc["min"] = 0;
|
|
doc["max"] = 5;
|
|
doc["step"] = 0.1;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/heating_hysteresis/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorHeatingSetpoint(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating_setpoint";
|
|
doc["object_id"] = _prefix + "_heating_setpoint";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "temperature";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Heating setpoint";
|
|
doc["icon"] = "mdi:coolant-temperature";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.parameters.heatingSetpoint|int(0) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/heating_setpoint/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchDHW(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_dhw";
|
|
doc["object_id"] = _prefix + "_dhw";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "DHW";
|
|
doc["icon"] = "mdi:water-pump";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.dhw.enable }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"dhw\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"dhw\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/dhw/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberDHWTarget(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_dhw_target";
|
|
doc["object_id"] = _prefix + "_dhw_target";
|
|
doc["entity_category"] = "config";
|
|
doc["device_class"] = "temperature";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "DHW target";
|
|
doc["icon"] = "mdi:water-pump";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.dhw.target|int(0) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"dhw\": {\"target\" : {{ value|int(0) }}}}";
|
|
doc["min"] = minTemp;
|
|
doc["max"] = maxTemp;
|
|
doc["step"] = 1;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/dhw_target/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchPID(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 + "_pid";
|
|
doc["object_id"] = _prefix + "_pid";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "PID";
|
|
doc["icon"] = "mdi:chart-bar-stacked";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.pid.enable }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"pid\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"pid\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/pid/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberPIDFactorP(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["unique_id"] = _prefix + "_pid_p";
|
|
doc["object_id"] = _prefix + "_pid_p";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "PID factor P";
|
|
doc["icon"] = "mdi:alpha-p-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.pid.p_factor|float(0)|round(3) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"pid\": {\"p_factor\" : {{ value }}}}";
|
|
doc["min"] = 0.001;
|
|
doc["max"] = 10;
|
|
doc["step"] = 0.001;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/pid_p_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberPIDFactorI(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["unique_id"] = _prefix + "_pid_i";
|
|
doc["object_id"] = _prefix + "_pid_i";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "PID factor I";
|
|
doc["icon"] = "mdi:alpha-i-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.pid.i_factor|float(0)|round(3) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"pid\": {\"i_factor\" : {{ value }}}}";
|
|
doc["min"] = 0;
|
|
doc["max"] = 10;
|
|
doc["step"] = 0.001;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/pid_i_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberPIDFactorD(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["unique_id"] = _prefix + "_pid_d";
|
|
doc["object_id"] = _prefix + "_pid_d";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "PID factor D";
|
|
doc["icon"] = "mdi:alpha-d-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.pid.d_factor|float(0)|round(3) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"pid\": {\"d_factor\" : {{ value }}}}";
|
|
doc["min"] = 0;
|
|
doc["max"] = 10;
|
|
doc["step"] = 0.001;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/pid_d_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchEquitherm(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 + "_equitherm";
|
|
doc["object_id"] = _prefix + "_equitherm";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Equitherm";
|
|
doc["icon"] = "mdi:sun-snowflake-variant";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.equitherm.enable }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["payload_on"] = "{\"equitherm\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"equitherm\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/equitherm/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberEquithermFactorN(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["unique_id"] = _prefix + "_equitherm_n";
|
|
doc["object_id"] = _prefix + "_equitherm_n";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Equitherm factor N";
|
|
doc["icon"] = "mdi:alpha-n-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.equitherm.n_factor|float(0)|round(3) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"equitherm\": {\"n_factor\" : {{ value }}}}";
|
|
doc["min"] = 0.001;
|
|
doc["max"] = 5;
|
|
doc["step"] = 0.001;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/equitherm_n_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberEquithermFactorK(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["unique_id"] = _prefix + "_equitherm_k";
|
|
doc["object_id"] = _prefix + "_equitherm_k";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Equitherm factor K";
|
|
doc["icon"] = "mdi:alpha-k-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.equitherm.k_factor|float(0)|round(2) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"equitherm\": {\"k_factor\" : {{ value }}}}";
|
|
doc["min"] = 0;
|
|
doc["max"] = 10;
|
|
doc["step"] = 0.01;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/equitherm_k_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberEquithermFactorT(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/settings");
|
|
doc["availability"]["value_template"] = F("{{ iif(value_json.pid.enable, 'offline', 'online') }}");
|
|
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["unique_id"] = _prefix + "_equitherm_t";
|
|
doc["object_id"] = _prefix + "_equitherm_t";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Equitherm factor T";
|
|
doc["icon"] = "mdi:alpha-t-circle-outline";
|
|
doc["state_topic"] = _prefix + F("/settings");
|
|
doc["value_template"] = "{{ value_json.equitherm.t_factor|float(0)|round(2) }}";
|
|
doc["command_topic"] = _prefix + "/settings/set";
|
|
doc["command_template"] = "{\"equitherm\": {\"t_factor\" : {{ value }}}}";
|
|
doc["min"] = 0;
|
|
doc["max"] = 10;
|
|
doc["step"] = 0.01;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/equitherm_t_factor/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSwitchTuning(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 + "_tuning";
|
|
doc["object_id"] = _prefix + "_tuning";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Tuning";
|
|
doc["icon"] = "mdi:tune-vertical";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["state_on"] = true;
|
|
doc["state_off"] = false;
|
|
doc["value_template"] = "{{ value_json.tuning.enable }}";
|
|
doc["command_topic"] = _prefix + "/state/set";
|
|
doc["payload_on"] = "{\"tuning\": {\"enable\" : true}}";
|
|
doc["payload_off"] = "{\"tuning\": {\"enable\" : false}}";
|
|
|
|
client.beginPublish((F("homeassistant/switch/") + _prefix + "/tuning/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSelectTuningRegulator(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
doc["availability_mode"] = F("all");
|
|
doc["command_topic"] = _prefix + "/state/set";
|
|
doc["command_template"] = F("{\"tuning\": {\"regulator\": {% if value == 'Equitherm' %}0{% elif value == 'PID' %}1{% endif %}}}");
|
|
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 + "_tuning_regulator";
|
|
doc["object_id"] = _prefix + "_tuning_regulator";
|
|
doc["entity_category"] = "config";
|
|
doc["name"] = "Tuning regulator";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{% if value_json.tuning.regulator == 0 %}Equitherm{% elif value_json.tuning.regulator == 1 %}PID{% endif %}");
|
|
doc["options"][0] = F("Equitherm");
|
|
doc["options"][1] = F("PID");
|
|
|
|
client.beginPublish((F("homeassistant/select/") + _prefix + "/tuning_regulator/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishBinSensorStatus(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 + "_status";
|
|
doc["object_id"] = _prefix + "_status";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "problem";
|
|
doc["name"] = "Status";
|
|
doc["icon"] = "mdi:list-status";
|
|
doc["state_topic"] = _prefix + F("/status");
|
|
doc["value_template"] = "{{ iif(value == 'online', 'OFF', 'ON') }}";
|
|
doc["expire_after"] = 60;
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/status/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorOtStatus(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 + "_ot_status";
|
|
doc["object_id"] = _prefix + "_ot_status";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "problem";
|
|
doc["name"] = "Opentherm status";
|
|
doc["icon"] = "mdi:list-status";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}";
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/ot_status/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorHeating(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating";
|
|
doc["object_id"] = _prefix + "_heating";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "running";
|
|
doc["name"] = "Heating";
|
|
doc["icon"] = "mdi:radiator";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}");
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/heating/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorDHW(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_dhw";
|
|
doc["object_id"] = _prefix + "_dhw";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "running";
|
|
doc["name"] = "DHW";
|
|
doc["icon"] = "mdi:water-pump";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}");
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/dhw/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorFlame(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_flame";
|
|
doc["object_id"] = _prefix + "_flame";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "running";
|
|
doc["name"] = "Flame";
|
|
doc["icon"] = "mdi:fire";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}");
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/flame/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorFault(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/state");
|
|
doc["availability"]["value_template"] = F("{{ iif(value_json.states.otStatus, 'online', 'offline') }}");
|
|
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 + "_fault";
|
|
doc["object_id"] = _prefix + "_fault";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "problem";
|
|
doc["name"] = "Fault";
|
|
doc["icon"] = "mdi:water-boiler-alert";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ iif(value_json.states.fault, 'ON', 'OFF') }}";
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/fault/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishBinSensorDiagnostic(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_diagnostic";
|
|
doc["object_id"] = _prefix + "_diagnostic";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "problem";
|
|
doc["name"] = "Diagnostic";
|
|
doc["icon"] = "mdi:account-wrench";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}";
|
|
|
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + "/diagnostic/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorFaultCode(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/state");
|
|
doc["availability"]["value_template"] = F("{{ iif(value_json.states.fault, 'online', 'offline') }}");
|
|
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 + "_fault_code";
|
|
doc["object_id"] = _prefix + "_fault_code";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["name"] = "Fault code";
|
|
doc["icon"] = "mdi:chat-alert-outline";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}");
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/fault_code/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishSensorModulation(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_modulation_level";
|
|
doc["object_id"] = _prefix + "_modulation_level";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "power_factor";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "%";
|
|
doc["name"] = "Modulation level";
|
|
doc["icon"] = "mdi:fire-circle";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.sensors.modulation|float(0)|round(0) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/modulation/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorPressure(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_pressure";
|
|
doc["object_id"] = _prefix + "_pressure";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "pressure";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "bar";
|
|
doc["name"] = "Pressure";
|
|
doc["icon"] = "mdi:gauge";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.sensors.pressure|float(0)|round(2) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/pressure/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishNumberIndoorTemp(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
//doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_indoor_temp";
|
|
doc["object_id"] = _prefix + "_indoor_temp";
|
|
doc["entity_category"] = "config";
|
|
//doc["entity_registry_visible_default"] = false;
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Indoor temperature";
|
|
doc["icon"] = "mdi:home-thermometer";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.temperatures.indoor|float(0)|round(1) }}";
|
|
doc["command_topic"] = _prefix + "/state/set";
|
|
doc["command_template"] = "{\"temperatures\": {\"indoor\":{{ value }}}}";
|
|
doc["min"] = -70;
|
|
doc["max"] = 50;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/indoor_temp/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishNumberOutdoorTemp(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 + "_outdoor_temp";
|
|
doc["object_id"] = _prefix + "_outdoor_temp";
|
|
doc["entity_category"] = "config";
|
|
//doc["entity_registry_visible_default"] = false;
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Outdoor temperature";
|
|
doc["icon"] = "mdi:home-thermometer-outline";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.temperatures.outdoor|float(0)|round(1) }}";
|
|
doc["command_topic"] = _prefix + "/state/set";
|
|
doc["command_template"] = "{\"temperatures\": {\"outdoor\":{{ value }}}}";
|
|
doc["min"] = -70;
|
|
doc["max"] = 50;
|
|
|
|
client.beginPublish((F("homeassistant/number/") + _prefix + "/outdoor_temp/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorOutdoorTemp(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"][0]["topic"] = _prefix + F("/status");
|
|
doc["availability"][1]["topic"] = _prefix + F("/settings");
|
|
doc["availability"][1]["value_template"] = F("{{ iif(value_json.outdoorTempSource == 2, 'online', 'offline') }}");
|
|
doc["availability_mode"] = "any";
|
|
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 + "_outdoor_temp";
|
|
doc["object_id"] = _prefix + "_outdoor_temp";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "temperature";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Outdoor temperature";
|
|
doc["icon"] = "mdi:home-thermometer-outline";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.temperatures.outdoor|float(0)|round(1) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/outdoor_temp/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorHeatingTemp(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating_temp";
|
|
doc["object_id"] = _prefix + "_heating_temp";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "temperature";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "Heating temperature";
|
|
doc["icon"] = "mdi:radiator";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.temperatures.heating|float(0)|round(2) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/heating_temp/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishSensorDHWTemp(bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_dhw_temp";
|
|
doc["object_id"] = _prefix + "_dhw_temp";
|
|
doc["entity_category"] = "diagnostic";
|
|
doc["device_class"] = "temperature";
|
|
doc["state_class"] = "measurement";
|
|
doc["unit_of_measurement"] = "°C";
|
|
doc["name"] = "DHW temperature";
|
|
doc["icon"] = "mdi:water-pump";
|
|
doc["state_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = "{{ value_json.temperatures.dhw|float(0)|round(2) }}";
|
|
|
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/dhw_temp/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_heating";
|
|
doc["object_id"] = _prefix + "_heating";
|
|
doc["name"] = "Heating";
|
|
doc["icon"] = "mdi:radiator";
|
|
|
|
doc["current_temperature_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ value_json.temperatures.indoor|float(0)|round(2) }}");
|
|
|
|
doc["temperature_command_topic"] = _prefix + "/settings/set";
|
|
doc["temperature_command_template"] = "{\"heating\": {\"target\" : {{ value }}}}";
|
|
|
|
doc["temperature_state_topic"] = _prefix + F("/settings");
|
|
doc["temperature_state_template"] = F("{{ value_json.heating.target|float(0)|round(1) }}");
|
|
|
|
doc["mode_command_topic"] = _prefix + "/settings/set";
|
|
doc["mode_command_template"] = F("{% if value == 'heat' %}{\"heating\": {\"enable\" : true}}"
|
|
"{% elif value == 'off' %}{\"heating\": {\"enable\" : false}}{% endif %}");
|
|
doc["mode_state_topic"] = _prefix + F("/settings");
|
|
doc["mode_state_template"] = F("{{ iif(value_json.heating.enable, 'heat', 'off') }}");
|
|
doc["modes"][0] = "off";
|
|
doc["modes"][1] = "heat";
|
|
doc["min_temp"] = minTemp;
|
|
doc["max_temp"] = maxTemp;
|
|
doc["temp_step"] = 0.5;
|
|
|
|
client.beginPublish((F("homeassistant/climate/") + _prefix + "_heating/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) {
|
|
StaticJsonDocument<1536> doc;
|
|
doc["availability"]["topic"] = _prefix + F("/status");
|
|
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 + "_dhw";
|
|
doc["object_id"] = _prefix + "_dhw";
|
|
doc["name"] = "DHW";
|
|
doc["icon"] = "mdi:water-pump";
|
|
|
|
doc["current_temperature_topic"] = _prefix + F("/state");
|
|
doc["value_template"] = F("{{ value_json.temperatures.dhw|float(0)|round(1) }}");
|
|
|
|
doc["temperature_command_topic"] = _prefix + "/settings/set";
|
|
doc["temperature_command_template"] = "{\"dhw\": {\"target\" : {{ value|int(0) }}}}";
|
|
|
|
doc["temperature_state_topic"] = _prefix + F("/settings");
|
|
doc["temperature_state_template"] = F("{{ value_json.dhw.target|int(0) }}");
|
|
|
|
doc["mode_command_topic"] = _prefix + "/settings/set";
|
|
doc["mode_command_template"] = F("{% if value == 'heat' %}{\"dhw\": {\"enable\" : true}}"
|
|
"{% elif value == 'off' %}{\"dhw\": {\"enable\" : false}}{% endif %}");
|
|
doc["mode_state_topic"] = _prefix + F("/settings");
|
|
doc["mode_state_template"] = F("{{ iif(value_json.dhw.enable, 'heat', 'off') }}");
|
|
doc["modes"][0] = "off";
|
|
doc["modes"][1] = "heat";
|
|
doc["min_temp"] = minTemp;
|
|
doc["max_temp"] = maxTemp;
|
|
|
|
client.beginPublish((F("homeassistant/climate/") + _prefix + "_dhw/config").c_str(), measureJson(doc), true);
|
|
//BufferingPrint bufferedClient(client, 32);
|
|
//serializeJson(doc, bufferedClient);
|
|
//bufferedClient.flush();
|
|
serializeJson(doc, client);
|
|
return client.endPublish();
|
|
}
|
|
|
|
|
|
bool deleteNumberOutdoorTemp() {
|
|
return client.publish((F("homeassistant/number/") + _prefix + "/outdoor_temp/config").c_str(), NULL, true);
|
|
}
|
|
|
|
bool deleteSensorOutdoorTemp() {
|
|
return client.publish((F("homeassistant/sensor/") + _prefix + "/outdoor_temp/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 = "";
|
|
};
|