Package: pyotgw
pyotgwA python library to interface with the OpenTherm GatewaySeehttp://otgw.tclcode.comfor the hardware.This library is written primarily for use with Home Assistant (https://www.home-assistant.io) but can be used for other purposes as well.
Parts of the code have not been thoroughly tested since my thermostat and boiler do not support all OpenTherm features. Feel free to test and contribute where you see fit.ContentsLibrary ReferenceGeneralGetting DataMethodsUsage ExampleDevelopmentStatus Dict StructureLibrary ReferenceGeneralpyotgw exposes its OpenThermGateway class which usespyserial-asyncioto connect to the OpenTherm Gateway.
After initialization of the object,OpenThermGateway.connect()should be used to establish a connection. The object will maintain the connection in the background, using it to send commands and continuously receive updates. The received information will be cached on the object for instant availability.
The OpenThermGateway object implements a watchdog to monitor the connection for inactivity. DuringOpenThermGateway.connect(), an inactivity timeout can be set for this purpose. Normally, the OpenTherm Gateway will send a message on its serial interface approximately every second. If no messages are received for the duration of the timeout, the watchdog will trigger a reconnection attempt.Getting DataThere are multiple ways to get information from pyotgw. CallingOpenThermGateway.connect()will request some initial information from the Gateway and return it in a dict. After this, the OpenThermGateway object exposes quite a few methods which return values that are cached on the object. There is also the option to register a callback withOpenThermGateway.subscribe()which will be called when any value changes.MethodsOpenThermGateway()The OpenThermGateway constructor takes no arguments and returns an empty OpenThermGateway object.OpenThermGateway.add_alternative(self, alt, timeout=OTGW_DEFAULT_TIMEOUT)Add the specified data-ID to the list of alternative commands to send to the boiler instead of a data-ID that is known to be unsupported by the boiler.
Alternative data-IDs will always be sent to the boiler in a Read-Data request message with the data-value set to zero. The table of alternative data-IDs is stored in non-volatile memory so it will persist even if the gateway has been powered off.
This method supports the following arguments:altThe alternative data-ID to add. Values from 1 to 255 are allowed.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the ID that was added to the list, or None on failure.This method is a coroutine.OpenThermGateway.add_unknown_id(self, unknown_id, timeout=OTGW_DEFAULT_TIMEOUT)Inform the gateway that the boiler doesn't support the specified data-ID, even if the boiler doesn't indicate that by returning anunknown-dataIDresponse.
Using this command allows the gateway to send an alternative data-ID to the boiler instead.
This method supports the following arguments:unknown_idThe data-ID to mark as unsupported. Values from 1 to 255 are allowed.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the added ID, or None on failure.This method is a coroutine.OpenThermGateway.connect(self, port, timeout=5, skip_init=None)Connect to an OpenTherm Gateway and initializes the parameters obtained from thePSandPRcommands.
If called while connected, reconnect to the gateway.
All optional serial-related arguments default to the OpenTherm Gateway default settings.
This method supports the following arguments:portThe port/url on which the OpenTherm Gateway can be reached as supported bypyserial.timeoutThe inactivity timeout in seconds after which the watchdog will trigger a reconnect. Defaults to 5.skip_initIf set to True, the PS= and PR= commands are skipped and only PS=0 is sent upon the current and future connection attempts. Defaults to None, which keeps the last known setting.Returns a status dict with all known values.This method is a coroutine.OpenThermGateway.disconnect(self)Disconnect from the OpenTherm Gateway and clean up the object.This method is a coroutine.OpenThermGateway.del_alternative(self, alt, timeout=OTGW_DEFAULT_TIMEOUT)Remove the specified data-ID from the list of alternative commands.
Only one occurrence is deleted. If the data-ID appears multiple times in the list of alternative commands, this command must be repeated to delete all occurrences. The table of alternative data-IDs is stored in non-volatile memory so it will persist even if the gateway has been powered off.
This method supports the following arguments:altThe alternative data-ID to remove. Values from 1 to 255 are allowed.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the ID that was removed from the list, or None on failure.This method is a coroutine.OpenThermGateway.del_unknown_id(self, unknown_id, timeout=OTGW_DEFAULT_TIMEOUT)Start forwarding the specified Data-ID to the boiler again.
This command resets the counter used to determine if the specified data-ID is supported by the boiler.
This method supports the following arguments:unknown_idThe data-ID to mark as supported. Values from 1 to 255 are allowed.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Return the ID that was marked as supported, or None on failure.This method is a coroutine.OpenThermGateway.get_reports(self)Update the OpenThermGateway object with the information from all of thePRcommands.
This method is also called fromOpenThermGateway.connect()to populate the status dict with initial values.Returns the full updated status dict.This method is a coroutine.OpenThermGateway.get_status(self)Update the OpenThermGateway object with the information from thePScommand.
This method is also called fromOpenThermGateway.connect()to populate the status dict with initial values.Returns the full updated status dict.This method is a coroutine.OpenThermGateway.set_ch_enable_bit(self, ch_bit, timeout=OTGW_DEFAULT_TIMEOUT)Set or unset theCentral Heating Enablebit.
Control the CH enable status bit when overriding the control setpoint. By default the CH enable bit is set after a call toOpenThermGateway.set_control_setpoint()with a value other than 0. With this method, the bit can be manipulated.
This method supports the following arguments:ch_bitThe new value for theCentral Heating Enablebit. Can be either0or1.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Return the newly accepted value (0or1), orNoneon failure.This method is a coroutine.OpenThermGateway.set_ch2_enable_bit(self, ch_bit, timeout=OTGW_DEFAULT_TIMEOUT)Set or unset theCentral Heating Enablebit for heating circuit 2.
Control the CH enable status bit when overriding the control setpoint. By default the CH enable bit is set after a call toOpenThermGateway.set_control_setpoint()with a value other than 0. With this method, the bit can be manipulated.
This method supports the following arguments:ch_bitThe new value for theCentral Heating Enablebit. Can be either0or1.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Return the newly accepted value (0or1), orNoneon failure.This method is a coroutine.OpenThermGateway.set_clock(self, date=datetime.now(), timeout=OTGW_DEFAULT_TIMEOUT)Set the clock on the thermostat.
Change the time and day of the week of the thermostat. The gateway will send the specified time and day of the week in response to the next time and date message from the thermostat.
This method supports the following arguments:dateA datetime object containing the time and day of the week to be sent to the thermostat. Defaults todatetime.now().timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the accepted response from the gateway with formatHH:MM/DOW, where DOW is a single digit: 1=Monday, 7=Sunday, orNoneon failure.This method is a coroutine.OpenThermGateway.set_connection_options(self, **kwargs)Set the serial connection parameters before calling connect().
Valid kwargs are 'baudrate', 'bytesize', 'parity' and 'stopbits'.
Returns True on success, False on fail or if already connected.
For more information on the kwargs see the pyserial documentation.OpenThermGateway.set_control_setpoint(self, setpoint, timeout=OTGW_DEFAULT_TIMEOUT)Set the control setpoint.
The control setpoint is the target temperature for the water in the central heating system. This method will cause the OpenTherm Gateway to manipulate the control setpoint which is sent to the boiler. Set the control setpoint to0to pass along the value specified by the thermostat.
This method supports the following arguments:setpointThe new control setpoint.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted value, orNoneon failure.This method is a coroutine.OpenThermGateway.set_control_setpoint_2(self, setpoint, timeout=OTGW_DEFAULT_TIMEOUT)Set the control setpoint for central heating circuit 2.
The control setpoint is the target temperature for the water in the central heating system. This method will cause the OpenTherm Gateway to manipulate the control setpoint which is sent to the boiler. Set the control setpoint to0to pass along the value specified by the thermostat.
This method supports the following arguments:setpointThe new control setpoint.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted value, orNoneon failure.This method is a coroutine.OpenThermGateway.set_dhw_setpoint(self, temperature, timeout=OTGW_DEFAULT_TIMEOUT)Set the domestic hot water setpoint.
The domestic hot water setpoint is the target temperature for the hot water system. Not all boilers support this command.
This method supports the following arguments:temperatureThe new domestic hot water setpoint.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted setpoint, orNoneon failure.This method is a coroutine.OpenThermGateway.set_gpio_mode(self, gpio_id, mode, timeout=OTGW_DEFAULT_TIMEOUT)Configure the functions of the two GPIO pins of the gateway.
Possible modes are:0.No function, default for both ports on a freshly flashed chip.1.Ground - A permanently low output (0V). Could be used for a power LED.2.Vcc - A permanently high output (5V). Can be used as a short-proof power supply for some external circuitry used by the other GPIO port.3.LED E - An additional LED if you want to present more than 4 LED functions.4.LED F - An additional LED if you want to present more than 5 LED functions.5.Home - Set thermostat to setback temperature when pulled low.6.Away - Set thermostat to setback temperature when pulled high.7.DS1820 (GPIO port B only) - Data line for a DS18S20 or DS18B20 temperature sensor used to measure the outside temperature. A 4k7 resistor should be connected between GPIO port B and Vcc.This method supports the following arguments:gpio_idThe GPIO pin on which the mode is set. EitherAorB.modeThe requested mode for the GPIO pin. Values from0to7are supported (7only for GPIOB).timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the new mode for the specified gpio, orNoneon failure.This method is a coroutine.OpenThermGateway.set_hot_water_ovrd(self, state, timeout=OTGW_DEFAULT_TIMEOUT)Control the domestic hot water enable option.
If the boiler has been configured to let the room unit control when to keep a small amount of water preheated, this option can influence that. A state of0or1will override the domestic hot water optionofforonrespectively. Any other single character disables the override and resumes normal operation.
This method supports the following arguments:stateThe requested state for the domestic hot water option.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the accepted value,Aif the override is disabled orNoneon failure.This method is a coroutine.OpenThermGateway.set_led_mode(self, led_id, mode, timeout=OTGW_DEFAULT_TIMEOUT)Set the mode of one of the LEDs.
Configure the functions of the six LEDs (A-F) that can optionally be connected to pins RB3/RB4/RB6/RB7 and the GPIO pins of the PIC.
Possible modes are:RReceiving an Opentherm message from the thermostat or boilerXTransmitting an Opentherm message to the thermostat or boilerTTransmitting or receiving a message on the master interfaceBTransmitting or receiving a message on the slave interfaceORemote setpoint override is activeFFlame is onHCentral heating is onWHot water is onCComfort mode (Domestic Hot Water Enable) is onETransmission error has been detectedMBoiler requires maintenancePRaised power mode active on thermostat interface.This method supports the following arguments:led_idThe LED for which the mode is set. Must be a character in the rangeA-F.modeThe requested state for the LED. Must be one ofR,X,T,B,O,F,H,W,C,E,MorP.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the new mode for the specified LED, orNoneon failure.This method is a coroutine.OpenThermGateway.set_max_ch_setpoint(self, temperature, timeout=OTGW_DEFAULT_TIMEOUT)Set the maximum central heating water setpoint.
Not all boilers support this option.This method supports the following arguments:temperatureThe new maximum central heating water setpoint.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted setpoint, orNoneon failure.This method is a coroutine.OpenThermGateway.set_max_relative_mod(self, max_mod, timeout=OTGW_DEFAULT_TIMEOUT)Set the maximum relative modulation level.
Override the maximum relative modulation from the thermostat. Valid values are 0 through 100. Clear the setting by specifying a non-numeric value.
This method supports the following arguments:temperatureThe new maximum central heating water setpoint.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted value,-if a previous value was cleared, orNoneon failure.This method is a coroutine.OpenThermGateway.set_mode(self, mode, timeout=OTGW_DEFAULT_TIMEOUT)Set the operating mode of the gateway.
The operating mode can be eithergatewayormonitormode. This method can also be used to reset the OpenTherm Gateway.
This method supports the following arguments:modeThe mode to be set on the gateway. Can be0orOTGW_MODE_MONITORformonitormode,1orOTGW_MODE_GATEWAYforgateway mode, orOTGW_MODE_RESET` to reset the gateway.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Return the newly activated mode, or the full renewed status dict after a reset.This method is a coroutine.OpenThermGateway.set_outside_temp(self, temp, timeout=OTGW_DEFAULT_TIMEOUT)Set the outside temperature.
Configure the outside temperature to send to the thermostat. Allowed values are between -40.0 and +64.0, although thermostats may not display the full range. Specify a value above 64 (suggestion: 99) to clear a previously configured value.
This method supports the following arguments:tempThe outside temperature to provide to the gateway.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the accepted value on success,-if a previously configured value has been cleared orNoneon failure.This method is a coroutine.OpenThermGateway.set_setback_temp(self, sb_temp, timeout=OTGW_DEFAULT_TIMEOUT)Set the setback temperature.
Configure the setback temperature to use in combination with the GPIO functionshome(5) andaway(6).
This method supports the following arguments:sb_tempThe new setback temperature.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the new setback temperature, orNoneon failure.This method is a coroutine.OpenThermGateway.set_target_temp(self, temp, temporary=True, timeout=OTGW_DEFAULT_TIMEOUT)Set the room setpoint.
Configure the thermostat setpoint and specify whether or not it may be overridden by a programmed change.
This method supports the following arguments:tempThe new room setpoint. Will be formatted to 1 decimal.temporaryWhether or not the thermostat program may override the room setpoint. EitherTrueorFalse. Defaults toTrue.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted room setpoint, orNoneon failure.This method is a coroutine.OpenThermGateway.set_temp_sensor_function(self, func, timeout=v.OTGW_DEFAULT_TIMEOUT):Set the function of the temperature sensor that can be attached to the gateway.
This method supports the following arguments:funcThe new temperature sensor function. EitherOforOutside Air TemperatureorRforReturn Water Temperature.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Returns the newly accepted temperature sensor function orNoneon failure.This method is a coroutine.OpenThermGateway.set_ventilation(self, pct, timeout=OTGW_DEFAULT_TIMEOUT)Set the ventilation setpoint.
Configure a ventilation setpoint override value (0-100%).
This method supports the following arguments:pctThe new ventilation setpoint. Must be between0and100.timeoutThe timeout for the request. Defaults to OTGW_DEFAULT_TIMEOUT (3 seconds).Return the newly accepted value, orNoneon failure.This method is a coroutine.OpenThermGateway.subscribe(self, coro)Subscribe to status updates from the Opentherm Gateway.
The subscribed coroutine must have the following signature:async def coro(status)Wherestatuswill be the full status dict containing the last known information from the OpenTherm Gateway.
This method supports the following arguments:coroA coroutine which will be called whenever a status change occurs.ReturnsTrueon success,Falseif the coroutine is already subscribed.OpenThermGateway.unsubscribe(self, coro)Unsubscribe from status updates from the Opentherm Gateway.
The supplied coroutine must have been subscribed withOpenThermGateway.subscribe()before.
This method supports the following arguments:coroThe coroutine which will be unsubscribed.ReturnsTrueon success,Falseif the coroutine was not subscribed before.Usage ExampleimportasynciofrompyotgwimportOpenThermGatewayPORT='/dev/ttyUSB0'asyncdefprint_status(status):"""Receive and print status."""print("Received a status update:\n{}".format(status))asyncdefconnect_and_subscribe():"""Connect to the OpenTherm Gateway and subscribe to status updates."""# Create the objectgw=OpenThermGateway()# Connect to OpenTherm Gateway on PORTstatus=awaitgw.connect(PORT)print("Initial status after connecting:\n{}".format(status))# Subscribe to updates from the gatewayifnotgw.subscribe(print_status):print("Could not subscribe to status updates.")# Keep the event loop alive...whileTrue:awaitasyncio.sleep(1)# Run the connect_and_subscribe coroutine.try:asyncio.run(connect_and_subscribe())exceptKeyboardInterrupt:print("Exiting")DevelopmentWe use pre-commit to ensure a consistent code style, sopip install pre_commitand runpre-commit installin the repository.Status Dict StructureThe full possible status dict with some example values looks like below. Note that not all keys will always be present and that the presence of a key does not guarantee that it contains useful information.{vars.BOILER:{vars.DATA_CH_PUMP_HOURS:15010,vars.DATA_CH_PUMP_STARTS:43832,vars.DATA_CH_WATER_PRESS:0.0,vars.DATA_CH_WATER_TEMP:47.2,vars.DATA_CH_WATER_TEMP_2:0.0,vars.DATA_CONTROL_SETPOINT:44.0,vars.DATA_CONTROL_SETPOINT_2:0.0,vars.DATA_COOLING_CONTROL:0,vars.DATA_DHW_BURNER_HOURS:411,vars.DATA_DHW_BURNER_STARTS:34296,vars.DATA_DHW_FLOW_RATE:0.0,vars.DATA_DHW_PUMP_HOURS:250,vars.DATA_DHW_PUMP_STARTS:9424,vars.DATA_DHW_SETPOINT:0.0,vars.DATA_DHW_TEMP:0.0,vars.DATA_DHW_TEMP_2:0.0,vars.DATA_EXHAUST_TEMP:0,vars.DATA_MASTER_CH2_ENABLED:0,vars.DATA_MASTER_CH_ENABLED:1,vars.DATA_MASTER_COOLING_ENABLED:0,vars.DATA_MASTER_DHW_ENABLED:1,vars.DATA_MASTER_MEMBERID:0,vars.DATA_MASTER_OTC_ENABLED:0,vars.DATA_MASTER_OT_VERSION:0.0,vars.DATA_MASTER_PRODUCT_TYPE:0,vars.DATA_MASTER_PRODUCT_VERSION:0,vars.DATA_MAX_CH_SETPOINT:75.0,vars.DATA_OEM_DIAG:0,vars.DATA_OUTSIDE_TEMP:0.0,vars.DATA_REL_MOD_LEVEL:0.0,vars.DATA_REMOTE_RW_DHW:1,vars.DATA_REMOTE_RW_MAX_CH:1,vars.DATA_REMOTE_TRANSFER_DHW:1,vars.DATA_REMOTE_TRANSFER_MAX_CH:1,vars.DATA_RETURN_WATER_TEMP:0.0,vars.DATA_ROOM_SETPOINT:20.0,vars.DATA_ROOM_SETPOINT_2:0.0,vars.DATA_ROOM_SETPOINT_OVRD:20.0,vars.DATA_ROOM_TEMP:19.62,vars.DATA_ROVRD_AUTO_PRIO:0,vars.DATA_ROVRD_MAN_PRIO:1,vars.DATA_SLAVE_AIR_PRESS_FAULT:0,vars.DATA_SLAVE_CH2_ACTIVE:0,vars.DATA_SLAVE_CH2_PRESENT:0,vars.DATA_SLAVE_CH_ACTIVE:1,vars.DATA_SLAVE_CH_MAX_SETP:75,vars.DATA_SLAVE_CH_MIN_SETP:20,vars.DATA_SLAVE_CONTROL_TYPE:1,vars.DATA_SLAVE_COOLING_ACTIVE:0,vars.DATA_SLAVE_COOLING_SUPPORTED:0,vars.DATA_SLAVE_DHW_ACTIVE:0,vars.DATA_SLAVE_DHW_CONFIG:0,vars.DATA_SLAVE_DHW_MAX_SETP:60,vars.DATA_SLAVE_DHW_MIN_SETP:40,vars.DATA_SLAVE_DHW_PRESENT:1,vars.DATA_SLAVE_DIAG_IND:0,vars.DATA_SLAVE_FAULT_IND:0,vars.DATA_SLAVE_FLAME_ON:1,vars.DATA_SLAVE_GAS_FAULT:0,vars.DATA_SLAVE_LOW_WATER_PRESS:0,vars.DATA_SLAVE_MASTER_LOW_OFF_PUMP:0,vars.DATA_SLAVE_MAX_CAPACITY:0,vars.DATA_SLAVE_MAX_RELATIVE_MOD:100.0,vars.DATA_SLAVE_MEMBERID:0,vars.DATA_SLAVE_MIN_MOD_LEVEL:0,vars.DATA_SLAVE_OEM_FAULT:0,vars.DATA_SLAVE_OT_VERSION:0.0,vars.DATA_SLAVE_PRODUCT_TYPE:0,vars.DATA_SLAVE_PRODUCT_VERSION:0,vars.DATA_SLAVE_REMOTE_RESET:0,vars.DATA_SLAVE_SERVICE_REQ:0,vars.DATA_SLAVE_WATER_OVERTEMP:0,vars.DATA_SOLAR_COLL_TEMP:0.0,vars.DATA_SOLAR_STORAGE_TEMP:0.0,vars.DATA_TOTAL_BURNER_HOURS:0,vars.DATA_TOTAL_BURNER_STARTS:0,},vars.OTGW:{vars.OTGW_ABOUT:'OpenTherm Gateway 4.2.5',vars.OTGW_BUILD:'17:59 20-10-2015',vars.OTGW_CLOCKMHZ:'4 MHz',vars.OTGW_DHW_OVRD:'1',vars.OTGW_GPIO_A:0,vars.OTGW_GPIO_A_STATE:0,vars.OTGW_GPIO_B:0,vars.OTGW_GPIO_B_STATE:0,vars.OTGW_IGNORE_TRANSITIONS:1,vars.OTGW_LED_A:'F',vars.OTGW_LED_B:'X',vars.OTGW_LED_C:'O',vars.OTGW_LED_D:'M',vars.OTGW_LED_E:'P',vars.OTGW_LED_F:'C',vars.OTGW_MODE:'G',vars.OTGW_OVRD_HB:1,vars.OTGW_SB_TEMP:16.0,vars.OTGW_SETP_OVRD_MODE:'T',vars.OTGW_SMART_PWR:'Low power',vars.OTGW_THRM_DETECT:'D',vars.OTGW_VREF:3,},vars.THERMOSTAT:{vars.DATA_CH_PUMP_HOURS:15010,vars.DATA_CH_PUMP_STARTS:43832,vars.DATA_CH_WATER_PRESS:0.0,vars.DATA_CH_WATER_TEMP:47.2,vars.DATA_CH_WATER_TEMP_2:0.0,vars.DATA_CONTROL_SETPOINT:44.0,vars.DATA_CONTROL_SETPOINT_2:0.0,vars.DATA_COOLING_CONTROL:0,vars.DATA_DHW_BURNER_HOURS:411,vars.DATA_DHW_BURNER_STARTS:34296,vars.DATA_DHW_FLOW_RATE:0.0,vars.DATA_DHW_PUMP_HOURS:250,vars.DATA_DHW_PUMP_STARTS:9424,vars.DATA_DHW_SETPOINT:0.0,vars.DATA_DHW_TEMP:0.0,vars.DATA_DHW_TEMP_2:0.0,vars.DATA_EXHAUST_TEMP:0,vars.DATA_MASTER_CH2_ENABLED:0,vars.DATA_MASTER_CH_ENABLED:1,vars.DATA_MASTER_COOLING_ENABLED:0,vars.DATA_MASTER_DHW_ENABLED:1,vars.DATA_MASTER_MEMBERID:0,vars.DATA_MASTER_OTC_ENABLED:0,vars.DATA_MASTER_OT_VERSION:0.0,vars.DATA_MASTER_PRODUCT_TYPE:0,vars.DATA_MASTER_PRODUCT_VERSION:0,vars.DATA_MAX_CH_SETPOINT:75.0,vars.DATA_OEM_DIAG:0,vars.DATA_OUTSIDE_TEMP:0.0,vars.DATA_REL_MOD_LEVEL:0.0,vars.DATA_REMOTE_RW_DHW:1,vars.DATA_REMOTE_RW_MAX_CH:1,vars.DATA_REMOTE_TRANSFER_DHW:1,vars.DATA_REMOTE_TRANSFER_MAX_CH:1,vars.DATA_RETURN_WATER_TEMP:0.0,vars.DATA_ROOM_SETPOINT:20.0,vars.DATA_ROOM_SETPOINT_2:0.0,vars.DATA_ROOM_SETPOINT_OVRD:20.0,vars.DATA_ROOM_TEMP:19.62,vars.DATA_ROVRD_AUTO_PRIO:0,vars.DATA_ROVRD_MAN_PRIO:1,vars.DATA_SLAVE_AIR_PRESS_FAULT:0,vars.DATA_SLAVE_CH2_ACTIVE:0,vars.DATA_SLAVE_CH2_PRESENT:0,vars.DATA_SLAVE_CH_ACTIVE:1,vars.DATA_SLAVE_CH_MAX_SETP:75,vars.DATA_SLAVE_CH_MIN_SETP:20,vars.DATA_SLAVE_CONTROL_TYPE:1,vars.DATA_SLAVE_COOLING_ACTIVE:0,vars.DATA_SLAVE_COOLING_SUPPORTED:0,vars.DATA_SLAVE_DHW_ACTIVE:0,vars.DATA_SLAVE_DHW_CONFIG:0,vars.DATA_SLAVE_DHW_MAX_SETP:60,vars.DATA_SLAVE_DHW_MIN_SETP:40,vars.DATA_SLAVE_DHW_PRESENT:1,vars.DATA_SLAVE_DIAG_IND:0,vars.DATA_SLAVE_FAULT_IND:0,vars.DATA_SLAVE_FLAME_ON:1,vars.DATA_SLAVE_GAS_FAULT:0,vars.DATA_SLAVE_LOW_WATER_PRESS:0,vars.DATA_SLAVE_MASTER_LOW_OFF_PUMP:0,vars.DATA_SLAVE_MAX_CAPACITY:0,vars.DATA_SLAVE_MAX_RELATIVE_MOD:100.0,vars.DATA_SLAVE_MEMBERID:0,vars.DATA_SLAVE_MIN_MOD_LEVEL:0,vars.DATA_SLAVE_OEM_FAULT:0,vars.DATA_SLAVE_OT_VERSION:0.0,vars.DATA_SLAVE_PRODUCT_TYPE:0,vars.DATA_SLAVE_PRODUCT_VERSION:0,vars.DATA_SLAVE_REMOTE_RESET:0,vars.DATA_SLAVE_SERVICE_REQ:0,vars.DATA_SLAVE_WATER_OVERTEMP:0,vars.DATA_SOLAR_COLL_TEMP:0.0,vars.DATA_SOLAR_STORAGE_TEMP:0.0,vars.DATA_TOTAL_BURNER_HOURS:0,vars.DATA_TOTAL_BURNER_STARTS:0,}}