esphome 2024.12.3__py3-none-any.whl → 2025.2.0b1__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.
- esphome/__main__.py +16 -3
- esphome/components/adc/__init__.py +17 -11
- esphome/components/adc/adc_sensor.h +17 -0
- esphome/components/adc/adc_sensor_common.cpp +55 -0
- esphome/components/adc/adc_sensor_esp32.cpp +8 -5
- esphome/components/adc/adc_sensor_esp8266.cpp +10 -6
- esphome/components/adc/adc_sensor_libretiny.cpp +11 -6
- esphome/components/adc/adc_sensor_rp2040.cpp +13 -10
- esphome/components/adc/sensor.py +9 -3
- esphome/components/ads1115/ads1115.cpp +56 -7
- esphome/components/ads1115/ads1115.h +13 -1
- esphome/components/ads1115/sensor/__init__.py +16 -0
- esphome/components/ads1115/sensor/ads1115_sensor.cpp +2 -1
- esphome/components/ads1115/sensor/ads1115_sensor.h +2 -0
- esphome/components/animation/__init__.py +23 -261
- esphome/components/animation/animation.cpp +2 -2
- esphome/components/animation/animation.h +2 -1
- esphome/components/api/api_pb2.cpp +14 -0
- esphome/components/api/api_pb2.h +1 -0
- esphome/components/audio/__init__.py +112 -0
- esphome/components/audio/audio.cpp +67 -0
- esphome/components/audio/audio.h +125 -7
- esphome/components/audio/audio_decoder.cpp +361 -0
- esphome/components/audio/audio_decoder.h +135 -0
- esphome/components/audio/audio_reader.cpp +308 -0
- esphome/components/audio/audio_reader.h +85 -0
- esphome/components/audio/audio_resampler.cpp +159 -0
- esphome/components/audio/audio_resampler.h +101 -0
- esphome/components/audio/audio_transfer_buffer.cpp +165 -0
- esphome/components/audio/audio_transfer_buffer.h +139 -0
- esphome/components/audio_adc/__init__.py +41 -0
- esphome/components/audio_adc/audio_adc.h +17 -0
- esphome/components/audio_adc/automation.h +23 -0
- esphome/components/bk72xx/__init__.py +1 -0
- esphome/components/ble_client/ble_client.cpp +1 -2
- esphome/components/ble_client/sensor/__init__.py +1 -1
- esphome/components/ble_client/text_sensor/__init__.py +1 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -0
- esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -0
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +5 -0
- esphome/components/ch422g/ch422g.h +2 -0
- esphome/components/climate/__init__.py +1 -1
- esphome/components/climate_ir/climate_ir.cpp +2 -1
- esphome/components/coolix/coolix.cpp +2 -1
- esphome/components/custom/__init__.py +0 -3
- esphome/components/custom/binary_sensor/__init__.py +2 -28
- esphome/components/custom/climate/__init__.py +2 -27
- esphome/components/custom/cover/__init__.py +2 -27
- esphome/components/custom/light/__init__.py +2 -27
- esphome/components/custom/output/__init__.py +2 -58
- esphome/components/custom/sensor/__init__.py +2 -24
- esphome/components/custom/switch/__init__.py +2 -24
- esphome/components/custom/text_sensor/__init__.py +2 -29
- esphome/components/custom_component/__init__.py +3 -27
- esphome/components/daly_bms/daly_bms.cpp +6 -0
- esphome/components/daly_bms/daly_bms.h +2 -0
- esphome/components/daly_bms/sensor.py +6 -0
- esphome/components/debug/debug_component.cpp +4 -0
- esphome/components/debug/debug_component.h +14 -0
- esphome/components/debug/debug_esp32.cpp +154 -74
- esphome/components/dfplayer/dfplayer.cpp +15 -2
- esphome/components/dfrobot_sen0395/dfrobot_sen0395.cpp +2 -1
- esphome/components/dht/dht.cpp +2 -1
- esphome/components/display/__init__.py +18 -5
- esphome/components/display/display.cpp +2 -1
- esphome/components/display/rect.cpp +2 -1
- esphome/components/es7210/__init__.py +0 -0
- esphome/components/es7210/audio_adc.py +51 -0
- esphome/components/es7210/es7210.cpp +228 -0
- esphome/components/es7210/es7210.h +62 -0
- esphome/components/es7210/es7210_const.h +129 -0
- esphome/components/es7243e/__init__.py +0 -0
- esphome/components/es7243e/audio_adc.py +34 -0
- esphome/components/es7243e/es7243e.cpp +125 -0
- esphome/components/es7243e/es7243e.h +37 -0
- esphome/components/es7243e/es7243e_const.h +54 -0
- esphome/components/es8156/__init__.py +0 -0
- esphome/components/es8156/audio_dac.py +27 -0
- esphome/components/es8156/es8156.cpp +87 -0
- esphome/components/es8156/es8156.h +51 -0
- esphome/components/es8156/es8156_const.h +68 -0
- esphome/components/es8311/audio_dac.py +1 -2
- esphome/components/esp32/__init__.py +1 -0
- esphome/components/esp32/core.cpp +5 -1
- esphome/components/esp32/gpio.h +2 -0
- esphome/components/esp32_ble/__init__.py +39 -0
- esphome/components/esp32_ble/queue.h +4 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +46 -0
- esphome/components/esp32_ble_client/ble_client_base.h +2 -0
- esphome/components/esp32_ble_server/__init__.py +582 -12
- esphome/components/esp32_ble_server/ble_characteristic.cpp +48 -60
- esphome/components/esp32_ble_server/ble_characteristic.h +24 -17
- esphome/components/esp32_ble_server/ble_descriptor.cpp +21 -9
- esphome/components/esp32_ble_server/ble_descriptor.h +17 -6
- esphome/components/esp32_ble_server/ble_server.cpp +62 -67
- esphome/components/esp32_ble_server/ble_server.h +28 -32
- esphome/components/esp32_ble_server/ble_server_automations.cpp +77 -0
- esphome/components/esp32_ble_server/ble_server_automations.h +115 -0
- esphome/components/esp32_ble_server/ble_service.cpp +17 -15
- esphome/components/esp32_ble_server/ble_service.h +10 -14
- esphome/components/esp32_ble_tracker/__init__.py +6 -39
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +33 -10
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +8 -4
- esphome/components/esp32_improv/__init__.py +2 -8
- esphome/components/esp32_improv/esp32_improv_component.cpp +21 -20
- esphome/components/esp32_improv/esp32_improv_component.h +3 -4
- esphome/components/esp32_rmt/__init__.py +28 -3
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +73 -6
- esphome/components/esp32_rmt_led_strip/led_strip.h +21 -3
- esphome/components/esp32_rmt_led_strip/light.py +72 -7
- esphome/components/esp32_touch/esp32_touch.cpp +5 -0
- esphome/components/esp8266/__init__.py +1 -0
- esphome/components/esp8266/gpio.h +1 -0
- esphome/components/ethernet/__init__.py +10 -10
- esphome/components/event/event.cpp +4 -2
- esphome/components/event/event.h +2 -0
- esphome/components/event_emitter/__init__.py +5 -0
- esphome/components/event_emitter/event_emitter.cpp +14 -0
- esphome/components/event_emitter/event_emitter.h +63 -0
- esphome/components/gcja5/gcja5.cpp +2 -1
- esphome/components/haier/haier_base.cpp +2 -1
- esphome/components/haier/hon_climate.cpp +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +2 -1
- esphome/components/host/__init__.py +1 -0
- esphome/components/host/gpio.h +1 -0
- esphome/components/http_request/http_request.h +2 -2
- esphome/components/http_request/http_request_arduino.cpp +1 -1
- esphome/components/http_request/http_request_idf.cpp +1 -1
- esphome/components/i2c/i2c_bus_esp_idf.cpp +4 -0
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +7 -5
- esphome/components/i2s_audio/speaker/__init__.py +53 -6
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +92 -46
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +8 -0
- esphome/components/ili9xxx/display.py +29 -11
- esphome/components/ili9xxx/ili9xxx_display.cpp +2 -5
- esphome/components/ili9xxx/ili9xxx_display.h +2 -1
- esphome/components/image/__init__.py +443 -255
- esphome/components/image/image.cpp +115 -61
- esphome/components/image/image.h +15 -24
- esphome/components/json/json_util.cpp +8 -34
- esphome/components/libretiny/__init__.py +1 -0
- esphome/components/libretiny/gpio_arduino.h +1 -0
- esphome/components/light/light_color_values.h +1 -1
- esphome/components/logger/__init__.py +43 -7
- esphome/components/logger/logger.cpp +16 -11
- esphome/components/logger/logger.h +11 -7
- esphome/components/logger/select/__init__.py +29 -0
- esphome/components/logger/select/logger_level_select.cpp +27 -0
- esphome/components/logger/select/logger_level_select.h +15 -0
- esphome/components/lvgl/__init__.py +96 -73
- esphome/components/lvgl/automation.py +39 -7
- esphome/components/lvgl/defines.py +8 -2
- esphome/components/lvgl/lvgl_esphome.cpp +8 -15
- esphome/components/lvgl/lvgl_esphome.h +20 -5
- esphome/components/lvgl/schemas.py +25 -14
- esphome/components/lvgl/trigger.py +27 -3
- esphome/components/lvgl/widgets/dropdown.py +1 -1
- esphome/components/lvgl/widgets/keyboard.py +8 -1
- esphome/components/lvgl/widgets/meter.py +2 -1
- esphome/components/lvgl/widgets/msgbox.py +1 -1
- esphome/components/lvgl/widgets/obj.py +1 -12
- esphome/components/lvgl/widgets/page.py +37 -2
- esphome/components/lvgl/widgets/tabview.py +1 -1
- esphome/components/max6956/max6956.h +2 -0
- esphome/components/mcp23016/mcp23016.h +2 -0
- esphome/components/mcp23xxx_base/mcp23xxx_base.h +2 -0
- esphome/components/mdns/__init__.py +1 -1
- esphome/components/media_player/__init__.py +37 -8
- esphome/components/media_player/automation.h +11 -2
- esphome/components/media_player/media_player.cpp +8 -0
- esphome/components/media_player/media_player.h +8 -4
- esphome/components/micronova/switch/micronova_switch.cpp +4 -2
- esphome/components/midea/ac_automations.h +3 -1
- esphome/components/midea/air_conditioner.cpp +7 -5
- esphome/components/midea/air_conditioner.h +1 -1
- esphome/components/midea/climate.py +4 -2
- esphome/components/midea/ir_transmitter.h +36 -5
- esphome/components/mixer/__init__.py +0 -0
- esphome/components/mixer/speaker/__init__.py +172 -0
- esphome/components/mixer/speaker/automation.h +19 -0
- esphome/components/mixer/speaker/mixer_speaker.cpp +624 -0
- esphome/components/mixer/speaker/mixer_speaker.h +207 -0
- esphome/components/mpr121/mpr121.h +2 -0
- esphome/components/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +7 -1
- esphome/components/mqtt/mqtt_client.h +1 -1
- esphome/components/mqtt/mqtt_climate.cpp +2 -2
- esphome/components/network/ip_address.h +2 -0
- esphome/components/nextion/automation.h +17 -0
- esphome/components/nextion/display.py +42 -17
- esphome/components/nextion/nextion.cpp +4 -10
- esphome/components/nextion/nextion.h +89 -82
- esphome/components/nextion/nextion_commands.cpp +10 -10
- esphome/components/ntc/sensor.py +2 -4
- esphome/components/online_image/__init__.py +98 -46
- esphome/components/online_image/bmp_image.cpp +101 -0
- esphome/components/online_image/bmp_image.h +40 -0
- esphome/components/online_image/image_decoder.cpp +28 -2
- esphome/components/online_image/image_decoder.h +24 -15
- esphome/components/online_image/jpeg_image.cpp +90 -0
- esphome/components/online_image/jpeg_image.h +34 -0
- esphome/components/online_image/online_image.cpp +112 -53
- esphome/components/online_image/online_image.h +24 -7
- esphome/components/online_image/png_image.cpp +7 -3
- esphome/components/online_image/png_image.h +2 -1
- esphome/components/opentherm/__init__.py +73 -7
- esphome/components/opentherm/automation.h +25 -0
- esphome/components/opentherm/const.py +1 -0
- esphome/components/opentherm/generate.py +39 -6
- esphome/components/opentherm/hub.cpp +117 -79
- esphome/components/opentherm/hub.h +31 -15
- esphome/components/opentherm/opentherm.cpp +47 -23
- esphome/components/opentherm/opentherm.h +27 -6
- esphome/components/opentherm/opentherm_macros.h +11 -0
- esphome/components/opentherm/schema.py +78 -1
- esphome/components/opentherm/validate.py +7 -2
- esphome/components/pca6416a/pca6416a.h +2 -0
- esphome/components/pca9554/pca9554.h +2 -0
- esphome/components/pcf8574/pcf8574.h +2 -0
- esphome/components/preferences/__init__.py +2 -4
- esphome/components/preferences/syncer.h +10 -3
- esphome/components/prometheus/prometheus_handler.cpp +313 -0
- esphome/components/prometheus/prometheus_handler.h +48 -7
- esphome/components/psram/psram.cpp +8 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +14 -9
- esphome/components/pulse_counter/pulse_counter_sensor.h +4 -4
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +2 -0
- esphome/components/qspi_dbi/__init__.py +3 -0
- esphome/components/qspi_dbi/display.py +74 -47
- esphome/components/qspi_dbi/models.py +245 -2
- esphome/components/qspi_dbi/qspi_dbi.cpp +9 -16
- esphome/components/qspi_dbi/qspi_dbi.h +2 -2
- esphome/components/remote_base/__init__.py +77 -25
- esphome/components/remote_base/remote_base.cpp +1 -1
- esphome/components/remote_base/remote_base.h +20 -2
- esphome/components/remote_base/toto_protocol.cpp +100 -0
- esphome/components/remote_base/toto_protocol.h +45 -0
- esphome/components/remote_receiver/__init__.py +55 -10
- esphome/components/remote_receiver/remote_receiver.h +36 -3
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +145 -6
- esphome/components/remote_transmitter/__init__.py +62 -4
- esphome/components/remote_transmitter/remote_transmitter.h +21 -2
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +140 -4
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +3 -3
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +3 -3
- esphome/components/resampler/__init__.py +0 -0
- esphome/components/resampler/speaker/__init__.py +103 -0
- esphome/components/resampler/speaker/resampler_speaker.cpp +318 -0
- esphome/components/resampler/speaker/resampler_speaker.h +107 -0
- esphome/components/resistance/resistance_sensor.h +2 -3
- esphome/components/resistance/sensor.py +2 -9
- esphome/components/rotary_encoder/rotary_encoder.cpp +8 -4
- esphome/components/rp2040/__init__.py +1 -0
- esphome/components/rp2040/gpio.h +1 -0
- esphome/components/rtl87xx/__init__.py +2 -0
- esphome/components/sdl/binary_sensor.py +270 -0
- esphome/components/sdl/sdl_esphome.cpp +16 -0
- esphome/components/sdl/sdl_esphome.h +9 -0
- esphome/components/seeed_mr60bha2/binary_sensor.py +25 -0
- esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +26 -2
- esphome/components/seeed_mr60bha2/seeed_mr60bha2.h +9 -20
- esphome/components/seeed_mr60bha2/sensor.py +9 -1
- esphome/components/sn74hc165/sn74hc165.h +3 -0
- esphome/components/sn74hc595/sn74hc595.h +3 -0
- esphome/components/speaker/__init__.py +5 -4
- esphome/components/speaker/media_player/__init__.py +458 -0
- esphome/components/speaker/media_player/audio_pipeline.cpp +568 -0
- esphome/components/speaker/media_player/audio_pipeline.h +159 -0
- esphome/components/speaker/media_player/automation.h +26 -0
- esphome/components/speaker/media_player/speaker_media_player.cpp +577 -0
- esphome/components/speaker/media_player/speaker_media_player.h +160 -0
- esphome/components/speaker/speaker.h +20 -0
- esphome/components/spi/__init__.py +1 -5
- esphome/components/spi/spi.cpp +7 -1
- esphome/components/spi/spi.h +21 -2
- esphome/components/spi_led_strip/light.py +3 -5
- esphome/components/spi_led_strip/spi_led_strip.cpp +67 -0
- esphome/components/spi_led_strip/spi_led_strip.h +8 -60
- esphome/components/sprinkler/sprinkler.cpp +3 -1
- esphome/components/sx1509/sx1509_gpio_pin.h +2 -0
- esphome/components/tca9555/tca9555.h +2 -0
- esphome/components/toshiba/toshiba.cpp +2 -1
- esphome/components/tuya/light/tuya_light.cpp +4 -2
- esphome/components/uart/uart_component_esp32_arduino.cpp +2 -2
- esphome/components/uart/uart_component_esp_idf.cpp +2 -2
- esphome/components/udp/__init__.py +8 -2
- esphome/components/udp/udp_component.cpp +25 -56
- esphome/components/udp/udp_component.h +3 -0
- esphome/components/uponor_smatrix/sensor/__init__.py +14 -4
- esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +5 -0
- esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.h +1 -0
- esphome/components/uptime/text_sensor/__init__.py +19 -0
- esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +63 -0
- esphome/components/uptime/text_sensor/uptime_text_sensor.h +25 -0
- esphome/components/voice_assistant/voice_assistant.cpp +24 -14
- esphome/components/voice_assistant/voice_assistant.h +8 -0
- esphome/components/waveshare_epaper/display.py +22 -1
- esphome/components/waveshare_epaper/waveshare_213v3.cpp +9 -3
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +1155 -44
- esphome/components/waveshare_epaper/waveshare_epaper.h +208 -7
- esphome/components/web_server/web_server.cpp +28 -6
- esphome/components/weikai/weikai.h +2 -0
- esphome/components/wifi/__init__.py +6 -6
- esphome/components/wifi/wifi_component.cpp +1 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -1
- esphome/components/wireguard/__init__.py +2 -2
- esphome/components/xl9535/xl9535.h +2 -0
- esphome/components/xxtea/__init__.py +3 -0
- esphome/components/xxtea/xxtea.cpp +46 -0
- esphome/components/xxtea/xxtea.h +26 -0
- esphome/components/yashima/yashima.cpp +2 -1
- esphome/config.py +9 -5
- esphome/config_validation.py +55 -17
- esphome/const.py +7 -10
- esphome/core/__init__.py +6 -13
- esphome/core/base_automation.h +1 -0
- esphome/core/config.py +57 -72
- esphome/core/defines.h +9 -1
- esphome/core/gpio.h +7 -0
- esphome/core/helpers.cpp +19 -15
- esphome/core/helpers.h +57 -8
- esphome/core/log.h +9 -7
- esphome/cpp_generator.py +2 -2
- esphome/espota2.py +3 -2
- esphome/loader.py +12 -4
- esphome/log.py +5 -7
- esphome/yaml_util.py +2 -2
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/METADATA +12 -7
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/RECORD +338 -289
- esphome/components/custom/binary_sensor/custom_binary_sensor.cpp +0 -16
- esphome/components/custom/binary_sensor/custom_binary_sensor.h +0 -26
- esphome/components/custom/climate/custom_climate.h +0 -22
- esphome/components/custom/cover/custom_cover.h +0 -21
- esphome/components/custom/light/custom_light_output.h +0 -24
- esphome/components/custom/output/custom_output.h +0 -37
- esphome/components/custom/sensor/custom_sensor.cpp +0 -16
- esphome/components/custom/sensor/custom_sensor.h +0 -24
- esphome/components/custom/switch/custom_switch.cpp +0 -16
- esphome/components/custom/switch/custom_switch.h +0 -24
- esphome/components/custom/text_sensor/custom_text_sensor.cpp +0 -16
- esphome/components/custom/text_sensor/custom_text_sensor.h +0 -26
- esphome/components/custom_component/custom_component.h +0 -28
- esphome/components/esp32_ble_server/ble_2901.cpp +0 -18
- esphome/components/esp32_ble_server/ble_2901.h +0 -19
- esphome/components/resistance_sampler/__init__.py +0 -6
- esphome/components/resistance_sampler/resistance_sampler.h +0 -10
- esphome/components/uptime/{sensor.py → sensor/__init__.py} +3 -3
- /esphome/components/uptime/{uptime_seconds_sensor.cpp → sensor/uptime_seconds_sensor.cpp} +0 -0
- /esphome/components/uptime/{uptime_seconds_sensor.h → sensor/uptime_seconds_sensor.h} +0 -0
- /esphome/components/uptime/{uptime_timestamp_sensor.cpp → sensor/uptime_timestamp_sensor.cpp} +0 -0
- /esphome/components/uptime/{uptime_timestamp_sensor.h → sensor/uptime_timestamp_sensor.h} +0 -0
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/LICENSE +0 -0
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/WHEEL +0 -0
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2024.12.3.dist-info → esphome-2025.2.0b1.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,9 @@ namespace opentherm {
|
|
28
28
|
#ifndef OPENTHERM_INPUT_SENSOR_LIST
|
29
29
|
#define OPENTHERM_INPUT_SENSOR_LIST(F, sep)
|
30
30
|
#endif
|
31
|
+
#ifndef OPENTHERM_SETTING_LIST
|
32
|
+
#define OPENTHERM_SETTING_LIST(F, sep)
|
33
|
+
#endif
|
31
34
|
|
32
35
|
// Use macros to create fields for every entity specified in the ESPHome configuration
|
33
36
|
#define OPENTHERM_DECLARE_SENSOR(entity) sensor::Sensor *entity;
|
@@ -36,6 +39,7 @@ namespace opentherm {
|
|
36
39
|
#define OPENTHERM_DECLARE_NUMBER(entity) OpenthermNumber *entity;
|
37
40
|
#define OPENTHERM_DECLARE_OUTPUT(entity) OpenthermOutput *entity;
|
38
41
|
#define OPENTHERM_DECLARE_INPUT_SENSOR(entity) sensor::Sensor *entity;
|
42
|
+
#define OPENTHERM_DECLARE_SETTING(type, entity, def) type entity = def;
|
39
43
|
|
40
44
|
// Setter macros
|
41
45
|
#define OPENTHERM_SET_SENSOR(entity) \
|
@@ -56,6 +60,9 @@ namespace opentherm {
|
|
56
60
|
#define OPENTHERM_SET_INPUT_SENSOR(entity) \
|
57
61
|
void set_##entity(sensor::Sensor *sensor) { this->entity = sensor; }
|
58
62
|
|
63
|
+
#define OPENTHERM_SET_SETTING(type, entity, def) \
|
64
|
+
void set_##entity(type value) { this->entity = value; }
|
65
|
+
|
59
66
|
// ===== hub.cpp macros =====
|
60
67
|
|
61
68
|
// *_MESSAGE_HANDLERS are generated in defines.h and look like this:
|
@@ -85,6 +92,9 @@ namespace opentherm {
|
|
85
92
|
#ifndef OPENTHERM_INPUT_SENSOR_MESSAGE_HANDLERS
|
86
93
|
#define OPENTHERM_INPUT_SENSOR_MESSAGE_HANDLERS(MESSAGE, ENTITY, entity_sep, postscript, msg_sep)
|
87
94
|
#endif
|
95
|
+
#ifndef OPENTHERM_SETTING_MESSAGE_HANDLERS
|
96
|
+
#define OPENTHERM_SETTING_MESSAGE_HANDLERS(MESSAGE, ENTITY, entity_sep, postscript, msg_sep)
|
97
|
+
#endif
|
88
98
|
|
89
99
|
// Write data request builders
|
90
100
|
#define OPENTHERM_MESSAGE_WRITE_MESSAGE(msg) \
|
@@ -92,6 +102,7 @@ namespace opentherm {
|
|
92
102
|
data.type = MessageType::WRITE_DATA; \
|
93
103
|
data.id = request_id;
|
94
104
|
#define OPENTHERM_MESSAGE_WRITE_ENTITY(key, msg_data) message_data::write_##msg_data(this->key->state, data);
|
105
|
+
#define OPENTHERM_MESSAGE_WRITE_SETTING(key, msg_data) message_data::write_##msg_data(this->key, data);
|
95
106
|
#define OPENTHERM_MESSAGE_WRITE_POSTSCRIPT \
|
96
107
|
return data; \
|
97
108
|
}
|
@@ -2,8 +2,9 @@
|
|
2
2
|
# inputs of the OpenTherm component.
|
3
3
|
|
4
4
|
from dataclasses import dataclass
|
5
|
-
from typing import Optional, TypeVar
|
5
|
+
from typing import Optional, TypeVar, Any
|
6
6
|
|
7
|
+
import esphome.config_validation as cv
|
7
8
|
from esphome.const import (
|
8
9
|
UNIT_CELSIUS,
|
9
10
|
UNIT_EMPTY,
|
@@ -64,6 +65,7 @@ class SensorSchema(EntitySchema):
|
|
64
65
|
icon: Optional[str] = None
|
65
66
|
device_class: Optional[str] = None
|
66
67
|
disabled_by_default: bool = False
|
68
|
+
order: Optional[int] = None
|
67
69
|
|
68
70
|
|
69
71
|
SENSORS: dict[str, SensorSchema] = {
|
@@ -399,6 +401,7 @@ SENSORS: dict[str, SensorSchema] = {
|
|
399
401
|
message="OT_VERSION_DEVICE",
|
400
402
|
keep_updated=False,
|
401
403
|
message_data="f88",
|
404
|
+
order=2,
|
402
405
|
),
|
403
406
|
"device_type": SensorSchema(
|
404
407
|
description="Device product type",
|
@@ -409,6 +412,7 @@ SENSORS: dict[str, SensorSchema] = {
|
|
409
412
|
message="VERSION_DEVICE",
|
410
413
|
keep_updated=False,
|
411
414
|
message_data="u8_hb",
|
415
|
+
order=0,
|
412
416
|
),
|
413
417
|
"device_version": SensorSchema(
|
414
418
|
description="Device product version",
|
@@ -419,6 +423,7 @@ SENSORS: dict[str, SensorSchema] = {
|
|
419
423
|
message="VERSION_DEVICE",
|
420
424
|
keep_updated=False,
|
421
425
|
message_data="u8_lb",
|
426
|
+
order=0,
|
422
427
|
),
|
423
428
|
"device_id": SensorSchema(
|
424
429
|
description="Device ID code",
|
@@ -429,6 +434,7 @@ SENSORS: dict[str, SensorSchema] = {
|
|
429
434
|
message="DEVICE_CONFIG",
|
430
435
|
keep_updated=False,
|
431
436
|
message_data="u8_lb",
|
437
|
+
order=4,
|
432
438
|
),
|
433
439
|
"otc_hc_ratio_ub": SensorSchema(
|
434
440
|
description="OTC heat curve ratio upper bound",
|
@@ -457,6 +463,7 @@ SENSORS: dict[str, SensorSchema] = {
|
|
457
463
|
class BinarySensorSchema(EntitySchema):
|
458
464
|
icon: Optional[str] = None
|
459
465
|
device_class: Optional[str] = None
|
466
|
+
order: Optional[int] = None
|
460
467
|
|
461
468
|
|
462
469
|
BINARY_SENSORS: dict[str, BinarySensorSchema] = {
|
@@ -525,48 +532,56 @@ BINARY_SENSORS: dict[str, BinarySensorSchema] = {
|
|
525
532
|
message="DEVICE_CONFIG",
|
526
533
|
keep_updated=False,
|
527
534
|
message_data="flag8_hb_0",
|
535
|
+
order=4,
|
528
536
|
),
|
529
537
|
"control_type_on_off": BinarySensorSchema(
|
530
538
|
description="Configuration: Control type is on/off",
|
531
539
|
message="DEVICE_CONFIG",
|
532
540
|
keep_updated=False,
|
533
541
|
message_data="flag8_hb_1",
|
542
|
+
order=4,
|
534
543
|
),
|
535
544
|
"cooling_supported": BinarySensorSchema(
|
536
545
|
description="Configuration: Cooling supported",
|
537
546
|
message="DEVICE_CONFIG",
|
538
547
|
keep_updated=False,
|
539
548
|
message_data="flag8_hb_2",
|
549
|
+
order=4,
|
540
550
|
),
|
541
551
|
"dhw_storage_tank": BinarySensorSchema(
|
542
552
|
description="Configuration: DHW storage tank",
|
543
553
|
message="DEVICE_CONFIG",
|
544
554
|
keep_updated=False,
|
545
555
|
message_data="flag8_hb_3",
|
556
|
+
order=4,
|
546
557
|
),
|
547
558
|
"controller_pump_control_allowed": BinarySensorSchema(
|
548
559
|
description="Configuration: Controller pump control allowed",
|
549
560
|
message="DEVICE_CONFIG",
|
550
561
|
keep_updated=False,
|
551
562
|
message_data="flag8_hb_4",
|
563
|
+
order=4,
|
552
564
|
),
|
553
565
|
"ch2_present": BinarySensorSchema(
|
554
566
|
description="Configuration: CH2 present",
|
555
567
|
message="DEVICE_CONFIG",
|
556
568
|
keep_updated=False,
|
557
569
|
message_data="flag8_hb_5",
|
570
|
+
order=4,
|
558
571
|
),
|
559
572
|
"water_filling": BinarySensorSchema(
|
560
573
|
description="Configuration: Remote water filling",
|
561
574
|
message="DEVICE_CONFIG",
|
562
575
|
keep_updated=False,
|
563
576
|
message_data="flag8_hb_6",
|
577
|
+
order=4,
|
564
578
|
),
|
565
579
|
"heat_mode": BinarySensorSchema(
|
566
580
|
description="Configuration: Heating or cooling",
|
567
581
|
message="DEVICE_CONFIG",
|
568
582
|
keep_updated=False,
|
569
583
|
message_data="flag8_hb_7",
|
584
|
+
order=4,
|
570
585
|
),
|
571
586
|
"dhw_setpoint_transfer_enabled": BinarySensorSchema(
|
572
587
|
description="Remote boiler parameters: DHW setpoint transfer enabled",
|
@@ -812,3 +827,65 @@ INPUTS: dict[str, InputSchema] = {
|
|
812
827
|
auto_max_value=AutoConfigure(message="OTC_CURVE_BOUNDS", message_data="u8_hb"),
|
813
828
|
),
|
814
829
|
}
|
830
|
+
|
831
|
+
|
832
|
+
@dataclass
|
833
|
+
class SettingSchema(EntitySchema):
|
834
|
+
backing_type: str
|
835
|
+
validation_schema: cv.Schema
|
836
|
+
default_value: Any
|
837
|
+
order: Optional[int] = None
|
838
|
+
|
839
|
+
|
840
|
+
SETTINGS: dict[str, SettingSchema] = {
|
841
|
+
"controller_product_type": SettingSchema(
|
842
|
+
description="Controller product type",
|
843
|
+
message="VERSION_CONTROLLER",
|
844
|
+
keep_updated=False,
|
845
|
+
message_data="u8_hb",
|
846
|
+
backing_type="uint8_t",
|
847
|
+
validation_schema=cv.int_range(min=0, max=255),
|
848
|
+
default_value=0,
|
849
|
+
order=1,
|
850
|
+
),
|
851
|
+
"controller_product_version": SettingSchema(
|
852
|
+
description="Controller product version",
|
853
|
+
message="VERSION_CONTROLLER",
|
854
|
+
keep_updated=False,
|
855
|
+
message_data="u8_lb",
|
856
|
+
backing_type="uint8_t",
|
857
|
+
validation_schema=cv.int_range(min=0, max=255),
|
858
|
+
default_value=0,
|
859
|
+
order=1,
|
860
|
+
),
|
861
|
+
"opentherm_version_controller": SettingSchema(
|
862
|
+
description="Version of OpenTherm implemented by controller",
|
863
|
+
message="OT_VERSION_CONTROLLER",
|
864
|
+
keep_updated=False,
|
865
|
+
message_data="f88",
|
866
|
+
backing_type="float",
|
867
|
+
validation_schema=cv.positive_float,
|
868
|
+
default_value=0,
|
869
|
+
order=3,
|
870
|
+
),
|
871
|
+
"controller_configuration": SettingSchema(
|
872
|
+
description="Controller configuration",
|
873
|
+
message="CONTROLLER_CONFIG",
|
874
|
+
keep_updated=False,
|
875
|
+
message_data="u8_hb",
|
876
|
+
backing_type="uint8_t",
|
877
|
+
validation_schema=cv.int_range(min=0, max=255),
|
878
|
+
default_value=0,
|
879
|
+
order=5,
|
880
|
+
),
|
881
|
+
"controller_id": SettingSchema(
|
882
|
+
description="Controller ID code",
|
883
|
+
message="CONTROLLER_CONFIG",
|
884
|
+
keep_updated=False,
|
885
|
+
message_data="u8_lb",
|
886
|
+
backing_type="uint8_t",
|
887
|
+
validation_schema=cv.int_range(min=0, max=255),
|
888
|
+
default_value=0,
|
889
|
+
order=5,
|
890
|
+
),
|
891
|
+
}
|
@@ -9,12 +9,17 @@ from .schema import TSchema
|
|
9
9
|
|
10
10
|
|
11
11
|
def create_entities_schema(
|
12
|
-
entities: dict[str,
|
12
|
+
entities: dict[str, TSchema],
|
13
13
|
get_entity_validation_schema: Callable[[TSchema], cv.Schema],
|
14
14
|
) -> Schema:
|
15
15
|
entity_schema = {}
|
16
16
|
for key, entity in entities.items():
|
17
|
-
|
17
|
+
schema_key = (
|
18
|
+
cv.Optional(key, entity.default_value)
|
19
|
+
if hasattr(entity, "default_value")
|
20
|
+
else cv.Optional(key)
|
21
|
+
)
|
22
|
+
entity_schema[schema_key] = get_entity_validation_schema(entity)
|
18
23
|
return cv.Schema(entity_schema)
|
19
24
|
|
20
25
|
|
@@ -52,6 +52,8 @@ class PCA6416AGPIOPin : public GPIOPin {
|
|
52
52
|
void set_inverted(bool inverted) { inverted_ = inverted; }
|
53
53
|
void set_flags(gpio::Flags flags) { flags_ = flags; }
|
54
54
|
|
55
|
+
gpio::Flags get_flags() const override { return this->flags_; }
|
56
|
+
|
55
57
|
protected:
|
56
58
|
PCA6416AComponent *parent_;
|
57
59
|
uint8_t pin_;
|
@@ -65,6 +65,8 @@ class PCA9554GPIOPin : public GPIOPin {
|
|
65
65
|
void set_inverted(bool inverted) { inverted_ = inverted; }
|
66
66
|
void set_flags(gpio::Flags flags) { flags_ = flags; }
|
67
67
|
|
68
|
+
gpio::Flags get_flags() const override { return this->flags_; }
|
69
|
+
|
68
70
|
protected:
|
69
71
|
PCA9554Component *parent_;
|
70
72
|
uint8_t pin_;
|
@@ -54,6 +54,8 @@ class PCF8574GPIOPin : public GPIOPin {
|
|
54
54
|
void set_inverted(bool inverted) { inverted_ = inverted; }
|
55
55
|
void set_flags(gpio::Flags flags) { flags_ = flags; }
|
56
56
|
|
57
|
+
gpio::Flags get_flags() const override { return this->flags_; }
|
58
|
+
|
57
59
|
protected:
|
58
60
|
PCF8574Component *parent_;
|
59
61
|
uint8_t pin_;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
from esphome.const import CONF_ID
|
2
1
|
import esphome.codegen as cg
|
3
2
|
import esphome.config_validation as cv
|
3
|
+
from esphome.const import CONF_ID
|
4
4
|
|
5
5
|
CODEOWNERS = ["@esphome/core"]
|
6
6
|
|
@@ -11,9 +11,7 @@ CONF_FLASH_WRITE_INTERVAL = "flash_write_interval"
|
|
11
11
|
CONFIG_SCHEMA = cv.Schema(
|
12
12
|
{
|
13
13
|
cv.GenerateID(): cv.declare_id(IntervalSyncer),
|
14
|
-
cv.Optional(
|
15
|
-
CONF_FLASH_WRITE_INTERVAL, default="60s"
|
16
|
-
): cv.positive_time_period_milliseconds,
|
14
|
+
cv.Optional(CONF_FLASH_WRITE_INTERVAL, default="60s"): cv.update_interval,
|
17
15
|
}
|
18
16
|
).extend(cv.COMPONENT_SCHEMA)
|
19
17
|
|
@@ -8,15 +8,22 @@ namespace preferences {
|
|
8
8
|
|
9
9
|
class IntervalSyncer : public Component {
|
10
10
|
public:
|
11
|
-
void set_write_interval(uint32_t write_interval) { write_interval_ = write_interval; }
|
11
|
+
void set_write_interval(uint32_t write_interval) { this->write_interval_ = write_interval; }
|
12
12
|
void setup() override {
|
13
|
-
|
13
|
+
if (this->write_interval_ != 0) {
|
14
|
+
set_interval(this->write_interval_, []() { global_preferences->sync(); });
|
15
|
+
}
|
16
|
+
}
|
17
|
+
void loop() override {
|
18
|
+
if (this->write_interval_ == 0) {
|
19
|
+
global_preferences->sync();
|
20
|
+
}
|
14
21
|
}
|
15
22
|
void on_shutdown() override { global_preferences->sync(); }
|
16
23
|
float get_setup_priority() const override { return setup_priority::BUS; }
|
17
24
|
|
18
25
|
protected:
|
19
|
-
uint32_t write_interval_;
|
26
|
+
uint32_t write_interval_{60000};
|
20
27
|
};
|
21
28
|
|
22
29
|
} // namespace preferences
|
@@ -59,6 +59,36 @@ void PrometheusHandler::handleRequest(AsyncWebServerRequest *req) {
|
|
59
59
|
this->text_sensor_row_(stream, obj, area, node, friendly_name);
|
60
60
|
#endif
|
61
61
|
|
62
|
+
#ifdef USE_NUMBER
|
63
|
+
this->number_type_(stream);
|
64
|
+
for (auto *obj : App.get_numbers())
|
65
|
+
this->number_row_(stream, obj, area, node, friendly_name);
|
66
|
+
#endif
|
67
|
+
|
68
|
+
#ifdef USE_SELECT
|
69
|
+
this->select_type_(stream);
|
70
|
+
for (auto *obj : App.get_selects())
|
71
|
+
this->select_row_(stream, obj, area, node, friendly_name);
|
72
|
+
#endif
|
73
|
+
|
74
|
+
#ifdef USE_MEDIA_PLAYER
|
75
|
+
this->media_player_type_(stream);
|
76
|
+
for (auto *obj : App.get_media_players())
|
77
|
+
this->media_player_row_(stream, obj, area, node, friendly_name);
|
78
|
+
#endif
|
79
|
+
|
80
|
+
#ifdef USE_UPDATE
|
81
|
+
this->update_entity_type_(stream);
|
82
|
+
for (auto *obj : App.get_updates())
|
83
|
+
this->update_entity_row_(stream, obj, area, node, friendly_name);
|
84
|
+
#endif
|
85
|
+
|
86
|
+
#ifdef USE_VALVE
|
87
|
+
this->valve_type_(stream);
|
88
|
+
for (auto *obj : App.get_valves())
|
89
|
+
this->valve_row_(stream, obj, area, node, friendly_name);
|
90
|
+
#endif
|
91
|
+
|
62
92
|
req->send(stream);
|
63
93
|
}
|
64
94
|
|
@@ -511,6 +541,289 @@ void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_senso
|
|
511
541
|
}
|
512
542
|
#endif
|
513
543
|
|
544
|
+
// Type-specific implementation
|
545
|
+
#ifdef USE_NUMBER
|
546
|
+
void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
|
547
|
+
stream->print(F("#TYPE esphome_number_value gauge\n"));
|
548
|
+
stream->print(F("#TYPE esphome_number_failed gauge\n"));
|
549
|
+
}
|
550
|
+
void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
|
551
|
+
std::string &node, std::string &friendly_name) {
|
552
|
+
if (obj->is_internal() && !this->include_internal_)
|
553
|
+
return;
|
554
|
+
if (!std::isnan(obj->state)) {
|
555
|
+
// We have a valid value, output this value
|
556
|
+
stream->print(F("esphome_number_failed{id=\""));
|
557
|
+
stream->print(relabel_id_(obj).c_str());
|
558
|
+
add_area_label_(stream, area);
|
559
|
+
add_node_label_(stream, node);
|
560
|
+
add_friendly_name_label_(stream, friendly_name);
|
561
|
+
stream->print(F("\",name=\""));
|
562
|
+
stream->print(relabel_name_(obj).c_str());
|
563
|
+
stream->print(F("\"} 0\n"));
|
564
|
+
// Data itself
|
565
|
+
stream->print(F("esphome_number_value{id=\""));
|
566
|
+
stream->print(relabel_id_(obj).c_str());
|
567
|
+
add_area_label_(stream, area);
|
568
|
+
add_node_label_(stream, node);
|
569
|
+
add_friendly_name_label_(stream, friendly_name);
|
570
|
+
stream->print(F("\",name=\""));
|
571
|
+
stream->print(relabel_name_(obj).c_str());
|
572
|
+
stream->print(F("\"} "));
|
573
|
+
stream->print(obj->state);
|
574
|
+
stream->print(F("\n"));
|
575
|
+
} else {
|
576
|
+
// Invalid state
|
577
|
+
stream->print(F("esphome_number_failed{id=\""));
|
578
|
+
stream->print(relabel_id_(obj).c_str());
|
579
|
+
add_area_label_(stream, area);
|
580
|
+
add_node_label_(stream, node);
|
581
|
+
add_friendly_name_label_(stream, friendly_name);
|
582
|
+
stream->print(F("\",name=\""));
|
583
|
+
stream->print(relabel_name_(obj).c_str());
|
584
|
+
stream->print(F("\"} 1\n"));
|
585
|
+
}
|
586
|
+
}
|
587
|
+
#endif
|
588
|
+
|
589
|
+
#ifdef USE_SELECT
|
590
|
+
void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
|
591
|
+
stream->print(F("#TYPE esphome_select_value gauge\n"));
|
592
|
+
stream->print(F("#TYPE esphome_select_failed gauge\n"));
|
593
|
+
}
|
594
|
+
void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
|
595
|
+
std::string &node, std::string &friendly_name) {
|
596
|
+
if (obj->is_internal() && !this->include_internal_)
|
597
|
+
return;
|
598
|
+
if (obj->has_state()) {
|
599
|
+
// We have a valid value, output this value
|
600
|
+
stream->print(F("esphome_select_failed{id=\""));
|
601
|
+
stream->print(relabel_id_(obj).c_str());
|
602
|
+
add_area_label_(stream, area);
|
603
|
+
add_node_label_(stream, node);
|
604
|
+
add_friendly_name_label_(stream, friendly_name);
|
605
|
+
stream->print(F("\",name=\""));
|
606
|
+
stream->print(relabel_name_(obj).c_str());
|
607
|
+
stream->print(F("\"} 0\n"));
|
608
|
+
// Data itself
|
609
|
+
stream->print(F("esphome_select_value{id=\""));
|
610
|
+
stream->print(relabel_id_(obj).c_str());
|
611
|
+
add_area_label_(stream, area);
|
612
|
+
add_node_label_(stream, node);
|
613
|
+
add_friendly_name_label_(stream, friendly_name);
|
614
|
+
stream->print(F("\",name=\""));
|
615
|
+
stream->print(relabel_name_(obj).c_str());
|
616
|
+
stream->print(F("\",value=\""));
|
617
|
+
stream->print(obj->state.c_str());
|
618
|
+
stream->print(F("\"} "));
|
619
|
+
stream->print(F("1.0"));
|
620
|
+
stream->print(F("\n"));
|
621
|
+
} else {
|
622
|
+
// Invalid state
|
623
|
+
stream->print(F("esphome_select_failed{id=\""));
|
624
|
+
stream->print(relabel_id_(obj).c_str());
|
625
|
+
add_area_label_(stream, area);
|
626
|
+
add_node_label_(stream, node);
|
627
|
+
add_friendly_name_label_(stream, friendly_name);
|
628
|
+
stream->print(F("\",name=\""));
|
629
|
+
stream->print(relabel_name_(obj).c_str());
|
630
|
+
stream->print(F("\"} 1\n"));
|
631
|
+
}
|
632
|
+
}
|
633
|
+
#endif
|
634
|
+
|
635
|
+
#ifdef USE_MEDIA_PLAYER
|
636
|
+
void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
|
637
|
+
stream->print(F("#TYPE esphome_media_player_state_value gauge\n"));
|
638
|
+
stream->print(F("#TYPE esphome_media_player_volume gauge\n"));
|
639
|
+
stream->print(F("#TYPE esphome_media_player_is_muted gauge\n"));
|
640
|
+
stream->print(F("#TYPE esphome_media_player_failed gauge\n"));
|
641
|
+
}
|
642
|
+
void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj,
|
643
|
+
std::string &area, std::string &node, std::string &friendly_name) {
|
644
|
+
if (obj->is_internal() && !this->include_internal_)
|
645
|
+
return;
|
646
|
+
stream->print(F("esphome_media_player_failed{id=\""));
|
647
|
+
stream->print(relabel_id_(obj).c_str());
|
648
|
+
add_area_label_(stream, area);
|
649
|
+
add_node_label_(stream, node);
|
650
|
+
add_friendly_name_label_(stream, friendly_name);
|
651
|
+
stream->print(F("\",name=\""));
|
652
|
+
stream->print(relabel_name_(obj).c_str());
|
653
|
+
stream->print(F("\"} 0\n"));
|
654
|
+
// Data itself
|
655
|
+
stream->print(F("esphome_media_player_state_value{id=\""));
|
656
|
+
stream->print(relabel_id_(obj).c_str());
|
657
|
+
add_area_label_(stream, area);
|
658
|
+
add_node_label_(stream, node);
|
659
|
+
add_friendly_name_label_(stream, friendly_name);
|
660
|
+
stream->print(F("\",name=\""));
|
661
|
+
stream->print(relabel_name_(obj).c_str());
|
662
|
+
stream->print(F("\",value=\""));
|
663
|
+
stream->print(media_player::media_player_state_to_string(obj->state));
|
664
|
+
stream->print(F("\"} "));
|
665
|
+
stream->print(F("1.0"));
|
666
|
+
stream->print(F("\n"));
|
667
|
+
stream->print(F("esphome_media_player_volume{id=\""));
|
668
|
+
stream->print(relabel_id_(obj).c_str());
|
669
|
+
add_area_label_(stream, area);
|
670
|
+
add_node_label_(stream, node);
|
671
|
+
add_friendly_name_label_(stream, friendly_name);
|
672
|
+
stream->print(F("\",name=\""));
|
673
|
+
stream->print(relabel_name_(obj).c_str());
|
674
|
+
stream->print(F("\"} "));
|
675
|
+
stream->print(obj->volume);
|
676
|
+
stream->print(F("\n"));
|
677
|
+
stream->print(F("esphome_media_player_is_muted{id=\""));
|
678
|
+
stream->print(relabel_id_(obj).c_str());
|
679
|
+
add_area_label_(stream, area);
|
680
|
+
add_node_label_(stream, node);
|
681
|
+
add_friendly_name_label_(stream, friendly_name);
|
682
|
+
stream->print(F("\",name=\""));
|
683
|
+
stream->print(relabel_name_(obj).c_str());
|
684
|
+
stream->print(F("\"} "));
|
685
|
+
if (obj->is_muted()) {
|
686
|
+
stream->print(F("1.0"));
|
687
|
+
} else {
|
688
|
+
stream->print(F("0.0"));
|
689
|
+
}
|
690
|
+
stream->print(F("\n"));
|
691
|
+
}
|
692
|
+
#endif
|
693
|
+
|
694
|
+
#ifdef USE_UPDATE
|
695
|
+
void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) {
|
696
|
+
stream->print(F("#TYPE esphome_update_entity_state gauge\n"));
|
697
|
+
stream->print(F("#TYPE esphome_update_entity_info gauge\n"));
|
698
|
+
stream->print(F("#TYPE esphome_update_entity_failed gauge\n"));
|
699
|
+
}
|
700
|
+
|
701
|
+
void PrometheusHandler::handle_update_state_(AsyncResponseStream *stream, update::UpdateState state) {
|
702
|
+
switch (state) {
|
703
|
+
case update::UpdateState::UPDATE_STATE_UNKNOWN:
|
704
|
+
stream->print("unknown");
|
705
|
+
break;
|
706
|
+
case update::UpdateState::UPDATE_STATE_NO_UPDATE:
|
707
|
+
stream->print("none");
|
708
|
+
break;
|
709
|
+
case update::UpdateState::UPDATE_STATE_AVAILABLE:
|
710
|
+
stream->print("available");
|
711
|
+
break;
|
712
|
+
case update::UpdateState::UPDATE_STATE_INSTALLING:
|
713
|
+
stream->print("installing");
|
714
|
+
break;
|
715
|
+
default:
|
716
|
+
stream->print("invalid");
|
717
|
+
break;
|
718
|
+
}
|
719
|
+
}
|
720
|
+
|
721
|
+
void PrometheusHandler::update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area,
|
722
|
+
std::string &node, std::string &friendly_name) {
|
723
|
+
if (obj->is_internal() && !this->include_internal_)
|
724
|
+
return;
|
725
|
+
if (obj->has_state()) {
|
726
|
+
// We have a valid value, output this value
|
727
|
+
stream->print(F("esphome_update_entity_failed{id=\""));
|
728
|
+
stream->print(relabel_id_(obj).c_str());
|
729
|
+
add_area_label_(stream, area);
|
730
|
+
add_node_label_(stream, node);
|
731
|
+
add_friendly_name_label_(stream, friendly_name);
|
732
|
+
stream->print(F("\",name=\""));
|
733
|
+
stream->print(relabel_name_(obj).c_str());
|
734
|
+
stream->print(F("\"} 0\n"));
|
735
|
+
// First update state
|
736
|
+
stream->print(F("esphome_update_entity_state{id=\""));
|
737
|
+
stream->print(relabel_id_(obj).c_str());
|
738
|
+
add_area_label_(stream, area);
|
739
|
+
add_node_label_(stream, node);
|
740
|
+
add_friendly_name_label_(stream, friendly_name);
|
741
|
+
stream->print(F("\",name=\""));
|
742
|
+
stream->print(relabel_name_(obj).c_str());
|
743
|
+
stream->print(F("\",value=\""));
|
744
|
+
handle_update_state_(stream, obj->state);
|
745
|
+
stream->print(F("\"} "));
|
746
|
+
stream->print(F("1.0"));
|
747
|
+
stream->print(F("\n"));
|
748
|
+
// Next update info
|
749
|
+
stream->print(F("esphome_update_entity_info{id=\""));
|
750
|
+
stream->print(relabel_id_(obj).c_str());
|
751
|
+
add_area_label_(stream, area);
|
752
|
+
add_node_label_(stream, node);
|
753
|
+
add_friendly_name_label_(stream, friendly_name);
|
754
|
+
stream->print(F("\",name=\""));
|
755
|
+
stream->print(relabel_name_(obj).c_str());
|
756
|
+
stream->print(F("\",current_version=\""));
|
757
|
+
stream->print(obj->update_info.current_version.c_str());
|
758
|
+
stream->print(F("\",latest_version=\""));
|
759
|
+
stream->print(obj->update_info.latest_version.c_str());
|
760
|
+
stream->print(F("\",title=\""));
|
761
|
+
stream->print(obj->update_info.title.c_str());
|
762
|
+
stream->print(F("\"} "));
|
763
|
+
stream->print(F("1.0"));
|
764
|
+
stream->print(F("\n"));
|
765
|
+
} else {
|
766
|
+
// Invalid state
|
767
|
+
stream->print(F("esphome_update_entity_failed{id=\""));
|
768
|
+
stream->print(relabel_id_(obj).c_str());
|
769
|
+
add_area_label_(stream, area);
|
770
|
+
add_node_label_(stream, node);
|
771
|
+
add_friendly_name_label_(stream, friendly_name);
|
772
|
+
stream->print(F("\",name=\""));
|
773
|
+
stream->print(relabel_name_(obj).c_str());
|
774
|
+
stream->print(F("\"} 1\n"));
|
775
|
+
}
|
776
|
+
}
|
777
|
+
#endif
|
778
|
+
|
779
|
+
#ifdef USE_VALVE
|
780
|
+
void PrometheusHandler::valve_type_(AsyncResponseStream *stream) {
|
781
|
+
stream->print(F("#TYPE esphome_valve_operation gauge\n"));
|
782
|
+
stream->print(F("#TYPE esphome_valve_failed gauge\n"));
|
783
|
+
stream->print(F("#TYPE esphome_valve_position gauge\n"));
|
784
|
+
}
|
785
|
+
|
786
|
+
void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
|
787
|
+
std::string &friendly_name) {
|
788
|
+
if (obj->is_internal() && !this->include_internal_)
|
789
|
+
return;
|
790
|
+
stream->print(F("esphome_valve_failed{id=\""));
|
791
|
+
stream->print(relabel_id_(obj).c_str());
|
792
|
+
add_area_label_(stream, area);
|
793
|
+
add_node_label_(stream, node);
|
794
|
+
add_friendly_name_label_(stream, friendly_name);
|
795
|
+
stream->print(F("\",name=\""));
|
796
|
+
stream->print(relabel_name_(obj).c_str());
|
797
|
+
stream->print(F("\"} 0\n"));
|
798
|
+
// Data itself
|
799
|
+
stream->print(F("esphome_valve_operation{id=\""));
|
800
|
+
stream->print(relabel_id_(obj).c_str());
|
801
|
+
add_area_label_(stream, area);
|
802
|
+
add_node_label_(stream, node);
|
803
|
+
add_friendly_name_label_(stream, friendly_name);
|
804
|
+
stream->print(F("\",name=\""));
|
805
|
+
stream->print(relabel_name_(obj).c_str());
|
806
|
+
stream->print(F("\",operation=\""));
|
807
|
+
stream->print(valve::valve_operation_to_str(obj->current_operation));
|
808
|
+
stream->print(F("\"} "));
|
809
|
+
stream->print(F("1.0"));
|
810
|
+
stream->print(F("\n"));
|
811
|
+
// Now see if position is supported
|
812
|
+
if (obj->get_traits().get_supports_position()) {
|
813
|
+
stream->print(F("esphome_valve_position{id=\""));
|
814
|
+
stream->print(relabel_id_(obj).c_str());
|
815
|
+
add_area_label_(stream, area);
|
816
|
+
add_node_label_(stream, node);
|
817
|
+
add_friendly_name_label_(stream, friendly_name);
|
818
|
+
stream->print(F("\",name=\""));
|
819
|
+
stream->print(relabel_name_(obj).c_str());
|
820
|
+
stream->print(F("\"} "));
|
821
|
+
stream->print(obj->position);
|
822
|
+
stream->print(F("\n"));
|
823
|
+
}
|
824
|
+
}
|
825
|
+
#endif
|
826
|
+
|
514
827
|
} // namespace prometheus
|
515
828
|
} // namespace esphome
|
516
829
|
#endif
|