esphome 2025.7.4__py3-none-any.whl → 2025.8.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 +190 -83
- esphome/automation.py +2 -4
- esphome/build_gen/__init__.py +0 -0
- esphome/build_gen/platformio.py +102 -0
- esphome/components/a4988/a4988.cpp +0 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
- esphome/components/absolute_humidity/sensor.py +2 -2
- esphome/components/adc/__init__.py +123 -85
- esphome/components/adc/adc_sensor.h +98 -35
- esphome/components/adc/adc_sensor_common.cpp +10 -4
- esphome/components/adc/adc_sensor_esp32.cpp +291 -123
- esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
- esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
- esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
- esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
- esphome/components/adc/sensor.py +61 -27
- esphome/components/adc128s102/adc128s102.cpp +1 -4
- esphome/components/ade7880/sensor.py +75 -49
- esphome/components/ads1115/ads1115.cpp +0 -1
- esphome/components/ads1118/ads1118.cpp +0 -1
- esphome/components/ags10/ags10.cpp +0 -4
- esphome/components/aht10/aht10.cpp +0 -4
- esphome/components/aic3204/aic3204.cpp +0 -2
- esphome/components/airthings_wave_plus/__init__.py +1 -1
- esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
- esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
- esphome/components/airthings_wave_plus/sensor.py +55 -28
- esphome/components/alarm_control_panel/__init__.py +4 -9
- esphome/components/am2315c/am2315c.cpp +0 -2
- esphome/components/am2320/am2320.cpp +0 -1
- esphome/components/animation/__init__.py +14 -11
- esphome/components/apds9306/apds9306.cpp +0 -4
- esphome/components/apds9960/apds9960.cpp +0 -1
- esphome/components/api/__init__.py +29 -4
- esphome/components/api/api_connection.cpp +378 -401
- esphome/components/api/api_connection.h +112 -56
- esphome/components/api/api_frame_helper.cpp +69 -896
- esphome/components/api/api_frame_helper.h +31 -126
- esphome/components/api/api_frame_helper_noise.cpp +583 -0
- esphome/components/api/api_frame_helper_noise.h +68 -0
- esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
- esphome/components/api/api_frame_helper_plaintext.h +53 -0
- esphome/components/api/api_noise_context.h +2 -4
- esphome/components/api/api_pb2.cpp +1601 -1808
- esphome/components/api/api_pb2.h +367 -323
- esphome/components/api/api_pb2_dump.cpp +1137 -3466
- esphome/components/api/api_pb2_includes.h +34 -0
- esphome/components/api/api_pb2_service.cpp +94 -105
- esphome/components/api/api_pb2_service.h +27 -16
- esphome/components/api/api_server.cpp +18 -17
- esphome/components/api/api_server.h +8 -5
- esphome/components/api/client.py +16 -8
- esphome/components/api/custom_api_device.h +68 -14
- esphome/components/api/homeassistant_service.h +24 -19
- esphome/components/api/list_entities.cpp +3 -5
- esphome/components/api/list_entities.h +2 -4
- esphome/components/api/proto.cpp +3 -5
- esphome/components/api/proto.h +239 -274
- esphome/components/api/subscribe_state.cpp +2 -4
- esphome/components/api/subscribe_state.h +2 -4
- esphome/components/api/user_services.cpp +2 -4
- esphome/components/api/user_services.h +8 -8
- esphome/components/as3935/as3935.cpp +0 -2
- esphome/components/as3935_spi/as3935_spi.cpp +0 -2
- esphome/components/as5600/__init__.py +1 -1
- esphome/components/as5600/as5600.cpp +0 -2
- esphome/components/as5600/sensor/__init__.py +0 -1
- esphome/components/as7341/as7341.cpp +0 -1
- esphome/components/async_tcp/__init__.py +1 -1
- esphome/components/at581x/at581x.cpp +1 -1
- esphome/components/atm90e26/atm90e26.cpp +0 -1
- esphome/components/atm90e32/atm90e32.cpp +475 -116
- esphome/components/atm90e32/atm90e32.h +43 -5
- esphome/components/audio/audio.h +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
- esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
- esphome/components/bh1750/bh1750.cpp +0 -1
- esphome/components/binary_sensor/__init__.py +14 -12
- esphome/components/ble_client/__init__.py +4 -7
- esphome/components/bluetooth_proxy/__init__.py +40 -3
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
- esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
- esphome/components/bme280_base/bme280_base.cpp +15 -16
- esphome/components/bme680/bme680.cpp +2 -3
- esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
- esphome/components/bmi160/bmi160.cpp +0 -1
- esphome/components/bmp085/bmp085.cpp +0 -1
- esphome/components/bmp280_base/bmp280_base.cpp +13 -14
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
- esphome/components/bmp581/bmp581.cpp +0 -2
- esphome/components/bp1658cj/bp1658cj.cpp +0 -1
- esphome/components/bp5758d/bp5758d.cpp +0 -1
- esphome/components/button/__init__.py +0 -1
- esphome/components/canbus/__init__.py +2 -3
- esphome/components/canbus/canbus.cpp +0 -1
- esphome/components/cap1188/cap1188.cpp +0 -2
- esphome/components/captive_portal/__init__.py +1 -1
- esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
- esphome/components/ch422g/ch422g.cpp +0 -1
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
- esphome/components/climate/__init__.py +0 -1
- esphome/components/climate/climate_traits.h +24 -0
- esphome/components/cm1106/cm1106.cpp +0 -1
- esphome/components/const/__init__.py +6 -0
- esphome/components/cover/__init__.py +0 -1
- esphome/components/cover/cover.cpp +9 -13
- esphome/components/cs5460a/cs5460a.cpp +0 -2
- esphome/components/cse7761/cse7761.cpp +0 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
- esphome/components/dac7678/dac7678_output.cpp +0 -2
- esphome/components/dallas_temp/dallas_temp.cpp +0 -1
- esphome/components/datetime/__init__.py +0 -2
- esphome/components/debug/__init__.py +15 -1
- esphome/components/debug/debug_zephyr.cpp +281 -0
- esphome/components/debug/sensor.py +2 -1
- esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
- esphome/components/dfrobot_sen0395/__init__.py +1 -2
- esphome/components/dht/dht.cpp +0 -1
- esphome/components/dht12/dht12.cpp +0 -1
- esphome/components/display/__init__.py +16 -3
- esphome/components/display_menu_base/__init__.py +1 -1
- esphome/components/dps310/dps310.cpp +0 -2
- esphome/components/ds1307/ds1307.cpp +0 -1
- esphome/components/ds2484/ds2484.cpp +0 -1
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
- esphome/components/ee895/ee895.cpp +0 -1
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
- esphome/components/emc2101/emc2101.cpp +0 -2
- esphome/components/ens160_base/ens160_base.cpp +0 -2
- esphome/components/ens210/ens210.cpp +0 -1
- esphome/components/es7210/es7210.cpp +0 -2
- esphome/components/es7243e/es7243e.cpp +0 -2
- esphome/components/es8156/es8156.cpp +0 -2
- esphome/components/es8311/es8311.cpp +0 -2
- esphome/components/es8388/es8388.cpp +0 -2
- esphome/components/esp32/__init__.py +203 -60
- esphome/components/esp32/boards.py +17 -0
- esphome/components/esp32/gpio.cpp +0 -1
- esphome/components/esp32/gpio.py +1 -2
- esphome/components/esp32/gpio_esp32_h2.py +2 -7
- esphome/components/esp32/gpio_esp32_p4.py +2 -7
- esphome/components/esp32/post_build.py.script +112 -61
- esphome/components/esp32_ble/__init__.py +41 -2
- esphome/components/esp32_ble/ble.cpp +14 -10
- esphome/components/esp32_ble/ble.h +18 -18
- esphome/components/esp32_ble/ble_advertising.cpp +5 -5
- esphome/components/esp32_ble/ble_advertising.h +7 -5
- esphome/components/esp32_ble/ble_event.h +139 -73
- esphome/components/esp32_ble/ble_scan_result.h +2 -4
- esphome/components/esp32_ble/ble_uuid.cpp +5 -5
- esphome/components/esp32_ble/ble_uuid.h +6 -5
- esphome/components/esp32_ble_beacon/__init__.py +4 -0
- esphome/components/esp32_ble_client/__init__.py +1 -1
- esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
- esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
- esphome/components/esp32_ble_client/ble_client_base.h +17 -6
- esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
- esphome/components/esp32_ble_client/ble_service.cpp +4 -4
- esphome/components/esp32_ble_client/ble_service.h +6 -4
- esphome/components/esp32_ble_server/__init__.py +15 -12
- esphome/components/esp32_ble_tracker/__init__.py +79 -11
- esphome/components/esp32_ble_tracker/automation.h +4 -4
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
- esphome/components/esp32_camera/__init__.py +13 -1
- esphome/components/esp32_camera/esp32_camera.cpp +7 -2
- esphome/components/esp32_camera/esp32_camera.h +1 -0
- esphome/components/esp32_dac/esp32_dac.cpp +3 -19
- esphome/components/esp32_dac/esp32_dac.h +4 -8
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
- esphome/components/esp32_rmt_led_strip/light.py +1 -1
- esphome/components/esp32_touch/__init__.py +2 -3
- esphome/components/esp32_touch/esp32_touch.h +9 -6
- esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
- esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
- esphome/components/esp8266/__init__.py +3 -1
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
- esphome/components/esphome/ota/__init__.py +1 -2
- esphome/components/esphome/ota/ota_esphome.cpp +150 -77
- esphome/components/esphome/ota/ota_esphome.h +8 -1
- esphome/components/espnow/__init__.py +309 -0
- esphome/components/espnow/automation.h +175 -0
- esphome/components/espnow/espnow_component.cpp +468 -0
- esphome/components/espnow/espnow_component.h +183 -0
- esphome/components/espnow/espnow_err.h +19 -0
- esphome/components/espnow/espnow_packet.h +166 -0
- esphome/components/ethernet/__init__.py +7 -1
- esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
- esphome/components/ethernet/ethernet_component.cpp +0 -1
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
- esphome/components/event/__init__.py +0 -1
- esphome/components/factory_reset/__init__.py +92 -0
- esphome/components/factory_reset/factory_reset.cpp +76 -0
- esphome/components/factory_reset/factory_reset.h +43 -0
- esphome/components/fan/__init__.py +0 -1
- esphome/components/fan/fan_traits.h +16 -0
- esphome/components/fastled_base/fastled_light.cpp +0 -1
- esphome/components/fastled_spi/light.py +1 -3
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
- esphome/components/font/__init__.py +9 -1
- esphome/components/fs3000/fs3000.cpp +0 -2
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
- esphome/components/ft63x6/ft63x6.cpp +0 -1
- esphome/components/gdk101/gdk101.cpp +0 -1
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
- esphome/components/gl_r01_i2c/sensor.py +1 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
- esphome/components/gpio/switch/gpio_switch.cpp +0 -2
- esphome/components/gpio_expander/cached_gpio.h +24 -15
- esphome/components/gps/__init__.py +6 -2
- esphome/components/gps/gps.cpp +50 -49
- esphome/components/gps/gps.h +4 -8
- esphome/components/gps/time/gps_time.cpp +3 -9
- esphome/components/gps/time/gps_time.h +4 -7
- esphome/components/graph/__init__.py +1 -1
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
- esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
- esphome/components/haier/climate.py +5 -10
- esphome/components/haier/haier_base.cpp +0 -1
- esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
- esphome/components/hdc1080/hdc1080.cpp +0 -2
- esphome/components/heatpumpir/climate.py +2 -2
- esphome/components/hlw8012/hlw8012.cpp +0 -1
- esphome/components/hm3301/hm3301.cpp +0 -1
- esphome/components/hmc5883l/hmc5883l.cpp +0 -1
- esphome/components/homeassistant/__init__.py +1 -0
- esphome/components/homeassistant/number/__init__.py +1 -0
- esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
- esphome/components/homeassistant/switch/__init__.py +1 -0
- esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
- esphome/components/honeywellabp/honeywellabp.cpp +1 -4
- esphome/components/host/__init__.py +2 -0
- esphome/components/hte501/hte501.cpp +0 -1
- esphome/components/http_request/__init__.py +2 -3
- esphome/components/http_request/http_request_idf.cpp +2 -2
- esphome/components/htu21d/htu21d.cpp +0 -2
- esphome/components/htu31d/htu31d.cpp +0 -2
- esphome/components/hx711/hx711.cpp +0 -1
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
- esphome/components/hydreon_rgxx/sensor.py +4 -5
- esphome/components/i2c/i2c_bus.h +1 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
- esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
- esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
- esphome/components/i2s_audio/__init__.py +6 -5
- esphome/components/i2s_audio/i2s_audio.cpp +0 -2
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
- esphome/components/i2s_audio/microphone/__init__.py +4 -6
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
- esphome/components/ili9xxx/display.py +4 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
- esphome/components/image/__init__.py +123 -92
- esphome/components/improv_serial/__init__.py +7 -8
- esphome/components/ina219/ina219.cpp +0 -1
- esphome/components/ina226/ina226.cpp +0 -2
- esphome/components/ina260/ina260.cpp +0 -2
- esphome/components/ina2xx_base/__init__.py +2 -5
- esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
- esphome/components/ina3221/ina3221.cpp +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +0 -2
- esphome/components/interval/interval.h +5 -9
- esphome/components/json/__init__.py +1 -1
- esphome/components/kmeteriso/kmeteriso.cpp +0 -2
- esphome/components/lc709203f/lc709203f.cpp +0 -2
- esphome/components/lcd_gpio/display.py +1 -3
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
- esphome/components/ld2410/__init__.py +4 -6
- esphome/components/ld2410/binary_sensor.py +4 -0
- esphome/components/ld2410/ld2410.cpp +56 -100
- esphome/components/ld2410/ld2410.h +17 -15
- esphome/components/ld2410/sensor.py +24 -10
- esphome/components/ld2412/__init__.py +46 -0
- esphome/components/ld2412/binary_sensor.py +70 -0
- esphome/components/ld2412/button/__init__.py +74 -0
- esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2412/button/factory_reset_button.h +18 -0
- esphome/components/ld2412/button/query_button.cpp +9 -0
- esphome/components/ld2412/button/query_button.h +18 -0
- esphome/components/ld2412/button/restart_button.cpp +9 -0
- esphome/components/ld2412/button/restart_button.h +18 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
- esphome/components/ld2412/ld2412.cpp +861 -0
- esphome/components/ld2412/ld2412.h +141 -0
- esphome/components/ld2412/number/__init__.py +126 -0
- esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
- esphome/components/ld2412/number/gate_threshold_number.h +19 -0
- esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
- esphome/components/ld2412/number/light_threshold_number.h +18 -0
- esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
- esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
- esphome/components/ld2412/select/__init__.py +82 -0
- esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
- esphome/components/ld2412/select/baud_rate_select.h +18 -0
- esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
- esphome/components/ld2412/select/distance_resolution_select.h +18 -0
- esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
- esphome/components/ld2412/select/light_out_control_select.h +18 -0
- esphome/components/ld2412/sensor.py +124 -0
- esphome/components/ld2412/switch/__init__.py +45 -0
- esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
- esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
- esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
- esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
- esphome/components/ld2412/text_sensor.py +34 -0
- esphome/components/ld2420/ld2420.cpp +0 -1
- esphome/components/ld2450/__init__.py +3 -4
- esphome/components/ld2450/binary_sensor.py +3 -0
- esphome/components/ld2450/ld2450.cpp +77 -165
- esphome/components/ld2450/ld2450.h +26 -54
- esphome/components/ld2450/sensor.py +120 -6
- esphome/components/ld2450/text_sensor.py +5 -4
- esphome/components/ld24xx/__init__.py +1 -0
- esphome/components/ld24xx/ld24xx.h +65 -0
- esphome/components/ledc/ledc_output.cpp +0 -1
- esphome/components/libretiny/__init__.py +2 -0
- esphome/components/light/__init__.py +0 -1
- esphome/components/light/effects.py +70 -45
- esphome/components/light/light_call.cpp +101 -66
- esphome/components/light/light_color_values.h +16 -11
- esphome/components/light/light_json_schema.cpp +46 -44
- esphome/components/light/light_state.cpp +8 -11
- esphome/components/light/light_traits.h +17 -0
- esphome/components/lightwaverf/lightwaverf.cpp +0 -2
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
- esphome/components/lock/__init__.py +0 -1
- esphome/components/logger/__init__.py +31 -9
- esphome/components/logger/logger.cpp +12 -7
- esphome/components/logger/logger.h +25 -14
- esphome/components/logger/logger_esp32.cpp +2 -7
- esphome/components/logger/logger_esp8266.cpp +2 -4
- esphome/components/logger/logger_host.cpp +2 -4
- esphome/components/logger/logger_libretiny.cpp +2 -4
- esphome/components/logger/logger_rp2040.cpp +2 -4
- esphome/components/logger/logger_zephyr.cpp +86 -0
- esphome/components/logger/select/logger_level_select.cpp +2 -4
- esphome/components/logger/select/logger_level_select.h +2 -4
- esphome/components/logger/task_log_buffer.cpp +2 -4
- esphome/components/logger/task_log_buffer.h +2 -4
- esphome/components/lps22/sensor.py +5 -5
- esphome/components/ltr390/ltr390.cpp +0 -2
- esphome/components/ltr501/ltr501.cpp +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
- esphome/components/lvgl/__init__.py +14 -13
- esphome/components/lvgl/automation.py +2 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/helpers.py +1 -1
- esphome/components/lvgl/lv_validation.py +7 -4
- esphome/components/lvgl/lvgl_esphome.cpp +2 -3
- esphome/components/lvgl/styles.py +2 -2
- esphome/components/lvgl/types.py +1 -1
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/arc.py +14 -11
- esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
- esphome/components/lvgl/widgets/qrcode.py +7 -7
- esphome/components/lvgl/widgets/spinner.py +6 -6
- esphome/components/lvgl/widgets/switch.py +2 -2
- esphome/components/lvgl/widgets/tabview.py +3 -3
- esphome/components/lvgl/widgets/tileview.py +15 -7
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
- esphome/components/matrix_keypad/__init__.py +4 -3
- esphome/components/max17043/max17043.cpp +0 -2
- esphome/components/max31855/max31855.cpp +1 -4
- esphome/components/max31856/max31856.cpp +0 -4
- esphome/components/max31865/max31865.cpp +0 -1
- esphome/components/max44009/max44009.cpp +0 -1
- esphome/components/max6675/max6675.cpp +1 -4
- esphome/components/max6956/max6956.cpp +0 -1
- esphome/components/max7219/max7219.cpp +0 -1
- esphome/components/max7219digit/display.py +1 -1
- esphome/components/max7219digit/max7219digit.cpp +0 -1
- esphome/components/max9611/max9611.cpp +0 -1
- esphome/components/mcp23008/__init__.py +1 -1
- esphome/components/mcp23008/mcp23008.cpp +0 -1
- esphome/components/mcp23016/mcp23016.cpp +0 -1
- esphome/components/mcp23017/__init__.py +1 -1
- esphome/components/mcp23017/mcp23017.cpp +0 -1
- esphome/components/mcp23s08/__init__.py +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +0 -1
- esphome/components/mcp23s17/__init__.py +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +0 -1
- esphome/components/mcp23x08_base/__init__.py +2 -0
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
- esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
- esphome/components/mcp23x17_base/__init__.py +2 -0
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
- esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
- esphome/components/mcp23xxx_base/__init__.py +11 -5
- esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
- esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
- esphome/components/mcp3008/mcp3008.cpp +1 -4
- esphome/components/mcp3204/mcp3204.cpp +1 -4
- esphome/components/mcp4461/mcp4461.cpp +0 -1
- esphome/components/mcp4725/mcp4725.cpp +0 -1
- esphome/components/mcp4728/mcp4728.cpp +0 -1
- esphome/components/mcp9600/mcp9600.cpp +0 -2
- esphome/components/mcp9808/mcp9808.cpp +0 -2
- esphome/components/mdns/__init__.py +3 -0
- esphome/components/mdns/mdns_component.cpp +2 -0
- esphome/components/mdns/mdns_component.h +4 -0
- esphome/components/media_player/__init__.py +40 -0
- esphome/components/media_player/automation.h +16 -0
- esphome/components/media_player/media_player.cpp +13 -0
- esphome/components/media_player/media_player.h +50 -3
- esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
- esphome/components/mics_4514/mics_4514.cpp +1 -6
- esphome/components/midea/ir_transmitter.h +4 -4
- esphome/components/mipi/__init__.py +416 -0
- esphome/components/mipi_dsi/__init__.py +5 -0
- esphome/components/mipi_dsi/display.py +233 -0
- esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
- esphome/components/mipi_dsi/mipi_dsi.h +123 -0
- esphome/components/mipi_dsi/models/__init__.py +0 -0
- esphome/components/mipi_dsi/models/guition.py +38 -0
- esphome/components/mipi_dsi/models/m5stack.py +57 -0
- esphome/components/mipi_dsi/models/waveshare.py +105 -0
- esphome/components/mipi_rgb/models/lilygo.py +0 -0
- esphome/components/mipi_spi/__init__.py +0 -9
- esphome/components/mipi_spi/display.py +220 -256
- esphome/components/mipi_spi/mipi_spi.cpp +1 -485
- esphome/components/mipi_spi/mipi_spi.h +556 -108
- esphome/components/mipi_spi/models/__init__.py +0 -65
- esphome/components/mipi_spi/models/adafruit.py +30 -0
- esphome/components/mipi_spi/models/amoled.py +41 -5
- esphome/components/mipi_spi/models/ili.py +5 -5
- esphome/components/mipi_spi/models/jc.py +1 -3
- esphome/components/mipi_spi/models/lilygo.py +1 -1
- esphome/components/mipi_spi/models/waveshare.py +16 -1
- esphome/components/mixer/speaker/__init__.py +4 -5
- esphome/components/mlx90393/sensor.py +7 -5
- esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
- esphome/components/mlx90614/mlx90614.cpp +0 -1
- esphome/components/mmc5603/mmc5603.cpp +0 -1
- esphome/components/mmc5983/mmc5983.cpp +0 -2
- esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
- esphome/components/mpr121/__init__.py +7 -6
- esphome/components/mpr121/mpr121.cpp +0 -1
- esphome/components/mpu6050/mpu6050.cpp +0 -1
- esphome/components/mpu6886/mpu6886.cpp +0 -1
- esphome/components/mqtt/__init__.py +1 -2
- esphome/components/mqtt/mqtt_button.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +0 -1
- esphome/components/mqtt/mqtt_component.cpp +8 -14
- esphome/components/mqtt/mqtt_component.h +0 -7
- esphome/components/mqtt/mqtt_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_sensor.h +0 -1
- esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_text_sensor.h +0 -1
- esphome/components/ms5611/ms5611.cpp +0 -1
- esphome/components/ms8607/ms8607.cpp +0 -1
- esphome/components/msa3xx/msa3xx.cpp +0 -2
- esphome/components/my9231/my9231.cpp +0 -2
- esphome/components/nau7802/nau7802.cpp +0 -1
- esphome/components/neopixelbus/light.py +3 -0
- esphome/components/network/util.cpp +29 -0
- esphome/components/nextion/nextion.cpp +2 -2
- esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
- esphome/components/npi19/npi19.cpp +0 -2
- esphome/components/nrf52/__init__.py +223 -0
- esphome/components/nrf52/boards.py +34 -0
- esphome/components/nrf52/const.py +18 -0
- esphome/components/nrf52/gpio.py +79 -0
- esphome/components/number/__init__.py +2 -1
- esphome/components/one_wire/__init__.py +1 -2
- esphome/components/one_wire/one_wire.cpp +0 -2
- esphome/components/one_wire/one_wire.h +0 -2
- esphome/components/opentherm/hub.cpp +0 -1
- esphome/components/opentherm/number/__init__.py +2 -2
- esphome/components/openthread/__init__.py +2 -3
- esphome/components/openthread/openthread.cpp +30 -13
- esphome/components/openthread/openthread.h +3 -0
- esphome/components/openthread/openthread_esp.cpp +3 -1
- esphome/components/opt3001/sensor.py +2 -6
- esphome/components/output/__init__.py +38 -0
- esphome/components/output/automation.h +24 -0
- esphome/components/output/switch/output_switch.cpp +0 -2
- esphome/components/packages/__init__.py +1 -2
- esphome/components/packet_transport/__init__.py +4 -3
- esphome/components/pca6416a/pca6416a.cpp +0 -1
- esphome/components/pca9554/pca9554.cpp +0 -1
- esphome/components/pca9685/pca9685_output.cpp +0 -2
- esphome/components/pcf85063/pcf85063.cpp +0 -1
- esphome/components/pcf8563/pcf8563.cpp +0 -1
- esphome/components/pcf8574/pcf8574.cpp +0 -1
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
- esphome/components/pipsolar/pipsolar.cpp +54 -42
- esphome/components/pipsolar/pipsolar.h +5 -4
- esphome/components/pipsolar/sensor/__init__.py +1 -1
- esphome/components/pm2005/pm2005.cpp +0 -1
- esphome/components/pmsa003i/pmsa003i.cpp +0 -2
- esphome/components/pmwcs3/sensor.py +1 -2
- esphome/components/pn532/pn532.cpp +0 -2
- esphome/components/pn532_spi/pn532_spi.cpp +0 -2
- esphome/components/power_supply/power_supply.cpp +7 -10
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +6 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
- esphome/components/pulse_counter/sensor.py +9 -6
- esphome/components/pylontech/pylontech.cpp +0 -1
- esphome/components/qmc5883l/qmc5883l.cpp +0 -1
- esphome/components/qmp6988/qmp6988.cpp +0 -2
- esphome/components/qspi_dbi/display.py +2 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
- esphome/components/qwiic_pir/binary_sensor.py +2 -3
- esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
- esphome/components/rc522/rc522.cpp +9 -31
- esphome/components/rc522_spi/rc522_spi.cpp +0 -1
- esphome/components/remote_base/__init__.py +5 -6
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
- esphome/components/remote_transmitter/__init__.py +26 -0
- esphome/components/remote_transmitter/automation.h +18 -0
- esphome/components/remote_transmitter/remote_transmitter.h +2 -1
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
- esphome/components/resampler/speaker/__init__.py +4 -5
- esphome/components/rf_bridge/__init__.py +4 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
- esphome/components/rp2040/__init__.py +3 -1
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
- esphome/components/rp2040_pio_led_strip/light.py +1 -2
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
- esphome/components/rpi_dpi_rgb/display.py +13 -15
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
- esphome/components/runtime_stats/__init__.py +34 -0
- esphome/components/runtime_stats/runtime_stats.cpp +102 -0
- esphome/components/runtime_stats/runtime_stats.h +132 -0
- esphome/components/scd30/scd30.cpp +0 -2
- esphome/components/scd30/sensor.py +1 -2
- esphome/components/scd4x/scd4x.cpp +0 -1
- esphome/components/scd4x/sensor.py +1 -3
- esphome/components/sdl/display.py +3 -1
- esphome/components/sdl/sdl_esphome.cpp +0 -2
- esphome/components/sdp3x/sdp3x.cpp +0 -2
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
- esphome/components/select/__init__.py +2 -3
- esphome/components/select/select_traits.cpp +1 -1
- esphome/components/select/select_traits.h +1 -1
- esphome/components/sen0321/sen0321.cpp +0 -1
- esphome/components/sen5x/sen5x.cpp +0 -2
- esphome/components/senseair/senseair.cpp +7 -3
- esphome/components/senseair/senseair.h +11 -0
- esphome/components/sensor/__init__.py +36 -4
- esphome/components/sensor/filter.cpp +49 -10
- esphome/components/sensor/filter.h +22 -7
- esphome/components/sensor/sensor.cpp +0 -1
- esphome/components/sensor/sensor.h +0 -9
- esphome/components/sfa30/sfa30.cpp +0 -4
- esphome/components/sgp30/sgp30.cpp +0 -2
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sgp4x/sgp4x.cpp +0 -2
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
- esphome/components/sht3xd/sht3xd.cpp +0 -2
- esphome/components/sht4x/sht4x.cpp +0 -2
- esphome/components/shtcx/shtcx.cpp +0 -1
- esphome/components/sim800l/__init__.py +2 -4
- esphome/components/sm16716/sm16716.cpp +0 -1
- esphome/components/sm2135/sm2135.cpp +0 -1
- esphome/components/sm2235/sm2235.cpp +0 -1
- esphome/components/sm2335/sm2335.cpp +0 -1
- esphome/components/sn74hc165/sn74hc165.cpp +0 -1
- esphome/components/sn74hc595/sn74hc595.cpp +0 -1
- esphome/components/sntp/sntp_component.cpp +0 -1
- esphome/components/sound_level/sensor.py +1 -1
- esphome/components/speaker/media_player/__init__.py +21 -33
- esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
- esphome/components/spi/__init__.py +29 -13
- esphome/components/spi/spi.cpp +0 -2
- esphome/components/spi_device/spi_device.cpp +1 -4
- esphome/components/sprinkler/__init__.py +4 -4
- esphome/components/sps30/sps30.cpp +0 -1
- esphome/components/ssd1306_base/__init__.py +11 -11
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
- esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
- esphome/components/st7567_spi/st7567_spi.cpp +0 -1
- esphome/components/st7701s/display.py +10 -14
- esphome/components/st7701s/st7701s.cpp +0 -3
- esphome/components/st7735/st7735.cpp +0 -1
- esphome/components/st7789v/st7789v.cpp +0 -1
- esphome/components/st7920/st7920.cpp +0 -1
- esphome/components/status_led/light/status_led_light.cpp +0 -2
- esphome/components/status_led/status_led.cpp +0 -1
- esphome/components/stepper/__init__.py +2 -4
- esphome/components/sts3x/sts3x.cpp +0 -1
- esphome/components/substitutions/__init__.py +10 -16
- esphome/components/substitutions/jinja.py +24 -1
- esphome/components/sun/__init__.py +2 -3
- esphome/components/switch/__init__.py +31 -1
- esphome/components/switch/automation.h +24 -0
- esphome/components/switch/switch.cpp +8 -0
- esphome/components/switch/switch.h +8 -0
- esphome/components/sx126x/sx126x.cpp +0 -2
- esphome/components/sx127x/sx127x.cpp +0 -2
- esphome/components/sx1509/__init__.py +7 -5
- esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
- esphome/components/sx1509/sx1509.cpp +0 -2
- esphome/components/syslog/esphome_syslog.cpp +1 -1
- esphome/components/tc74/tc74.cpp +0 -1
- esphome/components/tca9548a/tca9548a.cpp +0 -1
- esphome/components/tca9555/tca9555.cpp +0 -1
- esphome/components/tcs34725/tcs34725.cpp +0 -1
- esphome/components/tee501/tee501.cpp +0 -1
- esphome/components/tem3200/tem3200.cpp +0 -2
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
- esphome/components/template/cover/template_cover.cpp +0 -1
- esphome/components/template/select/template_select.cpp +0 -1
- esphome/components/template/text/template_text.cpp +0 -2
- esphome/components/template/valve/template_valve.cpp +0 -1
- esphome/components/text/__init__.py +0 -1
- esphome/components/text/text_traits.h +2 -0
- esphome/components/text_sensor/__init__.py +2 -1
- esphome/components/text_sensor/text_sensor.cpp +0 -2
- esphome/components/text_sensor/text_sensor.h +0 -8
- esphome/components/thermostat/climate.py +4 -4
- esphome/components/time/__init__.py +7 -4
- esphome/components/time/real_time_clock.cpp +16 -3
- esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
- esphome/components/tlc5947/tlc5947.cpp +0 -2
- esphome/components/tlc5971/tlc5971.cpp +0 -2
- esphome/components/tm1621/tm1621.cpp +0 -2
- esphome/components/tm1637/tm1637.cpp +0 -2
- esphome/components/tm1638/tm1638.cpp +0 -2
- esphome/components/tm1651/__init__.py +45 -48
- esphome/components/tm1651/tm1651.cpp +213 -47
- esphome/components/tm1651/tm1651.h +37 -32
- esphome/components/tmp117/tmp117.cpp +0 -2
- esphome/components/tsl2561/tsl2561.cpp +0 -1
- esphome/components/tsl2591/tsl2591.cpp +0 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
- esphome/components/tuya/climate/__init__.py +9 -10
- esphome/components/tuya/number/__init__.py +8 -6
- esphome/components/tx20/tx20.cpp +0 -1
- esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
- esphome/components/uart/uart_component_esp8266.cpp +0 -1
- esphome/components/uart/uart_component_esp_idf.cpp +0 -2
- esphome/components/uart/uart_component_libretiny.cpp +0 -2
- esphome/components/uart/uart_component_rp2040.cpp +0 -2
- esphome/components/udp/__init__.py +1 -1
- esphome/components/ufire_ec/sensor.py +1 -2
- esphome/components/ufire_ec/ufire_ec.cpp +0 -2
- esphome/components/ufire_ise/sensor.py +1 -2
- esphome/components/ufire_ise/ufire_ise.cpp +0 -2
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
- esphome/components/update/__init__.py +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
- esphome/components/usb_host/usb_host_client.cpp +0 -1
- esphome/components/usb_host/usb_host_component.cpp +0 -1
- esphome/components/valve/__init__.py +0 -1
- esphome/components/veml3235/veml3235.cpp +0 -3
- esphome/components/veml7700/veml7700.cpp +0 -2
- esphome/components/version/version_text_sensor.cpp +0 -1
- esphome/components/version/version_text_sensor.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
- esphome/components/voice_assistant/voice_assistant.cpp +9 -8
- esphome/components/web_server/__init__.py +13 -0
- esphome/components/web_server/web_server.cpp +188 -353
- esphome/components/web_server/web_server.h +61 -1
- esphome/components/web_server_base/__init__.py +1 -1
- esphome/components/web_server_base/web_server_base.cpp +2 -0
- esphome/components/web_server_base/web_server_base.h +6 -0
- esphome/components/web_server_idf/web_server_idf.cpp +10 -8
- esphome/components/web_server_idf/web_server_idf.h +2 -0
- esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
- esphome/components/weikai_spi/weikai_spi.cpp +1 -1
- esphome/components/wifi/__init__.py +17 -43
- esphome/components/wifi/wifi_component.cpp +100 -36
- esphome/components/wifi/wifi_component.h +5 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
- esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
- esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
- esphome/components/wireguard/wireguard.cpp +0 -2
- esphome/components/x9c/x9c.cpp +0 -2
- esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
- esphome/components/xl9535/xl9535.cpp +0 -2
- esphome/components/zephyr/__init__.py +252 -0
- esphome/components/zephyr/const.py +16 -0
- esphome/components/zephyr/core.cpp +90 -0
- esphome/components/zephyr/gpio.cpp +120 -0
- esphome/components/zephyr/gpio.h +38 -0
- esphome/components/zephyr/pre_build.py.script +4 -0
- esphome/components/zephyr/preferences.cpp +156 -0
- esphome/components/zephyr/preferences.h +13 -0
- esphome/config.py +38 -16
- esphome/config_helpers.py +1 -2
- esphome/config_validation.py +12 -16
- esphome/const.py +26 -1
- esphome/core/__init__.py +92 -51
- esphome/core/application.cpp +75 -21
- esphome/core/application.h +106 -171
- esphome/core/color.h +10 -0
- esphome/core/component.cpp +41 -25
- esphome/core/component.h +9 -6
- esphome/core/component_iterator.cpp +61 -261
- esphome/core/component_iterator.h +15 -0
- esphome/core/config.py +26 -11
- esphome/core/defines.h +40 -2
- esphome/core/entity_base.h +18 -0
- esphome/core/entity_helpers.py +45 -10
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +311 -77
- esphome/core/scheduler.h +141 -28
- esphome/cpp_generator.py +2 -6
- esphome/cpp_helpers.py +1 -1
- esphome/dashboard/dashboard.py +2 -3
- esphome/dashboard/dns.py +2 -8
- esphome/dashboard/web_server.py +34 -19
- esphome/espota2.py +1 -4
- esphome/git.py +3 -1
- esphome/helpers.py +23 -4
- esphome/log.py +3 -1
- esphome/mqtt.py +3 -5
- esphome/platformio_api.py +7 -4
- esphome/types.py +12 -0
- esphome/util.py +20 -8
- esphome/voluptuous_schema.py +4 -3
- esphome/vscode.py +1 -2
- esphome/wizard.py +1 -4
- esphome/writer.py +16 -108
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
- esphome/components/mipi_spi/models/commands.py +0 -82
- /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
|
@@ -109,8 +109,9 @@ void ATM90E32Component::update() {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
void ATM90E32Component::setup() {
|
|
112
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
113
112
|
this->spi_setup();
|
|
113
|
+
this->cs_summary_ = this->cs_->dump_summary();
|
|
114
|
+
const char *cs = this->cs_summary_.c_str();
|
|
114
115
|
|
|
115
116
|
uint16_t mmode0 = 0x87; // 3P4W 50Hz
|
|
116
117
|
uint16_t high_thresh = 0;
|
|
@@ -131,9 +132,9 @@ void ATM90E32Component::setup() {
|
|
|
131
132
|
mmode0 |= 0 << 1; // sets 1st bit to 0, phase b is not counted into the all-phase sum energy/power (P/Q/S)
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
this->write16_(ATM90E32_REGISTER_SOFTRESET, 0x789A);
|
|
135
|
-
delay(6);
|
|
136
|
-
this->write16_(ATM90E32_REGISTER_CFGREGACCEN, 0x55AA);
|
|
135
|
+
this->write16_(ATM90E32_REGISTER_SOFTRESET, 0x789A, false); // Perform soft reset
|
|
136
|
+
delay(6); // Wait for the minimum 5ms + 1ms
|
|
137
|
+
this->write16_(ATM90E32_REGISTER_CFGREGACCEN, 0x55AA); // enable register config access
|
|
137
138
|
if (!this->validate_spi_read_(0x55AA, "setup()")) {
|
|
138
139
|
ESP_LOGW(TAG, "Could not initialize ATM90E32 IC, check SPI settings");
|
|
139
140
|
this->mark_failed();
|
|
@@ -157,16 +158,17 @@ void ATM90E32Component::setup() {
|
|
|
157
158
|
|
|
158
159
|
if (this->enable_offset_calibration_) {
|
|
159
160
|
// Initialize flash storage for offset calibrations
|
|
160
|
-
uint32_t o_hash = fnv1_hash(std::string("_offset_calibration_") + this->
|
|
161
|
+
uint32_t o_hash = fnv1_hash(std::string("_offset_calibration_") + this->cs_summary_);
|
|
161
162
|
this->offset_pref_ = global_preferences->make_preference<OffsetCalibration[3]>(o_hash, true);
|
|
162
163
|
this->restore_offset_calibrations_();
|
|
163
164
|
|
|
164
165
|
// Initialize flash storage for power offset calibrations
|
|
165
|
-
uint32_t po_hash = fnv1_hash(std::string("_power_offset_calibration_") + this->
|
|
166
|
+
uint32_t po_hash = fnv1_hash(std::string("_power_offset_calibration_") + this->cs_summary_);
|
|
166
167
|
this->power_offset_pref_ = global_preferences->make_preference<PowerOffsetCalibration[3]>(po_hash, true);
|
|
167
168
|
this->restore_power_offset_calibrations_();
|
|
168
169
|
} else {
|
|
169
|
-
ESP_LOGI(TAG, "[CALIBRATION] Power & Voltage/Current offset calibration is disabled. Using config file values."
|
|
170
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Power & Voltage/Current offset calibration is disabled. Using config file values.",
|
|
171
|
+
cs);
|
|
170
172
|
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
171
173
|
this->write16_(this->voltage_offset_registers[phase],
|
|
172
174
|
static_cast<uint16_t>(this->offset_phase_[phase].voltage_offset_));
|
|
@@ -181,21 +183,18 @@ void ATM90E32Component::setup() {
|
|
|
181
183
|
|
|
182
184
|
if (this->enable_gain_calibration_) {
|
|
183
185
|
// Initialize flash storage for gain calibration
|
|
184
|
-
uint32_t g_hash = fnv1_hash(std::string("_gain_calibration_") + this->
|
|
186
|
+
uint32_t g_hash = fnv1_hash(std::string("_gain_calibration_") + this->cs_summary_);
|
|
185
187
|
this->gain_calibration_pref_ = global_preferences->make_preference<GainCalibration[3]>(g_hash, true);
|
|
186
188
|
this->restore_gain_calibrations_();
|
|
187
189
|
|
|
188
|
-
if (this->using_saved_calibrations_) {
|
|
189
|
-
ESP_LOGI(TAG, "[CALIBRATION] Successfully restored gain calibration from memory.");
|
|
190
|
-
} else {
|
|
190
|
+
if (!this->using_saved_calibrations_) {
|
|
191
191
|
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
192
192
|
this->write16_(voltage_gain_registers[phase], this->phase_[phase].voltage_gain_);
|
|
193
193
|
this->write16_(current_gain_registers[phase], this->phase_[phase].ct_gain_);
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
} else {
|
|
197
|
-
ESP_LOGI(TAG, "[CALIBRATION] Gain calibration is disabled. Using config file values.");
|
|
198
|
-
|
|
197
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Gain calibration is disabled. Using config file values.", cs);
|
|
199
198
|
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
200
199
|
this->write16_(voltage_gain_registers[phase], this->phase_[phase].voltage_gain_);
|
|
201
200
|
this->write16_(current_gain_registers[phase], this->phase_[phase].ct_gain_);
|
|
@@ -214,6 +213,122 @@ void ATM90E32Component::setup() {
|
|
|
214
213
|
this->write16_(ATM90E32_REGISTER_CFGREGACCEN, 0x0000); // end configuration
|
|
215
214
|
}
|
|
216
215
|
|
|
216
|
+
void ATM90E32Component::log_calibration_status_() {
|
|
217
|
+
const char *cs = this->cs_summary_.c_str();
|
|
218
|
+
|
|
219
|
+
bool offset_mismatch = false;
|
|
220
|
+
bool power_mismatch = false;
|
|
221
|
+
bool gain_mismatch = false;
|
|
222
|
+
|
|
223
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
224
|
+
offset_mismatch |= this->offset_calibration_mismatch_[phase];
|
|
225
|
+
power_mismatch |= this->power_offset_calibration_mismatch_[phase];
|
|
226
|
+
gain_mismatch |= this->gain_calibration_mismatch_[phase];
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (offset_mismatch) {
|
|
230
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ", cs);
|
|
231
|
+
ESP_LOGW(TAG,
|
|
232
|
+
"[CALIBRATION][%s] ===================== Offset mismatch: using flash values =====================", cs);
|
|
233
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
234
|
+
cs);
|
|
235
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | Phase | offset_voltage | offset_current |", cs);
|
|
236
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | | config | flash | config | flash |", cs);
|
|
237
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
238
|
+
cs);
|
|
239
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
240
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | %c | %6d | %6d | %6d | %6d |", cs, 'A' + phase,
|
|
241
|
+
this->config_offset_phase_[phase].voltage_offset_, this->offset_phase_[phase].voltage_offset_,
|
|
242
|
+
this->config_offset_phase_[phase].current_offset_, this->offset_phase_[phase].current_offset_);
|
|
243
|
+
}
|
|
244
|
+
ESP_LOGW(TAG,
|
|
245
|
+
"[CALIBRATION][%s] ===============================================================================", cs);
|
|
246
|
+
}
|
|
247
|
+
if (power_mismatch) {
|
|
248
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ", cs);
|
|
249
|
+
ESP_LOGW(TAG,
|
|
250
|
+
"[CALIBRATION][%s] ================= Power offset mismatch: using flash values =================", cs);
|
|
251
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
252
|
+
cs);
|
|
253
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | Phase | offset_active_power|offset_reactive_power|", cs);
|
|
254
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | | config | flash | config | flash |", cs);
|
|
255
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
256
|
+
cs);
|
|
257
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
258
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | %c | %6d | %6d | %6d | %6d |", cs, 'A' + phase,
|
|
259
|
+
this->config_power_offset_phase_[phase].active_power_offset,
|
|
260
|
+
this->power_offset_phase_[phase].active_power_offset,
|
|
261
|
+
this->config_power_offset_phase_[phase].reactive_power_offset,
|
|
262
|
+
this->power_offset_phase_[phase].reactive_power_offset);
|
|
263
|
+
}
|
|
264
|
+
ESP_LOGW(TAG,
|
|
265
|
+
"[CALIBRATION][%s] ===============================================================================", cs);
|
|
266
|
+
}
|
|
267
|
+
if (gain_mismatch) {
|
|
268
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ", cs);
|
|
269
|
+
ESP_LOGW(TAG,
|
|
270
|
+
"[CALIBRATION][%s] ====================== Gain mismatch: using flash values =====================", cs);
|
|
271
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
272
|
+
cs);
|
|
273
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | Phase | voltage_gain | current_gain |", cs);
|
|
274
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | | config | flash | config | flash |", cs);
|
|
275
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------------------",
|
|
276
|
+
cs);
|
|
277
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
278
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] | %c | %6u | %6u | %6u | %6u |", cs, 'A' + phase,
|
|
279
|
+
this->config_gain_phase_[phase].voltage_gain, this->gain_phase_[phase].voltage_gain,
|
|
280
|
+
this->config_gain_phase_[phase].current_gain, this->gain_phase_[phase].current_gain);
|
|
281
|
+
}
|
|
282
|
+
ESP_LOGW(TAG,
|
|
283
|
+
"[CALIBRATION][%s] ===============================================================================", cs);
|
|
284
|
+
}
|
|
285
|
+
if (!this->enable_offset_calibration_) {
|
|
286
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Power & Voltage/Current offset calibration is disabled. Using config file values.",
|
|
287
|
+
cs);
|
|
288
|
+
} else if (this->restored_offset_calibration_ && !offset_mismatch) {
|
|
289
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
290
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ============== Restored offset calibration from memory ==============", cs);
|
|
291
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
292
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_voltage | offset_current |", cs);
|
|
293
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
294
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
295
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase,
|
|
296
|
+
this->offset_phase_[phase].voltage_offset_, this->offset_phase_[phase].current_offset_);
|
|
297
|
+
}
|
|
298
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==============================================================\\n", cs);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (this->restored_power_offset_calibration_ && !power_mismatch) {
|
|
302
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
303
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ============ Restored power offset calibration from memory ============", cs);
|
|
304
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
305
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_active_power | offset_reactive_power |", cs);
|
|
306
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
307
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
308
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase,
|
|
309
|
+
this->power_offset_phase_[phase].active_power_offset,
|
|
310
|
+
this->power_offset_phase_[phase].reactive_power_offset);
|
|
311
|
+
}
|
|
312
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\n", cs);
|
|
313
|
+
}
|
|
314
|
+
if (!this->enable_gain_calibration_) {
|
|
315
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Gain calibration is disabled. Using config file values.", cs);
|
|
316
|
+
} else if (this->restored_gain_calibration_ && !gain_mismatch) {
|
|
317
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
318
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ============ Restoring saved gain calibrations to registers ============", cs);
|
|
319
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
320
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | voltage_gain | current_gain |", cs);
|
|
321
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
322
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
323
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6u | %6u |", cs, 'A' + phase,
|
|
324
|
+
this->gain_phase_[phase].voltage_gain, this->gain_phase_[phase].current_gain);
|
|
325
|
+
}
|
|
326
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\\n", cs);
|
|
327
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Gain calibration loaded and verified successfully.\n", cs);
|
|
328
|
+
}
|
|
329
|
+
this->calibration_message_printed_ = true;
|
|
330
|
+
}
|
|
331
|
+
|
|
217
332
|
void ATM90E32Component::dump_config() {
|
|
218
333
|
ESP_LOGCONFIG("", "ATM90E32:");
|
|
219
334
|
LOG_PIN(" CS Pin: ", this->cs_);
|
|
@@ -256,6 +371,10 @@ void ATM90E32Component::dump_config() {
|
|
|
256
371
|
LOG_SENSOR(" ", "Peak Current C", this->phase_[PHASEC].peak_current_sensor_);
|
|
257
372
|
LOG_SENSOR(" ", "Frequency", this->freq_sensor_);
|
|
258
373
|
LOG_SENSOR(" ", "Chip Temp", this->chip_temperature_sensor_);
|
|
374
|
+
if (this->restored_offset_calibration_ || this->restored_power_offset_calibration_ ||
|
|
375
|
+
this->restored_gain_calibration_ || !this->enable_offset_calibration_ || !this->enable_gain_calibration_) {
|
|
376
|
+
this->log_calibration_status_();
|
|
377
|
+
}
|
|
259
378
|
}
|
|
260
379
|
|
|
261
380
|
float ATM90E32Component::get_setup_priority() const { return setup_priority::IO; }
|
|
@@ -264,19 +383,17 @@ float ATM90E32Component::get_setup_priority() const { return setup_priority::IO;
|
|
|
264
383
|
// Peakdetect period: 05H. Bit 15:8 are PeakDet_period in ms. 7:0 are Sag_period
|
|
265
384
|
// Default is 143FH (20ms, 63ms)
|
|
266
385
|
uint16_t ATM90E32Component::read16_(uint16_t a_register) {
|
|
386
|
+
this->enable();
|
|
387
|
+
delay_microseconds_safe(1); // min delay between CS low and first SCK is 200ns - 1us is plenty
|
|
267
388
|
uint8_t addrh = (1 << 7) | ((a_register >> 8) & 0x03);
|
|
268
389
|
uint8_t addrl = (a_register & 0xFF);
|
|
269
|
-
uint8_t data[
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
delay_microseconds_safe(1); // min delay between CS low and first SCK is 200ns - 1ms is plenty
|
|
273
|
-
this->write_byte(addrh);
|
|
274
|
-
this->write_byte(addrl);
|
|
275
|
-
this->read_array(data, 2);
|
|
276
|
-
this->disable();
|
|
277
|
-
|
|
278
|
-
output = (uint16_t(data[0] & 0xFF) << 8) | (data[1] & 0xFF);
|
|
390
|
+
uint8_t data[4] = {addrh, addrl, 0x00, 0x00};
|
|
391
|
+
this->transfer_array(data, 4);
|
|
392
|
+
uint16_t output = encode_uint16(data[2], data[3]);
|
|
279
393
|
ESP_LOGVV(TAG, "read16_ 0x%04" PRIX16 " output 0x%04" PRIX16, a_register, output);
|
|
394
|
+
delay_microseconds_safe(1); // allow the last clock to propagate before releasing CS
|
|
395
|
+
this->disable();
|
|
396
|
+
delay_microseconds_safe(1); // meet minimum CS high time before next transaction
|
|
280
397
|
return output;
|
|
281
398
|
}
|
|
282
399
|
|
|
@@ -293,13 +410,19 @@ int ATM90E32Component::read32_(uint16_t addr_h, uint16_t addr_l) {
|
|
|
293
410
|
return val;
|
|
294
411
|
}
|
|
295
412
|
|
|
296
|
-
void ATM90E32Component::write16_(uint16_t a_register, uint16_t val) {
|
|
413
|
+
void ATM90E32Component::write16_(uint16_t a_register, uint16_t val, bool validate) {
|
|
297
414
|
ESP_LOGVV(TAG, "write16_ 0x%04" PRIX16 " val 0x%04" PRIX16, a_register, val);
|
|
415
|
+
uint8_t addrh = ((a_register >> 8) & 0x03);
|
|
416
|
+
uint8_t addrl = (a_register & 0xFF);
|
|
417
|
+
uint8_t data[4] = {addrh, addrl, uint8_t((val >> 8) & 0xFF), uint8_t(val & 0xFF)};
|
|
298
418
|
this->enable();
|
|
299
|
-
|
|
300
|
-
this->
|
|
419
|
+
delay_microseconds_safe(1); // ensure CS setup time
|
|
420
|
+
this->write_array(data, 4);
|
|
421
|
+
delay_microseconds_safe(1); // allow clock to settle before raising CS
|
|
301
422
|
this->disable();
|
|
302
|
-
|
|
423
|
+
delay_microseconds_safe(1); // ensure minimum CS high time
|
|
424
|
+
if (validate)
|
|
425
|
+
this->validate_spi_read_(val, "write16()");
|
|
303
426
|
}
|
|
304
427
|
|
|
305
428
|
float ATM90E32Component::get_local_phase_voltage_(uint8_t phase) { return this->phase_[phase].voltage_; }
|
|
@@ -442,8 +565,10 @@ float ATM90E32Component::get_chip_temperature_() {
|
|
|
442
565
|
}
|
|
443
566
|
|
|
444
567
|
void ATM90E32Component::run_gain_calibrations() {
|
|
568
|
+
const char *cs = this->cs_summary_.c_str();
|
|
445
569
|
if (!this->enable_gain_calibration_) {
|
|
446
|
-
ESP_LOGW(TAG, "[CALIBRATION] Gain calibration is disabled! Enable it first with enable_gain_calibration: true"
|
|
570
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Gain calibration is disabled! Enable it first with enable_gain_calibration: true",
|
|
571
|
+
cs);
|
|
447
572
|
return;
|
|
448
573
|
}
|
|
449
574
|
|
|
@@ -455,12 +580,14 @@ void ATM90E32Component::run_gain_calibrations() {
|
|
|
455
580
|
float ref_currents[3] = {this->get_reference_current(0), this->get_reference_current(1),
|
|
456
581
|
this->get_reference_current(2)};
|
|
457
582
|
|
|
458
|
-
ESP_LOGI(TAG, "[CALIBRATION] ");
|
|
459
|
-
ESP_LOGI(TAG, "[CALIBRATION] ========================= Gain Calibration =========================");
|
|
460
|
-
ESP_LOGI(TAG, "[CALIBRATION] ---------------------------------------------------------------------");
|
|
461
|
-
ESP_LOGI(
|
|
462
|
-
|
|
463
|
-
|
|
583
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
584
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ========================= Gain Calibration =========================", cs);
|
|
585
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
586
|
+
ESP_LOGI(
|
|
587
|
+
TAG,
|
|
588
|
+
"[CALIBRATION][%s] | Phase | V_meas (V) | I_meas (A) | V_ref | I_ref | V_gain (old→new) | I_gain (old→new) |",
|
|
589
|
+
cs);
|
|
590
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
464
591
|
|
|
465
592
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
466
593
|
float measured_voltage = this->get_phase_voltage_avg_(phase);
|
|
@@ -477,22 +604,22 @@ void ATM90E32Component::run_gain_calibrations() {
|
|
|
477
604
|
|
|
478
605
|
// Voltage calibration
|
|
479
606
|
if (ref_voltage <= 0.0f) {
|
|
480
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Skipping voltage calibration: reference voltage is 0.",
|
|
607
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Skipping voltage calibration: reference voltage is 0.", cs,
|
|
481
608
|
phase_labels[phase]);
|
|
482
609
|
} else if (measured_voltage == 0.0f) {
|
|
483
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Skipping voltage calibration: measured voltage is 0.",
|
|
610
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Skipping voltage calibration: measured voltage is 0.", cs,
|
|
484
611
|
phase_labels[phase]);
|
|
485
612
|
} else {
|
|
486
613
|
uint32_t new_voltage_gain = static_cast<uint16_t>((ref_voltage / measured_voltage) * current_voltage_gain);
|
|
487
614
|
if (new_voltage_gain == 0) {
|
|
488
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Voltage gain would be 0. Check reference and measured voltage.",
|
|
615
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Voltage gain would be 0. Check reference and measured voltage.", cs,
|
|
489
616
|
phase_labels[phase]);
|
|
490
617
|
} else {
|
|
491
618
|
if (new_voltage_gain >= 65535) {
|
|
492
|
-
ESP_LOGW(
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
619
|
+
ESP_LOGW(TAG,
|
|
620
|
+
"[CALIBRATION][%s] Phase %s - Voltage gain exceeds 65535. You may need a higher output voltage "
|
|
621
|
+
"transformer.",
|
|
622
|
+
cs, phase_labels[phase]);
|
|
496
623
|
new_voltage_gain = 65535;
|
|
497
624
|
}
|
|
498
625
|
this->gain_phase_[phase].voltage_gain = static_cast<uint16_t>(new_voltage_gain);
|
|
@@ -502,20 +629,20 @@ void ATM90E32Component::run_gain_calibrations() {
|
|
|
502
629
|
|
|
503
630
|
// Current calibration
|
|
504
631
|
if (ref_current == 0.0f) {
|
|
505
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Skipping current calibration: reference current is 0.",
|
|
632
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Skipping current calibration: reference current is 0.", cs,
|
|
506
633
|
phase_labels[phase]);
|
|
507
634
|
} else if (measured_current == 0.0f) {
|
|
508
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Skipping current calibration: measured current is 0.",
|
|
635
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Skipping current calibration: measured current is 0.", cs,
|
|
509
636
|
phase_labels[phase]);
|
|
510
637
|
} else {
|
|
511
638
|
uint32_t new_current_gain = static_cast<uint16_t>((ref_current / measured_current) * current_current_gain);
|
|
512
639
|
if (new_current_gain == 0) {
|
|
513
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Current gain would be 0. Check reference and measured current.",
|
|
640
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Current gain would be 0. Check reference and measured current.", cs,
|
|
514
641
|
phase_labels[phase]);
|
|
515
642
|
} else {
|
|
516
643
|
if (new_current_gain >= 65535) {
|
|
517
|
-
ESP_LOGW(TAG, "[CALIBRATION] Phase %s - Current gain exceeds 65535. You may need to turn up pga gain.",
|
|
518
|
-
phase_labels[phase]);
|
|
644
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] Phase %s - Current gain exceeds 65535. You may need to turn up pga gain.",
|
|
645
|
+
cs, phase_labels[phase]);
|
|
519
646
|
new_current_gain = 65535;
|
|
520
647
|
}
|
|
521
648
|
this->gain_phase_[phase].current_gain = static_cast<uint16_t>(new_current_gain);
|
|
@@ -524,13 +651,13 @@ void ATM90E32Component::run_gain_calibrations() {
|
|
|
524
651
|
}
|
|
525
652
|
|
|
526
653
|
// Final row output
|
|
527
|
-
ESP_LOGI(TAG, "[CALIBRATION] | %c | %9.2f | %9.4f | %5.2f | %6.4f | %5u → %-5u | %5u → %-5u |",
|
|
654
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %9.2f | %9.4f | %5.2f | %6.4f | %5u → %-5u | %5u → %-5u |", cs,
|
|
528
655
|
'A' + phase, measured_voltage, measured_current, ref_voltage, ref_current, current_voltage_gain,
|
|
529
656
|
did_voltage ? this->gain_phase_[phase].voltage_gain : current_voltage_gain, current_current_gain,
|
|
530
657
|
did_current ? this->gain_phase_[phase].current_gain : current_current_gain);
|
|
531
658
|
}
|
|
532
659
|
|
|
533
|
-
ESP_LOGI(TAG, "[CALIBRATION] =====================================================================\n");
|
|
660
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\n", cs);
|
|
534
661
|
|
|
535
662
|
this->save_gain_calibration_to_memory_();
|
|
536
663
|
this->write_gains_to_registers_();
|
|
@@ -538,54 +665,108 @@ void ATM90E32Component::run_gain_calibrations() {
|
|
|
538
665
|
}
|
|
539
666
|
|
|
540
667
|
void ATM90E32Component::save_gain_calibration_to_memory_() {
|
|
668
|
+
const char *cs = this->cs_summary_.c_str();
|
|
541
669
|
bool success = this->gain_calibration_pref_.save(&this->gain_phase_);
|
|
670
|
+
global_preferences->sync();
|
|
671
|
+
if (success) {
|
|
672
|
+
this->using_saved_calibrations_ = true;
|
|
673
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Gain calibration saved to memory.", cs);
|
|
674
|
+
} else {
|
|
675
|
+
this->using_saved_calibrations_ = false;
|
|
676
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Failed to save gain calibration to memory!", cs);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
void ATM90E32Component::save_offset_calibration_to_memory_() {
|
|
681
|
+
const char *cs = this->cs_summary_.c_str();
|
|
682
|
+
bool success = this->offset_pref_.save(&this->offset_phase_);
|
|
683
|
+
global_preferences->sync();
|
|
684
|
+
if (success) {
|
|
685
|
+
this->using_saved_calibrations_ = true;
|
|
686
|
+
this->restored_offset_calibration_ = true;
|
|
687
|
+
for (bool &phase : this->offset_calibration_mismatch_)
|
|
688
|
+
phase = false;
|
|
689
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Offset calibration saved to memory.", cs);
|
|
690
|
+
} else {
|
|
691
|
+
this->using_saved_calibrations_ = false;
|
|
692
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Failed to save offset calibration to memory!", cs);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
void ATM90E32Component::save_power_offset_calibration_to_memory_() {
|
|
697
|
+
const char *cs = this->cs_summary_.c_str();
|
|
698
|
+
bool success = this->power_offset_pref_.save(&this->power_offset_phase_);
|
|
699
|
+
global_preferences->sync();
|
|
542
700
|
if (success) {
|
|
543
701
|
this->using_saved_calibrations_ = true;
|
|
544
|
-
|
|
702
|
+
this->restored_power_offset_calibration_ = true;
|
|
703
|
+
for (bool &phase : this->power_offset_calibration_mismatch_)
|
|
704
|
+
phase = false;
|
|
705
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Power offset calibration saved to memory.", cs);
|
|
545
706
|
} else {
|
|
546
707
|
this->using_saved_calibrations_ = false;
|
|
547
|
-
ESP_LOGE(TAG, "[CALIBRATION] Failed to save
|
|
708
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Failed to save power offset calibration to memory!", cs);
|
|
548
709
|
}
|
|
549
710
|
}
|
|
550
711
|
|
|
551
712
|
void ATM90E32Component::run_offset_calibrations() {
|
|
713
|
+
const char *cs = this->cs_summary_.c_str();
|
|
552
714
|
if (!this->enable_offset_calibration_) {
|
|
553
|
-
ESP_LOGW(TAG,
|
|
715
|
+
ESP_LOGW(TAG,
|
|
716
|
+
"[CALIBRATION][%s] Offset calibration is disabled! Enable it first with enable_offset_calibration: true",
|
|
717
|
+
cs);
|
|
554
718
|
return;
|
|
555
719
|
}
|
|
556
720
|
|
|
721
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
722
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ======================== Offset Calibration ========================", cs);
|
|
723
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------", cs);
|
|
724
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_voltage | offset_current |", cs);
|
|
725
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ------------------------------------------------------------------", cs);
|
|
726
|
+
|
|
557
727
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
558
728
|
int16_t voltage_offset = calibrate_offset(phase, true);
|
|
559
729
|
int16_t current_offset = calibrate_offset(phase, false);
|
|
560
730
|
|
|
561
731
|
this->write_offsets_to_registers_(phase, voltage_offset, current_offset);
|
|
562
732
|
|
|
563
|
-
ESP_LOGI(TAG, "[CALIBRATION]
|
|
733
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase, voltage_offset,
|
|
564
734
|
current_offset);
|
|
565
735
|
}
|
|
566
736
|
|
|
567
|
-
|
|
737
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==================================================================\n", cs);
|
|
738
|
+
|
|
739
|
+
this->save_offset_calibration_to_memory_();
|
|
568
740
|
}
|
|
569
741
|
|
|
570
742
|
void ATM90E32Component::run_power_offset_calibrations() {
|
|
743
|
+
const char *cs = this->cs_summary_.c_str();
|
|
571
744
|
if (!this->enable_offset_calibration_) {
|
|
572
745
|
ESP_LOGW(
|
|
573
746
|
TAG,
|
|
574
|
-
"[CALIBRATION] Offset power calibration is disabled! Enable it first with enable_offset_calibration: true"
|
|
747
|
+
"[CALIBRATION][%s] Offset power calibration is disabled! Enable it first with enable_offset_calibration: true",
|
|
748
|
+
cs);
|
|
575
749
|
return;
|
|
576
750
|
}
|
|
577
751
|
|
|
752
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ", cs);
|
|
753
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ===================== Power Offset Calibration =====================", cs);
|
|
754
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
755
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_active_power | offset_reactive_power |", cs);
|
|
756
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
757
|
+
|
|
578
758
|
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
579
759
|
int16_t active_offset = calibrate_power_offset(phase, false);
|
|
580
760
|
int16_t reactive_offset = calibrate_power_offset(phase, true);
|
|
581
761
|
|
|
582
762
|
this->write_power_offsets_to_registers_(phase, active_offset, reactive_offset);
|
|
583
763
|
|
|
584
|
-
ESP_LOGI(TAG, "[CALIBRATION]
|
|
585
|
-
|
|
764
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase, active_offset,
|
|
765
|
+
reactive_offset);
|
|
586
766
|
}
|
|
767
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\n", cs);
|
|
587
768
|
|
|
588
|
-
this->
|
|
769
|
+
this->save_power_offset_calibration_to_memory_();
|
|
589
770
|
}
|
|
590
771
|
|
|
591
772
|
void ATM90E32Component::write_gains_to_registers_() {
|
|
@@ -632,102 +813,276 @@ void ATM90E32Component::write_power_offsets_to_registers_(uint8_t phase, int16_t
|
|
|
632
813
|
}
|
|
633
814
|
|
|
634
815
|
void ATM90E32Component::restore_gain_calibrations_() {
|
|
635
|
-
|
|
636
|
-
|
|
816
|
+
const char *cs = this->cs_summary_.c_str();
|
|
817
|
+
for (uint8_t i = 0; i < 3; ++i) {
|
|
818
|
+
this->config_gain_phase_[i].voltage_gain = this->phase_[i].voltage_gain_;
|
|
819
|
+
this->config_gain_phase_[i].current_gain = this->phase_[i].ct_gain_;
|
|
820
|
+
this->gain_phase_[i] = this->config_gain_phase_[i];
|
|
821
|
+
}
|
|
637
822
|
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
823
|
+
if (this->gain_calibration_pref_.load(&this->gain_phase_)) {
|
|
824
|
+
bool all_zero = true;
|
|
825
|
+
bool same_as_config = true;
|
|
826
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
827
|
+
const auto &cfg = this->config_gain_phase_[phase];
|
|
828
|
+
const auto &saved = this->gain_phase_[phase];
|
|
829
|
+
if (saved.voltage_gain != 0 || saved.current_gain != 0)
|
|
830
|
+
all_zero = false;
|
|
831
|
+
if (saved.voltage_gain != cfg.voltage_gain || saved.current_gain != cfg.current_gain)
|
|
832
|
+
same_as_config = false;
|
|
642
833
|
}
|
|
643
834
|
|
|
644
|
-
|
|
835
|
+
if (!all_zero && !same_as_config) {
|
|
836
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
837
|
+
bool mismatch = false;
|
|
838
|
+
if (this->has_config_voltage_gain_[phase] &&
|
|
839
|
+
this->gain_phase_[phase].voltage_gain != this->config_gain_phase_[phase].voltage_gain)
|
|
840
|
+
mismatch = true;
|
|
841
|
+
if (this->has_config_current_gain_[phase] &&
|
|
842
|
+
this->gain_phase_[phase].current_gain != this->config_gain_phase_[phase].current_gain)
|
|
843
|
+
mismatch = true;
|
|
844
|
+
if (mismatch)
|
|
845
|
+
this->gain_calibration_mismatch_[phase] = true;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
this->write_gains_to_registers_();
|
|
849
|
+
|
|
850
|
+
if (this->verify_gain_writes_()) {
|
|
851
|
+
this->using_saved_calibrations_ = true;
|
|
852
|
+
this->restored_gain_calibration_ = true;
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
645
855
|
|
|
646
|
-
if (this->verify_gain_writes_()) {
|
|
647
|
-
this->using_saved_calibrations_ = true;
|
|
648
|
-
ESP_LOGI(TAG, "[CALIBRATION] Gain calibration loaded and verified successfully.");
|
|
649
|
-
} else {
|
|
650
856
|
this->using_saved_calibrations_ = false;
|
|
651
|
-
ESP_LOGE(TAG, "[CALIBRATION] Gain verification failed! Calibration may not be applied correctly.");
|
|
857
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Gain verification failed! Calibration may not be applied correctly.", cs);
|
|
652
858
|
}
|
|
653
|
-
} else {
|
|
654
|
-
this->using_saved_calibrations_ = false;
|
|
655
|
-
ESP_LOGW(TAG, "[CALIBRATION] No stored gain calibrations found. Using config file values.");
|
|
656
859
|
}
|
|
860
|
+
|
|
861
|
+
this->using_saved_calibrations_ = false;
|
|
862
|
+
for (uint8_t i = 0; i < 3; ++i)
|
|
863
|
+
this->gain_phase_[i] = this->config_gain_phase_[i];
|
|
864
|
+
this->write_gains_to_registers_();
|
|
865
|
+
|
|
866
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] No stored gain calibrations found. Using config file values.", cs);
|
|
657
867
|
}
|
|
658
868
|
|
|
659
869
|
void ATM90E32Component::restore_offset_calibrations_() {
|
|
660
|
-
|
|
661
|
-
|
|
870
|
+
const char *cs = this->cs_summary_.c_str();
|
|
871
|
+
for (uint8_t i = 0; i < 3; ++i)
|
|
872
|
+
this->config_offset_phase_[i] = this->offset_phase_[i];
|
|
873
|
+
|
|
874
|
+
bool have_data = this->offset_pref_.load(&this->offset_phase_);
|
|
875
|
+
bool all_zero = true;
|
|
876
|
+
if (have_data) {
|
|
877
|
+
for (auto &phase : this->offset_phase_) {
|
|
878
|
+
if (phase.voltage_offset_ != 0 || phase.current_offset_ != 0) {
|
|
879
|
+
all_zero = false;
|
|
880
|
+
break;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
662
884
|
|
|
885
|
+
if (have_data && !all_zero) {
|
|
886
|
+
this->restored_offset_calibration_ = true;
|
|
663
887
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
664
888
|
auto &offset = this->offset_phase_[phase];
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
889
|
+
bool mismatch = false;
|
|
890
|
+
if (this->has_config_voltage_offset_[phase] &&
|
|
891
|
+
offset.voltage_offset_ != this->config_offset_phase_[phase].voltage_offset_)
|
|
892
|
+
mismatch = true;
|
|
893
|
+
if (this->has_config_current_offset_[phase] &&
|
|
894
|
+
offset.current_offset_ != this->config_offset_phase_[phase].current_offset_)
|
|
895
|
+
mismatch = true;
|
|
896
|
+
if (mismatch)
|
|
897
|
+
this->offset_calibration_mismatch_[phase] = true;
|
|
668
898
|
}
|
|
669
899
|
} else {
|
|
670
|
-
|
|
900
|
+
for (uint8_t phase = 0; phase < 3; phase++)
|
|
901
|
+
this->offset_phase_[phase] = this->config_offset_phase_[phase];
|
|
902
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] No stored offset calibrations found. Using default values.", cs);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
906
|
+
write_offsets_to_registers_(phase, this->offset_phase_[phase].voltage_offset_,
|
|
907
|
+
this->offset_phase_[phase].current_offset_);
|
|
671
908
|
}
|
|
672
909
|
}
|
|
673
910
|
|
|
674
911
|
void ATM90E32Component::restore_power_offset_calibrations_() {
|
|
675
|
-
|
|
676
|
-
|
|
912
|
+
const char *cs = this->cs_summary_.c_str();
|
|
913
|
+
for (uint8_t i = 0; i < 3; ++i)
|
|
914
|
+
this->config_power_offset_phase_[i] = this->power_offset_phase_[i];
|
|
915
|
+
|
|
916
|
+
bool have_data = this->power_offset_pref_.load(&this->power_offset_phase_);
|
|
917
|
+
bool all_zero = true;
|
|
918
|
+
if (have_data) {
|
|
919
|
+
for (auto &phase : this->power_offset_phase_) {
|
|
920
|
+
if (phase.active_power_offset != 0 || phase.reactive_power_offset != 0) {
|
|
921
|
+
all_zero = false;
|
|
922
|
+
break;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
677
926
|
|
|
927
|
+
if (have_data && !all_zero) {
|
|
928
|
+
this->restored_power_offset_calibration_ = true;
|
|
678
929
|
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
679
930
|
auto &offset = this->power_offset_phase_[phase];
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
931
|
+
bool mismatch = false;
|
|
932
|
+
if (this->has_config_active_power_offset_[phase] &&
|
|
933
|
+
offset.active_power_offset != this->config_power_offset_phase_[phase].active_power_offset)
|
|
934
|
+
mismatch = true;
|
|
935
|
+
if (this->has_config_reactive_power_offset_[phase] &&
|
|
936
|
+
offset.reactive_power_offset != this->config_power_offset_phase_[phase].reactive_power_offset)
|
|
937
|
+
mismatch = true;
|
|
938
|
+
if (mismatch)
|
|
939
|
+
this->power_offset_calibration_mismatch_[phase] = true;
|
|
683
940
|
}
|
|
684
941
|
} else {
|
|
685
|
-
|
|
942
|
+
for (uint8_t phase = 0; phase < 3; ++phase)
|
|
943
|
+
this->power_offset_phase_[phase] = this->config_power_offset_phase_[phase];
|
|
944
|
+
ESP_LOGW(TAG, "[CALIBRATION][%s] No stored power offsets found. Using default values.", cs);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
for (uint8_t phase = 0; phase < 3; ++phase) {
|
|
948
|
+
write_power_offsets_to_registers_(phase, this->power_offset_phase_[phase].active_power_offset,
|
|
949
|
+
this->power_offset_phase_[phase].reactive_power_offset);
|
|
686
950
|
}
|
|
687
951
|
}
|
|
688
952
|
|
|
689
953
|
void ATM90E32Component::clear_gain_calibrations() {
|
|
690
|
-
|
|
954
|
+
const char *cs = this->cs_summary_.c_str();
|
|
955
|
+
if (!this->using_saved_calibrations_) {
|
|
956
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] No stored gain calibrations to clear. Current values:", cs);
|
|
957
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ----------------------------------------------------------", cs);
|
|
958
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | voltage_gain | current_gain |", cs);
|
|
959
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ----------------------------------------------------------", cs);
|
|
960
|
+
for (int phase = 0; phase < 3; phase++) {
|
|
961
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6u | %6u |", cs, 'A' + phase,
|
|
962
|
+
this->gain_phase_[phase].voltage_gain, this->gain_phase_[phase].current_gain);
|
|
963
|
+
}
|
|
964
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==========================================================\n", cs);
|
|
965
|
+
return;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Clearing stored gain calibrations and restoring config-defined values", cs);
|
|
969
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ----------------------------------------------------------", cs);
|
|
970
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | voltage_gain | current_gain |", cs);
|
|
971
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ----------------------------------------------------------", cs);
|
|
691
972
|
|
|
692
973
|
for (int phase = 0; phase < 3; phase++) {
|
|
693
|
-
|
|
694
|
-
|
|
974
|
+
uint16_t voltage_gain = this->phase_[phase].voltage_gain_;
|
|
975
|
+
uint16_t current_gain = this->phase_[phase].ct_gain_;
|
|
976
|
+
|
|
977
|
+
this->config_gain_phase_[phase].voltage_gain = voltage_gain;
|
|
978
|
+
this->config_gain_phase_[phase].current_gain = current_gain;
|
|
979
|
+
this->gain_phase_[phase].voltage_gain = voltage_gain;
|
|
980
|
+
this->gain_phase_[phase].current_gain = current_gain;
|
|
981
|
+
|
|
982
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6u | %6u |", cs, 'A' + phase, voltage_gain, current_gain);
|
|
695
983
|
}
|
|
984
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==========================================================\n", cs);
|
|
985
|
+
|
|
986
|
+
GainCalibration zero_gains[3]{{0, 0}, {0, 0}, {0, 0}};
|
|
987
|
+
bool success = this->gain_calibration_pref_.save(&zero_gains);
|
|
988
|
+
global_preferences->sync();
|
|
696
989
|
|
|
697
|
-
bool success = this->gain_calibration_pref_.save(&this->gain_phase_);
|
|
698
990
|
this->using_saved_calibrations_ = false;
|
|
991
|
+
this->restored_gain_calibration_ = false;
|
|
992
|
+
for (bool &phase : this->gain_calibration_mismatch_)
|
|
993
|
+
phase = false;
|
|
699
994
|
|
|
700
|
-
if (success) {
|
|
701
|
-
|
|
702
|
-
for (int phase = 0; phase < 3; phase++) {
|
|
703
|
-
ESP_LOGI(TAG, "[CALIBRATION] Phase %c - Voltage Gain: %u, Current Gain: %u", 'A' + phase,
|
|
704
|
-
gain_phase_[phase].voltage_gain, gain_phase_[phase].current_gain);
|
|
705
|
-
}
|
|
706
|
-
} else {
|
|
707
|
-
ESP_LOGE(TAG, "[CALIBRATION] Failed to clear gain calibrations!");
|
|
995
|
+
if (!success) {
|
|
996
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Failed to clear gain calibrations!", cs);
|
|
708
997
|
}
|
|
709
998
|
|
|
710
999
|
this->write_gains_to_registers_(); // Apply them to the chip immediately
|
|
711
1000
|
}
|
|
712
1001
|
|
|
713
1002
|
void ATM90E32Component::clear_offset_calibrations() {
|
|
1003
|
+
const char *cs = this->cs_summary_.c_str();
|
|
1004
|
+
if (!this->restored_offset_calibration_) {
|
|
1005
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] No stored offset calibrations to clear. Current values:", cs);
|
|
1006
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
1007
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_voltage | offset_current |", cs);
|
|
1008
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
1009
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
1010
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase,
|
|
1011
|
+
this->offset_phase_[phase].voltage_offset_, this->offset_phase_[phase].current_offset_);
|
|
1012
|
+
}
|
|
1013
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==============================================================\n", cs);
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Clearing stored offset calibrations and restoring config-defined values", cs);
|
|
1018
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
1019
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_voltage | offset_current |", cs);
|
|
1020
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] --------------------------------------------------------------", cs);
|
|
1021
|
+
|
|
714
1022
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
715
|
-
|
|
1023
|
+
int16_t voltage_offset =
|
|
1024
|
+
this->has_config_voltage_offset_[phase] ? this->config_offset_phase_[phase].voltage_offset_ : 0;
|
|
1025
|
+
int16_t current_offset =
|
|
1026
|
+
this->has_config_current_offset_[phase] ? this->config_offset_phase_[phase].current_offset_ : 0;
|
|
1027
|
+
this->write_offsets_to_registers_(phase, voltage_offset, current_offset);
|
|
1028
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase, voltage_offset,
|
|
1029
|
+
current_offset);
|
|
716
1030
|
}
|
|
1031
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ==============================================================\n", cs);
|
|
1032
|
+
|
|
1033
|
+
OffsetCalibration zero_offsets[3]{{0, 0}, {0, 0}, {0, 0}};
|
|
1034
|
+
this->offset_pref_.save(&zero_offsets); // Clear stored values in flash
|
|
1035
|
+
global_preferences->sync();
|
|
717
1036
|
|
|
718
|
-
this->
|
|
1037
|
+
this->restored_offset_calibration_ = false;
|
|
1038
|
+
for (bool &phase : this->offset_calibration_mismatch_)
|
|
1039
|
+
phase = false;
|
|
719
1040
|
|
|
720
|
-
ESP_LOGI(TAG, "[CALIBRATION] Offsets cleared.");
|
|
1041
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Offsets cleared.", cs);
|
|
721
1042
|
}
|
|
722
1043
|
|
|
723
1044
|
void ATM90E32Component::clear_power_offset_calibrations() {
|
|
1045
|
+
const char *cs = this->cs_summary_.c_str();
|
|
1046
|
+
if (!this->restored_power_offset_calibration_) {
|
|
1047
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] No stored power offsets to clear. Current values:", cs);
|
|
1048
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
1049
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_active_power | offset_reactive_power |", cs);
|
|
1050
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
1051
|
+
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
1052
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase,
|
|
1053
|
+
this->power_offset_phase_[phase].active_power_offset,
|
|
1054
|
+
this->power_offset_phase_[phase].reactive_power_offset);
|
|
1055
|
+
}
|
|
1056
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\n", cs);
|
|
1057
|
+
return;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Clearing stored power offsets and restoring config-defined values", cs);
|
|
1061
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
1062
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | Phase | offset_active_power | offset_reactive_power |", cs);
|
|
1063
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] ---------------------------------------------------------------------", cs);
|
|
1064
|
+
|
|
724
1065
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
725
|
-
|
|
1066
|
+
int16_t active_offset =
|
|
1067
|
+
this->has_config_active_power_offset_[phase] ? this->config_power_offset_phase_[phase].active_power_offset : 0;
|
|
1068
|
+
int16_t reactive_offset = this->has_config_reactive_power_offset_[phase]
|
|
1069
|
+
? this->config_power_offset_phase_[phase].reactive_power_offset
|
|
1070
|
+
: 0;
|
|
1071
|
+
this->write_power_offsets_to_registers_(phase, active_offset, reactive_offset);
|
|
1072
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] | %c | %6d | %6d |", cs, 'A' + phase, active_offset,
|
|
1073
|
+
reactive_offset);
|
|
726
1074
|
}
|
|
1075
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] =====================================================================\n", cs);
|
|
727
1076
|
|
|
728
|
-
|
|
1077
|
+
PowerOffsetCalibration zero_power_offsets[3]{{0, 0}, {0, 0}, {0, 0}};
|
|
1078
|
+
this->power_offset_pref_.save(&zero_power_offsets);
|
|
1079
|
+
global_preferences->sync();
|
|
729
1080
|
|
|
730
|
-
|
|
1081
|
+
this->restored_power_offset_calibration_ = false;
|
|
1082
|
+
for (bool &phase : this->power_offset_calibration_mismatch_)
|
|
1083
|
+
phase = false;
|
|
1084
|
+
|
|
1085
|
+
ESP_LOGI(TAG, "[CALIBRATION][%s] Power offsets cleared.", cs);
|
|
731
1086
|
}
|
|
732
1087
|
|
|
733
1088
|
int16_t ATM90E32Component::calibrate_offset(uint8_t phase, bool voltage) {
|
|
@@ -748,20 +1103,21 @@ int16_t ATM90E32Component::calibrate_offset(uint8_t phase, bool voltage) {
|
|
|
748
1103
|
|
|
749
1104
|
int16_t ATM90E32Component::calibrate_power_offset(uint8_t phase, bool reactive) {
|
|
750
1105
|
const uint8_t num_reads = 5;
|
|
751
|
-
|
|
1106
|
+
int64_t total_value = 0;
|
|
752
1107
|
|
|
753
1108
|
for (uint8_t i = 0; i < num_reads; ++i) {
|
|
754
|
-
|
|
755
|
-
|
|
1109
|
+
int32_t reading = reactive ? this->read32_(ATM90E32_REGISTER_QMEAN + phase, ATM90E32_REGISTER_QMEANLSB + phase)
|
|
1110
|
+
: this->read32_(ATM90E32_REGISTER_PMEAN + phase, ATM90E32_REGISTER_PMEANLSB + phase);
|
|
756
1111
|
total_value += reading;
|
|
757
1112
|
}
|
|
758
1113
|
|
|
759
|
-
|
|
760
|
-
|
|
1114
|
+
int32_t average_value = total_value / num_reads;
|
|
1115
|
+
int32_t power_offset = -average_value;
|
|
761
1116
|
return static_cast<int16_t>(power_offset); // Takes the lower 16 bits
|
|
762
1117
|
}
|
|
763
1118
|
|
|
764
1119
|
bool ATM90E32Component::verify_gain_writes_() {
|
|
1120
|
+
const char *cs = this->cs_summary_.c_str();
|
|
765
1121
|
bool success = true;
|
|
766
1122
|
for (uint8_t phase = 0; phase < 3; phase++) {
|
|
767
1123
|
uint16_t read_voltage = this->read16_(voltage_gain_registers[phase]);
|
|
@@ -769,7 +1125,7 @@ bool ATM90E32Component::verify_gain_writes_() {
|
|
|
769
1125
|
|
|
770
1126
|
if (read_voltage != this->gain_phase_[phase].voltage_gain ||
|
|
771
1127
|
read_current != this->gain_phase_[phase].current_gain) {
|
|
772
|
-
ESP_LOGE(TAG, "[CALIBRATION] Mismatch detected for Phase %s!", phase_labels[phase]);
|
|
1128
|
+
ESP_LOGE(TAG, "[CALIBRATION][%s] Mismatch detected for Phase %s!", cs, phase_labels[phase]);
|
|
773
1129
|
success = false;
|
|
774
1130
|
}
|
|
775
1131
|
}
|
|
@@ -792,16 +1148,16 @@ void ATM90E32Component::check_phase_status() {
|
|
|
792
1148
|
status += "Phase Loss; ";
|
|
793
1149
|
|
|
794
1150
|
auto *sensor = this->phase_status_text_sensor_[phase];
|
|
795
|
-
|
|
1151
|
+
if (sensor == nullptr)
|
|
1152
|
+
continue;
|
|
1153
|
+
|
|
796
1154
|
if (!status.empty()) {
|
|
797
1155
|
status.pop_back(); // remove space
|
|
798
1156
|
status.pop_back(); // remove semicolon
|
|
799
|
-
ESP_LOGW(TAG, "%s: %s",
|
|
800
|
-
|
|
801
|
-
sensor->publish_state(status);
|
|
1157
|
+
ESP_LOGW(TAG, "%s: %s", sensor->get_name().c_str(), status.c_str());
|
|
1158
|
+
sensor->publish_state(status);
|
|
802
1159
|
} else {
|
|
803
|
-
|
|
804
|
-
sensor->publish_state("Okay");
|
|
1160
|
+
sensor->publish_state("Okay");
|
|
805
1161
|
}
|
|
806
1162
|
}
|
|
807
1163
|
}
|
|
@@ -818,9 +1174,12 @@ void ATM90E32Component::check_freq_status() {
|
|
|
818
1174
|
} else {
|
|
819
1175
|
freq_status = "Normal";
|
|
820
1176
|
}
|
|
821
|
-
ESP_LOGW(TAG, "Frequency status: %s", freq_status.c_str());
|
|
822
|
-
|
|
823
1177
|
if (this->freq_status_text_sensor_ != nullptr) {
|
|
1178
|
+
if (freq_status == "Normal") {
|
|
1179
|
+
ESP_LOGD(TAG, "Frequency status: %s", freq_status.c_str());
|
|
1180
|
+
} else {
|
|
1181
|
+
ESP_LOGW(TAG, "Frequency status: %s", freq_status.c_str());
|
|
1182
|
+
}
|
|
824
1183
|
this->freq_status_text_sensor_->publish_state(freq_status);
|
|
825
1184
|
}
|
|
826
1185
|
}
|