esphome 2024.10.2__py3-none-any.whl → 2024.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. esphome/__main__.py +22 -4
  2. esphome/automation.py +29 -2
  3. esphome/components/animation/__init__.py +5 -8
  4. esphome/components/animation/animation.cpp +1 -1
  5. esphome/components/audio/__init__.py +9 -0
  6. esphome/components/audio/audio.h +21 -0
  7. esphome/components/axs15231/__init__.py +6 -0
  8. esphome/components/axs15231/touchscreen/__init__.py +36 -0
  9. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +64 -0
  10. esphome/components/axs15231/touchscreen/axs15231_touchscreen.h +27 -0
  11. esphome/components/bme68x_bsec2/__init__.py +1 -1
  12. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +50 -47
  13. esphome/components/bme68x_bsec2/bme68x_bsec2.h +0 -2
  14. esphome/components/bytebuffer/__init__.py +5 -0
  15. esphome/components/bytebuffer/bytebuffer.h +421 -0
  16. esphome/components/climate/__init__.py +14 -13
  17. esphome/components/datetime/__init__.py +3 -3
  18. esphome/components/debug/debug_esp32.cpp +16 -8
  19. esphome/components/dfplayer/dfplayer.cpp +132 -6
  20. esphome/components/dfplayer/dfplayer.h +19 -53
  21. esphome/components/display/display.cpp +142 -0
  22. esphome/components/display/display.h +7 -0
  23. esphome/components/es8311/__init__.py +0 -0
  24. esphome/components/es8311/audio_dac.py +70 -0
  25. esphome/components/es8311/es8311.cpp +227 -0
  26. esphome/components/es8311/es8311.h +135 -0
  27. esphome/components/es8311/es8311_const.h +195 -0
  28. esphome/components/esp32/boards.py +199 -1
  29. esphome/components/esp32/gpio.py +3 -1
  30. esphome/components/esp32_ble/const_esp32c6.h +7 -0
  31. esphome/components/esp32_ble_client/ble_client_base.h +1 -1
  32. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +3 -0
  33. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -1
  34. esphome/components/esp32_rmt_led_strip/led_strip.cpp +2 -2
  35. esphome/components/esp32_rmt_led_strip/led_strip.h +2 -0
  36. esphome/components/esp32_rmt_led_strip/light.py +3 -1
  37. esphome/components/esp8266/gpio.py +7 -5
  38. esphome/components/ethernet/__init__.py +55 -1
  39. esphome/components/ethernet/ethernet_component.cpp +14 -1
  40. esphome/components/ethernet/ethernet_component.h +7 -1
  41. esphome/components/font/__init__.py +213 -108
  42. esphome/components/gp8403/output/__init__.py +1 -1
  43. esphome/components/host/gpio.py +6 -4
  44. esphome/components/http_request/__init__.py +12 -0
  45. esphome/components/http_request/http_request.h +65 -3
  46. esphome/components/http_request/http_request_arduino.cpp +4 -3
  47. esphome/components/http_request/http_request_idf.cpp +12 -14
  48. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  49. esphome/components/http_request/update/http_request_update.cpp +1 -1
  50. esphome/components/i2c_device/__init__.py +26 -0
  51. esphome/components/i2c_device/i2c_device.cpp +17 -0
  52. esphome/components/i2c_device/i2c_device.h +18 -0
  53. esphome/components/i2s_audio/__init__.py +1 -3
  54. esphome/components/i2s_audio/speaker/__init__.py +12 -4
  55. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +426 -200
  56. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +92 -33
  57. esphome/components/ili9xxx/display.py +5 -1
  58. esphome/components/image/__init__.py +5 -8
  59. esphome/components/image/image.cpp +14 -14
  60. esphome/components/image/image.h +20 -24
  61. esphome/components/internal_temperature/internal_temperature.cpp +51 -2
  62. esphome/components/internal_temperature/internal_temperature.h +1 -0
  63. esphome/components/ld2420/ld2420.cpp +1 -1
  64. esphome/components/libretiny/gpio.py +4 -2
  65. esphome/components/light/__init__.py +32 -1
  66. esphome/components/light/automation.py +39 -32
  67. esphome/components/light/effects.py +36 -36
  68. esphome/components/light/light_state.cpp +6 -16
  69. esphome/components/light/light_state.h +34 -0
  70. esphome/components/light/types.py +3 -1
  71. esphome/components/logger/logger_esp32.cpp +15 -0
  72. esphome/components/lvgl/__init__.py +202 -95
  73. esphome/components/lvgl/automation.py +42 -40
  74. esphome/components/lvgl/binary_sensor/__init__.py +8 -15
  75. esphome/components/lvgl/defines.py +14 -8
  76. esphome/components/lvgl/encoders.py +11 -8
  77. esphome/components/lvgl/keypads.py +77 -0
  78. esphome/components/lvgl/light/__init__.py +6 -8
  79. esphome/components/lvgl/lv_validation.py +2 -4
  80. esphome/components/lvgl/lvcode.py +3 -9
  81. esphome/components/lvgl/lvgl_esphome.cpp +210 -89
  82. esphome/components/lvgl/lvgl_esphome.h +113 -30
  83. esphome/components/lvgl/lvgl_proxy.h +17 -0
  84. esphome/components/lvgl/number/__init__.py +10 -15
  85. esphome/components/lvgl/schemas.py +4 -2
  86. esphome/components/lvgl/select/__init__.py +12 -37
  87. esphome/components/lvgl/select/lvgl_select.h +27 -33
  88. esphome/components/lvgl/sensor/__init__.py +8 -14
  89. esphome/components/lvgl/styles.py +3 -4
  90. esphome/components/lvgl/switch/__init__.py +8 -13
  91. esphome/components/lvgl/text/__init__.py +5 -6
  92. esphome/components/lvgl/text_sensor/__init__.py +15 -15
  93. esphome/components/lvgl/touchscreens.py +2 -3
  94. esphome/components/lvgl/trigger.py +7 -9
  95. esphome/components/lvgl/types.py +9 -3
  96. esphome/components/lvgl/widgets/__init__.py +32 -21
  97. esphome/components/lvgl/widgets/animimg.py +4 -3
  98. esphome/components/lvgl/widgets/dropdown.py +22 -10
  99. esphome/components/lvgl/widgets/img.py +2 -0
  100. esphome/components/lvgl/widgets/msgbox.py +6 -5
  101. esphome/components/lvgl/widgets/obj.py +4 -2
  102. esphome/components/lvgl/widgets/page.py +3 -2
  103. esphome/components/lvgl/widgets/qrcode.py +54 -0
  104. esphome/components/lvgl/widgets/roller.py +21 -14
  105. esphome/components/lvgl/widgets/tileview.py +2 -1
  106. esphome/components/max17043/__init__.py +1 -0
  107. esphome/components/max17043/automation.h +20 -0
  108. esphome/components/max17043/max17043.cpp +98 -0
  109. esphome/components/max17043/max17043.h +29 -0
  110. esphome/components/max17043/sensor.py +77 -0
  111. esphome/components/media_player/__init__.py +11 -0
  112. esphome/components/media_player/automation.h +10 -0
  113. esphome/components/media_player/media_player.cpp +4 -0
  114. esphome/components/midea/air_conditioner.cpp +17 -1
  115. esphome/components/mlx90393/sensor.py +1 -1
  116. esphome/components/modbus/modbus.cpp +24 -12
  117. esphome/components/modbus_controller/__init__.py +31 -1
  118. esphome/components/modbus_controller/automation.h +16 -0
  119. esphome/components/modbus_controller/const.py +2 -0
  120. esphome/components/modbus_controller/modbus_controller.cpp +14 -2
  121. esphome/components/modbus_controller/modbus_controller.h +9 -0
  122. esphome/components/mopeka_pro_check/mopeka_pro_check.cpp +40 -21
  123. esphome/components/mopeka_pro_check/mopeka_pro_check.h +9 -2
  124. esphome/components/mopeka_pro_check/sensor.py +41 -0
  125. esphome/components/mqtt/__init__.py +36 -0
  126. esphome/components/mqtt/mqtt_client.cpp +27 -3
  127. esphome/components/mqtt/mqtt_client.h +27 -2
  128. esphome/components/mqtt/mqtt_climate.cpp +4 -2
  129. esphome/components/mqtt/mqtt_component.cpp +6 -0
  130. esphome/components/mqtt/mqtt_component.h +4 -0
  131. esphome/components/mqtt/mqtt_const.h +6 -0
  132. esphome/components/online_image/online_image.cpp +2 -8
  133. esphome/components/online_image/online_image.h +2 -6
  134. esphome/components/opentherm/__init__.py +35 -9
  135. esphome/components/opentherm/binary_sensor/__init__.py +33 -0
  136. esphome/components/opentherm/const.py +11 -0
  137. esphome/components/opentherm/generate.py +142 -0
  138. esphome/components/opentherm/hub.cpp +130 -24
  139. esphome/components/opentherm/hub.h +62 -9
  140. esphome/components/opentherm/input.h +18 -0
  141. esphome/components/opentherm/input.py +51 -0
  142. esphome/components/opentherm/number/__init__.py +74 -0
  143. esphome/components/opentherm/number/number.cpp +40 -0
  144. esphome/components/opentherm/number/number.h +31 -0
  145. esphome/components/opentherm/opentherm.cpp +30 -0
  146. esphome/components/opentherm/opentherm.h +34 -2
  147. esphome/components/opentherm/opentherm_macros.h +151 -0
  148. esphome/components/opentherm/output/__init__.py +47 -0
  149. esphome/components/opentherm/output/output.cpp +18 -0
  150. esphome/components/opentherm/output/output.h +33 -0
  151. esphome/components/opentherm/schema.py +814 -0
  152. esphome/components/opentherm/sensor/__init__.py +51 -0
  153. esphome/components/opentherm/switch/__init__.py +43 -0
  154. esphome/components/opentherm/switch/switch.cpp +28 -0
  155. esphome/components/opentherm/switch/switch.h +20 -0
  156. esphome/components/opentherm/validate.py +31 -0
  157. esphome/components/pcd8544/display.py +8 -4
  158. esphome/components/prometheus/prometheus_handler.cpp +176 -14
  159. esphome/components/prometheus/prometheus_handler.h +25 -7
  160. esphome/components/qspi_amoled/display.py +1 -141
  161. esphome/components/qspi_dbi/display.py +185 -0
  162. esphome/components/qspi_dbi/models.py +64 -0
  163. esphome/components/{qspi_amoled/qspi_amoled.cpp → qspi_dbi/qspi_dbi.cpp} +95 -46
  164. esphome/components/{qspi_amoled/qspi_amoled.h → qspi_dbi/qspi_dbi.h} +26 -15
  165. esphome/components/rp2040/__init__.py +6 -3
  166. esphome/components/rp2040/gpio.py +5 -3
  167. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +20 -0
  168. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.h +3 -2
  169. esphome/components/rtttl/rtttl.cpp +4 -1
  170. esphome/components/rtttl/rtttl.h +1 -0
  171. esphome/components/sdl/sdl_esphome.cpp +22 -5
  172. esphome/components/sdl/sdl_esphome.h +1 -0
  173. esphome/components/sdm_meter/sdm_meter.cpp +1 -1
  174. esphome/components/sensor/__init__.py +18 -8
  175. esphome/components/sensor/filter.cpp +19 -18
  176. esphome/components/sensor/filter.h +9 -10
  177. esphome/components/sgp4x/sgp4x.cpp +40 -74
  178. esphome/components/sgp4x/sgp4x.h +5 -3
  179. esphome/components/speaker/__init__.py +51 -5
  180. esphome/components/speaker/automation.h +25 -0
  181. esphome/components/speaker/speaker.h +72 -1
  182. esphome/components/spi/__init__.py +15 -14
  183. esphome/components/spi_device/__init__.py +4 -15
  184. esphome/components/ssd1306_spi/display.py +6 -2
  185. esphome/components/ssd1322_spi/display.py +6 -2
  186. esphome/components/ssd1325_spi/display.py +6 -2
  187. esphome/components/ssd1327_spi/display.py +6 -2
  188. esphome/components/ssd1331_spi/display.py +6 -2
  189. esphome/components/ssd1351_spi/display.py +6 -2
  190. esphome/components/st7567_spi/display.py +6 -2
  191. esphome/components/st7701s/display.py +5 -1
  192. esphome/components/st7735/display.py +10 -5
  193. esphome/components/st7789v/display.py +12 -7
  194. esphome/components/statsd/statsd.cpp +2 -0
  195. esphome/components/statsd/statsd.h +2 -0
  196. esphome/components/sun/sun.h +3 -0
  197. esphome/components/tc74/__init__.py +1 -0
  198. esphome/components/tc74/sensor.py +32 -0
  199. esphome/components/tc74/tc74.cpp +68 -0
  200. esphome/components/tc74/tc74.h +28 -0
  201. esphome/components/touchscreen/__init__.py +41 -50
  202. esphome/components/touchscreen/touchscreen.h +4 -8
  203. esphome/components/tuya/fan/tuya_fan.cpp +1 -1
  204. esphome/components/udp/udp_component.cpp +6 -3
  205. esphome/components/udp/udp_component.h +4 -2
  206. esphome/components/waveshare_epaper/display.py +6 -2
  207. esphome/components/web_server/web_server.cpp +22 -0
  208. esphome/components/web_server/web_server.h +3 -0
  209. esphome/components/weikai/weikai.h +2 -2
  210. esphome/components/wifi/wifi_component.cpp +2 -2
  211. esphome/components/wifi/wifi_component_esp32_arduino.cpp +4 -4
  212. esphome/components/wifi/wifi_component_esp8266.cpp +4 -4
  213. esphome/components/wifi/wifi_component_esp_idf.cpp +2 -2
  214. esphome/components/xpt2046/touchscreen/__init__.py +7 -32
  215. esphome/config_validation.py +3 -1
  216. esphome/const.py +9 -2
  217. esphome/core/defines.h +8 -2
  218. esphome/core/helpers.cpp +32 -17
  219. esphome/core/helpers.h +32 -16
  220. esphome/core/ring_buffer.cpp +2 -2
  221. esphome/core/ring_buffer.h +2 -2
  222. esphome/dashboard/core.py +25 -0
  223. esphome/dashboard/status/mdns.py +3 -4
  224. esphome/dashboard/web_server.py +54 -19
  225. esphome/espota2.py +36 -35
  226. esphome/helpers.py +68 -16
  227. esphome/mqtt.py +9 -2
  228. esphome/storage_json.py +4 -0
  229. esphome/writer.py +7 -18
  230. esphome/zeroconf.py +8 -6
  231. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/METADATA +7 -5
  232. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/RECORD +237 -191
  233. esphome/core/bytebuffer.cpp +0 -167
  234. esphome/core/bytebuffer.h +0 -144
  235. /esphome/components/{qspi_amoled → qspi_dbi}/__init__.py +0 -0
  236. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/LICENSE +0 -0
  237. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/WHEEL +0 -0
  238. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/entry_points.txt +0 -0
  239. {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,814 @@
1
+ # This file contains a schema for all supported sensors, binary sensors and
2
+ # inputs of the OpenTherm component.
3
+
4
+ from dataclasses import dataclass
5
+ from typing import Optional, TypeVar
6
+
7
+ from esphome.const import (
8
+ UNIT_CELSIUS,
9
+ UNIT_EMPTY,
10
+ UNIT_KILOWATT,
11
+ UNIT_MICROAMP,
12
+ UNIT_PERCENT,
13
+ UNIT_REVOLUTIONS_PER_MINUTE,
14
+ DEVICE_CLASS_COLD,
15
+ DEVICE_CLASS_CURRENT,
16
+ DEVICE_CLASS_EMPTY,
17
+ DEVICE_CLASS_HEAT,
18
+ DEVICE_CLASS_PRESSURE,
19
+ DEVICE_CLASS_PROBLEM,
20
+ DEVICE_CLASS_TEMPERATURE,
21
+ STATE_CLASS_MEASUREMENT,
22
+ STATE_CLASS_NONE,
23
+ STATE_CLASS_TOTAL_INCREASING,
24
+ )
25
+
26
+
27
+ @dataclass
28
+ class EntitySchema:
29
+ description: str
30
+ """Description of the item, based on the OpenTherm spec"""
31
+
32
+ message: str
33
+ """OpenTherm message id used to read or write the value"""
34
+
35
+ keep_updated: bool
36
+ """Whether the value should be read or write repeatedly (True) or only during
37
+ the initialization phase (False)
38
+ """
39
+
40
+ message_data: str
41
+ """Instructions on how to interpret the data in the message
42
+ - flag8_[hb|lb]_[0-7]: data is a byte of single bit flags,
43
+ this flag is set in the high (hb) or low byte (lb),
44
+ at position 0 to 7
45
+ - u8_[hb|lb]: data is an unsigned 8-bit integer,
46
+ in the high (hb) or low byte (lb)
47
+ - s8_[hb|lb]: data is an signed 8-bit integer,
48
+ in the high (hb) or low byte (lb)
49
+ - f88: data is a signed fixed point value with
50
+ 1 sign bit, 7 integer bits, 8 fractional bits
51
+ - u16: data is an unsigned 16-bit integer
52
+ - s16: data is a signed 16-bit integer
53
+ """
54
+
55
+
56
+ TSchema = TypeVar("TSchema", bound=EntitySchema)
57
+
58
+
59
+ @dataclass
60
+ class SensorSchema(EntitySchema):
61
+ accuracy_decimals: int
62
+ state_class: str
63
+ unit_of_measurement: Optional[str] = None
64
+ icon: Optional[str] = None
65
+ device_class: Optional[str] = None
66
+ disabled_by_default: bool = False
67
+
68
+
69
+ SENSORS: dict[str, SensorSchema] = {
70
+ "rel_mod_level": SensorSchema(
71
+ description="Relative modulation level",
72
+ unit_of_measurement=UNIT_PERCENT,
73
+ accuracy_decimals=2,
74
+ icon="mdi:percent",
75
+ state_class=STATE_CLASS_MEASUREMENT,
76
+ message="MODULATION_LEVEL",
77
+ keep_updated=True,
78
+ message_data="f88",
79
+ ),
80
+ "ch_pressure": SensorSchema(
81
+ description="Water pressure in CH circuit",
82
+ unit_of_measurement="bar",
83
+ accuracy_decimals=2,
84
+ device_class=DEVICE_CLASS_PRESSURE,
85
+ state_class=STATE_CLASS_MEASUREMENT,
86
+ message="CH_WATER_PRESSURE",
87
+ keep_updated=True,
88
+ message_data="f88",
89
+ ),
90
+ "dhw_flow_rate": SensorSchema(
91
+ description="Water flow rate in DHW circuit",
92
+ unit_of_measurement="l/min",
93
+ accuracy_decimals=2,
94
+ icon="mdi:waves-arrow-right",
95
+ state_class=STATE_CLASS_MEASUREMENT,
96
+ message="DHW_FLOW_RATE",
97
+ keep_updated=True,
98
+ message_data="f88",
99
+ ),
100
+ "t_boiler": SensorSchema(
101
+ description="Boiler water temperature",
102
+ unit_of_measurement=UNIT_CELSIUS,
103
+ accuracy_decimals=2,
104
+ device_class=DEVICE_CLASS_TEMPERATURE,
105
+ state_class=STATE_CLASS_MEASUREMENT,
106
+ message="FEED_TEMP",
107
+ keep_updated=True,
108
+ message_data="f88",
109
+ ),
110
+ "t_dhw": SensorSchema(
111
+ description="DHW temperature",
112
+ unit_of_measurement=UNIT_CELSIUS,
113
+ accuracy_decimals=2,
114
+ device_class=DEVICE_CLASS_TEMPERATURE,
115
+ state_class=STATE_CLASS_MEASUREMENT,
116
+ message="DHW_TEMP",
117
+ keep_updated=True,
118
+ message_data="f88",
119
+ ),
120
+ "t_outside": SensorSchema(
121
+ description="Outside temperature",
122
+ unit_of_measurement=UNIT_CELSIUS,
123
+ accuracy_decimals=2,
124
+ device_class=DEVICE_CLASS_TEMPERATURE,
125
+ state_class=STATE_CLASS_MEASUREMENT,
126
+ message="OUTSIDE_TEMP",
127
+ keep_updated=True,
128
+ message_data="f88",
129
+ ),
130
+ "t_ret": SensorSchema(
131
+ description="Return water temperature",
132
+ unit_of_measurement=UNIT_CELSIUS,
133
+ accuracy_decimals=2,
134
+ device_class=DEVICE_CLASS_TEMPERATURE,
135
+ state_class=STATE_CLASS_MEASUREMENT,
136
+ message="RETURN_WATER_TEMP",
137
+ keep_updated=True,
138
+ message_data="f88",
139
+ ),
140
+ "t_storage": SensorSchema(
141
+ description="Solar storage temperature",
142
+ unit_of_measurement=UNIT_CELSIUS,
143
+ accuracy_decimals=2,
144
+ device_class=DEVICE_CLASS_TEMPERATURE,
145
+ state_class=STATE_CLASS_MEASUREMENT,
146
+ message="SOLAR_STORE_TEMP",
147
+ keep_updated=True,
148
+ message_data="f88",
149
+ ),
150
+ "t_collector": SensorSchema(
151
+ description="Solar collector temperature",
152
+ unit_of_measurement=UNIT_CELSIUS,
153
+ accuracy_decimals=0,
154
+ device_class=DEVICE_CLASS_TEMPERATURE,
155
+ state_class=STATE_CLASS_MEASUREMENT,
156
+ message="SOLAR_COLLECT_TEMP",
157
+ keep_updated=True,
158
+ message_data="s16",
159
+ ),
160
+ "t_flow_ch2": SensorSchema(
161
+ description="Flow water temperature CH2 circuit",
162
+ unit_of_measurement=UNIT_CELSIUS,
163
+ accuracy_decimals=2,
164
+ device_class=DEVICE_CLASS_TEMPERATURE,
165
+ state_class=STATE_CLASS_MEASUREMENT,
166
+ message="FEED_TEMP_CH2",
167
+ keep_updated=True,
168
+ message_data="f88",
169
+ ),
170
+ "t_dhw2": SensorSchema(
171
+ description="Domestic hot water temperature 2",
172
+ unit_of_measurement=UNIT_CELSIUS,
173
+ accuracy_decimals=2,
174
+ device_class=DEVICE_CLASS_TEMPERATURE,
175
+ state_class=STATE_CLASS_MEASUREMENT,
176
+ message="DHW2_TEMP",
177
+ keep_updated=True,
178
+ message_data="f88",
179
+ ),
180
+ "t_exhaust": SensorSchema(
181
+ description="Boiler exhaust temperature",
182
+ unit_of_measurement=UNIT_CELSIUS,
183
+ accuracy_decimals=0,
184
+ device_class=DEVICE_CLASS_TEMPERATURE,
185
+ state_class=STATE_CLASS_MEASUREMENT,
186
+ message="EXHAUST_TEMP",
187
+ keep_updated=True,
188
+ message_data="s16",
189
+ ),
190
+ "fan_speed": SensorSchema(
191
+ description="Boiler fan speed",
192
+ unit_of_measurement=UNIT_REVOLUTIONS_PER_MINUTE,
193
+ accuracy_decimals=0,
194
+ icon="mdi:fan",
195
+ device_class=DEVICE_CLASS_EMPTY,
196
+ state_class=STATE_CLASS_MEASUREMENT,
197
+ message="FAN_SPEED",
198
+ keep_updated=True,
199
+ message_data="u8_lb_60",
200
+ ),
201
+ "fan_speed_setpoint": SensorSchema(
202
+ description="Boiler fan speed setpoint",
203
+ unit_of_measurement=UNIT_REVOLUTIONS_PER_MINUTE,
204
+ accuracy_decimals=0,
205
+ icon="mdi:fan",
206
+ device_class=DEVICE_CLASS_EMPTY,
207
+ state_class=STATE_CLASS_MEASUREMENT,
208
+ message="FAN_SPEED",
209
+ keep_updated=True,
210
+ message_data="u8_hb_60",
211
+ ),
212
+ "flame_current": SensorSchema(
213
+ description="Boiler flame current",
214
+ unit_of_measurement=UNIT_MICROAMP,
215
+ accuracy_decimals=0,
216
+ device_class=DEVICE_CLASS_CURRENT,
217
+ state_class=STATE_CLASS_MEASUREMENT,
218
+ message="FLAME_CURRENT",
219
+ keep_updated=True,
220
+ message_data="f88",
221
+ ),
222
+ "burner_starts": SensorSchema(
223
+ description="Number of starts burner",
224
+ accuracy_decimals=0,
225
+ icon="mdi:gas-burner",
226
+ state_class=STATE_CLASS_TOTAL_INCREASING,
227
+ message="BURNER_STARTS",
228
+ keep_updated=True,
229
+ message_data="u16",
230
+ ),
231
+ "ch_pump_starts": SensorSchema(
232
+ description="Number of starts CH pump",
233
+ accuracy_decimals=0,
234
+ icon="mdi:pump",
235
+ state_class=STATE_CLASS_TOTAL_INCREASING,
236
+ message="CH_PUMP_STARTS",
237
+ keep_updated=True,
238
+ message_data="u16",
239
+ ),
240
+ "dhw_pump_valve_starts": SensorSchema(
241
+ description="Number of starts DHW pump/valve",
242
+ accuracy_decimals=0,
243
+ icon="mdi:water-pump",
244
+ state_class=STATE_CLASS_TOTAL_INCREASING,
245
+ message="DHW_PUMP_STARTS",
246
+ keep_updated=True,
247
+ message_data="u16",
248
+ ),
249
+ "dhw_burner_starts": SensorSchema(
250
+ description="Number of starts burner during DHW mode",
251
+ accuracy_decimals=0,
252
+ icon="mdi:gas-burner",
253
+ state_class=STATE_CLASS_TOTAL_INCREASING,
254
+ message="DHW_BURNER_STARTS",
255
+ keep_updated=True,
256
+ message_data="u16",
257
+ ),
258
+ "burner_operation_hours": SensorSchema(
259
+ description="Number of hours that burner is in operation",
260
+ accuracy_decimals=0,
261
+ icon="mdi:clock-outline",
262
+ state_class=STATE_CLASS_TOTAL_INCREASING,
263
+ message="BURNER_HOURS",
264
+ keep_updated=True,
265
+ message_data="u16",
266
+ ),
267
+ "ch_pump_operation_hours": SensorSchema(
268
+ description="Number of hours that CH pump has been running",
269
+ accuracy_decimals=0,
270
+ icon="mdi:clock-outline",
271
+ state_class=STATE_CLASS_TOTAL_INCREASING,
272
+ message="CH_PUMP_HOURS",
273
+ keep_updated=True,
274
+ message_data="u16",
275
+ ),
276
+ "dhw_pump_valve_operation_hours": SensorSchema(
277
+ description="Number of hours that DHW pump has been running or DHW valve has been opened",
278
+ accuracy_decimals=0,
279
+ icon="mdi:clock-outline",
280
+ state_class=STATE_CLASS_TOTAL_INCREASING,
281
+ message="DHW_PUMP_HOURS",
282
+ keep_updated=True,
283
+ message_data="u16",
284
+ ),
285
+ "dhw_burner_operation_hours": SensorSchema(
286
+ description="Number of hours that burner is in operation during DHW mode",
287
+ accuracy_decimals=0,
288
+ icon="mdi:clock-outline",
289
+ state_class=STATE_CLASS_TOTAL_INCREASING,
290
+ message="DHW_BURNER_HOURS",
291
+ keep_updated=True,
292
+ message_data="u16",
293
+ ),
294
+ "t_dhw_set_ub": SensorSchema(
295
+ description="Upper bound for adjustment of DHW setpoint",
296
+ unit_of_measurement=UNIT_CELSIUS,
297
+ accuracy_decimals=0,
298
+ device_class=DEVICE_CLASS_TEMPERATURE,
299
+ state_class=STATE_CLASS_MEASUREMENT,
300
+ message="DHW_BOUNDS",
301
+ keep_updated=False,
302
+ message_data="s8_hb",
303
+ ),
304
+ "t_dhw_set_lb": SensorSchema(
305
+ description="Lower bound for adjustment of DHW setpoint",
306
+ unit_of_measurement=UNIT_CELSIUS,
307
+ accuracy_decimals=0,
308
+ device_class=DEVICE_CLASS_TEMPERATURE,
309
+ state_class=STATE_CLASS_MEASUREMENT,
310
+ message="DHW_BOUNDS",
311
+ keep_updated=False,
312
+ message_data="s8_lb",
313
+ ),
314
+ "max_t_set_ub": SensorSchema(
315
+ description="Upper bound for adjustment of max CH setpoint",
316
+ unit_of_measurement=UNIT_CELSIUS,
317
+ accuracy_decimals=0,
318
+ device_class=DEVICE_CLASS_TEMPERATURE,
319
+ state_class=STATE_CLASS_MEASUREMENT,
320
+ message="CH_BOUNDS",
321
+ keep_updated=False,
322
+ message_data="s8_hb",
323
+ ),
324
+ "max_t_set_lb": SensorSchema(
325
+ description="Lower bound for adjustment of max CH setpoint",
326
+ unit_of_measurement=UNIT_CELSIUS,
327
+ accuracy_decimals=0,
328
+ device_class=DEVICE_CLASS_TEMPERATURE,
329
+ state_class=STATE_CLASS_MEASUREMENT,
330
+ message="CH_BOUNDS",
331
+ keep_updated=False,
332
+ message_data="s8_lb",
333
+ ),
334
+ "t_dhw_set": SensorSchema(
335
+ description="Domestic hot water temperature setpoint",
336
+ unit_of_measurement=UNIT_CELSIUS,
337
+ accuracy_decimals=2,
338
+ device_class=DEVICE_CLASS_TEMPERATURE,
339
+ state_class=STATE_CLASS_MEASUREMENT,
340
+ message="DHW_SETPOINT",
341
+ keep_updated=True,
342
+ message_data="f88",
343
+ ),
344
+ "max_t_set": SensorSchema(
345
+ description="Maximum allowable CH water setpoint",
346
+ unit_of_measurement=UNIT_CELSIUS,
347
+ accuracy_decimals=2,
348
+ device_class=DEVICE_CLASS_TEMPERATURE,
349
+ state_class=STATE_CLASS_MEASUREMENT,
350
+ message="MAX_CH_SETPOINT",
351
+ keep_updated=True,
352
+ message_data="f88",
353
+ ),
354
+ "oem_fault_code": SensorSchema(
355
+ description="OEM fault code",
356
+ unit_of_measurement=UNIT_EMPTY,
357
+ accuracy_decimals=0,
358
+ state_class=STATE_CLASS_NONE,
359
+ message="FAULT_FLAGS",
360
+ keep_updated=True,
361
+ message_data="u8_lb",
362
+ ),
363
+ "oem_diagnostic_code": SensorSchema(
364
+ description="OEM diagnostic code",
365
+ unit_of_measurement=UNIT_EMPTY,
366
+ accuracy_decimals=0,
367
+ state_class=STATE_CLASS_NONE,
368
+ message="OEM_DIAGNOSTIC",
369
+ keep_updated=True,
370
+ message_data="u16",
371
+ ),
372
+ "max_capacity": SensorSchema(
373
+ description="Maximum boiler capacity (KW)",
374
+ unit_of_measurement=UNIT_KILOWATT,
375
+ accuracy_decimals=0,
376
+ state_class=STATE_CLASS_MEASUREMENT,
377
+ disabled_by_default=True,
378
+ message="MAX_BOILER_CAPACITY",
379
+ keep_updated=False,
380
+ message_data="u8_hb",
381
+ ),
382
+ "min_mod_level": SensorSchema(
383
+ description="Minimum modulation level",
384
+ unit_of_measurement=UNIT_PERCENT,
385
+ accuracy_decimals=0,
386
+ icon="mdi:percent",
387
+ disabled_by_default=True,
388
+ state_class=STATE_CLASS_MEASUREMENT,
389
+ message="MAX_BOILER_CAPACITY",
390
+ keep_updated=False,
391
+ message_data="u8_lb",
392
+ ),
393
+ "opentherm_version_device": SensorSchema(
394
+ description="Version of OpenTherm implemented by device",
395
+ unit_of_measurement=UNIT_EMPTY,
396
+ accuracy_decimals=0,
397
+ state_class=STATE_CLASS_NONE,
398
+ disabled_by_default=True,
399
+ message="OT_VERSION_DEVICE",
400
+ keep_updated=False,
401
+ message_data="f88",
402
+ ),
403
+ "device_type": SensorSchema(
404
+ description="Device product type",
405
+ unit_of_measurement=UNIT_EMPTY,
406
+ accuracy_decimals=0,
407
+ state_class=STATE_CLASS_NONE,
408
+ disabled_by_default=True,
409
+ message="VERSION_DEVICE",
410
+ keep_updated=False,
411
+ message_data="u8_hb",
412
+ ),
413
+ "device_version": SensorSchema(
414
+ description="Device product version",
415
+ unit_of_measurement=UNIT_EMPTY,
416
+ accuracy_decimals=0,
417
+ state_class=STATE_CLASS_NONE,
418
+ disabled_by_default=True,
419
+ message="VERSION_DEVICE",
420
+ keep_updated=False,
421
+ message_data="u8_lb",
422
+ ),
423
+ "device_id": SensorSchema(
424
+ description="Device ID code",
425
+ unit_of_measurement=UNIT_EMPTY,
426
+ accuracy_decimals=0,
427
+ state_class=STATE_CLASS_NONE,
428
+ disabled_by_default=True,
429
+ message="DEVICE_CONFIG",
430
+ keep_updated=False,
431
+ message_data="u8_lb",
432
+ ),
433
+ "otc_hc_ratio_ub": SensorSchema(
434
+ description="OTC heat curve ratio upper bound",
435
+ unit_of_measurement=UNIT_EMPTY,
436
+ accuracy_decimals=0,
437
+ state_class=STATE_CLASS_NONE,
438
+ disabled_by_default=True,
439
+ message="OTC_CURVE_BOUNDS",
440
+ keep_updated=False,
441
+ message_data="u8_hb",
442
+ ),
443
+ "otc_hc_ratio_lb": SensorSchema(
444
+ description="OTC heat curve ratio lower bound",
445
+ unit_of_measurement=UNIT_EMPTY,
446
+ accuracy_decimals=0,
447
+ state_class=STATE_CLASS_NONE,
448
+ disabled_by_default=True,
449
+ message="OTC_CURVE_BOUNDS",
450
+ keep_updated=False,
451
+ message_data="u8_lb",
452
+ ),
453
+ }
454
+
455
+
456
+ @dataclass
457
+ class BinarySensorSchema(EntitySchema):
458
+ icon: Optional[str] = None
459
+ device_class: Optional[str] = None
460
+
461
+
462
+ BINARY_SENSORS: dict[str, BinarySensorSchema] = {
463
+ "fault_indication": BinarySensorSchema(
464
+ description="Status: Fault indication",
465
+ device_class=DEVICE_CLASS_PROBLEM,
466
+ message="STATUS",
467
+ keep_updated=True,
468
+ message_data="flag8_lb_0",
469
+ ),
470
+ "ch_active": BinarySensorSchema(
471
+ description="Status: Central Heating active",
472
+ device_class=DEVICE_CLASS_HEAT,
473
+ icon="mdi:radiator",
474
+ message="STATUS",
475
+ keep_updated=True,
476
+ message_data="flag8_lb_1",
477
+ ),
478
+ "dhw_active": BinarySensorSchema(
479
+ description="Status: Domestic Hot Water active",
480
+ device_class=DEVICE_CLASS_HEAT,
481
+ icon="mdi:faucet",
482
+ message="STATUS",
483
+ keep_updated=True,
484
+ message_data="flag8_lb_2",
485
+ ),
486
+ "flame_on": BinarySensorSchema(
487
+ description="Status: Flame on",
488
+ device_class=DEVICE_CLASS_HEAT,
489
+ icon="mdi:fire",
490
+ message="STATUS",
491
+ keep_updated=True,
492
+ message_data="flag8_lb_3",
493
+ ),
494
+ "cooling_active": BinarySensorSchema(
495
+ description="Status: Cooling active",
496
+ device_class=DEVICE_CLASS_COLD,
497
+ message="STATUS",
498
+ keep_updated=True,
499
+ message_data="flag8_lb_4",
500
+ ),
501
+ "ch2_active": BinarySensorSchema(
502
+ description="Status: Central Heating 2 active",
503
+ device_class=DEVICE_CLASS_HEAT,
504
+ icon="mdi:radiator",
505
+ message="STATUS",
506
+ keep_updated=True,
507
+ message_data="flag8_lb_5",
508
+ ),
509
+ "diagnostic_indication": BinarySensorSchema(
510
+ description="Status: Diagnostic event",
511
+ device_class=DEVICE_CLASS_PROBLEM,
512
+ message="STATUS",
513
+ keep_updated=True,
514
+ message_data="flag8_lb_6",
515
+ ),
516
+ "electricity_production": BinarySensorSchema(
517
+ description="Status: Electricity production",
518
+ device_class=DEVICE_CLASS_PROBLEM,
519
+ message="STATUS",
520
+ keep_updated=True,
521
+ message_data="flag8_lb_7",
522
+ ),
523
+ "dhw_present": BinarySensorSchema(
524
+ description="Configuration: DHW present",
525
+ message="DEVICE_CONFIG",
526
+ keep_updated=False,
527
+ message_data="flag8_hb_0",
528
+ ),
529
+ "control_type_on_off": BinarySensorSchema(
530
+ description="Configuration: Control type is on/off",
531
+ message="DEVICE_CONFIG",
532
+ keep_updated=False,
533
+ message_data="flag8_hb_1",
534
+ ),
535
+ "cooling_supported": BinarySensorSchema(
536
+ description="Configuration: Cooling supported",
537
+ message="DEVICE_CONFIG",
538
+ keep_updated=False,
539
+ message_data="flag8_hb_2",
540
+ ),
541
+ "dhw_storage_tank": BinarySensorSchema(
542
+ description="Configuration: DHW storage tank",
543
+ message="DEVICE_CONFIG",
544
+ keep_updated=False,
545
+ message_data="flag8_hb_3",
546
+ ),
547
+ "controller_pump_control_allowed": BinarySensorSchema(
548
+ description="Configuration: Controller pump control allowed",
549
+ message="DEVICE_CONFIG",
550
+ keep_updated=False,
551
+ message_data="flag8_hb_4",
552
+ ),
553
+ "ch2_present": BinarySensorSchema(
554
+ description="Configuration: CH2 present",
555
+ message="DEVICE_CONFIG",
556
+ keep_updated=False,
557
+ message_data="flag8_hb_5",
558
+ ),
559
+ "water_filling": BinarySensorSchema(
560
+ description="Configuration: Remote water filling",
561
+ message="DEVICE_CONFIG",
562
+ keep_updated=False,
563
+ message_data="flag8_hb_6",
564
+ ),
565
+ "heat_mode": BinarySensorSchema(
566
+ description="Configuration: Heating or cooling",
567
+ message="DEVICE_CONFIG",
568
+ keep_updated=False,
569
+ message_data="flag8_hb_7",
570
+ ),
571
+ "dhw_setpoint_transfer_enabled": BinarySensorSchema(
572
+ description="Remote boiler parameters: DHW setpoint transfer enabled",
573
+ message="REMOTE",
574
+ keep_updated=False,
575
+ message_data="flag8_hb_0",
576
+ ),
577
+ "max_ch_setpoint_transfer_enabled": BinarySensorSchema(
578
+ description="Remote boiler parameters: CH maximum setpoint transfer enabled",
579
+ message="REMOTE",
580
+ keep_updated=False,
581
+ message_data="flag8_hb_1",
582
+ ),
583
+ "dhw_setpoint_rw": BinarySensorSchema(
584
+ description="Remote boiler parameters: DHW setpoint read/write",
585
+ message="REMOTE",
586
+ keep_updated=False,
587
+ message_data="flag8_lb_0",
588
+ ),
589
+ "max_ch_setpoint_rw": BinarySensorSchema(
590
+ description="Remote boiler parameters: CH maximum setpoint read/write",
591
+ message="REMOTE",
592
+ keep_updated=False,
593
+ message_data="flag8_lb_1",
594
+ ),
595
+ "service_request": BinarySensorSchema(
596
+ description="Service required",
597
+ device_class=DEVICE_CLASS_PROBLEM,
598
+ message="FAULT_FLAGS",
599
+ keep_updated=True,
600
+ message_data="flag8_hb_0",
601
+ ),
602
+ "lockout_reset": BinarySensorSchema(
603
+ description="Lockout Reset",
604
+ device_class=DEVICE_CLASS_PROBLEM,
605
+ message="FAULT_FLAGS",
606
+ keep_updated=True,
607
+ message_data="flag8_hb_1",
608
+ ),
609
+ "low_water_pressure": BinarySensorSchema(
610
+ description="Low water pressure fault",
611
+ device_class=DEVICE_CLASS_PROBLEM,
612
+ message="FAULT_FLAGS",
613
+ keep_updated=True,
614
+ message_data="flag8_hb_2",
615
+ ),
616
+ "flame_fault": BinarySensorSchema(
617
+ description="Flame fault",
618
+ device_class=DEVICE_CLASS_PROBLEM,
619
+ message="FAULT_FLAGS",
620
+ keep_updated=True,
621
+ message_data="flag8_hb_3",
622
+ ),
623
+ "air_pressure_fault": BinarySensorSchema(
624
+ description="Air pressure fault",
625
+ device_class=DEVICE_CLASS_PROBLEM,
626
+ message="FAULT_FLAGS",
627
+ keep_updated=True,
628
+ message_data="flag8_hb_4",
629
+ ),
630
+ "water_over_temp": BinarySensorSchema(
631
+ description="Water overtemperature",
632
+ device_class=DEVICE_CLASS_PROBLEM,
633
+ message="FAULT_FLAGS",
634
+ keep_updated=True,
635
+ message_data="flag8_hb_5",
636
+ ),
637
+ }
638
+
639
+
640
+ @dataclass
641
+ class SwitchSchema(EntitySchema):
642
+ default_mode: Optional[str] = None
643
+
644
+
645
+ SWITCHES: dict[str, SwitchSchema] = {
646
+ "ch_enable": SwitchSchema(
647
+ description="Central Heating enabled",
648
+ message="STATUS",
649
+ keep_updated=True,
650
+ message_data="flag8_hb_0",
651
+ default_mode="restore_default_off",
652
+ ),
653
+ "dhw_enable": SwitchSchema(
654
+ description="Domestic Hot Water enabled",
655
+ message="STATUS",
656
+ keep_updated=True,
657
+ message_data="flag8_hb_1",
658
+ default_mode="restore_default_off",
659
+ ),
660
+ "cooling_enable": SwitchSchema(
661
+ description="Cooling enabled",
662
+ message="STATUS",
663
+ keep_updated=True,
664
+ message_data="flag8_hb_2",
665
+ default_mode="restore_default_off",
666
+ ),
667
+ "otc_active": SwitchSchema(
668
+ description="Outside temperature compensation active",
669
+ message="STATUS",
670
+ keep_updated=True,
671
+ message_data="flag8_hb_3",
672
+ default_mode="restore_default_off",
673
+ ),
674
+ "ch2_active": SwitchSchema(
675
+ description="Central Heating 2 active",
676
+ message="STATUS",
677
+ keep_updated=True,
678
+ message_data="flag8_hb_4",
679
+ default_mode="restore_default_off",
680
+ ),
681
+ "summer_mode_active": SwitchSchema(
682
+ description="Summer mode active",
683
+ message="STATUS",
684
+ keep_updated=True,
685
+ message_data="flag8_hb_5",
686
+ default_mode="restore_default_off",
687
+ ),
688
+ "dhw_block": SwitchSchema(
689
+ description="DHW blocked",
690
+ message="STATUS",
691
+ keep_updated=True,
692
+ message_data="flag8_hb_6",
693
+ default_mode="restore_default_off",
694
+ ),
695
+ }
696
+
697
+
698
+ @dataclass
699
+ class AutoConfigure:
700
+ message: str
701
+ message_data: str
702
+
703
+
704
+ @dataclass
705
+ class InputSchema(EntitySchema):
706
+ unit_of_measurement: str
707
+ step: float
708
+ range: tuple[int, int]
709
+ icon: Optional[str] = None
710
+ auto_max_value: Optional[AutoConfigure] = None
711
+ auto_min_value: Optional[AutoConfigure] = None
712
+
713
+
714
+ INPUTS: dict[str, InputSchema] = {
715
+ "t_set": InputSchema(
716
+ description="Control setpoint: temperature setpoint for the boiler's supply water",
717
+ unit_of_measurement=UNIT_CELSIUS,
718
+ step=0.1,
719
+ message="CH_SETPOINT",
720
+ keep_updated=True,
721
+ message_data="f88",
722
+ range=(0, 100),
723
+ auto_max_value=AutoConfigure(message="MAX_CH_SETPOINT", message_data="f88"),
724
+ ),
725
+ "t_set_ch2": InputSchema(
726
+ description="Control setpoint 2: temperature setpoint for the boiler's supply water on the second heating circuit",
727
+ unit_of_measurement=UNIT_CELSIUS,
728
+ step=0.1,
729
+ message="CH2_SETPOINT",
730
+ keep_updated=True,
731
+ message_data="f88",
732
+ range=(0, 100),
733
+ auto_max_value=AutoConfigure(message="MAX_CH_SETPOINT", message_data="f88"),
734
+ ),
735
+ "cooling_control": InputSchema(
736
+ description="Cooling control signal",
737
+ unit_of_measurement=UNIT_PERCENT,
738
+ step=1.0,
739
+ message="COOLING_CONTROL",
740
+ keep_updated=True,
741
+ message_data="f88",
742
+ range=(0, 100),
743
+ ),
744
+ "t_dhw_set": InputSchema(
745
+ description="Domestic hot water temperature setpoint",
746
+ unit_of_measurement=UNIT_CELSIUS,
747
+ step=0.1,
748
+ message="DHW_SETPOINT",
749
+ keep_updated=True,
750
+ message_data="f88",
751
+ range=(0, 127),
752
+ auto_min_value=AutoConfigure(message="DHW_BOUNDS", message_data="s8_lb"),
753
+ auto_max_value=AutoConfigure(message="DHW_BOUNDS", message_data="s8_hb"),
754
+ ),
755
+ "max_t_set": InputSchema(
756
+ description="Maximum allowable CH water setpoint",
757
+ unit_of_measurement=UNIT_CELSIUS,
758
+ step=0.1,
759
+ message="MAX_CH_SETPOINT",
760
+ keep_updated=True,
761
+ message_data="f88",
762
+ range=(0, 127),
763
+ auto_min_value=AutoConfigure(message="CH_BOUNDS", message_data="s8_lb"),
764
+ auto_max_value=AutoConfigure(message="CH_BOUNDS", message_data="s8_hb"),
765
+ ),
766
+ "t_room_set": InputSchema(
767
+ description="Current room temperature setpoint (informational)",
768
+ unit_of_measurement=UNIT_CELSIUS,
769
+ step=0.1,
770
+ message="ROOM_SETPOINT",
771
+ keep_updated=True,
772
+ message_data="f88",
773
+ range=(-40, 127),
774
+ ),
775
+ "t_room_set_ch2": InputSchema(
776
+ description="Current room temperature setpoint on CH2 (informational)",
777
+ unit_of_measurement=UNIT_CELSIUS,
778
+ step=0.1,
779
+ message="ROOM_SETPOINT_CH2",
780
+ keep_updated=True,
781
+ message_data="f88",
782
+ range=(-40, 127),
783
+ ),
784
+ "t_room": InputSchema(
785
+ description="Current sensed room temperature (informational)",
786
+ unit_of_measurement=UNIT_CELSIUS,
787
+ step=0.1,
788
+ message="ROOM_TEMP",
789
+ keep_updated=True,
790
+ message_data="f88",
791
+ range=(-40, 127),
792
+ ),
793
+ "max_rel_mod_level": InputSchema(
794
+ description="Maximum relative modulation level",
795
+ unit_of_measurement=UNIT_PERCENT,
796
+ step=1,
797
+ icon="mdi:percent",
798
+ message="MAX_MODULATION_LEVEL",
799
+ keep_updated=True,
800
+ message_data="f88",
801
+ range=(0, 100),
802
+ ),
803
+ "otc_hc_ratio": InputSchema(
804
+ description="OTC heat curve ratio",
805
+ unit_of_measurement=UNIT_CELSIUS,
806
+ step=0.1,
807
+ message="OTC_CURVE_RATIO",
808
+ keep_updated=True,
809
+ message_data="f88",
810
+ range=(0, 127),
811
+ auto_min_value=AutoConfigure(message="OTC_CURVE_BOUNDS", message_data="u8_lb"),
812
+ auto_max_value=AutoConfigure(message="OTC_CURVE_BOUNDS", message_data="u8_hb"),
813
+ ),
814
+ }