esphome 2024.10.2__py3-none-any.whl → 2024.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +22 -4
- esphome/automation.py +29 -2
- esphome/components/animation/__init__.py +5 -8
- esphome/components/animation/animation.cpp +1 -1
- esphome/components/audio/__init__.py +9 -0
- esphome/components/audio/audio.h +21 -0
- esphome/components/axs15231/__init__.py +6 -0
- esphome/components/axs15231/touchscreen/__init__.py +36 -0
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +64 -0
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.h +27 -0
- esphome/components/bme68x_bsec2/__init__.py +1 -1
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +50 -47
- esphome/components/bme68x_bsec2/bme68x_bsec2.h +0 -2
- esphome/components/bytebuffer/__init__.py +5 -0
- esphome/components/bytebuffer/bytebuffer.h +421 -0
- esphome/components/climate/__init__.py +14 -13
- esphome/components/datetime/__init__.py +3 -3
- esphome/components/debug/debug_esp32.cpp +16 -8
- esphome/components/dfplayer/dfplayer.cpp +132 -6
- esphome/components/dfplayer/dfplayer.h +19 -53
- esphome/components/display/display.cpp +142 -0
- esphome/components/display/display.h +7 -0
- esphome/components/es8311/__init__.py +0 -0
- esphome/components/es8311/audio_dac.py +70 -0
- esphome/components/es8311/es8311.cpp +227 -0
- esphome/components/es8311/es8311.h +135 -0
- esphome/components/es8311/es8311_const.h +195 -0
- esphome/components/esp32/boards.py +199 -1
- esphome/components/esp32/gpio.py +3 -1
- esphome/components/esp32_ble/const_esp32c6.h +7 -0
- esphome/components/esp32_ble_client/ble_client_base.h +1 -1
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +3 -0
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -1
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +2 -2
- esphome/components/esp32_rmt_led_strip/led_strip.h +2 -0
- esphome/components/esp32_rmt_led_strip/light.py +3 -1
- esphome/components/esp8266/gpio.py +7 -5
- esphome/components/ethernet/__init__.py +55 -1
- esphome/components/ethernet/ethernet_component.cpp +14 -1
- esphome/components/ethernet/ethernet_component.h +7 -1
- esphome/components/font/__init__.py +213 -108
- esphome/components/gp8403/output/__init__.py +1 -1
- esphome/components/host/gpio.py +6 -4
- esphome/components/http_request/__init__.py +12 -0
- esphome/components/http_request/http_request.h +65 -3
- esphome/components/http_request/http_request_arduino.cpp +4 -3
- esphome/components/http_request/http_request_idf.cpp +12 -14
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +1 -1
- esphome/components/i2c_device/__init__.py +26 -0
- esphome/components/i2c_device/i2c_device.cpp +17 -0
- esphome/components/i2c_device/i2c_device.h +18 -0
- esphome/components/i2s_audio/__init__.py +1 -3
- esphome/components/i2s_audio/speaker/__init__.py +12 -4
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +426 -200
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +92 -33
- esphome/components/ili9xxx/display.py +5 -1
- esphome/components/image/__init__.py +5 -8
- esphome/components/image/image.cpp +14 -14
- esphome/components/image/image.h +20 -24
- esphome/components/internal_temperature/internal_temperature.cpp +51 -2
- esphome/components/internal_temperature/internal_temperature.h +1 -0
- esphome/components/ld2420/ld2420.cpp +1 -1
- esphome/components/libretiny/gpio.py +4 -2
- esphome/components/light/__init__.py +32 -1
- esphome/components/light/automation.py +39 -32
- esphome/components/light/effects.py +36 -36
- esphome/components/light/light_state.cpp +6 -16
- esphome/components/light/light_state.h +34 -0
- esphome/components/light/types.py +3 -1
- esphome/components/logger/logger_esp32.cpp +15 -0
- esphome/components/lvgl/__init__.py +202 -95
- esphome/components/lvgl/automation.py +42 -40
- esphome/components/lvgl/binary_sensor/__init__.py +8 -15
- esphome/components/lvgl/defines.py +14 -8
- esphome/components/lvgl/encoders.py +11 -8
- esphome/components/lvgl/keypads.py +77 -0
- esphome/components/lvgl/light/__init__.py +6 -8
- esphome/components/lvgl/lv_validation.py +2 -4
- esphome/components/lvgl/lvcode.py +3 -9
- esphome/components/lvgl/lvgl_esphome.cpp +210 -89
- esphome/components/lvgl/lvgl_esphome.h +113 -30
- esphome/components/lvgl/lvgl_proxy.h +17 -0
- esphome/components/lvgl/number/__init__.py +10 -15
- esphome/components/lvgl/schemas.py +4 -2
- esphome/components/lvgl/select/__init__.py +12 -37
- esphome/components/lvgl/select/lvgl_select.h +27 -33
- esphome/components/lvgl/sensor/__init__.py +8 -14
- esphome/components/lvgl/styles.py +3 -4
- esphome/components/lvgl/switch/__init__.py +8 -13
- esphome/components/lvgl/text/__init__.py +5 -6
- esphome/components/lvgl/text_sensor/__init__.py +15 -15
- esphome/components/lvgl/touchscreens.py +2 -3
- esphome/components/lvgl/trigger.py +7 -9
- esphome/components/lvgl/types.py +9 -3
- esphome/components/lvgl/widgets/__init__.py +32 -21
- esphome/components/lvgl/widgets/animimg.py +4 -3
- esphome/components/lvgl/widgets/dropdown.py +22 -10
- esphome/components/lvgl/widgets/img.py +2 -0
- esphome/components/lvgl/widgets/msgbox.py +6 -5
- esphome/components/lvgl/widgets/obj.py +4 -2
- esphome/components/lvgl/widgets/page.py +3 -2
- esphome/components/lvgl/widgets/qrcode.py +54 -0
- esphome/components/lvgl/widgets/roller.py +21 -14
- esphome/components/lvgl/widgets/tileview.py +2 -1
- esphome/components/max17043/__init__.py +1 -0
- esphome/components/max17043/automation.h +20 -0
- esphome/components/max17043/max17043.cpp +98 -0
- esphome/components/max17043/max17043.h +29 -0
- esphome/components/max17043/sensor.py +77 -0
- esphome/components/media_player/__init__.py +11 -0
- esphome/components/media_player/automation.h +10 -0
- esphome/components/media_player/media_player.cpp +4 -0
- esphome/components/midea/air_conditioner.cpp +17 -1
- esphome/components/mlx90393/sensor.py +1 -1
- esphome/components/modbus/modbus.cpp +24 -12
- esphome/components/modbus_controller/__init__.py +31 -1
- esphome/components/modbus_controller/automation.h +16 -0
- esphome/components/modbus_controller/const.py +2 -0
- esphome/components/modbus_controller/modbus_controller.cpp +14 -2
- esphome/components/modbus_controller/modbus_controller.h +9 -0
- esphome/components/mopeka_pro_check/mopeka_pro_check.cpp +40 -21
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +9 -2
- esphome/components/mopeka_pro_check/sensor.py +41 -0
- esphome/components/mqtt/__init__.py +36 -0
- esphome/components/mqtt/mqtt_client.cpp +27 -3
- esphome/components/mqtt/mqtt_client.h +27 -2
- esphome/components/mqtt/mqtt_climate.cpp +4 -2
- esphome/components/mqtt/mqtt_component.cpp +6 -0
- esphome/components/mqtt/mqtt_component.h +4 -0
- esphome/components/mqtt/mqtt_const.h +6 -0
- esphome/components/online_image/online_image.cpp +2 -8
- esphome/components/online_image/online_image.h +2 -6
- esphome/components/opentherm/__init__.py +35 -9
- esphome/components/opentherm/binary_sensor/__init__.py +33 -0
- esphome/components/opentherm/const.py +11 -0
- esphome/components/opentherm/generate.py +142 -0
- esphome/components/opentherm/hub.cpp +130 -24
- esphome/components/opentherm/hub.h +62 -9
- esphome/components/opentherm/input.h +18 -0
- esphome/components/opentherm/input.py +51 -0
- esphome/components/opentherm/number/__init__.py +74 -0
- esphome/components/opentherm/number/number.cpp +40 -0
- esphome/components/opentherm/number/number.h +31 -0
- esphome/components/opentherm/opentherm.cpp +30 -0
- esphome/components/opentherm/opentherm.h +34 -2
- esphome/components/opentherm/opentherm_macros.h +151 -0
- esphome/components/opentherm/output/__init__.py +47 -0
- esphome/components/opentherm/output/output.cpp +18 -0
- esphome/components/opentherm/output/output.h +33 -0
- esphome/components/opentherm/schema.py +814 -0
- esphome/components/opentherm/sensor/__init__.py +51 -0
- esphome/components/opentherm/switch/__init__.py +43 -0
- esphome/components/opentherm/switch/switch.cpp +28 -0
- esphome/components/opentherm/switch/switch.h +20 -0
- esphome/components/opentherm/validate.py +31 -0
- esphome/components/pcd8544/display.py +8 -4
- esphome/components/prometheus/prometheus_handler.cpp +176 -14
- esphome/components/prometheus/prometheus_handler.h +25 -7
- esphome/components/qspi_amoled/display.py +1 -141
- esphome/components/qspi_dbi/display.py +185 -0
- esphome/components/qspi_dbi/models.py +64 -0
- esphome/components/{qspi_amoled/qspi_amoled.cpp → qspi_dbi/qspi_dbi.cpp} +95 -46
- esphome/components/{qspi_amoled/qspi_amoled.h → qspi_dbi/qspi_dbi.h} +26 -15
- esphome/components/rp2040/__init__.py +6 -3
- esphome/components/rp2040/gpio.py +5 -3
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +20 -0
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.h +3 -2
- esphome/components/rtttl/rtttl.cpp +4 -1
- esphome/components/rtttl/rtttl.h +1 -0
- esphome/components/sdl/sdl_esphome.cpp +22 -5
- esphome/components/sdl/sdl_esphome.h +1 -0
- esphome/components/sdm_meter/sdm_meter.cpp +1 -1
- esphome/components/sensor/__init__.py +18 -8
- esphome/components/sensor/filter.cpp +19 -18
- esphome/components/sensor/filter.h +9 -10
- esphome/components/sgp4x/sgp4x.cpp +40 -74
- esphome/components/sgp4x/sgp4x.h +5 -3
- esphome/components/speaker/__init__.py +51 -5
- esphome/components/speaker/automation.h +25 -0
- esphome/components/speaker/speaker.h +72 -1
- esphome/components/spi/__init__.py +15 -14
- esphome/components/spi_device/__init__.py +4 -15
- esphome/components/ssd1306_spi/display.py +6 -2
- esphome/components/ssd1322_spi/display.py +6 -2
- esphome/components/ssd1325_spi/display.py +6 -2
- esphome/components/ssd1327_spi/display.py +6 -2
- esphome/components/ssd1331_spi/display.py +6 -2
- esphome/components/ssd1351_spi/display.py +6 -2
- esphome/components/st7567_spi/display.py +6 -2
- esphome/components/st7701s/display.py +5 -1
- esphome/components/st7735/display.py +10 -5
- esphome/components/st7789v/display.py +12 -7
- esphome/components/statsd/statsd.cpp +2 -0
- esphome/components/statsd/statsd.h +2 -0
- esphome/components/sun/sun.h +3 -0
- esphome/components/tc74/__init__.py +1 -0
- esphome/components/tc74/sensor.py +32 -0
- esphome/components/tc74/tc74.cpp +68 -0
- esphome/components/tc74/tc74.h +28 -0
- esphome/components/touchscreen/__init__.py +41 -50
- esphome/components/touchscreen/touchscreen.h +4 -8
- esphome/components/tuya/fan/tuya_fan.cpp +1 -1
- esphome/components/udp/udp_component.cpp +6 -3
- esphome/components/udp/udp_component.h +4 -2
- esphome/components/waveshare_epaper/display.py +6 -2
- esphome/components/web_server/web_server.cpp +22 -0
- esphome/components/web_server/web_server.h +3 -0
- esphome/components/weikai/weikai.h +2 -2
- esphome/components/wifi/wifi_component.cpp +2 -2
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +4 -4
- esphome/components/wifi/wifi_component_esp8266.cpp +4 -4
- esphome/components/wifi/wifi_component_esp_idf.cpp +2 -2
- esphome/components/xpt2046/touchscreen/__init__.py +7 -32
- esphome/config_validation.py +3 -1
- esphome/const.py +9 -2
- esphome/core/defines.h +8 -2
- esphome/core/helpers.cpp +32 -17
- esphome/core/helpers.h +32 -16
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/ring_buffer.h +2 -2
- esphome/dashboard/core.py +25 -0
- esphome/dashboard/status/mdns.py +3 -4
- esphome/dashboard/web_server.py +54 -19
- esphome/espota2.py +36 -35
- esphome/helpers.py +68 -16
- esphome/mqtt.py +9 -2
- esphome/storage_json.py +4 -0
- esphome/writer.py +7 -18
- esphome/zeroconf.py +8 -6
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/METADATA +7 -5
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/RECORD +237 -191
- esphome/core/bytebuffer.cpp +0 -167
- esphome/core/bytebuffer.h +0 -144
- /esphome/components/{qspi_amoled → qspi_dbi}/__init__.py +0 -0
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/LICENSE +0 -0
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/WHEEL +0 -0
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/entry_points.txt +0 -0
- {esphome-2024.10.2.dist-info → esphome-2024.11.0.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,8 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1306_base
|
5
4
|
from esphome.components.ssd1306_base import _validate
|
5
|
+
import esphome.config_validation as cv
|
6
6
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
7
7
|
|
8
8
|
AUTO_LOAD = ["ssd1306_base"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
_validate,
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1306_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1322_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@kbx81"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1322_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1325_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@kbx81"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1325_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1327_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@kbx81"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1327_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1331_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@kbx81"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1331_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, ssd1351_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@kbx81"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"ssd1351_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import spi, st7567_base
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import CONF_DC_PIN, CONF_ID, CONF_LAMBDA, CONF_PAGES
|
6
6
|
|
7
7
|
CODEOWNERS = ["@latonita"]
|
@@ -24,6 +24,10 @@ CONFIG_SCHEMA = cv.All(
|
|
24
24
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
25
25
|
)
|
26
26
|
|
27
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
28
|
+
"st7567_spi", require_miso=False, require_mosi=True
|
29
|
+
)
|
30
|
+
|
27
31
|
|
28
32
|
async def to_code(config):
|
29
33
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -18,6 +18,7 @@ from esphome.const import (
|
|
18
18
|
CONF_HSYNC_PIN,
|
19
19
|
CONF_ID,
|
20
20
|
CONF_IGNORE_STRAPPING_WARNING,
|
21
|
+
CONF_INIT_SEQUENCE,
|
21
22
|
CONF_INVERT_COLORS,
|
22
23
|
CONF_LAMBDA,
|
23
24
|
CONF_MIRROR_X,
|
@@ -35,7 +36,6 @@ from esphome.core import TimePeriod
|
|
35
36
|
|
36
37
|
from .init_sequences import ST7701S_INITS, cmd
|
37
38
|
|
38
|
-
CONF_INIT_SEQUENCE = "init_sequence"
|
39
39
|
CONF_DE_PIN = "de_pin"
|
40
40
|
CONF_PCLK_PIN = "pclk_pin"
|
41
41
|
|
@@ -167,6 +167,10 @@ CONFIG_SCHEMA = cv.All(
|
|
167
167
|
cv.only_with_esp_idf,
|
168
168
|
)
|
169
169
|
|
170
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
171
|
+
"st7701s", require_miso=False, require_mosi=True
|
172
|
+
)
|
173
|
+
|
170
174
|
|
171
175
|
async def to_code(config):
|
172
176
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -1,17 +1,17 @@
|
|
1
|
+
from esphome import pins
|
1
2
|
import esphome.codegen as cg
|
3
|
+
from esphome.components import display, spi
|
2
4
|
import esphome.config_validation as cv
|
3
|
-
from esphome import pins
|
4
|
-
from esphome.components import spi
|
5
|
-
from esphome.components import display
|
6
5
|
from esphome.const import (
|
7
6
|
CONF_DC_PIN,
|
8
7
|
CONF_ID,
|
8
|
+
CONF_INVERT_COLORS,
|
9
9
|
CONF_LAMBDA,
|
10
10
|
CONF_MODEL,
|
11
|
-
CONF_RESET_PIN,
|
12
11
|
CONF_PAGES,
|
13
|
-
|
12
|
+
CONF_RESET_PIN,
|
14
13
|
)
|
14
|
+
|
15
15
|
from . import st7735_ns
|
16
16
|
|
17
17
|
CODEOWNERS = ["@SenexCrenshaw"]
|
@@ -68,6 +68,11 @@ CONFIG_SCHEMA = cv.All(
|
|
68
68
|
)
|
69
69
|
|
70
70
|
|
71
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
72
|
+
"st7735", require_miso=False, require_mosi=True
|
73
|
+
)
|
74
|
+
|
75
|
+
|
71
76
|
async def setup_st7735(var, config):
|
72
77
|
await display.register_display(var, config)
|
73
78
|
|
@@ -1,22 +1,23 @@
|
|
1
|
+
from esphome import pins
|
1
2
|
import esphome.codegen as cg
|
3
|
+
from esphome.components import display, power_supply, spi
|
2
4
|
import esphome.config_validation as cv
|
3
|
-
from esphome import pins
|
4
|
-
from esphome.components import display, spi, power_supply
|
5
5
|
from esphome.const import (
|
6
6
|
CONF_BACKLIGHT_PIN,
|
7
|
+
CONF_CS_PIN,
|
7
8
|
CONF_DC_PIN,
|
8
9
|
CONF_HEIGHT,
|
9
10
|
CONF_ID,
|
10
11
|
CONF_LAMBDA,
|
11
12
|
CONF_MODEL,
|
12
|
-
CONF_RESET_PIN,
|
13
|
-
CONF_WIDTH,
|
14
|
-
CONF_POWER_SUPPLY,
|
15
|
-
CONF_ROTATION,
|
16
|
-
CONF_CS_PIN,
|
17
13
|
CONF_OFFSET_HEIGHT,
|
18
14
|
CONF_OFFSET_WIDTH,
|
15
|
+
CONF_POWER_SUPPLY,
|
16
|
+
CONF_RESET_PIN,
|
17
|
+
CONF_ROTATION,
|
18
|
+
CONF_WIDTH,
|
19
19
|
)
|
20
|
+
|
20
21
|
from . import st7789v_ns
|
21
22
|
|
22
23
|
CONF_EIGHTBITCOLOR = "eightbitcolor"
|
@@ -168,6 +169,10 @@ CONFIG_SCHEMA = cv.All(
|
|
168
169
|
validate_st7789v,
|
169
170
|
)
|
170
171
|
|
172
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
173
|
+
"st7789v", require_miso=False, require_mosi=True
|
174
|
+
)
|
175
|
+
|
171
176
|
|
172
177
|
async def to_code(config):
|
173
178
|
var = cg.new_Pvariable(config[CONF_ID])
|
@@ -3,6 +3,7 @@
|
|
3
3
|
#include <vector>
|
4
4
|
|
5
5
|
#include "esphome/core/defines.h"
|
6
|
+
#ifdef USE_NETWORK
|
6
7
|
#include "esphome/core/component.h"
|
7
8
|
#include "esphome/components/socket/socket.h"
|
8
9
|
#include "esphome/components/network/ip_address.h"
|
@@ -84,3 +85,4 @@ class StatsdComponent : public PollingComponent {
|
|
84
85
|
|
85
86
|
} // namespace statsd
|
86
87
|
} // namespace esphome
|
88
|
+
#endif
|
esphome/components/sun/sun.h
CHANGED
@@ -59,6 +59,9 @@ class Sun {
|
|
59
59
|
void set_latitude(double latitude) { location_.latitude = latitude; }
|
60
60
|
void set_longitude(double longitude) { location_.longitude = longitude; }
|
61
61
|
|
62
|
+
// Check if the sun is above the horizon, with a default elevation angle of -0.83333 (standard for sunrise/set).
|
63
|
+
bool is_above_horizon(double elevation = -0.83333) { return this->elevation() > elevation; }
|
64
|
+
|
62
65
|
optional<ESPTime> sunrise(double elevation);
|
63
66
|
optional<ESPTime> sunset(double elevation);
|
64
67
|
optional<ESPTime> sunrise(ESPTime date, double elevation);
|
@@ -0,0 +1 @@
|
|
1
|
+
CODEOWNERS = ["@sethgirvan"]
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import esphome.codegen as cg
|
2
|
+
from esphome.components import i2c, sensor
|
3
|
+
import esphome.config_validation as cv
|
4
|
+
from esphome.const import (
|
5
|
+
DEVICE_CLASS_TEMPERATURE,
|
6
|
+
STATE_CLASS_MEASUREMENT,
|
7
|
+
UNIT_CELSIUS,
|
8
|
+
)
|
9
|
+
|
10
|
+
CODEOWNERS = ["@sethgirvan"]
|
11
|
+
DEPENDENCIES = ["i2c"]
|
12
|
+
|
13
|
+
tc74_ns = cg.esphome_ns.namespace("tc74")
|
14
|
+
TC74Component = tc74_ns.class_("TC74Component", cg.PollingComponent, i2c.I2CDevice)
|
15
|
+
|
16
|
+
CONFIG_SCHEMA = (
|
17
|
+
sensor.sensor_schema(
|
18
|
+
TC74Component,
|
19
|
+
unit_of_measurement=UNIT_CELSIUS,
|
20
|
+
accuracy_decimals=1,
|
21
|
+
device_class=DEVICE_CLASS_TEMPERATURE,
|
22
|
+
state_class=STATE_CLASS_MEASUREMENT,
|
23
|
+
)
|
24
|
+
.extend(cv.polling_component_schema("60s"))
|
25
|
+
.extend(i2c.i2c_device_schema(0x48))
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
async def to_code(config):
|
30
|
+
var = await sensor.new_sensor(config)
|
31
|
+
await cg.register_component(var, config)
|
32
|
+
await i2c.register_i2c_device(var, config)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
// Based on the TC74 datasheet https://ww1.microchip.com/downloads/en/DeviceDoc/21462D.pdf
|
2
|
+
|
3
|
+
#include "tc74.h"
|
4
|
+
#include "esphome/core/log.h"
|
5
|
+
|
6
|
+
namespace esphome {
|
7
|
+
namespace tc74 {
|
8
|
+
|
9
|
+
static const char *const TAG = "tc74";
|
10
|
+
|
11
|
+
static const uint8_t TC74_REGISTER_TEMPERATURE = 0x00;
|
12
|
+
static const uint8_t TC74_REGISTER_CONFIGURATION = 0x01;
|
13
|
+
static const uint8_t TC74_DATA_READY_MASK = 0x40;
|
14
|
+
|
15
|
+
// It is possible the "Data Ready" bit will not be set if the TC74 has not been powered on for at least 250ms, so it not
|
16
|
+
// being set does not constitute a failure.
|
17
|
+
void TC74Component::setup() {
|
18
|
+
ESP_LOGCONFIG(TAG, "Setting up TC74...");
|
19
|
+
uint8_t config_reg;
|
20
|
+
if (this->read_register(TC74_REGISTER_CONFIGURATION, &config_reg, 1) != i2c::ERROR_OK) {
|
21
|
+
this->mark_failed();
|
22
|
+
return;
|
23
|
+
}
|
24
|
+
this->data_ready_ = config_reg & TC74_DATA_READY_MASK;
|
25
|
+
}
|
26
|
+
|
27
|
+
void TC74Component::update() { this->read_temperature_(); }
|
28
|
+
|
29
|
+
void TC74Component::dump_config() {
|
30
|
+
LOG_SENSOR("", "TC74", this);
|
31
|
+
LOG_I2C_DEVICE(this);
|
32
|
+
if (this->is_failed()) {
|
33
|
+
ESP_LOGE(TAG, "Connection with TC74 failed!");
|
34
|
+
}
|
35
|
+
LOG_UPDATE_INTERVAL(this);
|
36
|
+
}
|
37
|
+
|
38
|
+
void TC74Component::read_temperature_() {
|
39
|
+
if (!this->data_ready_) {
|
40
|
+
uint8_t config_reg;
|
41
|
+
if (this->read_register(TC74_REGISTER_CONFIGURATION, &config_reg, 1) != i2c::ERROR_OK) {
|
42
|
+
this->status_set_warning();
|
43
|
+
return;
|
44
|
+
}
|
45
|
+
|
46
|
+
if (config_reg & TC74_DATA_READY_MASK) {
|
47
|
+
this->data_ready_ = true;
|
48
|
+
} else {
|
49
|
+
ESP_LOGD(TAG, "TC74 not ready");
|
50
|
+
return;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
uint8_t temperature_reg;
|
55
|
+
if (this->read_register(TC74_REGISTER_TEMPERATURE, &temperature_reg, 1) != i2c::ERROR_OK) {
|
56
|
+
this->status_set_warning();
|
57
|
+
return;
|
58
|
+
}
|
59
|
+
|
60
|
+
ESP_LOGD(TAG, "Got Temperature=%d °C", temperature_reg);
|
61
|
+
this->publish_state(temperature_reg);
|
62
|
+
this->status_clear_warning();
|
63
|
+
}
|
64
|
+
|
65
|
+
float TC74Component::get_setup_priority() const { return setup_priority::DATA; }
|
66
|
+
|
67
|
+
} // namespace tc74
|
68
|
+
} // namespace esphome
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "esphome/core/component.h"
|
4
|
+
#include "esphome/components/sensor/sensor.h"
|
5
|
+
#include "esphome/components/i2c/i2c.h"
|
6
|
+
|
7
|
+
namespace esphome {
|
8
|
+
namespace tc74 {
|
9
|
+
|
10
|
+
class TC74Component : public PollingComponent, public i2c::I2CDevice, public sensor::Sensor {
|
11
|
+
public:
|
12
|
+
/// Setup the sensor and check connection.
|
13
|
+
void setup() override;
|
14
|
+
void dump_config() override;
|
15
|
+
/// Update the sensor value (temperature).
|
16
|
+
void update() override;
|
17
|
+
|
18
|
+
float get_setup_priority() const override;
|
19
|
+
|
20
|
+
protected:
|
21
|
+
/// Internal method to read the temperature from the component after it has been scheduled.
|
22
|
+
void read_temperature_();
|
23
|
+
|
24
|
+
bool data_ready_ = false;
|
25
|
+
};
|
26
|
+
|
27
|
+
} // namespace tc74
|
28
|
+
} // namespace esphome
|
@@ -1,21 +1,18 @@
|
|
1
|
-
|
1
|
+
from esphome import automation
|
2
2
|
import esphome.codegen as cg
|
3
|
-
|
4
3
|
from esphome.components import display
|
5
|
-
|
6
|
-
|
4
|
+
import esphome.config_validation as cv
|
7
5
|
from esphome.const import (
|
6
|
+
CONF_CALIBRATION,
|
8
7
|
CONF_DISPLAY,
|
9
|
-
|
8
|
+
CONF_MIRROR_X,
|
9
|
+
CONF_MIRROR_Y,
|
10
10
|
CONF_ON_RELEASE,
|
11
|
+
CONF_ON_TOUCH,
|
11
12
|
CONF_ON_UPDATE,
|
12
13
|
CONF_SWAP_XY,
|
13
|
-
CONF_MIRROR_X,
|
14
|
-
CONF_MIRROR_Y,
|
15
14
|
CONF_TRANSFORM,
|
16
|
-
CONF_CALIBRATION,
|
17
15
|
)
|
18
|
-
|
19
16
|
from esphome.core import coroutine_with_priority
|
20
17
|
|
21
18
|
CODEOWNERS = ["@jesserockz", "@nielsnl68"]
|
@@ -43,51 +40,45 @@ CONF_Y_MIN = "y_min"
|
|
43
40
|
CONF_Y_MAX = "y_max"
|
44
41
|
|
45
42
|
|
46
|
-
def validate_calibration(
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
cv.int_(calibration_config[CONF_Y_MIN])
|
65
|
-
- cv.int_(calibration_config[CONF_Y_MAX])
|
66
|
-
)
|
67
|
-
< 10
|
68
|
-
):
|
69
|
-
raise cv.Invalid("Calibration Y values difference must be more than 10")
|
70
|
-
|
71
|
-
return config
|
43
|
+
def validate_calibration(calibration_config):
|
44
|
+
x_min = calibration_config[CONF_X_MIN]
|
45
|
+
x_max = calibration_config[CONF_X_MAX]
|
46
|
+
y_min = calibration_config[CONF_Y_MIN]
|
47
|
+
y_max = calibration_config[CONF_Y_MAX]
|
48
|
+
if x_max < x_min:
|
49
|
+
raise cv.Invalid(
|
50
|
+
"x_min must be smaller than x_max. To mirror the direction use the 'transform' options"
|
51
|
+
)
|
52
|
+
if y_max < y_min:
|
53
|
+
raise cv.Invalid(
|
54
|
+
"y_min must be smaller than y_max. To mirror the direction use the 'transform' options"
|
55
|
+
)
|
56
|
+
x_delta = x_max - x_min
|
57
|
+
y_delta = y_max - y_min
|
58
|
+
if x_delta < 10 or y_delta < 10:
|
59
|
+
raise cv.Invalid("Calibration value range must be greater than 10")
|
60
|
+
return calibration_config
|
72
61
|
|
73
62
|
|
74
|
-
|
75
|
-
|
63
|
+
CALIBRATION_SCHEMA = cv.All(
|
64
|
+
cv.Schema(
|
76
65
|
{
|
77
|
-
cv.
|
78
|
-
cv.
|
79
|
-
|
80
|
-
),
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
},
|
86
|
-
validate_calibration,
|
87
|
-
)
|
66
|
+
cv.Required(CONF_X_MIN): cv.int_range(min=0, max=4095),
|
67
|
+
cv.Required(CONF_X_MAX): cv.int_range(min=0, max=4095),
|
68
|
+
cv.Required(CONF_Y_MIN): cv.int_range(min=0, max=4095),
|
69
|
+
cv.Required(CONF_Y_MAX): cv.int_range(min=0, max=4095),
|
70
|
+
}
|
71
|
+
),
|
72
|
+
validate_calibration,
|
73
|
+
)
|
88
74
|
|
89
75
|
|
90
|
-
def touchscreen_schema(default_touch_timeout):
|
76
|
+
def touchscreen_schema(default_touch_timeout=cv.UNDEFINED, calibration_required=False):
|
77
|
+
calibration = (
|
78
|
+
cv.Required(CONF_CALIBRATION)
|
79
|
+
if calibration_required
|
80
|
+
else cv.Optional(CONF_CALIBRATION)
|
81
|
+
)
|
91
82
|
return cv.Schema(
|
92
83
|
{
|
93
84
|
cv.GenerateID(CONF_DISPLAY): cv.use_id(display.Display),
|
@@ -102,7 +93,7 @@ def touchscreen_schema(default_touch_timeout):
|
|
102
93
|
cv.positive_time_period_milliseconds,
|
103
94
|
cv.Range(max=cv.TimePeriod(milliseconds=65535)),
|
104
95
|
),
|
105
|
-
|
96
|
+
calibration: CALIBRATION_SCHEMA,
|
106
97
|
cv.Optional(CONF_ON_TOUCH): automation.validate_automation(single=True),
|
107
98
|
cv.Optional(CONF_ON_UPDATE): automation.validate_automation(single=True),
|
108
99
|
cv.Optional(CONF_ON_RELEASE): automation.validate_automation(single=True),
|
@@ -53,14 +53,10 @@ class Touchscreen : public PollingComponent {
|
|
53
53
|
void set_swap_xy(bool swap) { this->swap_x_y_ = swap; }
|
54
54
|
|
55
55
|
void set_calibration(int16_t x_min, int16_t x_max, int16_t y_min, int16_t y_max) {
|
56
|
-
this->x_raw_min_ =
|
57
|
-
this->x_raw_max_ =
|
58
|
-
this->y_raw_min_ =
|
59
|
-
this->y_raw_max_ =
|
60
|
-
if (x_min > x_max)
|
61
|
-
this->invert_x_ = true;
|
62
|
-
if (y_min > y_max)
|
63
|
-
this->invert_y_ = true;
|
56
|
+
this->x_raw_min_ = x_min;
|
57
|
+
this->x_raw_max_ = x_max;
|
58
|
+
this->y_raw_min_ = y_min;
|
59
|
+
this->y_raw_max_ = y_max;
|
64
60
|
}
|
65
61
|
|
66
62
|
Trigger<TouchPoint, const TouchPoints_t &> *get_touch_trigger() { return &this->touch_trigger_; }
|
@@ -86,7 +86,7 @@ void TuyaFan::control(const fan::FanCall &call) {
|
|
86
86
|
if (this->oscillation_id_.has_value() && call.get_oscillating().has_value()) {
|
87
87
|
if (this->oscillation_type_ == TuyaDatapointType::ENUM) {
|
88
88
|
this->parent_->set_enum_datapoint_value(*this->oscillation_id_, *call.get_oscillating());
|
89
|
-
} else if (this->
|
89
|
+
} else if (this->oscillation_type_ == TuyaDatapointType::BOOLEAN) {
|
90
90
|
this->parent_->set_boolean_datapoint_value(*this->oscillation_id_, *call.get_oscillating());
|
91
91
|
}
|
92
92
|
}
|
@@ -261,7 +261,8 @@ void UDPComponent::setup() {
|
|
261
261
|
return;
|
262
262
|
}
|
263
263
|
}
|
264
|
-
#
|
264
|
+
#endif
|
265
|
+
#ifdef USE_SOCKET_IMPL_LWIP_TCP
|
265
266
|
// 8266 and RP2040 `Duino
|
266
267
|
for (const auto &address : this->addresses_) {
|
267
268
|
auto ipaddr = IPAddress();
|
@@ -370,7 +371,8 @@ void UDPComponent::loop() {
|
|
370
371
|
for (;;) {
|
371
372
|
#if defined(USE_SOCKET_IMPL_BSD_SOCKETS) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS)
|
372
373
|
auto len = this->listen_socket_->read(buf, sizeof(buf));
|
373
|
-
#
|
374
|
+
#endif
|
375
|
+
#ifdef USE_SOCKET_IMPL_LWIP_TCP
|
374
376
|
auto len = this->udp_client_.parsePacket();
|
375
377
|
if (len > 0)
|
376
378
|
len = this->udp_client_.read(buf, sizeof(buf));
|
@@ -587,7 +589,8 @@ void UDPComponent::send_packet_(void *data, size_t len) {
|
|
587
589
|
if (result < 0)
|
588
590
|
ESP_LOGW(TAG, "sendto() error %d", errno);
|
589
591
|
}
|
590
|
-
#
|
592
|
+
#endif
|
593
|
+
#ifdef USE_SOCKET_IMPL_LWIP_TCP
|
591
594
|
auto iface = IPAddress(0, 0, 0, 0);
|
592
595
|
for (const auto &saddr : this->ipaddrs_) {
|
593
596
|
if (this->udp_client_.beginPacketMulticast(saddr, this->port_, iface, 128) != 0) {
|
@@ -9,7 +9,8 @@
|
|
9
9
|
#endif
|
10
10
|
#if defined(USE_SOCKET_IMPL_BSD_SOCKETS) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS)
|
11
11
|
#include "esphome/components/socket/socket.h"
|
12
|
-
#
|
12
|
+
#endif
|
13
|
+
#ifdef USE_SOCKET_IMPL_LWIP_TCP
|
13
14
|
#include <WiFiUdp.h>
|
14
15
|
#endif
|
15
16
|
#include <vector>
|
@@ -125,7 +126,8 @@ class UDPComponent : public PollingComponent {
|
|
125
126
|
std::unique_ptr<socket::Socket> broadcast_socket_ = nullptr;
|
126
127
|
std::unique_ptr<socket::Socket> listen_socket_ = nullptr;
|
127
128
|
std::vector<struct sockaddr> sockaddrs_{};
|
128
|
-
#
|
129
|
+
#endif
|
130
|
+
#ifdef USE_SOCKET_IMPL_LWIP_TCP
|
129
131
|
std::vector<IPAddress> ipaddrs_{};
|
130
132
|
WiFiUDP udp_client_{};
|
131
133
|
#endif
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome import core, pins
|
2
|
+
import esphome.codegen as cg
|
4
3
|
from esphome.components import display, spi
|
4
|
+
import esphome.config_validation as cv
|
5
5
|
from esphome.const import (
|
6
6
|
CONF_BUSY_PIN,
|
7
7
|
CONF_DC_PIN,
|
@@ -187,6 +187,10 @@ CONFIG_SCHEMA = cv.All(
|
|
187
187
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
188
188
|
)
|
189
189
|
|
190
|
+
FINAL_VALIDATE_SCHEMA = spi.final_validate_device_schema(
|
191
|
+
"waveshare_epaper", require_miso=False, require_mosi=True
|
192
|
+
)
|
193
|
+
|
190
194
|
|
191
195
|
async def to_code(config):
|
192
196
|
model_type, model = MODELS[config[CONF_MODEL]]
|