Merge branch 'dev-ventilation' into dev

This commit is contained in:
Robert van den Breemen 2021-05-02 17:41:43 +02:00
commit f39b68a37a
5 changed files with 592 additions and 91 deletions

View File

@ -25,8 +25,8 @@ TelnetStreamClass OTGWstream(OTGW_SERIAL_PORT);
typedef struct {
uint16_t Statusflags = 0; // flag8 / flag8 Master and Slave Status flags.
float TSet = 0.0; // f8.8 Control setpoint ie CH water temperature setpoint (°C)
uint16_t MConfigMMemberIDcode = 0; // flag8 / u8 Master Configuration Flags / Master MemberID Code
uint16_t SConfigSMemberIDcode = 0; // flag8 / u8 Slave Configuration Flags / Slave MemberID Code
uint16_t MasterConfigMemberIDcode = 0; // flag8 / u8 Master Configuration Flags / Master MemberID Code
uint16_t SlaveConfigMemberIDcode = 0; // flag8 / u8 Slave Configuration Flags / Slave MemberID Code
uint16_t Command = 0; // u8 / u8 Remote Command
uint16_t ASFflags = 0; // / OEM-fault-code flag8 / u8 Application-specific fault flags and OEM fault code
uint16_t RBPflags = 0; // flag8 / flag8 Remote boiler parameter transfer-enable & read/write flags
@ -79,23 +79,33 @@ typedef struct {
uint16_t ElectricityProduction = 0; // u16 Electricity production
uint16_t CumulativElectricityProduction = 0; // u16 Cumulativ Electricity production
//Solar Storage
uint16_t SolarStorageMaster = 0;
uint16_t SolarStorageASFflags = 0;
uint16_t SolarStorageSlaveConfigMemberIDcode = 0;
uint16_t SolarStorageVersionType = 0;
uint16_t SolarStorageTSP = 0;
uint16_t SolarStorageTSPindexTSPvalue = 0;
uint16_t SolarStorageFHBsize = 0;
uint16_t SolarStorageFHBindexFHBvalue = 0;
//Ventilation/HeatRecovery Msgids
uint16_t StatusVH = 0;
uint16_t ControlSetpointVH = 0; //should be uint8_t
uint16_t FaultFlagsCodeVH = 0;
uint16_t ASFFaultCodeVH = 0;
uint16_t DiagnosticCodeVH = 0;
uint16_t ConfigMemberIDVH = 0;
float OpenthermVersionVH = 0.0;
uint16_t VersionTypeVH = 0;
uint16_t RelativeVentilation = 0;
uint16_t RelativeHumidityVH = 0;
uint16_t CO2LevelVH = 0;
uint16_t RelativeHumidityExhaustAir = 0;
uint16_t CO2LevelExhaustAir = 0;
float SupplyInletTemperature = 0.0;
float SupplyOutletTemperature = 0.0;
float ExhaustInletTemperature = 0.0;
float ExhaustOutletTemperature = 0.0;
uint16_t ActualExhaustFanSpeed = 0;
uint16_t ActualInletFanSpeed = 0;
uint16_t ActualSupplyFanSpeed = 0;
uint16_t RemoteParameterSettingVH = 0;
uint16_t NominalVentilationValue = 0;
uint16_t TSPNumberVH = 0;
@ -103,8 +113,9 @@ typedef struct {
uint16_t FaultBufferSizeVH = 0;
uint16_t FaultBufferEntryVH = 0;
//Statitics
uint16_t BurnerUnsuccessfulStarts = 0;
uint16_t FlameSignalTooLow = 0;
uint16_t RemoteOverrideFunction = 0; // flag8 / - Function of manual and program changes in master and remote room setpoint.
uint16_t OEMDiagnosticCode = 0; // u16 OEM-specific diagnostic/service code
uint16_t BurnerStarts = 0; // u16 Number of starts burner
@ -159,8 +170,8 @@ enum OpenThermMessageType {
enum OpenThermMessageID {
OT_Statusflags, // flag8 / flag8 Master and Slave Status flags.
OT_TSet, // f8.8 Control setpoint ie CH water temperature setpoint (°C)
OT_MConfigMMemberIDcode, // flag8 / u8 Master Configuration Flags / Master MemberID Code
OT_SConfigSMemberIDcode, // flag8 / u8 Slave Configuration Flags / Slave MemberID Code
OT_MasterConfigMemberIDcode, // flag8 / u8 Master Configuration Flags / Master MemberID Code
OT_SlaveConfigMemberIDcode, // flag8 / u8 Slave Configuration Flags / Slave MemberID Code
OT_Command, // u8 / u8 Remote Command
OT_ASFflags, // / OEM-fault-code flag8 / u8 Application-specific fault flags and OEM fault code
OT_RBPflags, // flag8 / flag8 Remote boiler parameter transfer-enable & read/write flags
@ -203,20 +214,20 @@ enum OpenThermMessageID {
OT_Hcratio, // f8.8 OTC heat curve ratio (°C) (Remote parameter 3)
OT_StatusVH = 70, // flag8 / flag8 Status Ventilation/Heat recovery
OT_ControlSetpointVH, // u8 Control setpoint V/H
OT_FaultFlagsCodeVH, // flag8 / u8 Fault Flags/Code V/H
OT_ASFFaultCodeVH, // flag8 / u8 Aplication Specific Fault Flags/Code V/H
OT_DiagnosticCodeVH, // u16 Diagnostic Code V/H
OT_ConfigMemberIDVH, // flag8 / u8 Config/Member ID V/H
OT_OpenthermVersionVH, // f8.8 OpenTherm Version V/H
OT_VersionTypeVH, // u8 / u8 Version & Type V/H
OT_RelativeVentilation, // u8 Relative Ventilation (%)
OT_RelativeHumidityVH, // u8 / u8 Relative Humidity (%)
OT_CO2LevelVH, // u16 CO2 Level (ppm)
OT_RelativeHumidityExhaustAir, // u8 / u8 Relative Humidity (%)
OT_CO2LevelExhaustAir, // u16 CO2 Level (ppm)
OT_SupplyInletTemperature, // f8.8 Supply Inlet Temperature (°C)
OT_SupplyOutletTemperature, // f8.8 Supply Outlet Temperature(°C)
OT_ExhaustInletTemperature, // f8.8 Exhaust Inlet Temperature (°C)
OT_ExhaustOutletTemperature, // f8.8 Exhaust Outlet Temperature (°C)
OT_ActualExhaustFanSpeed, // u16 Actual Exhaust Fan Speed (rpm)
OT_ActualInletFanSpeed, // u16 Actual Inlet Fan Speed (rpm)
OT_ActualSupplyFanSpeed, // u16 Actual Supply Fan Speed (rpm)
OT_RemoteParameterSettingVH, // flag8 / flag8 Remote Parameter Setting V/H
OT_NominalVentilationValue, // u8 Nominal Ventilation Value
OT_TSPNumberVH, // u8 / u8 TSP Number V/H
@ -225,12 +236,22 @@ enum OpenThermMessageID {
OT_FaultBufferEntryVH, // u8 / u8 Fault Buffer Entry V/H
OT_RFstrengthbatterylevel=98, // u8 / u8 RF strength and battery level
OT_OperatingMode_HC1_HC2_DHW, // u8 / u8 Operating Mode HC1, HC2/ DHW
OT_RemoteOverrideFunction = 100, // flag8 / - Function of manual and program changes in master and remote room setpoint.
OT_ElectricityProducerStarts = 109, // u16 Electricity producer starts
OT_RemoteOverrideFunction, // flag8 / - Function of manual and program changes in master and remote room setpoint.
OT_SolarStorageMaster, // flag8 / flag8 Solar Storage Master flags.
OT_SolarStorageASFflags, // flag8 / u8 / Solar Storage OEM-fault-code flag8 / u8 Application-specific fault flags and OEM fault code
OT_SolarStorageSlaveConfigMemberIDcode, // flag8 / u8 Solar Storage Master Configuration Flags / Master MemberID Code
OT_SolarStorageVersionType, // u8 / u8 / Solar Storage product version number and type
OT_SolarStorageTSP, // u8 / u8 / Solar Storage Number of Transparent-Slave-Parameters supported
OT_SolarStorageTSPindexTSPvalue, // u8 / u8 / Solar Storage Index number / Value of referred-to transparent slave parameter
OT_SolarStorageFHBsize, // u8 /u8 / Solar Storage Size of Fault-History-Buffer supported by slave
OT_SolarStorageFHBindexFHBvalue, // u8 /u8 / Solar Storage Index number / Value of referred-to fault-history buffer entry
OT_ElectricityProducerStarts, // u16 Electricity producer starts
OT_ElectricityProducerHours, //u16 Electricity producer hours
OT_ElectricityProduction, //u16 Electricity production
OT_CumulativElectricityProduction, // u16 Cumulativ Electricity production
OT_OEMDiagnosticCode = 115, // u16 OEM-specific diagnostic/service code
OT_BurnerUnsuccessfulStarts, // u16 Number of Un-successful burner starts
OT_FlameSignalTooLow, //u16 Number of times flame signal too low
OT_OEMDiagnosticCode, // u16 OEM-specific diagnostic/service code
OT_BurnerStarts, // u16 Number of starts burner
OT_CHPumpStarts, // u16 Number of starts CH pump
OT_DHWPumpValveStarts, // u16 Number of starts DHW pump/valve
@ -263,11 +284,11 @@ enum OpenThermMessageID {
OTlookup_t OTmap[] = {
{ 0, OT_READ , ot_flag8flag8, "Status", "Master and Slave status", "" },
{ 1, OT_WRITE , ot_f88, "TSet", "Control setpoint", "°C" },
{ 2, OT_WRITE , ot_flag8u8, "MConfigMMemberIDcode", "Master Config / Member ID", "" },
{ 3, OT_READ , ot_flag8u8, "SConfigSMemberIDcode", "Slave Config / Member ID", "" },
{ 2, OT_WRITE , ot_flag8u8, "MasterConfigMemberIDcode", "Master Config / Member ID", "" },
{ 3, OT_READ , ot_flag8u8, "SlaveConfigMemberIDcode", "Slave Config / Member ID", "" },
{ 4, OT_RW , ot_u8u8, "Command", "Command-Code", "" },
{ 5, OT_READ , ot_flag8u8, "ASFflags", "Application-specific fault", "" },
{ 6, OT_READ , ot_flag8u8, "RBPflags", "Remote-parameter flags ", "" },
{ 6, OT_READ , ot_flag8u8, "RBPflags", "Remote-parameter flags", "" },
{ 7, OT_WRITE , ot_f88, "CoolingControl", "Cooling control signal", "%" },
{ 8, OT_WRITE , ot_f88, "TsetCH2", "Control setpoint for 2e CH circuit", "°C" },
{ 9, OT_READ , ot_f88, "TrOverride", "Remote override room setpoint", "" },
@ -290,7 +311,7 @@ enum OpenThermMessageID {
{ 26, OT_READ , ot_f88, "Tdhw", "DHW temperature", "°C" },
{ 27, OT_READ , ot_f88, "Toutside", "Outside temperature", "°C" },
{ 28, OT_READ , ot_f88, "Tret", "Return water temperature", "°C" },
{ 29, OT_READ , ot_f88, "Tshehehelarstorage", "Solar storage temperature", "°C" },
{ 29, OT_READ , ot_f88, "Tsolarstorage", "Solar storage temperature", "°C" },
{ 30, OT_READ , ot_s16, "Tsolarcollector", "Solar collector temperature", "°C" },
{ 31, OT_READ , ot_f88, "TflowCH2", "Flow water temperature CH2 circuit", "°C" },
{ 32, OT_READ , ot_f88, "Tdhw2", "Domestic hot water temperature 2", "°C" },
@ -333,20 +354,20 @@ enum OpenThermMessageID {
{ 69, OT_UNDEF , ot_undef, "", "", "" },
{ 70, OT_READ , ot_flag8flag8, "StatusVH", "Status Ventilation/Heat recovery", "" },
{ 71, OT_WRITE , ot_u8, "ControlSetpointVH", "Control setpoint V/H", "" },
{ 72, OT_READ , ot_flag8u8, "FaultFlagsCodeVH", "Fault Flags/Code V/H", "" },
{ 72, OT_READ , ot_flag8u8, "ASFFaultCodeVH", "Application-specific Fault Flags/Code V/H", "" },
{ 73, OT_READ , ot_u16, "DiagnosticCodeVH", "Diagnostic Code V/H", "" },
{ 74, OT_READ , ot_flag8u8, "ConfigMemberIDVH", "Config/Member ID V/H", "" },
{ 75, OT_READ , ot_f88, "OpenthermVersionVH", "OpenTherm Version V/H", "" },
{ 76, OT_READ , ot_u8u8, "VersionTypeVH", "Version & Type V/H", "" },
{ 77, OT_READ , ot_u8, "RelativeVentilation", "Relative Ventilation", "%" },
{ 78, OT_RW , ot_u8u8, "RelativeHumidityVH", "Relative Humidity V/H", "%" },
{ 79, OT_RW , ot_u16, "CO2LevelVH", "CO2 Level V/H", "ppm" },
{ 78, OT_RW , ot_u8u8, "RelativeHumidityExhaustAir", "Relative Humidity Exaust Air", "%" },
{ 79, OT_RW , ot_u16, "CO2LevelExhaustAir", "CO2 Level Exhaust Air", "ppm" },
{ 80, OT_READ , ot_f88, "SupplyInletTemperature", "Supply Inlet Temperature", "°C" },
{ 81, OT_READ , ot_f88, "SupplyOutletTemperature", "Supply Outlet Temperature", "°C" },
{ 82, OT_READ , ot_f88, "ExhaustInletTemperature", "Exhaust Inlet Temperature", "°C" },
{ 83, OT_READ , ot_f88, "ExhaustOutletTemperature", "Exhaust Outlet Temperature", "°C" },
{ 84, OT_READ , ot_u16, "ActualExhaustFanSpeed", "Actual Exhaust Fan Speed", "rpm" },
{ 85, OT_READ , ot_u16, "ActualInletFanSpeed", "Actual Inlet Fan Speed", "rpm" },
{ 85, OT_READ , ot_u16, "ActualSupplyFanSpeed", "Actual Supply Fan Speed", "rpm" },
{ 86, OT_READ , ot_flag8flag8, "RemoteParameterSettingVH", "Remote Parameter Setting V/H", "" },
{ 87, OT_RW , ot_u8, "NominalVentilationValue", "Nominal Ventilation Value", "" },
{ 88, OT_READ , ot_u8u8, "TSPNumberVH", "TSP Number V/H", "" },
@ -362,33 +383,33 @@ enum OpenThermMessageID {
{ 98, OT_READ , ot_u8u8, "RFstrengthbatterylevel", "RF strength and battery level", "" },
{ 99, OT_READ , ot_u8u8, "OperatingMode_HC1_HC2_DHW", "Operating Mode HC1, HC2/ DHW", "" },
{ 100, OT_READ , ot_flag8, "RoomRemoteOverrideFunction", "Function of manual and program changes in master and remote room setpoint.", "" },
{ 101, OT_UNDEF , ot_undef, "", "", "" },
{ 102, OT_UNDEF , ot_undef, "", "", "" },
{ 103, OT_UNDEF , ot_undef, "", "", "" },
{ 104, OT_UNDEF , ot_undef, "", "", "" },
{ 105, OT_UNDEF , ot_undef, "", "", "" },
{ 106, OT_UNDEF , ot_undef, "", "", "" },
{ 107, OT_UNDEF , ot_undef, "", "", "" },
{ 108, OT_UNDEF , ot_undef, "", "", "" },
{ 109, OT_READ , ot_u16, "ElectricityProducerStarts", "Electricity producer starts", "" },
{ 110, OT_READ , ot_u16, "ElectricityProducerHours", "Electricity producer hours", "" },
{ 111, OT_READ , ot_u16, "ElectricityProduction", "Electricity production", "" },
{ 112, OT_READ , ot_u16, "CumulativElectricityProduction", "Cumulativ Electricity production", "" },
{ 113, OT_UNDEF , ot_undef, "", "", "" },
{ 114, OT_UNDEF , ot_undef, "", "", "" },
{ 115, OT_READ , ot_u16, "OEMDiagnosticCode", "OEM-specific diagnostic/service code", "" },
{ 116, OT_RW , ot_u16, "BurnerStarts", "Nr of starts burner", "" },
{ 117, OT_RW , ot_u16, "CHPumpStarts", "Nr of starts CH pump", "" },
{ 118, OT_RW , ot_u16, "DHWPumpValveStarts", "Nr of starts DHW pump/valve", "" },
{ 119, OT_RW , ot_u16, "DHWBurnerStarts", "Nr of starts burner during DHW mode", "" },
{ 120, OT_RW , ot_u16, "BurnerOperationHours", "Nr of hours that burner is in operation (i.e. flame on)", "" },
{ 121, OT_RW , ot_u16, "CHPumpOperationHours", "Nr of hours that CH pump has been running", "" },
{ 122, OT_RW , ot_u16, "DHWPumpValveOperationHours", "Nr of hours that DHW pump has been running or DHW valve has been opened ", "" },
{ 123, OT_RW , ot_u16, "DHWBurnerOperationHours", "Nr of hours that burner is in operation during DHW mode", "" },
{ 124, OT_READ , ot_f88, "OpenThermVersionMaster", "Master Version OpenTherm Protocol Specification", "" },
{ 125, OT_READ , ot_f88, "OpenThermVersionSlave", "Slave Version OpenTherm Protocol Specification", "" },
{ 126, OT_READ , ot_u8u8, "MasterVersion", "Master product version number and type", "" },
{ 127, OT_READ , ot_u8u8, "SlaveVersion", "Slave product version number and type", "" },
{ 101, OT_READ , ot_flag8flag8, "SolarStorageMaster", "Solar Storage Master mode", "" },
{ 102, OT_READ , ot_flag8u8, "SolarStorageASFflags", "Solar Storage Application-specific flags and OEM fault", "" },
{ 103, OT_READ , ot_flag8u8, "SolarStorageSlaveConfigMemberIDcode", "Solar Storage Slave Config / Member ID", "" },
{ 104, OT_READ , ot_u8u8, "SolarStorageVersionType", "Solar Storage product version number and type", "" },
{ 105, OT_READ , ot_u8u8, "SolarStorageTSP", "Solar Storage Number of Transparent-Slave-Parameters supported", "" },
{ 106, OT_RW , ot_u8u8, "SolarStorageTSPindexTSPvalue", "Solar Storage Index number / Value of referred-to transparent slave parameter", "" },
{ 107, OT_READ , ot_u8u8, "SolarStorageFHBsize", "Solar Storage Size of Fault-History-Buffer supported by slave", "" },
{ 108, OT_READ , ot_u8u8, "SolarStorageFHBindexFHBvalue", "Solar Storage Index number / Value of referred-to fault-history buffer entry", "" },
{ 109, OT_READ , ot_u16, "ElectricityProducerStarts", "Electricity producer starts", "" },
{ 110, OT_READ , ot_u16, "ElectricityProducerHours", "Electricity producer hours", "" },
{ 111, OT_READ , ot_u16, "ElectricityProduction", "Electricity production", "" },
{ 112, OT_READ , ot_u16, "CumulativElectricityProduction", "Cumulativ Electricity production", "" },
{ 113, OT_RW , ot_u16, "BurnerUnsuccessfulStarts", "Nr of un-successful burner starts", "" },
{ 114, OT_RW , ot_u16, "FlameSignalTooLow", "Nr of times flame signal was too low", "" },
{ 115, OT_READ , ot_u16, "OEMDiagnosticCode", "OEM-specific diagnostic/service code", "" },
{ 116, OT_RW , ot_u16, "BurnerStarts", "Nr of starts burner", "" },
{ 117, OT_RW , ot_u16, "CHPumpStarts", "Nr of starts CH pump", "" },
{ 118, OT_RW , ot_u16, "DHWPumpValveStarts", "Nr of starts DHW pump/valve", "" },
{ 119, OT_RW , ot_u16, "DHWBurnerStarts", "Nr of starts burner during DHW mode", "" },
{ 120, OT_RW , ot_u16, "BurnerOperationHours", "Nr of hours that burner is in operation (i.e. flame on)", "" },
{ 121, OT_RW , ot_u16, "CHPumpOperationHours", "Nr of hours that CH pump has been running", "" },
{ 122, OT_RW , ot_u16, "DHWPumpValveOperationHours", "Nr of hours that DHW pump has been running or DHW valve has been opened ", "" },
{ 123, OT_RW , ot_u16, "DHWBurnerOperationHours", "Nr of hours that burner is in operation during DHW mode", "" },
{ 124, OT_READ , ot_f88, "OpenThermVersionMaster", "Master Version OpenTherm Protocol Specification", "" },
{ 125, OT_READ , ot_f88, "OpenThermVersionSlave", "Slave Version OpenTherm Protocol Specification", "" },
{ 126, OT_READ , ot_u8u8, "MasterVersion", "Master product version number and type", "" },
{ 127, OT_READ , ot_u8u8, "SlaveVersion", "Slave product version number and type", "" },
{ 128, OT_UNDEF , ot_undef, "", "", "" },
{ 129, OT_UNDEF , ot_undef, "", "", "" },
{ 130, OT_UNDEF , ot_undef, "", "", "" },

View File

@ -482,16 +482,16 @@ uint16_t print_status()
// 2: Cooling enable [ Cooling is disabled, Cooling is enabled]]
// 3: OTC active [OTC not active, OTC is active]
// 4: CH2 enable [CH2 is disabled, CH2 is enabled]
// 5: reserved
// 6: reserved
// 5: Summer/winter mode [Summertime, Wintertime]
// 6: DHW blocking [ DHW not blocking, DHW blocking ]
// 7: reserved
_flag8_master[0] = (((OTdata.valueHB) & 0x01) ? 'C' : '-');
_flag8_master[1] = (((OTdata.valueHB) & 0x02) ? 'D' : '-');
_flag8_master[2] = (((OTdata.valueHB) & 0x04) ? 'C' : '-');
_flag8_master[3] = (((OTdata.valueHB) & 0x08) ? 'O' : '-');
_flag8_master[4] = (((OTdata.valueHB) & 0x10) ? '2' : '-');
_flag8_master[5] = (((OTdata.valueHB) & 0x20) ? '.' : '-');
_flag8_master[6] = (((OTdata.valueHB) & 0x40) ? '.' : '-');
_flag8_master[5] = (((OTdata.valueHB) & 0x20) ? 'W' : 'S');
_flag8_master[6] = (((OTdata.valueHB) & 0x40) ? 'B' : '-');
_flag8_master[7] = (((OTdata.valueHB) & 0x80) ? '.' : '-');
_flag8_master[8] = '\0';
@ -503,6 +503,8 @@ uint16_t print_status()
sendMQTTData("cooling_enable", (((OTdata.valueHB) & 0x04) ? "ON" : "OFF"));
sendMQTTData("otc_active", (((OTdata.valueHB) & 0x08) ? "ON" : "OFF"));
sendMQTTData("ch2_enable", (((OTdata.valueHB) & 0x10) ? "ON" : "OFF"));
sendMQTTData("summerwintertime", (((OTdata.valueHB) & 0x20) ? "ON" : "OFF"));
sendMQTTData("dhw_blocking", (((OTdata.valueHB) & 0x40) ? "ON" : "OFF"));
//Slave
// 0: fault indication [ no fault, fault ]
@ -512,7 +514,7 @@ uint16_t print_status()
// 4: Cooling status [ cooling mode not active, cooling mode active ]
// 5: CH2 mode [CH2 not active, CH2 active]
// 6: diagnostic indication [no diagnostics, diagnostic event]
// 7: reserved
// 7: Electricity production [no eletric production, eletric production]
_flag8_slave[0] = (((OTdata.valueLB) & 0x01) ? 'E' : '-');
_flag8_slave[1] = (((OTdata.valueLB) & 0x02) ? 'C' : '-');
_flag8_slave[2] = (((OTdata.valueLB) & 0x04) ? 'W' : '-');
@ -520,7 +522,7 @@ uint16_t print_status()
_flag8_slave[4] = (((OTdata.valueLB) & 0x10) ? 'C' : '-');
_flag8_slave[5] = (((OTdata.valueLB) & 0x20) ? '2' : '-');
_flag8_slave[6] = (((OTdata.valueLB) & 0x40) ? 'D' : '-');
_flag8_slave[7] = (((OTdata.valueLB) & 0x80) ? '.' : '-');
_flag8_slave[7] = (((OTdata.valueLB) & 0x80) ? 'P' : '-');
_flag8_slave[8] = '\0';
OTGWDebugTf("%-37s = S[%s] \r\n", OTmap[OTdata.id].label, _flag8_slave);
@ -534,6 +536,7 @@ uint16_t print_status()
sendMQTTData("cooling", (((OTdata.valueLB) & 0x10) ? "ON" : "OFF"));
sendMQTTData("centralheating2", (((OTdata.valueLB) & 0x20) ? "ON" : "OFF"));
sendMQTTData("diagnostic_indicator", (((OTdata.valueLB) & 0x40) ? "ON" : "OFF"));
sendMQTTData("eletric_production", (((OTdata.valueLB) & 0x80) ? "ON" : "OFF"));
uint16_t _value = OTdata.u16();
@ -541,6 +544,102 @@ uint16_t print_status()
return _value;
}
uint16_t print_solar_storage_status()
{
char _msg[15] {0};
// Master Solar Storage
// ID101:HB012: Master Solar Storage: Solar mode
uint8_t MasterSolarMode = (OTdata.valueHB) & 0x7;
//Slave
// ID101:LB0: Slave Solar Storage: Fault indication
uint8_t SlaveSolarFaultIndicator = (OTdata.valueLB) & 0x01;
// ID101:LB123: Slave Solar Storage: Solar mode status
uint8_t SlaveSolarModeStatus = (OTdata.valueLB>>1) & 0x07;
// ID101:LB45: Slave Solar Storage: Solar status
uint8_t SlaveSolarStatus = (OTdata.valueLB>>4)& 0x03;
OTGWDebugf("%-37s = Solar Storage Master Mode [%d] \r\n", OTmap[OTdata.id].label, MasterSolarMode);
OTGWDebugf("%-37s = Slave Solar Fault Indicator [%d] \r\n", OTmap[OTdata.id].label, SlaveSolarFaultIndicator);
OTGWDebugf("%-37s = Slave Solar Mode Status [%d] \r\n", OTmap[OTdata.id].label, SlaveSolarModeStatus);
OTGWDebugf("%-37s = Slave Solar Status [%d] \r\n", OTmap[OTdata.id].label, SlaveSolarStatus);
sendMQTTData("solar_storage_master_mode", itoa(MasterSolarMode, _msg, 10));
sendMQTTData("solar_storage_slave_fault_incidator", ((SlaveSolarFaultIndicator) ? "ON" : "OFF"));
sendMQTTData("solar_storage_mode_status", itoa(SlaveSolarModeStatus, _msg, 10));
sendMQTTData("solar_storage_slave_status", itoa(SlaveSolarStatus, _msg, 10));
uint16_t _value = OTdata.u16();
OTGWDebugTf("Solar Storage Master / Slave Mode u16 [%04x] _value [%04x] hb [%02x] lb [%02x]\r\n", OTdata.u16(), _value, OTdata.valueHB, OTdata.valueLB);
return _value;
}
uint16_t print_statusVH()
{
char _flag8_master[8] {0};
char _flag8_slave[8] {0};
//bit: [clear/0, set/1]
// ID70:HB0: Master status ventilation / heat-recovery: Ventilation enable
// ID70:HB1: Master status ventilation / heat-recovery: Bypass postion
// ID70:HB2: Master status ventilation / heat-recovery: Bypass mode
// ID70:HB3: Master status ventilation / heat-recovery: Free ventilation mode
// 4: reserved
// 5: reserved
// 6: reserved
// 7: reserved
_flag8_master[0] = (((OTdata.valueHB) & 0x01) ? 'V' : '-');
_flag8_master[1] = (((OTdata.valueHB) & 0x02) ? 'P' : '-');
_flag8_master[2] = (((OTdata.valueHB) & 0x04) ? 'M' : '-');
_flag8_master[3] = (((OTdata.valueHB) & 0x08) ? 'F' : '-');
_flag8_master[4] = (((OTdata.valueHB) & 0x10) ? '.' : '-');
_flag8_master[5] = (((OTdata.valueHB) & 0x20) ? '.' : '-');
_flag8_master[6] = (((OTdata.valueHB) & 0x40) ? '.' : '-');
_flag8_master[7] = (((OTdata.valueHB) & 0x80) ? '.' : '-');
_flag8_master[8] = '\0';
OTGWDebugf("%-37s = VH Master [%s] \r\n", OTmap[OTdata.id].label, _flag8_master);
//Master Status
sendMQTTData("status_vh_master", _flag8_master);
sendMQTTData("vh_ventilation_enabled", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("vh_bypass_position", (((OTdata.valueHB) & 0x02) ? "ON" : "OFF"));
sendMQTTData("vh_bypass_mode", (((OTdata.valueHB) & 0x04) ? "ON" : "OFF"));
sendMQTTData("vh_free_ventlation_mode", (((OTdata.valueHB) & 0x08) ? "ON" : "OFF"));
//Slave
// ID70:LB0: Slave status ventilation / heat-recovery: Fault indication
// ID70:LB1: Slave status ventilation / heat-recovery: Ventilation mode
// ID70:LB2: Slave status ventilation / heat-recovery: Bypass status
// ID70:LB3: Slave status ventilation / heat-recovery: Bypass automatic status
// ID70:LB4: Slave status ventilation / heat-recovery: Free ventilation status
// ID70:LB6: Slave status ventilation / heat-recovery: Diagnostic indication
_flag8_slave[0] = (((OTdata.valueLB) & 0x01) ? 'F' : '-');
_flag8_slave[1] = (((OTdata.valueLB) & 0x02) ? 'V' : '-');
_flag8_slave[2] = (((OTdata.valueLB) & 0x04) ? 'P' : '-');
_flag8_slave[3] = (((OTdata.valueLB) & 0x08) ? 'A' : '-');
_flag8_slave[4] = (((OTdata.valueLB) & 0x10) ? 'F' : '-');
_flag8_slave[5] = (((OTdata.valueLB) & 0x20) ? '.' : '-');
_flag8_slave[6] = (((OTdata.valueLB) & 0x40) ? 'D' : '-');
_flag8_slave[7] = (((OTdata.valueLB) & 0x80) ? '.' : '-');
_flag8_slave[8] = '\0';
OTGWDebugTf("%-37s = S[%s] \r\n", OTmap[OTdata.id].label, _flag8_slave);
//Slave Status
sendMQTTData("status_vh_slave", _flag8_slave);
sendMQTTData("vh_fault", (((OTdata.valueLB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("vh_ventlation_mode", (((OTdata.valueLB) & 0x02) ? "ON" : "OFF"));
sendMQTTData("vh_bypass_status", (((OTdata.valueLB) & 0x04) ? "ON" : "OFF"));
sendMQTTData("vh_bypass_automatic_status", (((OTdata.valueLB) & 0x08) ? "ON" : "OFF"));
sendMQTTData("vh_free_ventliation_status", (((OTdata.valueLB) & 0x10) ? "ON" : "OFF"));
sendMQTTData("vh_diagnostic_indicator", (((OTdata.valueLB) & 0x40) ? "ON" : "OFF"));
uint16_t _value = OTdata.u16();
OTGWDebugTf("Status u16 [%04x] _value [%04x] hb [%02x] lb [%02x]\r\n", OTdata.u16(), _value, OTdata.valueHB, OTdata.valueLB);
return _value;
}
uint16_t print_ASFflags()
{
OTGWDebugf("%-37s = M[%s] OEM fault code [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueLB);
@ -567,7 +666,43 @@ uint16_t print_ASFflags()
sendMQTTData("low_water_pressure", (((OTdata.valueHB) & 0x04) ? "ON" : "OFF"));
sendMQTTData("gas_flame_fault", (((OTdata.valueHB) & 0x08) ? "ON" : "OFF"));
sendMQTTData("air_pressure_fault", (((OTdata.valueHB) & 0x10) ? "ON" : "OFF"));
sendMQTTData("water_over-temperature",(((OTdata.valueHB) & 0x20) ? "ON" : "OFF"));
sendMQTTData("water_over_temperature",(((OTdata.valueHB) & 0x20) ? "ON" : "OFF"));
return OTdata.u16();
}
uint16_t print_RBPflags()
{
OTGWDebugf("%-37s = M[%s] OEM fault code [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueLB);
//Build string for MQTT
char _msg[15] {0};
//Remote Boiler Paramaters
sendMQTTData("RBP_flags_transfer_enable", byte_to_binary(OTdata.valueHB));
sendMQTTData("RBP_flags_read_write", byte_to_binary(OTdata.valueLB));
//bit: [clear/0, set/1]
//0: DHW setpoint
//1: max CH setpoint
//2: reserved
//3: reserved
//4: reserved
//5: reserved
//6: reserved
//7: reserved
sendMQTTData("rbp_dhw_setpoint", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("rbp_max_ch_setpoint", (((OTdata.valueHB) & 0x02) ? "ON" : "OFF"));
//bit: [clear/0, set/1]
//0: read write DHW setpoint
//1: read write max CH setpoint
//2: reserved
//3: reserved
//4: reserved
//5: reserved
//6: reserved
//7: reserved
sendMQTTData("rbp_rw_dhw_setpoint", (((OTdata.valueLB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("rbp_rw_max_ch_setpoint", (((OTdata.valueLB) & 0x02) ? "ON" : "OFF"));
return OTdata.u16();
}
@ -591,14 +726,17 @@ uint16_t print_slavememberid()
// 4: Master low-off&pump control function [allowed,
// not allowed]
// 5: CH2 present [CH2 not present, CH2 present]
// 6: reserved
// 7: reserved
// 6: Remote water filling function
// 7: Heat/cool mode control
sendMQTTData("dhw_present", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("control_type", (((OTdata.valueHB) & 0x02) ? "ON" : "OFF"));
sendMQTTData("control_type_modulation", (((OTdata.valueHB) & 0x02) ? "ON" : "OFF"));
sendMQTTData("cooling_config", (((OTdata.valueHB) & 0x04) ? "ON" : "OFF"));
sendMQTTData("dhw_config", (((OTdata.valueHB) & 0x08) ? "ON" : "OFF"));
sendMQTTData("master_low_off_pump_control_function", (((OTdata.valueHB) & 0x10) ? "ON" : "OFF"));
sendMQTTData("ch2_present", (((OTdata.valueHB) & 0x20) ? "ON" : "OFF"));
sendMQTTData("remote_water_filling_function", (((OTdata.valueHB) & 0x40) ? "ON" : "OFF"));
sendMQTTData("heat_cool_mode_control", (((OTdata.valueHB) & 0x80) ? "ON" : "OFF"));
return OTdata.u16();
}
@ -608,11 +746,42 @@ uint16_t print_mastermemberid()
//Build string for MQTT
char _msg[15] {0};
sendMQTTData("master_configuration", byte_to_binary(OTdata.valueHB));
sendMQTTData("master_configuration_smart_power", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
utoa(OTdata.valueLB, _msg, 10);
sendMQTTData("master_memberid_code", _msg);
return OTdata.u16();
}
uint16_t print_vh_configmemberid()
{
OTGWDebugf("%-37s = VH Config[%s] MemberID code [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueLB);
//Build string for MQTT
char _msg[15] {0};
sendMQTTData("vh_configuration", byte_to_binary(OTdata.valueHB));
sendMQTTData("vh_configuration_system_type", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
sendMQTTData("vh_configuration_bypass", (((OTdata.valueHB) & 0x02) ? "ON" : "OFF"));
sendMQTTData("vh_configuration_speed_control", (((OTdata.valueHB) & 0x04) ? "ON" : "OFF"));
utoa(OTdata.valueLB, _msg, 10);
sendMQTTData("vh_memberid_code", _msg);
return OTdata.u16();
}
uint16_t print_solarstorage_slavememberid()
{
OTGWDebugf("%-37s = Solar Storage Slave Config[%s] MemberID code [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueLB);
//Build string for SendMQTT
sendMQTTData("solar_storage_slave_configuration", byte_to_binary(OTdata.valueHB));
char _msg[15] {0};
utoa(OTdata.valueLB, _msg, 10);
sendMQTTData("solar_storage_slave_memberid_code", _msg);
//ID103:HB0: Slave Configuration Solar Storage: System type1
sendMQTTData("solar_storage_system_type", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
return OTdata.u16();
}
uint16_t print_flag8u8()
{
OTGWDebugf("%-37s = M[%s] - [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueLB);
@ -663,6 +832,62 @@ uint16_t print_flag8flag8()
return OTdata.u16();
}
uint16_t print_vh_remoteparametersetting()
{
//Build string for MQTT
char _topic[50] {0};
//flag8 valueHB
OTGWDebugf("%-37s = HB flag8[%s] -[%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueHB), OTdata.valueHB);
strlcpy(_topic, messageIDToString(static_cast<OpenThermMessageID>(OTdata.id)), sizeof(_topic));
strlcat(_topic, "_hb_flag8", sizeof(_topic));
sendMQTTData(_topic, byte_to_binary(OTdata.valueHB));
sendMQTTData("vh_tramfer_enble_nominal_ventlation_value", (((OTdata.valueHB) & 0x01) ? "ON" : "OFF"));
//flag8 valueLB
OTGWDebugf("%-37s = LB flag8[%s] - [%3d]\r\n", OTmap[OTdata.id].label, byte_to_binary(OTdata.valueLB), OTdata.valueLB);
strlcpy(_topic, messageIDToString(static_cast<OpenThermMessageID>(OTdata.id)), sizeof(_topic));
strlcat(_topic, "_lb_flag8", sizeof(_topic));
sendMQTTData(_topic, byte_to_binary(OTdata.valueLB));
sendMQTTData("vh_rw_nominal_ventlation_value", (((OTdata.valueLB) & 0x01) ? "ON" : "OFF"));
return OTdata.u16();
}
uint16_t print_command()
{
//Known Commands
// ID4 (HB=1): Remote Request Boiler Lockout-reset
// ID4 (HB=2): Remote Request Water filling
// ID4 (HB=10): Remote Request Service request reset
OTGWDebugf("%-37s = %3d / %3d %s\r\n", OTmap[OTdata.id].label, (uint8_t)OTdata.valueHB, (uint8_t)OTdata.valueLB, OTmap[OTdata.id].unit);
//Build string for MQTT
char _topic[50] {0};
char _msg[10] {0};
//flag8 valueHB
utoa((OTdata.valueHB), _msg, 10);
OTGWDebugf("%-37s = HB u8[%s] [%3d]\r\n", OTmap[OTdata.id].label, _msg, OTdata.valueHB);
strlcpy(_topic, messageIDToString(static_cast<OpenThermMessageID>(OTdata.id)), sizeof(_topic));
strlcat(_topic, "_hb_u8", sizeof(_topic));
sendMQTTData(_topic, _msg);
strlcpy(_topic, messageIDToString(static_cast<OpenThermMessageID>(OTdata.id)), sizeof(_topic));
strlcat(_topic, "_remote_command", sizeof(_topic));
switch (OTdata.valueHB) {
case 1: sendMQTTData(_topic, "Remote Request Boiler Lockout-reset"); OTGWDebugf("%-37s = remote command [%s]\r\n", OTmap[OTdata.id].label, "Remote Request Boiler Lockout-reset"); break;
case 2: sendMQTTData(_topic, "Remote Request Water filling"); OTGWDebugf("%-37s = remote command [%s]\r\n", OTmap[OTdata.id].label, "Remote Request Water filling"); break;
case 10: sendMQTTData(_topic, "Remote Request Service request reset"); OTGWDebugf("%-37s = remote command [%s]\r\n", OTmap[OTdata.id].label, "Remote Request Service request reset");break;
default: sendMQTTData(_topic, "Unknown command"); OTGWDebugf("%-37s = remote command [%s]\r\n", OTmap[OTdata.id].label, "Unknown command");break;
}
//flag8 valueLB
utoa((OTdata.valueLB), _msg, 10);
OTGWDebugf("%-37s = LB u8[%s] [%3d]\r\n", OTmap[OTdata.id].label, _msg, OTdata.valueLB);
strlcpy(_topic, messageIDToString(static_cast<OpenThermMessageID>(OTdata.id)), sizeof(_topic));
strlcat(_topic, "_lb_u8", sizeof(_topic));
sendMQTTData(_topic, _msg);
return OTdata.u16();
}
uint16_t print_u8u8()
{
OTGWDebugf("%-37s = %3d / %3d %s\r\n", OTmap[OTdata.id].label, (uint8_t)OTdata.valueHB, (uint8_t)OTdata.valueLB, OTmap[OTdata.id].unit);
@ -1013,8 +1238,8 @@ void processOTGW(const char *buf, int len){
case OT_Tdhw: OTdataObject.Tdhw = print_f88(); break;
case OT_Toutside: OTdataObject.Toutside = print_f88(); break;
case OT_Tret: OTdataObject.Tret = print_f88(); break;
case OT_Tsolarstorage: OTdataObject.Tsolarstorage = print_f88(); break;
case OT_Tsolarcollector: OTdataObject.Tsolarcollector = print_s16(); break;
case OT_Tsolarstorage: OTdataObject.Tsolarstorage = print_f88(); break;
case OT_Tsolarcollector: OTdataObject.Tsolarcollector = print_s16(); break;
case OT_TflowCH2: OTdataObject.TflowCH2 = print_f88(); break;
case OT_Tdhw2: OTdataObject.Tdhw2 = print_f88(); break;
case OT_Texhaust: OTdataObject.Texhaust = print_s16(); break;
@ -1025,10 +1250,10 @@ void processOTGW(const char *buf, int len){
case OT_OpenThermVersionSlave: OTdataObject.OpenThermVersionSlave = print_f88(); break;
case OT_Statusflags: OTdataObject.Statusflags = print_status(); break;
case OT_ASFflags: OTdataObject.ASFflags = print_ASFflags(); break;
case OT_MConfigMMemberIDcode: OTdataObject.MConfigMMemberIDcode = print_mastermemberid(); break;
case OT_SConfigSMemberIDcode: OTdataObject.SConfigSMemberIDcode = print_slavememberid(); break;
case OT_Command: OTdataObject.Command = print_u8u8(); break;
case OT_RBPflags: OTdataObject.RBPflags = print_flag8flag8(); break;
case OT_MasterConfigMemberIDcode: OTdataObject.MasterConfigMemberIDcode = print_mastermemberid(); break;
case OT_SlaveConfigMemberIDcode: OTdataObject.SlaveConfigMemberIDcode = print_slavememberid(); break;
case OT_Command: OTdataObject.Command = print_command(); break;
case OT_RBPflags: OTdataObject.RBPflags = print_RBPflags(); break;
case OT_TSP: OTdataObject.TSP = print_u8u8(); break;
case OT_TSPindexTSPvalue: OTdataObject.TSPindexTSPvalue = print_u8u8(); break;
case OT_FHBsize: OTdataObject.FHBsize = print_u8u8(); break;
@ -1054,21 +1279,21 @@ void processOTGW(const char *buf, int len){
case OT_SlaveVersion: OTdataObject.SlaveVersion = print_u8u8(); break;
case OT_StatusVH: OTdataObject.StatusVH = print_flag8flag8(); break;
case OT_ControlSetpointVH: OTdataObject.ControlSetpointVH = print_u8u8(); break;
case OT_FaultFlagsCodeVH: OTdataObject.FaultFlagsCodeVH = print_flag8u8(); break;
case OT_ASFFaultCodeVH: OTdataObject.ASFFaultCodeVH = print_flag8u8(); break;
case OT_DiagnosticCodeVH: OTdataObject.DiagnosticCodeVH = print_u16(); break;
case OT_ConfigMemberIDVH: OTdataObject.ConfigMemberIDVH = print_flag8u8(); break;
case OT_ConfigMemberIDVH: OTdataObject.ConfigMemberIDVH = print_vh_configmemberid(); break;
case OT_OpenthermVersionVH: OTdataObject.OpenthermVersionVH = print_f88(); break;
case OT_VersionTypeVH: OTdataObject.VersionTypeVH = print_u8u8(); break;
case OT_RelativeVentilation: OTdataObject.RelativeVentilation = print_u8u8(); break;
case OT_RelativeHumidityVH: OTdataObject.RelativeHumidityVH = print_u8u8(); break;
case OT_CO2LevelVH: OTdataObject.CO2LevelVH = print_u16(); break;
case OT_RelativeHumidityExhaustAir: OTdataObject.RelativeHumidityExhaustAir = print_u8u8(); break;
case OT_CO2LevelExhaustAir: OTdataObject.CO2LevelExhaustAir = print_u16(); break;
case OT_SupplyInletTemperature: OTdataObject.SupplyInletTemperature = print_f88(); break;
case OT_SupplyOutletTemperature: OTdataObject.SupplyOutletTemperature = print_f88(); break;
case OT_ExhaustInletTemperature: OTdataObject.ExhaustInletTemperature = print_f88(); break;
case OT_ExhaustOutletTemperature: OTdataObject.ExhaustOutletTemperature = print_f88(); break;
case OT_ActualExhaustFanSpeed: OTdataObject.ActualExhaustFanSpeed = print_u16(); break;
case OT_ActualInletFanSpeed: OTdataObject.ActualInletFanSpeed = print_u16(); break;
case OT_RemoteParameterSettingVH: OTdataObject.RemoteParameterSettingVH = print_flag8flag8(); break;
case OT_ActualSupplyFanSpeed: OTdataObject.ActualSupplyFanSpeed = print_u16(); break;
case OT_RemoteParameterSettingVH: OTdataObject.RemoteParameterSettingVH = print_vh_remoteparametersetting(); break;
case OT_NominalVentilationValue: OTdataObject.NominalVentilationValue = print_u8u8(); break;
case OT_TSPNumberVH: OTdataObject.TSPNumberVH = print_u8u8(); break;
case OT_TSPEntryVH: OTdataObject.TSPEntryVH = print_u8u8(); break;
@ -1087,6 +1312,16 @@ void processOTGW(const char *buf, int len){
case OT_RemehadFdUcodes: OTdataObject.RemehadFdUcodes = print_u8u8(); break;
case OT_RemehaServicemessage: OTdataObject.RemehaServicemessage = print_u8u8(); break;
case OT_RemehaDetectionConnectedSCU: OTdataObject.RemehaDetectionConnectedSCU = print_u8u8(); break;
case OT_SolarStorageMaster: OTdataObject.SolarStorageMaster = print_solar_storage_status(); break;
case OT_SolarStorageASFflags: OTdataObject.SolarStorageASFflags = print_flag8u8(); break;
case OT_SolarStorageSlaveConfigMemberIDcode: OTdataObject.SolarStorageSlaveConfigMemberIDcode=print_solarstorage_slavememberid(); break;
case OT_SolarStorageVersionType: OTdataObject.SolarStorageVersionType = print_u8u8(); break;
case OT_SolarStorageTSP: OTdataObject.SolarStorageTSP = print_u8u8(); break;
case OT_SolarStorageTSPindexTSPvalue: OTdataObject.SolarStorageTSPindexTSPvalue = print_u8u8(); break;
case OT_SolarStorageFHBsize: OTdataObject.SolarStorageFHBsize = print_u8u8(); break;
case OT_SolarStorageFHBindexFHBvalue: OTdataObject.SolarStorageFHBindexFHBvalue = print_u8u8(); break;
case OT_BurnerUnsuccessfulStarts: OTdataObject.BurnerUnsuccessfulStarts = print_u16(); break;
case OT_FlameSignalTooLow: OTdataObject.FlameSignalTooLow = print_u16(); break;
default: DebugTf("Unknown message [%02d] value [%04X]\r\n"); break;
}
} else OTGWDebugf("\thb[%3d] lb[%3d]\r\n", OTdata.valueHB, OTdata.valueLB);
@ -1244,8 +1479,8 @@ String getOTGWValue(int msgid)
case OT_OpenThermVersionSlave: return String(OTdataObject.OpenThermVersionSlave); break;
case OT_Statusflags: return String(OTdataObject.Statusflags); break;
case OT_ASFflags: return String(OTdataObject.ASFflags); break;
case OT_MConfigMMemberIDcode: return String(OTdataObject.MConfigMMemberIDcode); break;
case OT_SConfigSMemberIDcode: return String(OTdataObject.SConfigSMemberIDcode); break;
case OT_MasterConfigMemberIDcode: return String(OTdataObject.MasterConfigMemberIDcode); break;
case OT_SlaveConfigMemberIDcode: return String(OTdataObject.SlaveConfigMemberIDcode); break;
case OT_Command: return String(OTdataObject.Command); break;
case OT_RBPflags: return String(OTdataObject.RBPflags); break;
case OT_TSP: return String(OTdataObject.TSP); break;
@ -1273,20 +1508,20 @@ String getOTGWValue(int msgid)
case OT_SlaveVersion: return String(OTdataObject.SlaveVersion); break;
case OT_StatusVH: return String(OTdataObject.StatusVH); break;
case OT_ControlSetpointVH: return String(OTdataObject.ControlSetpointVH); break;
case OT_FaultFlagsCodeVH: return String(OTdataObject.FaultFlagsCodeVH); break;
case OT_ASFFaultCodeVH: return String(OTdataObject.ASFFaultCodeVH); break;
case OT_DiagnosticCodeVH: return String(OTdataObject.DiagnosticCodeVH); break;
case OT_ConfigMemberIDVH: return String(OTdataObject.ConfigMemberIDVH); break;
case OT_OpenthermVersionVH: return String(OTdataObject.OpenthermVersionVH); break;
case OT_VersionTypeVH: return String(OTdataObject.VersionTypeVH); break;
case OT_RelativeVentilation: return String(OTdataObject.RelativeVentilation); break;
case OT_RelativeHumidityVH: return String(OTdataObject.RelativeHumidityVH); break;
case OT_CO2LevelVH: return String(OTdataObject.CO2LevelVH); break;
case OT_RelativeHumidityExhaustAir: return String(OTdataObject.RelativeHumidityExhaustAir); break;
case OT_CO2LevelExhaustAir: return String(OTdataObject.CO2LevelExhaustAir); break;
case OT_SupplyInletTemperature: return String(OTdataObject.SupplyInletTemperature); break;
case OT_SupplyOutletTemperature: return String(OTdataObject.SupplyOutletTemperature); break;
case OT_ExhaustInletTemperature: return String(OTdataObject.ExhaustInletTemperature); break;
case OT_ExhaustOutletTemperature: return String(OTdataObject.ExhaustOutletTemperature); break;
case OT_ActualExhaustFanSpeed: return String(OTdataObject.ActualExhaustFanSpeed); break;
case OT_ActualInletFanSpeed: return String(OTdataObject.ActualInletFanSpeed); break;
case OT_ActualSupplyFanSpeed: return String(OTdataObject.ActualSupplyFanSpeed); break;
case OT_RemoteParameterSettingVH: return String(OTdataObject.RemoteParameterSettingVH); break;
case OT_NominalVentilationValue: return String(OTdataObject.NominalVentilationValue); break;
case OT_TSPNumberVH: return String(OTdataObject.TSPNumberVH); break;
@ -1306,6 +1541,15 @@ String getOTGWValue(int msgid)
case OT_RemehadFdUcodes: return String(OTdataObject.RemehadFdUcodes); break;
case OT_RemehaServicemessage: return String(OTdataObject.RemehaServicemessage); break;
case OT_RemehaDetectionConnectedSCU: return String(OTdataObject.RemehaDetectionConnectedSCU); break;
case OT_SolarStorageMaster: return String(OTdataObject.SolarStorageMaster); break;
case OT_SolarStorageASFflags: return String(OTdataObject.SolarStorageASFflags); break;
case OT_SolarStorageSlaveConfigMemberIDcode: return String(OTdataObject.SolarStorageSlaveConfigMemberIDcode); break;
case OT_SolarStorageVersionType: return String(OTdataObject.SolarStorageVersionType); break;
case OT_SolarStorageTSP: return String(OTdataObject.SolarStorageTSP); break;
case OT_SolarStorageTSPindexTSPvalue: return String(OTdataObject.SolarStorageTSPindexTSPvalue); break;
case OT_SolarStorageFHBsize: return String(OTdataObject.SolarStorageFHBsize); break;
case OT_SolarStorageFHBindexFHBvalue: return String(OTdataObject.SolarStorageFHBindexFHBvalue); break;
default: return "Error: not implemented yet!\r\n";
}
}

View File

@ -50,6 +50,8 @@ Looking for the documentation, go here (work in progress): <br> https://github.
| Version | Release notes |
|-|-|
| 0.8.4 | Adding MsgID for Solar Storage<br>Verbose Status parsing for Ventlation / Heatrecovery<br>Adding msgid 113/114 unsuccessful burnerstart / flame too low<br>Added
smartpower configruation detection<br>Added 2.3 spec status bits for (summer/winter time, dhw blocking, service indicator, electricproduction)|
| 0.8.3 | New feature: Unique ID is configurable (thanks to @RobR)<br>New feature: GPIO pins follow status bits (master/slave) (thanks to @sjorsjuhmaniac)<br>Improved: Detecting online status of thermostat and boiler<br>Improved: MQTT Debug error logging<br>Fixed bug: reconnect MQTT timer and changed wait for reconnect to 42 seconds<br>Added: Rest API command now uses queues for sending commands<br>Fixed bug: msgid 32/33 type switch around<br>Changed: Solar Storage and Collector now proper names (breaking change)|
| 0.8.2 | Added: Command Queue to MQTT command topic<br>Bugfix: Values not updating in WebUI fixed<br>Added: verbose debug modes<br> Added check for littlefs githash<br>Added: Interval setting for sensor readout<br>Adding: Send OTGW commands on boot<br>Bugfix: Hostname now actually changes if needed.|
| 0.8.1 | Improved ot msg processing<br>MQTT: added `otgw-firmware/version`, `otgw-firmware/reboot_count`, `otgw-firmware/version` and `otgw-firmware/uptime` (seconds)<br>Bugfix: typoo in topic name `master_low_off_pomp_control_function` -> `master_low_off_pump_control_function`<br>Bugfix: Home Assistant thermostat operation mode (flame icon) template<br>Feature: Add support for Dallas temperature sensors, defaults GPIO10, pushes data to `otgw-firmware/sensors/<Dallas-sensor-ID>` |

View File

@ -0,0 +1,200 @@
https://www.opentherm.eu/request-details/?post_ids=1833
Informatoin from a Monitor OpenTherm for Mbus
ch: info
ch: service/diagnostics
cooling: info
cooling: service/diagnostics
dhw: info
dhw: service/diagnostics
general: info
general: service/diagnostics
solar: info
solar: service/diagnostics
ventilation: info
ventilation: service/diagnostics
OT messages supported
X ID0:HB0: Master status: CH enable
X ID0:HB1: Master status: DHW enable
X ID0:HB2: Master status: Cooling enable
X ID0:HB3: Master status: OTC active
X ID0:HB4: Master status: CH2 enable
* ID0:HB5: Master status: Summer/winter mode
* ID0:HB6: Master status: DHW blocking
X ID0:LB0: Slave Status: Fault indication
X ID0:LB1: Slave Status: CH mode
X ID0:LB2: Slave Status: DHW mode
X ID0:LB3: Slave Status: Flame status
X ID0:LB4: Slave Status: Cooling status
X ID0:LB5: Slave Status: CH2 mode
* ID0:LB6: Slave Status: Diagnostic/service indication
* ID0:LB7: Slave Status: Electricity production
X ID1: Control Setpoint i.e. CH water temperature Setpoint (°C)
X ID10: Number of Transparent-Slave-Parameters supported by slave
X ID100: Function of manual and program changes in master and remte room Setpoint
* ID101:HB012: Master Solar Storage: Solar mode
* ID101:LB0: Slave Solar Storage: Fault indication
* ID101:LB123: Slave Solar Storage: Solar mode status
* ID101:LB45: Slave Solar Storage: Solar status
*ID102: Application-specific fault flags and OEM fault code Solar Storage
* ID103:HB0: Slave Configuration Solar Storage: System type
* ID103:LB: Slave MemberID Code Solar Storage
*ID104: Solar Storage product version number and type
*ID105: Number of Transparent-Slave-Parameters supported by TSPs Solar Storage
*ID106: Index number / Value of referred-to transparent TSPs Solar Storage parameter
*ID107: Size of Fault-History-Buffer supported by Solar Storage
*ID108: Index number / Value of referred-to fault-history buffer entry Solar Stor
*ID109: Electricity producer starts
X ID11: Index number / Value of referred-to transparent slave parameter
X ID110: Electricity producer hours
X ID111: Electricity production
X ID112: Cumulativ Electricity production
* ID113: Number of un-successful burner starts
* ID114: Number of times flame signal was too low
X ID115: OEM-specific diagnostic/service code
X ID116: Number of succesful starts burner
X ID117: Number of starts CH pump
X ID118: Number of starts DHW pump/valve
X ID119: Number of starts burner during DHW mode
X ID12: Size of Fault-History-Buffer supported by slave
X ID120: Number of hours that burner is in operation (i.e. flame on)
X ID121: Number of hours that CH pump has been running
X ID122: Number of hours that DHW pump has been running or DHW valve has been opened
X ID123: Number of hours that burner is in operation during DHW mode
X ID124: The implemented version of the OpenTherm Protocol Specification in the master
X ID125: The implemented version of the OpenTherm Protocol Specification in the slave
X ID126: Master product version number and type
X ID127: Slave product version number and type
X ID13: Index number / Value of referred-to fault-history buffer entry
X ID14: Maximum relative modulation level setting (%)
X ID15: Maximum boiler capacity (kW) / Minimum boiler modulation level(%)
X ID16: Room Setpoint (°C)
X ID17: Relative Modulation Level (%)
X ID18: Water pressure in CH circuit (bar)
X ID19: Water flow rate in DHW circuit. (litres/minute)
* ID2:HB0: Master configuration: Smart power
X ID2:LB: Master MemberID Code
X ID20: Day of Week and Time of Day
X ID21: Calendar date
X ID22: Calendar year
X ID23: Room Setpoint for 2nd CH circuit (°C)
X ID24: Room temperature (°C)
X ID25: Boiler flow water temperature (°C)
X ID26: DHW temperature (°C)
X ID27: Outside temperature (°C)
X ID28: Return water temperature (°C)
X ID29: Solar storage temperature (°C)
X ID3:HB0: Slave configuration: DHW present
X ID3:HB1: Slave configuration: Control type
X ID3:HB2: Slave configuration: Cooling configuration
X ID3:HB3: Slave configuration: DHW configuration
X ID3:HB4: Slave configuration: Master low-off&pump control
X ID3:HB5: Slave configuration: CH2 present
* ID3:HB6: Slave configuration: Remote water filling function
* ID3:HB7: Heat/cool mode control
X ID3:LB: Slave MemberID Code
X ID30: Solar collector temperature (°C)
X ID31: Flow water temperature CH2 circuit (°C)
X ID32: Domestic hot water temperature 2 (°C)
X ID33: Boiler exhaust temperature (°C)
X ID34: Boiler heat exchanger temperature (°C)
X ID35: Boiler fan speed Setpoint and actual value
X ID36: Electrical current through burner flame [µA]
X ID37: Room temperature for 2nd CH circuit (°C)
X ID38: Relative Humidity
* ID4 (HB=1): Remote Request Boiler Lockout-reset
* ID4 (HB=10): Remote Request Service request reset
* ID4 (HB=2): Remote Request Water filling
X ID48: DHW Setpoint upper & lower bounds for adjustment (°C)
X ID49: Max CH water Setpoint upper & lower bounds for adjustment (°C)
X ID5:HB0: Service request
X ID5:HB1: Lockout-reset
X ID5:HB2: Low water pressure
X ID5:HB3: Gas/flame fault
X ID5:HB4: Air pressure fault
X ID5:HB5: Water over-temperature
X ID5:LB: OEM fault code
X ID56: DHW Setpoint (°C) (Remote parameter 1)
X ID57: Max CH water Setpoint (°C) (Remote parameters 2)
* ID6:HB0: Remote boiler parameter transfer-enable: DHW setpoint
* ID6:HB1: Remote boiler parameter transfer-enable: max. CH setpoint
* ID6:LB0: Remote boiler parameter read/write: DHW setpoint
* ID6:LB1: Remote boiler parameter read/write: max. CH setpoint
X ID7: Cooling control signal (%)
* ID70:HB0: Master status ventilation / heat-recovery: Ventilation enable
* ID70:HB1: Master status ventilation / heat-recovery: Bypass postion
* ID70:HB2: Master status ventilation / heat-recovery: Bypass mode
* ID70:HB3: Master status ventilation / heat-recovery: Free ventilation mode
* ID70:LB0: Slave status ventilation / heat-recovery: Fault indication
* ID70:LB1: Slave status ventilation / heat-recovery: Ventilation mode
* ID70:LB2: Slave status ventilation / heat-recovery: Bypass status
* ID70:LB3: Slave status ventilation / heat-recovery: Bypass automatic status
* ID70:LB4: Slave status ventilation / heat-recovery: Free ventilation status
* ID70:LB6: Slave status ventilation / heat-recovery: Diagnostic indication
X ID71: Relative ventilation position (0-100%). 0% is the minimum set ventilation and 100% is the maximum set ventilation
X ID72: Application-specific fault flags and OEM fault code ventilation / heat-recovery
X ID73: An OEM-specific diagnostic/service code for ventilation / heat-recovery system
* ID74:HB0: Slave Configuration ventilation / heat-recovery: System type
* ID74:HB1: Slave Configuration ventilation / heat-recovery: Bypass
* ID74:HB2: Slave Configuration ventilation / heat-recovery: Speed control
* ID74:LB: Slave MemberID Code ventilation / heat-recovery
X ID75: The implemented version of the OpenTherm Protocol Specification in the ventilation / heat-recovery system
X ID76: Ventilation / heat-recovery product version number and type
X ID77: Relative ventilation (0-100%)
X ID78: Relative humidity exhaust air (0-100%)
X ID79: CO2 level exhaust air (0-2000 ppm)
X ID8: Control Setpoint for 2e CH circuit (°C)
X ID80: Supply inlet temperature (°C)
X ID81: Supply outlet temperature (°C)
X ID82: Exhaust inlet temperature (°C)
X ID83: Exhaust outlet temperature (°C)
X ID84: Exhaust fan speed in rpm
* ID85: Supply fan speed in rpm
* ID86:HB0: Remote ventilation / heat-recovery parameter transfer-enable: Nominal ventilation value
* ID86:LB0: Remote ventilation / heat-recovery parameter read/write : Nominal ventilation value
X ID87: Nominal relative value for ventilation (0-100 %)
X ID88: Number of Transparent-Slave-Parameters supported by TSPs ventilation / heat-recovery
X ID89: Index number / Value of referred-to transparent TSPs ventilation / heat-recovery parameter
X ID9: Remote override room Setpoint
X ID90: Size of Fault-History-Buffer supported by ventilation / heat-recovery
X ID91: Index number / Value of referred-to fault-history buffer entry ventilation / heat-recovery
X ID98: For a specific RF sensor the RF strength and battery level is written
X ID99: perating Mode HC1, HC2/ Operating Mode DHW

View File

@ -55,15 +55,42 @@
%homeassistant%/binary_sensor/%node_id%/low_water_pressure/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-low_water_pressure", "name": "%hostname%_Low_water_press", "stat_t": "%mqtt_pub_topic%/low_water_pressure"}
%homeassistant%/binary_sensor/%node_id%/gas_flame_fault/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-gas_flame_fault", "name": "%hostname%_Gas_flame_fault", "stat_t": "%mqtt_pub_topic%/gas_flame_fault"}
%homeassistant%/binary_sensor/%node_id%/air_pressure_fault/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-air_pressure_fault", "name": "%hostname%_Air_press_fault", "stat_t": "%mqtt_pub_topic%/air_pressure_fault"}
%homeassistant%/binary_sensor/%node_id%/water_over-temperature/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-water_over-temperature", "name": "%hostname%_Water_over_temp", "stat_t": "%mqtt_pub_topic%/water_over-temperature"}
%homeassistant%/binary_sensor/%node_id%/water_over_temperature/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-water_over_temperature", "name": "%hostname%_Water_over_temp", "stat_t": "%mqtt_pub_topic%/water_over_temperature"}
// split
%homeassistant%/binary_sensor/%node_id%/dhw_present/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-dhw_present", "name": "%hostname%_DHW_present", "stat_t": "%mqtt_pub_topic%/dhw_present"}
%homeassistant%/binary_sensor/%node_id%/control_type/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-control_type", "name": "%hostname%_Control_type", "stat_t": "%mqtt_pub_topic%/control_type"}
%homeassistant%/binary_sensor/%node_id%/dhw_present/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-dhw_present", "name": "%hostname%_dhw_present", "stat_t": "%mqtt_pub_topic%/dhw_present"}
%homeassistant%/binary_sensor/%node_id%/control_type_modulation/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-control_type_modulation", "name": "%hostname%_control_type_modulation", "stat_t": "%mqtt_pub_topic%/control_type_modulation"}
%homeassistant%/binary_sensor/%node_id%/cooling_config/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-cooling_config", "name": "%hostname%_Cooling_configs", "stat_t": "%mqtt_pub_topic%/cooling_config"}
%homeassistant%/binary_sensor/%node_id%/dhw_config/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-dhw_config", "name": "%hostname%_DHW_config", "stat_t": "%mqtt_pub_topic%/dhw_config"}
%homeassistant%/binary_sensor/%node_id%/master_low_off_pump_control_function/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-master_low_off_pump_control_function", "name": "%hostname%_Master_low_off_pump_control_function", "stat_t": "%mqtt_pub_topic%/master_low_off_pump_control_function"}
%homeassistant%/binary_sensor/%node_id%/ch2_present/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-ch2_present", "name": "%hostname%_CH2_present", "stat_t": "%mqtt_pub_topic%/ch2_present"}
%homeassistant%/binary_sensor/%node_id%/ch2_present/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-ch2_present", "name": "%hostname%_ch2_present", "stat_t": "%mqtt_pub_topic%/ch2_present"}
%homeassistant%/binary_sensor/%node_id%/remote_water_filling_function/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-ch2_present", "name": "%hostname%_remote_water_filling_function", "stat_t": "%mqtt_pub_topic%/remote_water_filling_function"}
%homeassistant%/binary_sensor/%node_id%/heat_cool_mode_control/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-heat_cool_mode_control", "name": "%hostname%_heat_cool_mode_control", "stat_t": "%mqtt_pub_topic%/heat_cool_mode_control"}
// split
%homeassistant%/binary_sensor/%node_id%/master_configuration_smart_power/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-master_configuration_smart_power", "name": "%hostname%_master_configuration_smart_power", "stat_t": "%mqtt_pub_topic%/master_configuration_smart_power"}
// split
%homeassistant%/binary_sensor/%node_id%/vh_configuration_system_type/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_configuration_system_type", "name": "%hostname%_vh_configuration_system_type", "stat_t": "%mqtt_pub_topic%/vh_configuration_system_type"}
%homeassistant%/binary_sensor/%node_id%/vh_configuration_bypass/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_configuration_bypass", "name": "%hostname%_vh_configuration_bypass", "stat_t": "%mqtt_pub_topic%/vh_configuration_bypass"}
%homeassistant%/binary_sensor/%node_id%/vh_configuration_speed_control/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_configuration_speed_controle", "name": "%hostname%_vh_configuration_speed_control", "stat_t": "%mqtt_pub_topic%/vh_configuration_speed_control"}
// split
%homeassistant%/binary_sensor/%node_id%/vh_ventilation_enabled/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_ventilation_enabled", "name": "%hostname%_vh_ventilation_enabled", "stat_t": "%mqtt_pub_topic%/vh_ventilation_enabled"}
%homeassistant%/binary_sensor/%node_id%/vh_bypass_position/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_bypass_position", "name": "%hostname%_vh_bypass_position", "stat_t": "%mqtt_pub_topic%/vh_bypass_position"}
%homeassistant%/binary_sensor/%node_id%/vh_bypass_mode/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_bypass_mode", "name": "%hostname%_vh_bypass_mode", "stat_t": "%mqtt_pub_topic%/vh_bypass_mode"}
%homeassistant%/binary_sensor/%node_id%/vh_free_ventlation_mode/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_free_ventlation_mode", "name": "%hostname%_vh_free_ventlation_mode", "stat_t": "%mqtt_pub_topic%/vh_free_ventlation_mode"}
%homeassistant%/binary_sensor/%node_id%/vh_fault/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_fault", "name": "%hostname%_vh_fault", "stat_t": "%mqtt_pub_topic%/vh_fault"}
%homeassistant%/binary_sensor/%node_id%/vh_ventlation_mode/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_ventlation_mode", "name": "%hostname%_vh_ventlation_mode", "stat_t": "%mqtt_pub_topic%/vh_ventlation_mode"}
%homeassistant%/binary_sensor/%node_id%/vh_bypass_status/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_bypass_status", "name": "%hostname%_vh_bypass_status", "stat_t": "%mqtt_pub_topic%/vh_bypass_status"}
%homeassistant%/binary_sensor/%node_id%/vh_bypass_automatic_status/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_bypass_automatic_status", "name": "%hostname%_vh_bypass_automatic_status", "stat_t": "%mqtt_pub_topic%/vh_bypass_automatic_status"}
%homeassistant%/binary_sensor/%node_id%/vh_free_ventliation_status/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_free_ventliation_status", "name": "%hostname%_vh_free_ventliation_status", "stat_t": "%mqtt_pub_topic%/vh_free_ventliation_status"}
%homeassistant%/binary_sensor/%node_id%/vh_diagnostic_indicator/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-vh_diagnostic_indicator", "name": "%hostname%_vh_diagnostic_indicator", "stat_t": "%mqtt_pub_topic%/vh_diagnostic_indicator"}
// split
%homeassistant%/binary_sensor/%node_id%/solar_storage_system_type/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-solar_storage_system_type", "name": "%hostname%_solar_storage_system_type", "stat_t": "%mqtt_pub_topic%/solar_storage_system_type"}
%homeassistant%/binary_sensor/%node_id%/solar_storage_slave_fault_incidator/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-solar_storage_slave_fault_incidator", "name": "%hostname%_solar_storage_slave_fault_incidator", "stat_t": "%mqtt_pub_topic%/solar_storage_slave_fault_incidator"}
// split
%homeassistant%/binary_sensor/%node_id%/rbp_dhw_setpoint/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-rbp_dhw_setpoint", "name": "%hostname%_rbp_dhw_setpoint", "stat_t": "%mqtt_pub_topic%/rbp_dhw_setpoint"}
%homeassistant%/binary_sensor/%node_id%/rbp_max_ch_setpoint/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-rbp_max_ch_setpoint", "name": "%hostname%_rbp_max_ch_setpoint", "stat_t": "%mqtt_pub_topic%/rbp_max_ch_setpoint"}
%homeassistant%/binary_sensor/%node_id%/rbp_rw_dhw_setpoint/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-rbp_rw_dhw_setpoint", "name": "%hostname%_rbp_rw_dhw_setpoint", "stat_t": "%mqtt_pub_topic%/rbp_rw_dhw_setpoint"}
%homeassistant%/binary_sensor/%node_id%/rbp_rw_max_ch_setpoint/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-rbp_rw_max_ch_setpointr", "name": "%hostname%_rbp_rw_max_ch_setpoint", "stat_t": "%mqtt_pub_topic%/rbp_rw_max_ch_setpoint"}
//
// Configuration topic no2: %homeassistant%/sensor/<name node>/config
// Configuration payload no1: {"device_class": "temperature", "name": "%hostname%_Temperature", "stat_t": "%mqtt_pub_topic%/<sensor name>>", "unit_of_measurement": "°C", "value_template": "{{ value_json.temperature}}" }
%homeassistant%/sensor/%node_id%/TSet/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-TSet", "device_class": "temperature", "name": "%hostname%_Control_setpoint", "stat_t": "%mqtt_pub_topic%/TSet", "unit_of_measurement": "°C", "value_template": "{{ value }}" }
@ -91,14 +118,16 @@
%homeassistant%/sensor/%node_id%/OpenThermVersionMaster/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-OpenThermVersionMaster", "name": "%hostname%_Master_OT_protocol_version", "stat_t": "%mqtt_pub_topic%/OpenThermVersionMaster", "unit_of_measurement": "l/min", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/OpenThermVersionSlave/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-OpenThermVersionSlave", "name": "%hostname%_Slave_OT_protocol_version", "stat_t": "%mqtt_pub_topic%/OpenThermVersionSlave", "unit_of_measurement": "l/min", "value_template": "{{ value }}" }
// Statistics
%homeassistant%/sensor/%node_id%/BurnerStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-BurnerStarts", "name": "%hostname%_Nr_of_starts_burner", "stat_t": "%mqtt_pub_topic%/BurnerStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/CHPumpStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-CHPumpStarts", "name": "%hostname%_Nr_of_starts_CH_pump", "stat_t": "%mqtt_pub_topic%/CHPumpStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWPumpValveStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWPumpValveStarts", "name": "%hostname%_Nr_of_starts_DHW_pump or valve", "stat_t": "%mqtt_pub_topic%/DHWPumpValveStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWBurnerStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWBurnerStarts", "name": "%hostname%_Nr_of_starts_burner_during DHW", "stat_t": "%mqtt_pub_topic%/DHWBurnerStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/BurnerOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-BurnerOperationHours", "name": "%hostname%_Nr_of_hours_burner_operation", "stat_t": "%mqtt_pub_topic%/BurnerOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/CHPumpOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-CHPumpOperationHours", "name": "%hostname%_Nr_of_hours_CH_pump running", "stat_t": "%mqtt_pub_topic%/CHPumpOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWPumpValveOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWPumpValveOperationHours", "name": "%hostname%_Nr_of_hours_DHW_valve open", "stat_t": "%mqtt_pub_topic%/DHWPumpValveOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWBurnerOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWBurnerOperationHours", "name": "%hostname%_Nr_of_hours_burner_operation DHW", "stat_t": "%mqtt_pub_topic%/DHWBurnerOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/BurnerStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-BurnerStarts", "name": "%hostname%_BurnerStarts", "stat_t": "%mqtt_pub_topic%/BurnerStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/CHPumpStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-CHPumpStarts", "name": "%hostname%_CHPumpStarts", "stat_t": "%mqtt_pub_topic%/CHPumpStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWPumpValveStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWPumpValveStarts", "name": "%hostname%_DHWPumpValveStarts", "stat_t": "%mqtt_pub_topic%/DHWPumpValveStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWBurnerStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWBurnerStarts", "name": "%hostname%_DHWBurnerStarts", "stat_t": "%mqtt_pub_topic%/DHWBurnerStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/BurnerOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-BurnerOperationHours", "name": "%hostname%_BurnerOperationHours", "stat_t": "%mqtt_pub_topic%/BurnerOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/CHPumpOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-CHPumpOperationHours", "name": "%hostname%_CHPumpOperationHoursg", "stat_t": "%mqtt_pub_topic%/CHPumpOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWPumpValveOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWPumpValveOperationHours", "name": "%hostname%_DHWPumpValveOperationHours", "stat_t": "%mqtt_pub_topic%/DHWPumpValveOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/DHWBurnerOperationHours/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-DHWBurnerOperationHours", "name": "%hostname%_DHWBurnerOperationHours DHW", "stat_t": "%mqtt_pub_topic%/DHWBurnerOperationHours", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/BurnerUnsuccessfulStarts/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-BurnerUnsuccessfulStarts", "name": "%hostname%_BurnerUnsuccessfulStarts", "stat_t": "%mqtt_pub_topic%/BurnerUnsuccessfulStarts", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/FlameSignalTooLow/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-FlameSignalTooLow", "name": "%hostname%_FlameSignalTooLow", "stat_t": "%mqtt_pub_topic%/FlameSignalTooLow", "unit_of_measurement": "", "value_template": "{{ value }}" }
// split
%homeassistant%/sensor/%node_id%/status_master/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-status_master", "name": "%hostname%_Status_Master", "stat_t": "%mqtt_pub_topic%/status_master", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/status_slave/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-status_slave", "name": "%hostname%_Status_Slave", "stat_t": "%mqtt_pub_topic%/status_slave", "unit_of_measurement": "", "value_template": "{{ value }}" }
@ -110,3 +139,8 @@
%homeassistant%/sensor/%node_id%/master_memberid_code/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-master_memberid_code", "name": "%hostname%_Status_Master_Memberid_Code", "stat_t": "%mqtt_pub_topic%/master_memberid_code", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/slave_configuration/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-slave_configuration", "name": "%hostname%_Status_Slave_Configuration", "stat_t": "%mqtt_pub_topic%/slave_configuration", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/slave_memberid_code/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-slave_memberid_code", "name": "%hostname%_Status_Slave_Memberid_Code", "stat_t": "%mqtt_pub_topic%/slave_memberid_code", "unit_of_measurement": "", "value_template": "{{ value }}" }
// split
%homeassistant%/sensor/%node_id%/solar_storage_master_mode/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-solar_storage_master_mode", "name": "%hostname%_solar_storage_master_mode", "stat_t": "%mqtt_pub_topic%/solar_storage_master_mode", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/solar_storage_mode_status/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-solar_storage_mode_status", "name": "%hostname%_solar_storage_mode_status", "stat_t": "%mqtt_pub_topic%/solar_storage_mode_status", "unit_of_measurement": "", "value_template": "{{ value }}" }
%homeassistant%/sensor/%node_id%/solar_storage_slave_status/config , {"avty_t": "%mqtt_pub_topic%", "dev": {"identifiers": "%node_id%", "manufacturer": "Schelte Bron", "model": "otgw-nodo", "name": "OpenTherm Gateway (%hostname%)", "sw_version": "%version%"}, "uniq_id": "%node_id%-solar_storage_slave_status", "name": "%hostname%_solar_storage_slave_status", "stat_t": "%mqtt_pub_topic%/solar_storage_slave_status", "unit_of_measurement": "", "value_template": "{{ value }}" }
// split