esphome 2025.8.4__py3-none-any.whl → 2025.9.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.
- esphome/__main__.py +177 -105
- esphome/components/absolute_humidity/absolute_humidity.cpp +3 -5
- esphome/components/adc/__init__.py +1 -26
- esphome/components/adc/adc_sensor_esp32.cpp +29 -6
- esphome/components/adc/sensor.py +20 -0
- esphome/components/ade7880/ade7880.cpp +1 -1
- esphome/components/ags10/ags10.cpp +3 -18
- esphome/components/ags10/ags10.h +2 -12
- esphome/components/aht10/aht10.cpp +3 -3
- esphome/components/airthings_ble/__init__.py +2 -2
- esphome/components/alarm_control_panel/__init__.py +2 -2
- esphome/components/am2315c/am2315c.cpp +1 -17
- esphome/components/am2315c/am2315c.h +2 -3
- esphome/components/api/__init__.py +2 -2
- esphome/components/api/api_connection.cpp +38 -34
- esphome/components/api/api_connection.h +20 -40
- esphome/components/api/api_frame_helper.cpp +25 -25
- esphome/components/api/api_frame_helper.h +3 -3
- esphome/components/api/api_frame_helper_noise.cpp +75 -40
- esphome/components/api/api_frame_helper_noise.h +3 -7
- esphome/components/api/api_frame_helper_plaintext.cpp +17 -4
- esphome/components/api/api_frame_helper_plaintext.h +1 -4
- esphome/components/api/api_pb2.cpp +12 -2
- esphome/components/api/api_pb2.h +144 -143
- esphome/components/api/api_pb2_dump.cpp +6 -1
- esphome/components/api/api_pb2_service.cpp +0 -14
- esphome/components/api/api_pb2_service.h +1 -3
- esphome/components/api/client.py +5 -3
- esphome/components/api/proto.cpp +33 -37
- esphome/components/async_tcp/__init__.py +2 -2
- esphome/components/atm90e26/sensor.py +2 -0
- esphome/components/atm90e32/sensor.py +4 -2
- esphome/components/audio_adc/__init__.py +2 -2
- esphome/components/audio_dac/__init__.py +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +1 -1
- esphome/components/bedjet/bedjet_hub.cpp +1 -1
- esphome/components/binary_sensor/__init__.py +2 -2
- esphome/components/binary_sensor/binary_sensor.cpp +13 -0
- esphome/components/binary_sensor/binary_sensor.h +4 -7
- esphome/components/bl0940/__init__.py +6 -1
- esphome/components/bl0940/bl0940.cpp +178 -41
- esphome/components/bl0940/bl0940.h +121 -76
- esphome/components/bl0940/button/__init__.py +27 -0
- esphome/components/bl0940/button/calibration_reset_button.cpp +20 -0
- esphome/components/bl0940/button/calibration_reset_button.h +19 -0
- esphome/components/bl0940/number/__init__.py +94 -0
- esphome/components/bl0940/number/calibration_number.cpp +29 -0
- esphome/components/bl0940/number/calibration_number.h +26 -0
- esphome/components/bl0940/sensor.py +151 -2
- esphome/components/bl0942/bl0942.cpp +1 -1
- esphome/components/ble_client/output/__init__.py +4 -4
- esphome/components/bluetooth_proxy/__init__.py +1 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -1
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +15 -7
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +6 -3
- esphome/components/button/__init__.py +2 -2
- esphome/components/button/button.cpp +13 -0
- esphome/components/button/button.h +4 -7
- esphome/components/camera/buffer.h +18 -0
- esphome/components/camera/buffer_impl.cpp +20 -0
- esphome/components/camera/buffer_impl.h +26 -0
- esphome/components/camera/camera.h +43 -0
- esphome/components/camera/encoder.h +69 -0
- esphome/components/camera_encoder/__init__.py +62 -0
- esphome/components/camera_encoder/encoder_buffer_impl.cpp +23 -0
- esphome/components/camera_encoder/encoder_buffer_impl.h +25 -0
- esphome/components/camera_encoder/esp32_camera_jpeg_encoder.cpp +82 -0
- esphome/components/camera_encoder/esp32_camera_jpeg_encoder.h +39 -0
- esphome/components/captive_portal/__init__.py +2 -2
- esphome/components/captive_portal/captive_index.h +77 -97
- esphome/components/captive_portal/captive_portal.cpp +35 -12
- esphome/components/captive_portal/captive_portal.h +3 -3
- esphome/components/ccs811/ccs811.cpp +3 -3
- esphome/components/climate/__init__.py +2 -2
- esphome/components/climate/climate.cpp +1 -1
- esphome/components/cover/__init__.py +5 -5
- esphome/components/cover/cover.cpp +1 -1
- esphome/components/cover/cover.h +2 -2
- esphome/components/dallas_temp/dallas_temp.cpp +2 -2
- esphome/components/datetime/__init__.py +2 -2
- esphome/components/datetime/date_entity.h +2 -2
- esphome/components/datetime/datetime_entity.h +2 -2
- esphome/components/datetime/time_entity.h +2 -2
- esphome/components/debug/debug_esp32.cpp +1 -1
- esphome/components/display/__init__.py +4 -4
- esphome/components/duty_time/duty_time_sensor.cpp +1 -1
- esphome/components/esp32/__init__.py +0 -5
- esphome/components/esp32/gpio.cpp +27 -23
- esphome/components/esp32/gpio.h +26 -11
- esphome/components/esp32/preferences.cpp +8 -4
- esphome/components/esp32_ble/__init__.py +7 -2
- esphome/components/esp32_ble/ble_uuid.cpp +30 -9
- esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +4 -3
- esphome/components/esp32_ble_client/ble_client_base.cpp +7 -3
- esphome/components/esp32_ble_client/ble_client_base.h +8 -5
- esphome/components/esp32_ble_tracker/__init__.py +2 -2
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +11 -47
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -14
- esphome/components/esp8266/__init__.py +2 -2
- esphome/components/esp8266/core.cpp +2 -2
- esphome/components/esp8266/gpio.py +4 -4
- esphome/components/esp8266/preferences.cpp +30 -28
- esphome/components/esphome/ota/__init__.py +2 -2
- esphome/components/esphome/ota/ota_esphome.cpp +21 -19
- esphome/components/esphome/ota/ota_esphome.h +6 -5
- esphome/components/ethernet/__init__.py +18 -2
- esphome/components/ethernet/ethernet_component.cpp +53 -3
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/event/__init__.py +2 -2
- esphome/components/event/event.h +4 -4
- esphome/components/factory_reset/button/factory_reset_button.cpp +18 -1
- esphome/components/factory_reset/button/factory_reset_button.h +6 -1
- esphome/components/factory_reset/switch/factory_reset_switch.cpp +18 -1
- esphome/components/factory_reset/switch/factory_reset_switch.h +5 -1
- esphome/components/fan/__init__.py +2 -2
- esphome/components/fan/fan.cpp +2 -1
- esphome/components/gdk101/gdk101.cpp +4 -4
- esphome/components/globals/__init__.py +2 -2
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +19 -18
- esphome/components/gpio_expander/cached_gpio.h +36 -16
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -5
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
- esphome/components/haier/haier_base.cpp +1 -1
- esphome/components/haier/hon_climate.cpp +1 -1
- esphome/components/hlw8012/hlw8012.cpp +5 -5
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +4 -4
- esphome/components/host/preferences.h +3 -2
- esphome/components/hte501/hte501.cpp +3 -21
- esphome/components/hte501/hte501.h +2 -3
- esphome/components/http_request/ota/__init__.py +2 -2
- esphome/components/i2c/__init__.py +2 -2
- esphome/components/i2c/i2c.cpp +13 -9
- esphome/components/i2c/i2c_bus.h +36 -6
- esphome/components/i2s_audio/__init__.py +8 -2
- esphome/components/i2s_audio/media_player/__init__.py +1 -1
- esphome/components/i2s_audio/microphone/__init__.py +1 -1
- esphome/components/i2s_audio/speaker/__init__.py +1 -1
- esphome/components/ina2xx_base/__init__.py +4 -2
- esphome/components/inkplate/__init__.py +1 -0
- esphome/components/inkplate/const.py +105 -0
- esphome/components/inkplate/display.py +238 -0
- esphome/components/{inkplate6 → inkplate}/inkplate.cpp +156 -74
- esphome/components/{inkplate6 → inkplate}/inkplate.h +28 -68
- esphome/components/inkplate6/__init__.py +0 -1
- esphome/components/inkplate6/display.py +2 -211
- esphome/components/integration/integration_sensor.cpp +1 -1
- esphome/components/json/__init__.py +2 -2
- esphome/components/lc709203f/lc709203f.cpp +4 -17
- esphome/components/lc709203f/lc709203f.h +2 -3
- esphome/components/ld2420/text_sensor/{text_sensor.cpp → ld2420_text_sensor.cpp} +1 -1
- esphome/components/ld2450/ld2450.cpp +1 -1
- esphome/components/libretiny/preferences.cpp +13 -5
- esphome/components/light/__init__.py +2 -2
- esphome/components/light/addressable_light_effect.h +7 -0
- esphome/components/light/base_light_effects.h +8 -0
- esphome/components/light/light_call.cpp +22 -20
- esphome/components/light/light_effect.cpp +36 -0
- esphome/components/light/light_effect.h +14 -0
- esphome/components/light/light_json_schema.cpp +9 -1
- esphome/components/light/light_state.cpp +2 -2
- esphome/components/light/light_state.h +38 -0
- esphome/components/lock/__init__.py +2 -2
- esphome/components/lock/lock.h +2 -2
- esphome/components/logger/__init__.py +2 -2
- esphome/components/logger/logger.cpp +25 -4
- esphome/components/logger/logger.h +1 -1
- esphome/components/logger/logger_esp32.cpp +16 -8
- esphome/components/logger/logger_esp8266.cpp +11 -3
- esphome/components/logger/logger_libretiny.cpp +13 -3
- esphome/components/logger/logger_rp2040.cpp +14 -3
- esphome/components/logger/logger_zephyr.cpp +15 -4
- esphome/components/lvgl/defines.py +1 -0
- esphome/components/lvgl/hello_world.py +96 -33
- esphome/components/lvgl/number/lvgl_number.h +1 -1
- esphome/components/lvgl/select/lvgl_select.h +1 -1
- esphome/components/lvgl/widgets/__init__.py +0 -1
- esphome/components/lvgl/widgets/spinbox.py +20 -11
- esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +1 -1
- esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +1 -1
- esphome/components/mapping/__init__.py +13 -5
- esphome/components/mapping/mapping.h +69 -0
- esphome/components/max17043/max17043.cpp +2 -2
- esphome/components/mcp23016/__init__.py +1 -0
- esphome/components/mcp23016/mcp23016.cpp +20 -5
- esphome/components/mcp23016/mcp23016.h +10 -4
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +1 -1
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +2 -2
- esphome/components/md5/md5.cpp +3 -2
- esphome/components/mdns/__init__.py +2 -2
- esphome/components/mdns/mdns_component.cpp +145 -54
- esphome/components/media_player/__init__.py +2 -2
- esphome/components/micro_wake_word/__init__.py +2 -2
- esphome/components/microphone/__init__.py +2 -2
- esphome/components/mipi/__init__.py +77 -33
- esphome/components/mipi_rgb/__init__.py +2 -0
- esphome/components/mipi_rgb/display.py +321 -0
- esphome/components/mipi_rgb/mipi_rgb.cpp +388 -0
- esphome/components/mipi_rgb/mipi_rgb.h +127 -0
- esphome/components/mipi_rgb/models/guition.py +24 -0
- esphome/components/mipi_rgb/models/lilygo.py +228 -0
- esphome/components/mipi_rgb/models/rpi.py +9 -0
- esphome/components/mipi_rgb/models/st7701s.py +214 -0
- esphome/components/mipi_rgb/models/waveshare.py +64 -0
- esphome/components/mipi_spi/models/jc.py +229 -0
- esphome/components/mlx90614/mlx90614.cpp +1 -16
- esphome/components/mlx90614/mlx90614.h +0 -1
- esphome/components/mqtt/__init__.py +2 -2
- esphome/components/mqtt/mqtt_client.cpp +1 -1
- esphome/components/mqtt/mqtt_sensor.cpp +7 -2
- esphome/components/ms5611/ms5611.cpp +7 -6
- esphome/components/network/__init__.py +2 -2
- esphome/components/nextion/nextion_upload.cpp +4 -1
- esphome/components/nrf52/__init__.py +49 -6
- esphome/components/nrf52/const.py +1 -0
- esphome/components/nrf52/dfu.cpp +51 -0
- esphome/components/nrf52/dfu.h +24 -0
- esphome/components/ntc/ntc.cpp +1 -1
- esphome/components/number/__init__.py +2 -2
- esphome/components/number/automation.cpp +1 -1
- esphome/components/number/number.cpp +21 -0
- esphome/components/number/number.h +4 -13
- esphome/components/opentherm/hub.h +6 -6
- esphome/components/opentherm/number/{number.cpp → opentherm_number.cpp} +2 -2
- esphome/components/opentherm/output/{output.cpp → opentherm_output.cpp} +1 -1
- esphome/components/opentherm/switch/{switch.cpp → opentherm_switch.cpp} +1 -1
- esphome/components/openthread/openthread.cpp +41 -7
- esphome/components/openthread/openthread.h +11 -0
- esphome/components/ota/__init__.py +2 -2
- esphome/components/pca6416a/__init__.py +1 -0
- esphome/components/pca6416a/pca6416a.cpp +20 -5
- esphome/components/pca6416a/pca6416a.h +12 -5
- esphome/components/pca9554/__init__.py +2 -1
- esphome/components/pca9554/pca9554.cpp +12 -18
- esphome/components/pca9554/pca9554.h +10 -9
- esphome/components/pcf8574/__init__.py +1 -0
- esphome/components/pcf8574/pcf8574.cpp +14 -5
- esphome/components/pcf8574/pcf8574.h +13 -6
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +7 -7
- esphome/components/pipsolar/__init__.py +3 -3
- esphome/components/pipsolar/output/__init__.py +4 -4
- esphome/components/pulse_width/pulse_width.cpp +2 -2
- esphome/components/qmp6988/qmp6988.cpp +81 -126
- esphome/components/qmp6988/qmp6988.h +31 -37
- esphome/components/radon_eye_ble/__init__.py +2 -2
- esphome/components/remote_base/__init__.py +6 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +1 -1
- esphome/components/rp2040/__init__.py +2 -2
- esphome/components/runtime_stats/runtime_stats.cpp +10 -23
- esphome/components/runtime_stats/runtime_stats.h +4 -10
- esphome/components/safe_mode/__init__.py +2 -2
- esphome/components/safe_mode/safe_mode.cpp +33 -31
- esphome/components/script/script.cpp +6 -0
- esphome/components/script/script.h +19 -5
- esphome/components/sdm_meter/sensor.py +3 -1
- esphome/components/select/__init__.py +2 -2
- esphome/components/select/select.cpp +3 -3
- esphome/components/select/select.h +2 -2
- esphome/components/select/select_call.cpp +1 -1
- esphome/components/sen5x/sen5x.cpp +57 -55
- esphome/components/sen5x/sen5x.h +21 -15
- esphome/components/sen5x/sensor.py +67 -44
- esphome/components/sensirion_common/i2c_sensirion.cpp +18 -47
- esphome/components/sensirion_common/i2c_sensirion.h +39 -55
- esphome/components/sensor/__init__.py +2 -2
- esphome/components/sensor/automation.h +1 -1
- esphome/components/sensor/sensor.cpp +34 -6
- esphome/components/sensor/sensor.h +4 -21
- esphome/components/sgp30/sgp30.cpp +34 -35
- esphome/components/sgp30/sgp30.h +11 -10
- esphome/components/sgp4x/sgp4x.cpp +2 -2
- esphome/components/shelly_dimmer/light.py +7 -7
- esphome/components/sht4x/sht4x.cpp +1 -1
- esphome/components/sntp/sntp_component.cpp +36 -9
- esphome/components/sntp/sntp_component.h +7 -0
- esphome/components/sound_level/sound_level.cpp +1 -1
- esphome/components/speaker/__init__.py +2 -2
- esphome/components/speaker/media_player/__init__.py +2 -2
- esphome/components/speaker/media_player/speaker_media_player.cpp +1 -1
- esphome/components/spi/__init__.py +2 -2
- esphome/components/sprinkler/sprinkler.cpp +1 -1
- esphome/components/sps30/sps30.cpp +18 -23
- esphome/components/sps30/sps30.h +3 -3
- esphome/components/status_led/__init__.py +2 -2
- esphome/components/stepper/__init__.py +2 -2
- esphome/components/switch/__init__.py +2 -2
- esphome/components/switch/switch.cpp +5 -5
- esphome/components/sx1509/__init__.py +1 -1
- esphome/components/sx1509/sx1509.cpp +12 -7
- esphome/components/sx1509/sx1509.h +11 -4
- esphome/components/tca9555/tca9555.cpp +5 -5
- esphome/components/tee501/tee501.cpp +2 -21
- esphome/components/tee501/tee501.h +2 -4
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +1 -1
- esphome/components/template/datetime/template_date.cpp +1 -1
- esphome/components/template/datetime/template_datetime.cpp +2 -2
- esphome/components/template/datetime/template_time.cpp +1 -1
- esphome/components/template/number/template_number.cpp +1 -1
- esphome/components/template/select/template_select.cpp +1 -1
- esphome/components/template/text/template_text.cpp +1 -1
- esphome/components/text/__init__.py +2 -2
- esphome/components/text/text.h +2 -2
- esphome/components/text_sensor/__init__.py +2 -2
- esphome/components/text_sensor/text_sensor.h +4 -4
- esphome/components/thermostat/climate.py +11 -7
- esphome/components/thermostat/thermostat_climate.cpp +237 -206
- esphome/components/thermostat/thermostat_climate.h +52 -41
- esphome/components/time/__init__.py +2 -2
- esphome/components/tmp1075/tmp1075.cpp +1 -1
- esphome/components/total_daily_energy/total_daily_energy.cpp +1 -1
- esphome/components/touchscreen/__init__.py +2 -2
- esphome/components/tuya/number/tuya_number.cpp +1 -1
- esphome/components/udp/udp_component.cpp +3 -3
- esphome/components/ufire_ec/ufire_ec.cpp +4 -4
- esphome/components/ufire_ise/ufire_ise.cpp +4 -4
- esphome/components/update/__init__.py +2 -2
- esphome/components/usb_uart/usb_uart.cpp +1 -1
- esphome/components/valve/__init__.py +5 -5
- esphome/components/valve/valve.cpp +1 -1
- esphome/components/valve/valve.h +2 -2
- esphome/components/wake_on_lan/wake_on_lan.cpp +2 -2
- esphome/components/waveshare_epaper/waveshare_213v3.cpp +1 -1
- esphome/components/web_server/__init__.py +2 -2
- esphome/components/web_server/ota/__init__.py +2 -2
- esphome/components/web_server/ota/ota_web_server.cpp +11 -0
- esphome/components/web_server/server_index_v2.h +149 -149
- esphome/components/web_server/web_server.cpp +58 -12
- esphome/components/web_server_base/__init__.py +2 -2
- esphome/components/wifi/__init__.py +5 -5
- esphome/components/wifi/wifi_component.cpp +4 -4
- esphome/components/wifi/wifi_component_esp_idf.cpp +2 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +3 -2
- esphome/config_validation.py +2 -2
- esphome/const.py +3 -1
- esphome/core/__init__.py +1 -0
- esphome/core/application.cpp +89 -51
- esphome/core/application.h +1 -0
- esphome/core/component.cpp +41 -19
- esphome/core/component.h +17 -13
- esphome/core/config.py +7 -7
- esphome/core/defines.h +5 -0
- esphome/core/entity_base.cpp +22 -8
- esphome/core/entity_base.h +43 -0
- esphome/core/helpers.cpp +34 -20
- esphome/core/helpers.h +33 -3
- esphome/core/ring_buffer.cpp +6 -2
- esphome/core/ring_buffer.h +2 -1
- esphome/core/scheduler.cpp +178 -97
- esphome/core/scheduler.h +67 -36
- esphome/core/time.cpp +6 -20
- esphome/coroutine.py +80 -3
- esphome/cpp_generator.py +13 -0
- esphome/cpp_helpers.py +2 -2
- esphome/dashboard/web_server.py +69 -15
- esphome/espota2.py +13 -6
- esphome/helpers.py +68 -83
- esphome/resolver.py +67 -0
- esphome/util.py +9 -6
- esphome/wizard.py +81 -34
- esphome/writer.py +13 -0
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/METADATA +9 -9
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/RECORD +369 -338
- /esphome/components/ld2420/text_sensor/{text_sensor.h → ld2420_text_sensor.h} +0 -0
- /esphome/components/opentherm/number/{number.h → opentherm_number.h} +0 -0
- /esphome/components/opentherm/output/{output.h → opentherm_output.h} +0 -0
- /esphome/components/opentherm/switch/{switch.h → opentherm_switch.h} +0 -0
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/WHEEL +0 -0
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/top_level.txt +0 -0
@@ -10,10 +10,18 @@
|
|
10
10
|
#include <cstring>
|
11
11
|
#include <cinttypes>
|
12
12
|
|
13
|
+
#ifdef USE_ESP8266
|
14
|
+
#include <pgmspace.h>
|
15
|
+
#endif
|
16
|
+
|
13
17
|
namespace esphome::api {
|
14
18
|
|
15
19
|
static const char *const TAG = "api.noise";
|
20
|
+
#ifdef USE_ESP8266
|
21
|
+
static const char PROLOGUE_INIT[] PROGMEM = "NoiseAPIInit";
|
22
|
+
#else
|
16
23
|
static const char *const PROLOGUE_INIT = "NoiseAPIInit";
|
24
|
+
#endif
|
17
25
|
static constexpr size_t PROLOGUE_INIT_LEN = 12; // strlen("NoiseAPIInit")
|
18
26
|
|
19
27
|
#define HELPER_LOG(msg, ...) ESP_LOGVV(TAG, "%s: " msg, this->client_info_->get_combined_info().c_str(), ##__VA_ARGS__)
|
@@ -27,42 +35,42 @@ static constexpr size_t PROLOGUE_INIT_LEN = 12; // strlen("NoiseAPIInit")
|
|
27
35
|
#endif
|
28
36
|
|
29
37
|
/// Convert a noise error code to a readable error
|
30
|
-
|
38
|
+
const LogString *noise_err_to_logstr(int err) {
|
31
39
|
if (err == NOISE_ERROR_NO_MEMORY)
|
32
|
-
return "NO_MEMORY";
|
40
|
+
return LOG_STR("NO_MEMORY");
|
33
41
|
if (err == NOISE_ERROR_UNKNOWN_ID)
|
34
|
-
return "UNKNOWN_ID";
|
42
|
+
return LOG_STR("UNKNOWN_ID");
|
35
43
|
if (err == NOISE_ERROR_UNKNOWN_NAME)
|
36
|
-
return "UNKNOWN_NAME";
|
44
|
+
return LOG_STR("UNKNOWN_NAME");
|
37
45
|
if (err == NOISE_ERROR_MAC_FAILURE)
|
38
|
-
return "MAC_FAILURE";
|
46
|
+
return LOG_STR("MAC_FAILURE");
|
39
47
|
if (err == NOISE_ERROR_NOT_APPLICABLE)
|
40
|
-
return "NOT_APPLICABLE";
|
48
|
+
return LOG_STR("NOT_APPLICABLE");
|
41
49
|
if (err == NOISE_ERROR_SYSTEM)
|
42
|
-
return "SYSTEM";
|
50
|
+
return LOG_STR("SYSTEM");
|
43
51
|
if (err == NOISE_ERROR_REMOTE_KEY_REQUIRED)
|
44
|
-
return "REMOTE_KEY_REQUIRED";
|
52
|
+
return LOG_STR("REMOTE_KEY_REQUIRED");
|
45
53
|
if (err == NOISE_ERROR_LOCAL_KEY_REQUIRED)
|
46
|
-
return "LOCAL_KEY_REQUIRED";
|
54
|
+
return LOG_STR("LOCAL_KEY_REQUIRED");
|
47
55
|
if (err == NOISE_ERROR_PSK_REQUIRED)
|
48
|
-
return "PSK_REQUIRED";
|
56
|
+
return LOG_STR("PSK_REQUIRED");
|
49
57
|
if (err == NOISE_ERROR_INVALID_LENGTH)
|
50
|
-
return "INVALID_LENGTH";
|
58
|
+
return LOG_STR("INVALID_LENGTH");
|
51
59
|
if (err == NOISE_ERROR_INVALID_PARAM)
|
52
|
-
return "INVALID_PARAM";
|
60
|
+
return LOG_STR("INVALID_PARAM");
|
53
61
|
if (err == NOISE_ERROR_INVALID_STATE)
|
54
|
-
return "INVALID_STATE";
|
62
|
+
return LOG_STR("INVALID_STATE");
|
55
63
|
if (err == NOISE_ERROR_INVALID_NONCE)
|
56
|
-
return "INVALID_NONCE";
|
64
|
+
return LOG_STR("INVALID_NONCE");
|
57
65
|
if (err == NOISE_ERROR_INVALID_PRIVATE_KEY)
|
58
|
-
return "INVALID_PRIVATE_KEY";
|
66
|
+
return LOG_STR("INVALID_PRIVATE_KEY");
|
59
67
|
if (err == NOISE_ERROR_INVALID_PUBLIC_KEY)
|
60
|
-
return "INVALID_PUBLIC_KEY";
|
68
|
+
return LOG_STR("INVALID_PUBLIC_KEY");
|
61
69
|
if (err == NOISE_ERROR_INVALID_FORMAT)
|
62
|
-
return "INVALID_FORMAT";
|
70
|
+
return LOG_STR("INVALID_FORMAT");
|
63
71
|
if (err == NOISE_ERROR_INVALID_SIGNATURE)
|
64
|
-
return "INVALID_SIGNATURE";
|
65
|
-
return
|
72
|
+
return LOG_STR("INVALID_SIGNATURE");
|
73
|
+
return LOG_STR("UNKNOWN");
|
66
74
|
}
|
67
75
|
|
68
76
|
/// Initialize the frame helper, returns OK if successful.
|
@@ -75,7 +83,11 @@ APIError APINoiseFrameHelper::init() {
|
|
75
83
|
// init prologue
|
76
84
|
size_t old_size = prologue_.size();
|
77
85
|
prologue_.resize(old_size + PROLOGUE_INIT_LEN);
|
86
|
+
#ifdef USE_ESP8266
|
87
|
+
memcpy_P(prologue_.data() + old_size, PROLOGUE_INIT, PROLOGUE_INIT_LEN);
|
88
|
+
#else
|
78
89
|
std::memcpy(prologue_.data() + old_size, PROLOGUE_INIT, PROLOGUE_INIT_LEN);
|
90
|
+
#endif
|
79
91
|
|
80
92
|
state_ = State::CLIENT_HELLO;
|
81
93
|
return APIError::OK;
|
@@ -83,18 +95,18 @@ APIError APINoiseFrameHelper::init() {
|
|
83
95
|
// Helper for handling handshake frame errors
|
84
96
|
APIError APINoiseFrameHelper::handle_handshake_frame_error_(APIError aerr) {
|
85
97
|
if (aerr == APIError::BAD_INDICATOR) {
|
86
|
-
send_explicit_handshake_reject_("Bad indicator byte");
|
98
|
+
send_explicit_handshake_reject_(LOG_STR("Bad indicator byte"));
|
87
99
|
} else if (aerr == APIError::BAD_HANDSHAKE_PACKET_LEN) {
|
88
|
-
send_explicit_handshake_reject_("Bad handshake packet len");
|
100
|
+
send_explicit_handshake_reject_(LOG_STR("Bad handshake packet len"));
|
89
101
|
}
|
90
102
|
return aerr;
|
91
103
|
}
|
92
104
|
|
93
105
|
// Helper for handling noise library errors
|
94
|
-
APIError APINoiseFrameHelper::handle_noise_error_(int err, const
|
106
|
+
APIError APINoiseFrameHelper::handle_noise_error_(int err, const LogString *func_name, APIError api_err) {
|
95
107
|
if (err != 0) {
|
96
108
|
state_ = State::FAILED;
|
97
|
-
HELPER_LOG("%s failed: %s", func_name,
|
109
|
+
HELPER_LOG("%s failed: %s", LOG_STR_ARG(func_name), LOG_STR_ARG(noise_err_to_logstr(err)));
|
98
110
|
return api_err;
|
99
111
|
}
|
100
112
|
return APIError::OK;
|
@@ -279,11 +291,11 @@ APIError APINoiseFrameHelper::state_action_() {
|
|
279
291
|
}
|
280
292
|
|
281
293
|
if (frame.empty()) {
|
282
|
-
send_explicit_handshake_reject_("Empty handshake message");
|
294
|
+
send_explicit_handshake_reject_(LOG_STR("Empty handshake message"));
|
283
295
|
return APIError::BAD_HANDSHAKE_ERROR_BYTE;
|
284
296
|
} else if (frame[0] != 0x00) {
|
285
297
|
HELPER_LOG("Bad handshake error byte: %u", frame[0]);
|
286
|
-
send_explicit_handshake_reject_("Bad handshake error byte");
|
298
|
+
send_explicit_handshake_reject_(LOG_STR("Bad handshake error byte"));
|
287
299
|
return APIError::BAD_HANDSHAKE_ERROR_BYTE;
|
288
300
|
}
|
289
301
|
|
@@ -293,8 +305,10 @@ APIError APINoiseFrameHelper::state_action_() {
|
|
293
305
|
err = noise_handshakestate_read_message(handshake_, &mbuf, nullptr);
|
294
306
|
if (err != 0) {
|
295
307
|
// Special handling for MAC failure
|
296
|
-
send_explicit_handshake_reject_(err == NOISE_ERROR_MAC_FAILURE ? "Handshake MAC failure"
|
297
|
-
|
308
|
+
send_explicit_handshake_reject_(err == NOISE_ERROR_MAC_FAILURE ? LOG_STR("Handshake MAC failure")
|
309
|
+
: LOG_STR("Handshake error"));
|
310
|
+
return handle_noise_error_(err, LOG_STR("noise_handshakestate_read_message"),
|
311
|
+
APIError::HANDSHAKESTATE_READ_FAILED);
|
298
312
|
}
|
299
313
|
|
300
314
|
aerr = check_handshake_finished_();
|
@@ -307,8 +321,8 @@ APIError APINoiseFrameHelper::state_action_() {
|
|
307
321
|
noise_buffer_set_output(mbuf, buffer + 1, sizeof(buffer) - 1);
|
308
322
|
|
309
323
|
err = noise_handshakestate_write_message(handshake_, &mbuf, nullptr);
|
310
|
-
APIError aerr_write =
|
311
|
-
|
324
|
+
APIError aerr_write = handle_noise_error_(err, LOG_STR("noise_handshakestate_write_message"),
|
325
|
+
APIError::HANDSHAKESTATE_WRITE_FAILED);
|
312
326
|
if (aerr_write != APIError::OK)
|
313
327
|
return aerr_write;
|
314
328
|
buffer[0] = 0x00; // success
|
@@ -331,15 +345,31 @@ APIError APINoiseFrameHelper::state_action_() {
|
|
331
345
|
}
|
332
346
|
return APIError::OK;
|
333
347
|
}
|
334
|
-
void APINoiseFrameHelper::send_explicit_handshake_reject_(const
|
348
|
+
void APINoiseFrameHelper::send_explicit_handshake_reject_(const LogString *reason) {
|
349
|
+
#ifdef USE_STORE_LOG_STR_IN_FLASH
|
350
|
+
// On ESP8266 with flash strings, we need to use PROGMEM-aware functions
|
351
|
+
size_t reason_len = strlen_P(reinterpret_cast<PGM_P>(reason));
|
335
352
|
std::vector<uint8_t> data;
|
336
|
-
data.resize(
|
353
|
+
data.resize(reason_len + 1);
|
354
|
+
data[0] = 0x01; // failure
|
355
|
+
|
356
|
+
// Copy error message from PROGMEM
|
357
|
+
if (reason_len > 0) {
|
358
|
+
memcpy_P(data.data() + 1, reinterpret_cast<PGM_P>(reason), reason_len);
|
359
|
+
}
|
360
|
+
#else
|
361
|
+
// Normal memory access
|
362
|
+
const char *reason_str = LOG_STR_ARG(reason);
|
363
|
+
size_t reason_len = strlen(reason_str);
|
364
|
+
std::vector<uint8_t> data;
|
365
|
+
data.resize(reason_len + 1);
|
337
366
|
data[0] = 0x01; // failure
|
338
367
|
|
339
368
|
// Copy error message in bulk
|
340
|
-
if (
|
341
|
-
std::memcpy(data.data() + 1,
|
369
|
+
if (reason_len > 0) {
|
370
|
+
std::memcpy(data.data() + 1, reason_str, reason_len);
|
342
371
|
}
|
372
|
+
#endif
|
343
373
|
|
344
374
|
// temporarily remove failed state
|
345
375
|
auto orig_state = state_;
|
@@ -368,7 +398,8 @@ APIError APINoiseFrameHelper::read_packet(ReadPacketBuffer *buffer) {
|
|
368
398
|
noise_buffer_init(mbuf);
|
369
399
|
noise_buffer_set_inout(mbuf, frame.data(), frame.size(), frame.size());
|
370
400
|
err = noise_cipherstate_decrypt(recv_cipher_, &mbuf);
|
371
|
-
APIError decrypt_err =
|
401
|
+
APIError decrypt_err =
|
402
|
+
handle_noise_error_(err, LOG_STR("noise_cipherstate_decrypt"), APIError::CIPHERSTATE_DECRYPT_FAILED);
|
372
403
|
if (decrypt_err != APIError::OK)
|
373
404
|
return decrypt_err;
|
374
405
|
|
@@ -450,7 +481,8 @@ APIError APINoiseFrameHelper::write_protobuf_packets(ProtoWriteBuffer buffer, st
|
|
450
481
|
4 + packet.payload_size + frame_footer_size_);
|
451
482
|
|
452
483
|
int err = noise_cipherstate_encrypt(send_cipher_, &mbuf);
|
453
|
-
APIError aerr =
|
484
|
+
APIError aerr =
|
485
|
+
handle_noise_error_(err, LOG_STR("noise_cipherstate_encrypt"), APIError::CIPHERSTATE_ENCRYPT_FAILED);
|
454
486
|
if (aerr != APIError::OK)
|
455
487
|
return aerr;
|
456
488
|
|
@@ -504,25 +536,27 @@ APIError APINoiseFrameHelper::init_handshake_() {
|
|
504
536
|
nid_.modifier_ids[0] = NOISE_MODIFIER_PSK0;
|
505
537
|
|
506
538
|
err = noise_handshakestate_new_by_id(&handshake_, &nid_, NOISE_ROLE_RESPONDER);
|
507
|
-
APIError aerr =
|
539
|
+
APIError aerr =
|
540
|
+
handle_noise_error_(err, LOG_STR("noise_handshakestate_new_by_id"), APIError::HANDSHAKESTATE_SETUP_FAILED);
|
508
541
|
if (aerr != APIError::OK)
|
509
542
|
return aerr;
|
510
543
|
|
511
544
|
const auto &psk = ctx_->get_psk();
|
512
545
|
err = noise_handshakestate_set_pre_shared_key(handshake_, psk.data(), psk.size());
|
513
|
-
aerr = handle_noise_error_(err, "noise_handshakestate_set_pre_shared_key",
|
546
|
+
aerr = handle_noise_error_(err, LOG_STR("noise_handshakestate_set_pre_shared_key"),
|
547
|
+
APIError::HANDSHAKESTATE_SETUP_FAILED);
|
514
548
|
if (aerr != APIError::OK)
|
515
549
|
return aerr;
|
516
550
|
|
517
551
|
err = noise_handshakestate_set_prologue(handshake_, prologue_.data(), prologue_.size());
|
518
|
-
aerr = handle_noise_error_(err, "noise_handshakestate_set_prologue", APIError::HANDSHAKESTATE_SETUP_FAILED);
|
552
|
+
aerr = handle_noise_error_(err, LOG_STR("noise_handshakestate_set_prologue"), APIError::HANDSHAKESTATE_SETUP_FAILED);
|
519
553
|
if (aerr != APIError::OK)
|
520
554
|
return aerr;
|
521
555
|
// set_prologue copies it into handshakestate, so we can get rid of it now
|
522
556
|
prologue_ = {};
|
523
557
|
|
524
558
|
err = noise_handshakestate_start(handshake_);
|
525
|
-
aerr = handle_noise_error_(err, "noise_handshakestate_start", APIError::HANDSHAKESTATE_SETUP_FAILED);
|
559
|
+
aerr = handle_noise_error_(err, LOG_STR("noise_handshakestate_start"), APIError::HANDSHAKESTATE_SETUP_FAILED);
|
526
560
|
if (aerr != APIError::OK)
|
527
561
|
return aerr;
|
528
562
|
return APIError::OK;
|
@@ -540,7 +574,8 @@ APIError APINoiseFrameHelper::check_handshake_finished_() {
|
|
540
574
|
return APIError::HANDSHAKESTATE_BAD_STATE;
|
541
575
|
}
|
542
576
|
int err = noise_handshakestate_split(handshake_, &send_cipher_, &recv_cipher_);
|
543
|
-
APIError aerr =
|
577
|
+
APIError aerr =
|
578
|
+
handle_noise_error_(err, LOG_STR("noise_handshakestate_split"), APIError::HANDSHAKESTATE_SPLIT_FAILED);
|
544
579
|
if (aerr != APIError::OK)
|
545
580
|
return aerr;
|
546
581
|
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
namespace esphome::api {
|
9
9
|
|
10
|
-
class APINoiseFrameHelper : public APIFrameHelper {
|
10
|
+
class APINoiseFrameHelper final : public APIFrameHelper {
|
11
11
|
public:
|
12
12
|
APINoiseFrameHelper(std::unique_ptr<socket::Socket> socket, std::shared_ptr<APINoiseContext> ctx,
|
13
13
|
const ClientInfo *client_info)
|
@@ -25,10 +25,6 @@ class APINoiseFrameHelper : public APIFrameHelper {
|
|
25
25
|
APIError read_packet(ReadPacketBuffer *buffer) override;
|
26
26
|
APIError write_protobuf_packet(uint8_t type, ProtoWriteBuffer buffer) override;
|
27
27
|
APIError write_protobuf_packets(ProtoWriteBuffer buffer, std::span<const PacketInfo> packets) override;
|
28
|
-
// Get the frame header padding required by this protocol
|
29
|
-
uint8_t frame_header_padding() override { return frame_header_padding_; }
|
30
|
-
// Get the frame footer size required by this protocol
|
31
|
-
uint8_t frame_footer_size() override { return frame_footer_size_; }
|
32
28
|
|
33
29
|
protected:
|
34
30
|
APIError state_action_();
|
@@ -36,9 +32,9 @@ class APINoiseFrameHelper : public APIFrameHelper {
|
|
36
32
|
APIError write_frame_(const uint8_t *data, uint16_t len);
|
37
33
|
APIError init_handshake_();
|
38
34
|
APIError check_handshake_finished_();
|
39
|
-
void send_explicit_handshake_reject_(const
|
35
|
+
void send_explicit_handshake_reject_(const LogString *reason);
|
40
36
|
APIError handle_handshake_frame_error_(APIError aerr);
|
41
|
-
APIError handle_noise_error_(int err, const
|
37
|
+
APIError handle_noise_error_(int err, const LogString *func_name, APIError api_err);
|
42
38
|
|
43
39
|
// Pointers first (4 bytes each)
|
44
40
|
NoiseHandshakeState *handshake_{nullptr};
|
@@ -10,6 +10,10 @@
|
|
10
10
|
#include <cstring>
|
11
11
|
#include <cinttypes>
|
12
12
|
|
13
|
+
#ifdef USE_ESP8266
|
14
|
+
#include <pgmspace.h>
|
15
|
+
#endif
|
16
|
+
|
13
17
|
namespace esphome::api {
|
14
18
|
|
15
19
|
static const char *const TAG = "api.plaintext";
|
@@ -197,11 +201,20 @@ APIError APIPlaintextFrameHelper::read_packet(ReadPacketBuffer *buffer) {
|
|
197
201
|
// We must send at least 3 bytes to be read, so we add
|
198
202
|
// a message after the indicator byte to ensures its long
|
199
203
|
// enough and can aid in debugging.
|
200
|
-
|
201
|
-
|
204
|
+
static constexpr uint8_t INDICATOR_MSG_SIZE = 19;
|
205
|
+
#ifdef USE_ESP8266
|
206
|
+
static const char MSG_PROGMEM[] PROGMEM = "\x00"
|
207
|
+
"Bad indicator byte";
|
208
|
+
char msg[INDICATOR_MSG_SIZE];
|
209
|
+
memcpy_P(msg, MSG_PROGMEM, INDICATOR_MSG_SIZE);
|
202
210
|
iov[0].iov_base = (void *) msg;
|
203
|
-
|
204
|
-
|
211
|
+
#else
|
212
|
+
static const char MSG[] = "\x00"
|
213
|
+
"Bad indicator byte";
|
214
|
+
iov[0].iov_base = (void *) MSG;
|
215
|
+
#endif
|
216
|
+
iov[0].iov_len = INDICATOR_MSG_SIZE;
|
217
|
+
this->write_raw_(iov, 1, INDICATOR_MSG_SIZE);
|
205
218
|
}
|
206
219
|
return aerr;
|
207
220
|
}
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
namespace esphome::api {
|
7
7
|
|
8
|
-
class APIPlaintextFrameHelper : public APIFrameHelper {
|
8
|
+
class APIPlaintextFrameHelper final : public APIFrameHelper {
|
9
9
|
public:
|
10
10
|
APIPlaintextFrameHelper(std::unique_ptr<socket::Socket> socket, const ClientInfo *client_info)
|
11
11
|
: APIFrameHelper(std::move(socket), client_info) {
|
@@ -22,9 +22,6 @@ class APIPlaintextFrameHelper : public APIFrameHelper {
|
|
22
22
|
APIError read_packet(ReadPacketBuffer *buffer) override;
|
23
23
|
APIError write_protobuf_packet(uint8_t type, ProtoWriteBuffer buffer) override;
|
24
24
|
APIError write_protobuf_packets(ProtoWriteBuffer buffer, std::span<const PacketInfo> packets) override;
|
25
|
-
uint8_t frame_header_padding() override { return frame_header_padding_; }
|
26
|
-
// Get the frame footer size required by this protocol
|
27
|
-
uint8_t frame_footer_size() override { return frame_footer_size_; }
|
28
25
|
|
29
26
|
protected:
|
30
27
|
APIError try_read_frame_(std::vector<uint8_t> *frame);
|
@@ -901,6 +901,16 @@ bool HomeAssistantStateResponse::decode_length(uint32_t field_id, ProtoLengthDel
|
|
901
901
|
return true;
|
902
902
|
}
|
903
903
|
#endif
|
904
|
+
bool GetTimeResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
|
905
|
+
switch (field_id) {
|
906
|
+
case 2:
|
907
|
+
this->timezone = value.as_string();
|
908
|
+
break;
|
909
|
+
default:
|
910
|
+
return false;
|
911
|
+
}
|
912
|
+
return true;
|
913
|
+
}
|
904
914
|
bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
|
905
915
|
switch (field_id) {
|
906
916
|
case 1:
|
@@ -911,8 +921,6 @@ bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
|
|
911
921
|
}
|
912
922
|
return true;
|
913
923
|
}
|
914
|
-
void GetTimeResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_fixed32(1, this->epoch_seconds); }
|
915
|
-
void GetTimeResponse::calculate_size(ProtoSize &size) const { size.add_fixed32(1, this->epoch_seconds); }
|
916
924
|
#ifdef USE_API_SERVICES
|
917
925
|
void ListEntitiesServicesArgument::encode(ProtoWriteBuffer buffer) const {
|
918
926
|
buffer.encode_string(1, this->name_ref_);
|
@@ -2153,10 +2161,12 @@ void BluetoothDeviceClearCacheResponse::calculate_size(ProtoSize &size) const {
|
|
2153
2161
|
void BluetoothScannerStateResponse::encode(ProtoWriteBuffer buffer) const {
|
2154
2162
|
buffer.encode_uint32(1, static_cast<uint32_t>(this->state));
|
2155
2163
|
buffer.encode_uint32(2, static_cast<uint32_t>(this->mode));
|
2164
|
+
buffer.encode_uint32(3, static_cast<uint32_t>(this->configured_mode));
|
2156
2165
|
}
|
2157
2166
|
void BluetoothScannerStateResponse::calculate_size(ProtoSize &size) const {
|
2158
2167
|
size.add_uint32(1, static_cast<uint32_t>(this->state));
|
2159
2168
|
size.add_uint32(1, static_cast<uint32_t>(this->mode));
|
2169
|
+
size.add_uint32(1, static_cast<uint32_t>(this->configured_mode));
|
2160
2170
|
}
|
2161
2171
|
bool BluetoothScannerSetModeRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
2162
2172
|
switch (field_id) {
|