Merge pull request #67487 from home-assistant/rc

This commit is contained in:
Franck Nijhof
2022-03-02 19:56:49 +01:00
committed by GitHub
4494 changed files with 98036 additions and 22569 deletions

View File

@@ -64,6 +64,7 @@ components: &components
- homeassistant/components/group/* - homeassistant/components/group/*
- homeassistant/components/hassio/* - homeassistant/components/hassio/*
- homeassistant/components/homeassistant/** - homeassistant/components/homeassistant/**
- homeassistant/components/http/**
- homeassistant/components/image/* - homeassistant/components/image/*
- homeassistant/components/input_boolean/* - homeassistant/components/input_boolean/*
- homeassistant/components/input_button/* - homeassistant/components/input_button/*
@@ -75,6 +76,7 @@ components: &components
- homeassistant/components/logger/* - homeassistant/components/logger/*
- homeassistant/components/lovelace/* - homeassistant/components/lovelace/*
- homeassistant/components/media_source/* - homeassistant/components/media_source/*
- homeassistant/components/mjpeg/*
- homeassistant/components/mqtt/* - homeassistant/components/mqtt/*
- homeassistant/components/network/* - homeassistant/components/network/*
- homeassistant/components/onboarding/* - homeassistant/components/onboarding/*
@@ -101,6 +103,7 @@ components: &components
# Testing related files that affect the whole test/linting suite # Testing related files that affect the whole test/linting suite
tests: &tests tests: &tests
- codecov.yaml - codecov.yaml
- pylint/**
- requirements_test_pre_commit.txt - requirements_test_pre_commit.txt
- requirements_test.txt - requirements_test.txt
- tests/auth/** - tests/auth/**
@@ -111,6 +114,7 @@ tests: &tests
- tests/helpers/* - tests/helpers/*
- tests/ignore_uncaught_exceptions.py - tests/ignore_uncaught_exceptions.py
- tests/mock/* - tests/mock/*
- tests/pylint/*
- tests/scripts/* - tests/scripts/*
- tests/test_util/* - tests/test_util/*
- tests/testing_config/** - tests/testing_config/**
@@ -120,15 +124,16 @@ other: &other
- .github/workflows/* - .github/workflows/*
- homeassistant/scripts/** - homeassistant/scripts/**
requirements: requirements: &requirements
- .github/workflows/* - .github/workflows/*
- homeassistant/package_constraints.txt - homeassistant/package_constraints.txt
- requirements*.txt - requirements*.txt
- setup.py - setup.cfg
any: any:
- *base_platforms - *base_platforms
- *components - *components
- *core - *core
- *other - *other
- *requirements
- *tests - *tests

View File

@@ -52,7 +52,9 @@ omit =
homeassistant/components/amazon_polly/* homeassistant/components/amazon_polly/*
homeassistant/components/amberelectric/__init__.py homeassistant/components/amberelectric/__init__.py
homeassistant/components/ambiclimate/climate.py homeassistant/components/ambiclimate/climate.py
homeassistant/components/ambient_station/* homeassistant/components/ambient_station/__init__.py
homeassistant/components/ambient_station/binary_sensor.py
homeassistant/components/ambient_station/sensor.py
homeassistant/components/amcrest/* homeassistant/components/amcrest/*
homeassistant/components/ampio/* homeassistant/components/ampio/*
homeassistant/components/android_ip_webcam/* homeassistant/components/android_ip_webcam/*
@@ -75,11 +77,13 @@ omit =
homeassistant/components/aruba/device_tracker.py homeassistant/components/aruba/device_tracker.py
homeassistant/components/arwn/sensor.py homeassistant/components/arwn/sensor.py
homeassistant/components/aseko_pool_live/__init__.py homeassistant/components/aseko_pool_live/__init__.py
homeassistant/components/aseko_pool_live/binary_sensor.py
homeassistant/components/aseko_pool_live/entity.py homeassistant/components/aseko_pool_live/entity.py
homeassistant/components/aseko_pool_live/sensor.py homeassistant/components/aseko_pool_live/sensor.py
homeassistant/components/asterisk_cdr/mailbox.py homeassistant/components/asterisk_cdr/mailbox.py
homeassistant/components/asterisk_mbox/* homeassistant/components/asterisk_mbox/*
homeassistant/components/asuswrt/__init__.py homeassistant/components/asuswrt/__init__.py
homeassistant/components/asuswrt/diagnostics.py
homeassistant/components/asuswrt/router.py homeassistant/components/asuswrt/router.py
homeassistant/components/aten_pe/* homeassistant/components/aten_pe/*
homeassistant/components/atome/* homeassistant/components/atome/*
@@ -87,6 +91,7 @@ omit =
homeassistant/components/aurora/binary_sensor.py homeassistant/components/aurora/binary_sensor.py
homeassistant/components/aurora/const.py homeassistant/components/aurora/const.py
homeassistant/components/aurora/sensor.py homeassistant/components/aurora/sensor.py
homeassistant/components/aussie_broadband/diagnostics.py
homeassistant/components/avea/light.py homeassistant/components/avea/light.py
homeassistant/components/avion/light.py homeassistant/components/avion/light.py
homeassistant/components/azure_devops/__init__.py homeassistant/components/azure_devops/__init__.py
@@ -189,7 +194,10 @@ omit =
homeassistant/components/crownstone/light.py homeassistant/components/crownstone/light.py
homeassistant/components/cups/sensor.py homeassistant/components/cups/sensor.py
homeassistant/components/currencylayer/sensor.py homeassistant/components/currencylayer/sensor.py
homeassistant/components/daikin/* homeassistant/components/daikin/__init__.py
homeassistant/components/daikin/climate.py
homeassistant/components/daikin/sensor.py
homeassistant/components/daikin/switch.py
homeassistant/components/danfoss_air/* homeassistant/components/danfoss_air/*
homeassistant/components/darksky/weather.py homeassistant/components/darksky/weather.py
homeassistant/components/ddwrt/device_tracker.py homeassistant/components/ddwrt/device_tracker.py
@@ -222,7 +230,12 @@ omit =
homeassistant/components/dnsip/sensor.py homeassistant/components/dnsip/sensor.py
homeassistant/components/dominos/* homeassistant/components/dominos/*
homeassistant/components/doods/* homeassistant/components/doods/*
homeassistant/components/doorbird/* homeassistant/components/doorbird/__init__.py
homeassistant/components/doorbird/button.py
homeassistant/components/doorbird/camera.py
homeassistant/components/doorbird/entity.py
homeassistant/components/doorbird/logbook.py
homeassistant/components/doorbird/util.py
homeassistant/components/dovado/* homeassistant/components/dovado/*
homeassistant/components/downloader/* homeassistant/components/downloader/*
homeassistant/components/dsmr_reader/* homeassistant/components/dsmr_reader/*
@@ -256,7 +269,14 @@ omit =
homeassistant/components/egardia/* homeassistant/components/egardia/*
homeassistant/components/eight_sleep/* homeassistant/components/eight_sleep/*
homeassistant/components/eliqonline/sensor.py homeassistant/components/eliqonline/sensor.py
homeassistant/components/elkm1/* homeassistant/components/elkm1/__init__.py
homeassistant/components/elkm1/alarm_control_panel.py
homeassistant/components/elkm1/climate.py
homeassistant/components/elkm1/discovery.py
homeassistant/components/elkm1/light.py
homeassistant/components/elkm1/scene.py
homeassistant/components/elkm1/sensor.py
homeassistant/components/elkm1/switch.py
homeassistant/components/elmax/__init__.py homeassistant/components/elmax/__init__.py
homeassistant/components/elmax/common.py homeassistant/components/elmax/common.py
homeassistant/components/elmax/const.py homeassistant/components/elmax/const.py
@@ -300,6 +320,7 @@ omit =
homeassistant/components/esphome/entry_data.py homeassistant/components/esphome/entry_data.py
homeassistant/components/esphome/fan.py homeassistant/components/esphome/fan.py
homeassistant/components/esphome/light.py homeassistant/components/esphome/light.py
homeassistant/components/esphome/lock.py
homeassistant/components/esphome/number.py homeassistant/components/esphome/number.py
homeassistant/components/esphome/select.py homeassistant/components/esphome/select.py
homeassistant/components/esphome/sensor.py homeassistant/components/esphome/sensor.py
@@ -339,6 +360,9 @@ omit =
homeassistant/components/firmata/sensor.py homeassistant/components/firmata/sensor.py
homeassistant/components/firmata/switch.py homeassistant/components/firmata/switch.py
homeassistant/components/fitbit/* homeassistant/components/fitbit/*
homeassistant/components/fivem/__init__.py
homeassistant/components/fivem/binary_sensor.py
homeassistant/components/fivem/sensor.py
homeassistant/components/fixer/sensor.py homeassistant/components/fixer/sensor.py
homeassistant/components/fjaraskupan/__init__.py homeassistant/components/fjaraskupan/__init__.py
homeassistant/components/fjaraskupan/binary_sensor.py homeassistant/components/fjaraskupan/binary_sensor.py
@@ -370,13 +394,10 @@ omit =
homeassistant/components/freebox/router.py homeassistant/components/freebox/router.py
homeassistant/components/freebox/sensor.py homeassistant/components/freebox/sensor.py
homeassistant/components/freebox/switch.py homeassistant/components/freebox/switch.py
homeassistant/components/fritz/__init__.py
homeassistant/components/fritz/binary_sensor.py homeassistant/components/fritz/binary_sensor.py
homeassistant/components/fritz/button.py
homeassistant/components/fritz/common.py homeassistant/components/fritz/common.py
homeassistant/components/fritz/const.py homeassistant/components/fritz/const.py
homeassistant/components/fritz/device_tracker.py homeassistant/components/fritz/device_tracker.py
homeassistant/components/fritz/diagnostics.py
homeassistant/components/fritz/sensor.py homeassistant/components/fritz/sensor.py
homeassistant/components/fritz/services.py homeassistant/components/fritz/services.py
homeassistant/components/fritz/switch.py homeassistant/components/fritz/switch.py
@@ -400,20 +421,15 @@ omit =
homeassistant/components/glances/__init__.py homeassistant/components/glances/__init__.py
homeassistant/components/glances/const.py homeassistant/components/glances/const.py
homeassistant/components/glances/sensor.py homeassistant/components/glances/sensor.py
homeassistant/components/gntp/notify.py
homeassistant/components/goalfeed/* homeassistant/components/goalfeed/*
homeassistant/components/goodwe/__init__.py homeassistant/components/goodwe/__init__.py
homeassistant/components/goodwe/const.py homeassistant/components/goodwe/const.py
homeassistant/components/goodwe/number.py homeassistant/components/goodwe/number.py
homeassistant/components/goodwe/select.py homeassistant/components/goodwe/select.py
homeassistant/components/goodwe/sensor.py homeassistant/components/goodwe/sensor.py
homeassistant/components/google/__init__.py
homeassistant/components/google_cloud/tts.py homeassistant/components/google_cloud/tts.py
homeassistant/components/google_maps/device_tracker.py homeassistant/components/google_maps/device_tracker.py
homeassistant/components/google_pubsub/__init__.py homeassistant/components/google_pubsub/__init__.py
homeassistant/components/google_travel_time/__init__.py
homeassistant/components/google_travel_time/helpers.py
homeassistant/components/google_travel_time/sensor.py
homeassistant/components/gpmdp/media_player.py homeassistant/components/gpmdp/media_player.py
homeassistant/components/gpsd/sensor.py homeassistant/components/gpsd/sensor.py
homeassistant/components/greenwave/light.py homeassistant/components/greenwave/light.py
@@ -430,7 +446,11 @@ omit =
homeassistant/components/habitica/__init__.py homeassistant/components/habitica/__init__.py
homeassistant/components/habitica/const.py homeassistant/components/habitica/const.py
homeassistant/components/habitica/sensor.py homeassistant/components/habitica/sensor.py
homeassistant/components/hangouts/* homeassistant/components/hangouts/__init__.py
homeassistant/components/hangouts/hangouts_bot.py
homeassistant/components/hangouts/hangups_utils.py
homeassistant/components/hangouts/intents.py
homeassistant/components/hangouts/notify.py
homeassistant/components/harman_kardon_avr/media_player.py homeassistant/components/harman_kardon_avr/media_player.py
homeassistant/components/harmony/const.py homeassistant/components/harmony/const.py
homeassistant/components/harmony/data.py homeassistant/components/harmony/data.py
@@ -471,7 +491,12 @@ omit =
homeassistant/components/horizon/media_player.py homeassistant/components/horizon/media_player.py
homeassistant/components/hp_ilo/sensor.py homeassistant/components/hp_ilo/sensor.py
homeassistant/components/htu21d/sensor.py homeassistant/components/htu21d/sensor.py
homeassistant/components/huawei_lte/* homeassistant/components/huawei_lte/__init__.py
homeassistant/components/huawei_lte/binary_sensor.py
homeassistant/components/huawei_lte/device_tracker.py
homeassistant/components/huawei_lte/notify.py
homeassistant/components/huawei_lte/sensor.py
homeassistant/components/huawei_lte/switch.py
homeassistant/components/hue/light.py homeassistant/components/hue/light.py
homeassistant/components/hunterdouglas_powerview/__init__.py homeassistant/components/hunterdouglas_powerview/__init__.py
homeassistant/components/hunterdouglas_powerview/scene.py homeassistant/components/hunterdouglas_powerview/scene.py
@@ -497,7 +522,9 @@ omit =
homeassistant/components/izone/discovery.py homeassistant/components/izone/discovery.py
homeassistant/components/izone/__init__.py homeassistant/components/izone/__init__.py
homeassistant/components/idteck_prox/* homeassistant/components/idteck_prox/*
homeassistant/components/ifttt/* homeassistant/components/ifttt/__init__.py
homeassistant/components/ifttt/alarm_control_panel.py
homeassistant/components/ifttt/const.py
homeassistant/components/iglo/light.py homeassistant/components/iglo/light.py
homeassistant/components/ihc/* homeassistant/components/ihc/*
homeassistant/components/imap/sensor.py homeassistant/components/imap/sensor.py
@@ -517,12 +544,17 @@ omit =
homeassistant/components/intellifire/coordinator.py homeassistant/components/intellifire/coordinator.py
homeassistant/components/intellifire/binary_sensor.py homeassistant/components/intellifire/binary_sensor.py
homeassistant/components/intellifire/sensor.py homeassistant/components/intellifire/sensor.py
homeassistant/components/intellifire/entity.py
homeassistant/components/incomfort/* homeassistant/components/incomfort/*
homeassistant/components/intesishome/* homeassistant/components/intesishome/*
homeassistant/components/ios/* homeassistant/components/ios/__init__.py
homeassistant/components/ios/notify.py
homeassistant/components/ios/sensor.py
homeassistant/components/iperf3/* homeassistant/components/iperf3/*
homeassistant/components/iqvia/* homeassistant/components/iqvia/__init__.py
homeassistant/components/iqvia/sensor.py
homeassistant/components/irish_rail_transport/sensor.py homeassistant/components/irish_rail_transport/sensor.py
homeassistant/components/iss/__init__.py
homeassistant/components/iss/binary_sensor.py homeassistant/components/iss/binary_sensor.py
homeassistant/components/isy994/__init__.py homeassistant/components/isy994/__init__.py
homeassistant/components/isy994/binary_sensor.py homeassistant/components/isy994/binary_sensor.py
@@ -569,7 +601,10 @@ omit =
homeassistant/components/kodi/const.py homeassistant/components/kodi/const.py
homeassistant/components/kodi/media_player.py homeassistant/components/kodi/media_player.py
homeassistant/components/kodi/notify.py homeassistant/components/kodi/notify.py
homeassistant/components/konnected/* homeassistant/components/konnected/__init__.py
homeassistant/components/konnected/handlers.py
homeassistant/components/konnected/panel.py
homeassistant/components/konnected/switch.py
homeassistant/components/kostal_plenticore/__init__.py homeassistant/components/kostal_plenticore/__init__.py
homeassistant/components/kostal_plenticore/const.py homeassistant/components/kostal_plenticore/const.py
homeassistant/components/kostal_plenticore/helper.py homeassistant/components/kostal_plenticore/helper.py
@@ -594,8 +629,13 @@ omit =
homeassistant/components/lcn/services.py homeassistant/components/lcn/services.py
homeassistant/components/lg_netcast/media_player.py homeassistant/components/lg_netcast/media_player.py
homeassistant/components/lg_soundbar/media_player.py homeassistant/components/lg_soundbar/media_player.py
homeassistant/components/life360/* homeassistant/components/life360/__init__.py
homeassistant/components/lifx/* homeassistant/components/life360/const.py
homeassistant/components/life360/device_tracker.py
homeassistant/components/life360/helpers.py
homeassistant/components/lifx/__init__.py
homeassistant/components/lifx/const.py
homeassistant/components/lifx/light.py
homeassistant/components/lifx_cloud/scene.py homeassistant/components/lifx_cloud/scene.py
homeassistant/components/lightwave/* homeassistant/components/lightwave/*
homeassistant/components/limitlessled/light.py homeassistant/components/limitlessled/light.py
@@ -676,9 +716,15 @@ omit =
homeassistant/components/minio/* homeassistant/components/minio/*
homeassistant/components/mitemp_bt/sensor.py homeassistant/components/mitemp_bt/sensor.py
homeassistant/components/mjpeg/camera.py homeassistant/components/mjpeg/camera.py
homeassistant/components/mjpeg/util.py
homeassistant/components/mochad/* homeassistant/components/mochad/*
homeassistant/components/modbus/climate.py homeassistant/components/modbus/climate.py
homeassistant/components/modbus/binary_sensor.py
homeassistant/components/modem_callerid/button.py
homeassistant/components/modem_callerid/sensor.py homeassistant/components/modem_callerid/sensor.py
homeassistant/components/moehlenhoff_alpha2/__init__.py
homeassistant/components/moehlenhoff_alpha2/climate.py
homeassistant/components/moehlenhoff_alpha2/const.py
homeassistant/components/motion_blinds/__init__.py homeassistant/components/motion_blinds/__init__.py
homeassistant/components/motion_blinds/const.py homeassistant/components/motion_blinds/const.py
homeassistant/components/motion_blinds/cover.py homeassistant/components/motion_blinds/cover.py
@@ -716,6 +762,7 @@ omit =
homeassistant/components/nad/media_player.py homeassistant/components/nad/media_player.py
homeassistant/components/nanoleaf/__init__.py homeassistant/components/nanoleaf/__init__.py
homeassistant/components/nanoleaf/button.py homeassistant/components/nanoleaf/button.py
homeassistant/components/nanoleaf/device_trigger.py
homeassistant/components/nanoleaf/diagnostics.py homeassistant/components/nanoleaf/diagnostics.py
homeassistant/components/nanoleaf/entity.py homeassistant/components/nanoleaf/entity.py
homeassistant/components/nanoleaf/light.py homeassistant/components/nanoleaf/light.py
@@ -730,9 +777,11 @@ omit =
homeassistant/components/nest/legacy/* homeassistant/components/nest/legacy/*
homeassistant/components/netdata/sensor.py homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/__init__.py homeassistant/components/netgear/__init__.py
homeassistant/components/netgear/button.py
homeassistant/components/netgear/device_tracker.py homeassistant/components/netgear/device_tracker.py
homeassistant/components/netgear/router.py homeassistant/components/netgear/router.py
homeassistant/components/netgear/sensor.py homeassistant/components/netgear/sensor.py
homeassistant/components/netgear/switch.py
homeassistant/components/netgear_lte/* homeassistant/components/netgear_lte/*
homeassistant/components/netio/switch.py homeassistant/components/netio/switch.py
homeassistant/components/neurio_energy/sensor.py homeassistant/components/neurio_energy/sensor.py
@@ -759,6 +808,7 @@ omit =
homeassistant/components/nuki/const.py homeassistant/components/nuki/const.py
homeassistant/components/nuki/binary_sensor.py homeassistant/components/nuki/binary_sensor.py
homeassistant/components/nuki/lock.py homeassistant/components/nuki/lock.py
homeassistant/components/nut/diagnostics.py
homeassistant/components/nx584/alarm_control_panel.py homeassistant/components/nx584/alarm_control_panel.py
homeassistant/components/nzbget/coordinator.py homeassistant/components/nzbget/coordinator.py
homeassistant/components/obihai/* homeassistant/components/obihai/*
@@ -820,6 +870,8 @@ omit =
homeassistant/components/overkiz/__init__.py homeassistant/components/overkiz/__init__.py
homeassistant/components/overkiz/binary_sensor.py homeassistant/components/overkiz/binary_sensor.py
homeassistant/components/overkiz/button.py homeassistant/components/overkiz/button.py
homeassistant/components/overkiz/climate.py
homeassistant/components/overkiz/climate_entities/*
homeassistant/components/overkiz/cover.py homeassistant/components/overkiz/cover.py
homeassistant/components/overkiz/cover_entities/* homeassistant/components/overkiz/cover_entities/*
homeassistant/components/overkiz/coordinator.py homeassistant/components/overkiz/coordinator.py
@@ -832,6 +884,7 @@ omit =
homeassistant/components/overkiz/scene.py homeassistant/components/overkiz/scene.py
homeassistant/components/overkiz/select.py homeassistant/components/overkiz/select.py
homeassistant/components/overkiz/sensor.py homeassistant/components/overkiz/sensor.py
homeassistant/components/overkiz/siren.py
homeassistant/components/overkiz/switch.py homeassistant/components/overkiz/switch.py
homeassistant/components/ovo_energy/__init__.py homeassistant/components/ovo_energy/__init__.py
homeassistant/components/ovo_energy/const.py homeassistant/components/ovo_energy/const.py
@@ -845,6 +898,7 @@ omit =
homeassistant/components/pcal9535a/* homeassistant/components/pcal9535a/*
homeassistant/components/pencom/switch.py homeassistant/components/pencom/switch.py
homeassistant/components/philips_js/__init__.py homeassistant/components/philips_js/__init__.py
homeassistant/components/philips_js/diagnostics.py
homeassistant/components/philips_js/light.py homeassistant/components/philips_js/light.py
homeassistant/components/philips_js/media_player.py homeassistant/components/philips_js/media_player.py
homeassistant/components/philips_js/remote.py homeassistant/components/philips_js/remote.py
@@ -867,9 +921,13 @@ omit =
homeassistant/components/plaato/entity.py homeassistant/components/plaato/entity.py
homeassistant/components/plaato/sensor.py homeassistant/components/plaato/sensor.py
homeassistant/components/plex/media_player.py homeassistant/components/plex/media_player.py
homeassistant/components/plex/view.py
homeassistant/components/plum_lightpad/light.py homeassistant/components/plum_lightpad/light.py
homeassistant/components/pocketcasts/sensor.py homeassistant/components/pocketcasts/sensor.py
homeassistant/components/point/* homeassistant/components/point/__init__.py
homeassistant/components/point/alarm_control_panel.py
homeassistant/components/point/binary_sensor.py
homeassistant/components/point/sensor.py
homeassistant/components/poolsense/__init__.py homeassistant/components/poolsense/__init__.py
homeassistant/components/poolsense/sensor.py homeassistant/components/poolsense/sensor.py
homeassistant/components/poolsense/binary_sensor.py homeassistant/components/poolsense/binary_sensor.py
@@ -892,8 +950,15 @@ omit =
homeassistant/components/qrcode/image_processing.py homeassistant/components/qrcode/image_processing.py
homeassistant/components/quantum_gateway/device_tracker.py homeassistant/components/quantum_gateway/device_tracker.py
homeassistant/components/qvr_pro/* homeassistant/components/qvr_pro/*
homeassistant/components/rachio/* homeassistant/components/rachio/__init__.py
homeassistant/components/rachio/binary_sensor.py
homeassistant/components/rachio/device.py
homeassistant/components/rachio/entity.py
homeassistant/components/rachio/switch.py
homeassistant/components/rachio/webhooks.py
homeassistant/components/radarr/sensor.py homeassistant/components/radarr/sensor.py
homeassistant/components/radio_browser/__init__.py
homeassistant/components/radio_browser/media_source.py
homeassistant/components/radiotherm/climate.py homeassistant/components/radiotherm/climate.py
homeassistant/components/rainbird/* homeassistant/components/rainbird/*
homeassistant/components/raincloud/* homeassistant/components/raincloud/*
@@ -948,7 +1013,6 @@ omit =
homeassistant/components/saj/sensor.py homeassistant/components/saj/sensor.py
homeassistant/components/satel_integra/* homeassistant/components/satel_integra/*
homeassistant/components/schluter/* homeassistant/components/schluter/*
homeassistant/components/scrape/sensor.py
homeassistant/components/screenlogic/__init__.py homeassistant/components/screenlogic/__init__.py
homeassistant/components/screenlogic/binary_sensor.py homeassistant/components/screenlogic/binary_sensor.py
homeassistant/components/screenlogic/climate.py homeassistant/components/screenlogic/climate.py
@@ -973,6 +1037,9 @@ omit =
homeassistant/components/senseme/switch.py homeassistant/components/senseme/switch.py
homeassistant/components/sensibo/__init__.py homeassistant/components/sensibo/__init__.py
homeassistant/components/sensibo/climate.py homeassistant/components/sensibo/climate.py
homeassistant/components/sensibo/coordinator.py
homeassistant/components/sensibo/diagnostics.py
homeassistant/components/sensibo/number.py
homeassistant/components/serial/sensor.py homeassistant/components/serial/sensor.py
homeassistant/components/serial_pm/sensor.py homeassistant/components/serial_pm/sensor.py
homeassistant/components/sesame/lock.py homeassistant/components/sesame/lock.py
@@ -985,6 +1052,7 @@ omit =
homeassistant/components/shelly/climate.py homeassistant/components/shelly/climate.py
homeassistant/components/shelly/entity.py homeassistant/components/shelly/entity.py
homeassistant/components/shelly/light.py homeassistant/components/shelly/light.py
homeassistant/components/shelly/number.py
homeassistant/components/shelly/sensor.py homeassistant/components/shelly/sensor.py
homeassistant/components/shelly/utils.py homeassistant/components/shelly/utils.py
homeassistant/components/sht31/sensor.py homeassistant/components/sht31/sensor.py
@@ -1021,7 +1089,11 @@ omit =
homeassistant/components/smarthab/__init__.py homeassistant/components/smarthab/__init__.py
homeassistant/components/smarthab/cover.py homeassistant/components/smarthab/cover.py
homeassistant/components/smarthab/light.py homeassistant/components/smarthab/light.py
homeassistant/components/sms/* homeassistant/components/sms/__init__.py
homeassistant/components/sms/const.py
homeassistant/components/sms/gateway.py
homeassistant/components/sms/notify.py
homeassistant/components/sms/sensor.py
homeassistant/components/smtp/notify.py homeassistant/components/smtp/notify.py
homeassistant/components/snapcast/* homeassistant/components/snapcast/*
homeassistant/components/snmp/* homeassistant/components/snmp/*
@@ -1030,7 +1102,8 @@ omit =
homeassistant/components/solaredge/coordinator.py homeassistant/components/solaredge/coordinator.py
homeassistant/components/solaredge/sensor.py homeassistant/components/solaredge/sensor.py
homeassistant/components/solaredge_local/sensor.py homeassistant/components/solaredge_local/sensor.py
homeassistant/components/solarlog/* homeassistant/components/solarlog/__init__.py
homeassistant/components/solarlog/sensor.py
homeassistant/components/solax/__init__.py homeassistant/components/solax/__init__.py
homeassistant/components/solax/sensor.py homeassistant/components/solax/sensor.py
homeassistant/components/soma/__init__.py homeassistant/components/soma/__init__.py
@@ -1052,21 +1125,34 @@ omit =
homeassistant/components/sonos/favorites.py homeassistant/components/sonos/favorites.py
homeassistant/components/sonos/helpers.py homeassistant/components/sonos/helpers.py
homeassistant/components/sonos/household_coordinator.py homeassistant/components/sonos/household_coordinator.py
homeassistant/components/sonos/media.py
homeassistant/components/sonos/media_browser.py homeassistant/components/sonos/media_browser.py
homeassistant/components/sonos/media_player.py homeassistant/components/sonos/media_player.py
homeassistant/components/sonos/speaker.py homeassistant/components/sonos/speaker.py
homeassistant/components/sonos/switch.py homeassistant/components/sonos/switch.py
homeassistant/components/sony_projector/switch.py homeassistant/components/sony_projector/switch.py
homeassistant/components/spc/* homeassistant/components/spc/*
homeassistant/components/spider/* homeassistant/components/spider/__init__.py
homeassistant/components/spider/climate.py
homeassistant/components/spider/sensor.py
homeassistant/components/spider/switch.py
homeassistant/components/splunk/* homeassistant/components/splunk/*
homeassistant/components/spotify/__init__.py homeassistant/components/spotify/__init__.py
homeassistant/components/spotify/browse_media.py
homeassistant/components/spotify/media_player.py homeassistant/components/spotify/media_player.py
homeassistant/components/spotify/system_health.py homeassistant/components/spotify/system_health.py
homeassistant/components/spotify/util.py
homeassistant/components/squeezebox/__init__.py homeassistant/components/squeezebox/__init__.py
homeassistant/components/squeezebox/browse_media.py homeassistant/components/squeezebox/browse_media.py
homeassistant/components/squeezebox/media_player.py homeassistant/components/squeezebox/media_player.py
homeassistant/components/starline/* homeassistant/components/starline/__init__.py
homeassistant/components/starline/account.py
homeassistant/components/starline/binary_sensor.py
homeassistant/components/starline/device_tracker.py
homeassistant/components/starline/entity.py
homeassistant/components/starline/lock.py
homeassistant/components/starline/sensor.py
homeassistant/components/starline/switch.py
homeassistant/components/starlingbank/sensor.py homeassistant/components/starlingbank/sensor.py
homeassistant/components/steam_online/sensor.py homeassistant/components/steam_online/sensor.py
homeassistant/components/stiebel_eltron/* homeassistant/components/stiebel_eltron/*
@@ -1116,7 +1202,12 @@ omit =
homeassistant/components/system_bridge/coordinator.py homeassistant/components/system_bridge/coordinator.py
homeassistant/components/system_bridge/sensor.py homeassistant/components/system_bridge/sensor.py
homeassistant/components/systemmonitor/sensor.py homeassistant/components/systemmonitor/sensor.py
homeassistant/components/tado/* homeassistant/components/tado/__init__.py
homeassistant/components/tado/binary_sensor.py
homeassistant/components/tado/climate.py
homeassistant/components/tado/device_tracker.py
homeassistant/components/tado/sensor.py
homeassistant/components/tado/water_heater.py
homeassistant/components/tank_utility/sensor.py homeassistant/components/tank_utility/sensor.py
homeassistant/components/tankerkoenig/* homeassistant/components/tankerkoenig/*
homeassistant/components/tapsaff/binary_sensor.py homeassistant/components/tapsaff/binary_sensor.py
@@ -1160,6 +1251,7 @@ omit =
homeassistant/components/tolo/climate.py homeassistant/components/tolo/climate.py
homeassistant/components/tolo/fan.py homeassistant/components/tolo/fan.py
homeassistant/components/tolo/light.py homeassistant/components/tolo/light.py
homeassistant/components/tolo/number.py
homeassistant/components/tolo/select.py homeassistant/components/tolo/select.py
homeassistant/components/tolo/sensor.py homeassistant/components/tolo/sensor.py
homeassistant/components/tomato/device_tracker.py homeassistant/components/tomato/device_tracker.py
@@ -1189,7 +1281,7 @@ omit =
homeassistant/components/tractive/switch.py homeassistant/components/tractive/switch.py
homeassistant/components/tradfri/__init__.py homeassistant/components/tradfri/__init__.py
homeassistant/components/tradfri/base_class.py homeassistant/components/tradfri/base_class.py
homeassistant/components/tradfri/config_flow.py homeassistant/components/tradfri/coordinator.py
homeassistant/components/tradfri/cover.py homeassistant/components/tradfri/cover.py
homeassistant/components/tradfri/fan.py homeassistant/components/tradfri/fan.py
homeassistant/components/tradfri/light.py homeassistant/components/tradfri/light.py
@@ -1237,7 +1329,9 @@ omit =
homeassistant/components/upcloud/__init__.py homeassistant/components/upcloud/__init__.py
homeassistant/components/upcloud/binary_sensor.py homeassistant/components/upcloud/binary_sensor.py
homeassistant/components/upcloud/switch.py homeassistant/components/upcloud/switch.py
homeassistant/components/upnp/* homeassistant/components/upnp/__init__.py
homeassistant/components/upnp/device.py
homeassistant/components/upnp/sensor.py
homeassistant/components/upc_connect/* homeassistant/components/upc_connect/*
homeassistant/components/uscis/sensor.py homeassistant/components/uscis/sensor.py
homeassistant/components/vallox/__init__.py homeassistant/components/vallox/__init__.py
@@ -1251,6 +1345,7 @@ omit =
homeassistant/components/velbus/climate.py homeassistant/components/velbus/climate.py
homeassistant/components/velbus/const.py homeassistant/components/velbus/const.py
homeassistant/components/velbus/cover.py homeassistant/components/velbus/cover.py
homeassistant/components/velbus/diagnostics.py
homeassistant/components/velbus/light.py homeassistant/components/velbus/light.py
homeassistant/components/velbus/sensor.py homeassistant/components/velbus/sensor.py
homeassistant/components/velbus/switch.py homeassistant/components/velbus/switch.py
@@ -1303,10 +1398,10 @@ omit =
homeassistant/components/watson_tts/tts.py homeassistant/components/watson_tts/tts.py
homeassistant/components/watttime/__init__.py homeassistant/components/watttime/__init__.py
homeassistant/components/watttime/sensor.py homeassistant/components/watttime/sensor.py
homeassistant/components/waze_travel_time/__init__.py homeassistant/components/wiffi/__init__.py
homeassistant/components/waze_travel_time/helpers.py homeassistant/components/wiffi/binary_sensor.py
homeassistant/components/waze_travel_time/sensor.py homeassistant/components/wiffi/sensor.py
homeassistant/components/wiffi/* homeassistant/components/wiffi/wiffi_strings.py
homeassistant/components/wirelesstag/* homeassistant/components/wirelesstag/*
homeassistant/components/wolflink/__init__.py homeassistant/components/wolflink/__init__.py
homeassistant/components/wolflink/sensor.py homeassistant/components/wolflink/sensor.py
@@ -1357,6 +1452,7 @@ omit =
homeassistant/components/yale_smart_alarm/binary_sensor.py homeassistant/components/yale_smart_alarm/binary_sensor.py
homeassistant/components/yale_smart_alarm/const.py homeassistant/components/yale_smart_alarm/const.py
homeassistant/components/yale_smart_alarm/coordinator.py homeassistant/components/yale_smart_alarm/coordinator.py
homeassistant/components/yale_smart_alarm/diagnostics.py
homeassistant/components/yale_smart_alarm/entity.py homeassistant/components/yale_smart_alarm/entity.py
homeassistant/components/yale_smart_alarm/lock.py homeassistant/components/yale_smart_alarm/lock.py
homeassistant/components/yamaha_musiccast/__init__.py homeassistant/components/yamaha_musiccast/__init__.py
@@ -1396,6 +1492,16 @@ omit =
homeassistant/components/zwave/util.py homeassistant/components/zwave/util.py
homeassistant/components/zwave_js/discovery.py homeassistant/components/zwave_js/discovery.py
homeassistant/components/zwave_js/sensor.py homeassistant/components/zwave_js/sensor.py
homeassistant/components/zwave_me/__init__.py
homeassistant/components/zwave_me/binary_sensor.py
homeassistant/components/zwave_me/button.py
homeassistant/components/zwave_me/climate.py
homeassistant/components/zwave_me/helpers.py
homeassistant/components/zwave_me/light.py
homeassistant/components/zwave_me/lock.py
homeassistant/components/zwave_me/number.py
homeassistant/components/zwave_me/sensor.py
homeassistant/components/zwave_me/switch.py
[report] [report]
# Regexes for lines to exclude from consideration # Regexes for lines to exclude from consideration

View File

@@ -75,6 +75,17 @@ body:
attributes: attributes:
value: | value: |
# Details # Details
- type: textarea
attributes:
label: Diagnostics information
description: >-
Many integrations provide the ability to download diagnostic data
on the device page (and on the integration dashboard).
**It would really help if you could download the diagnostics data for the device you are having issues with,
and drag-and-drop that file into the textbox below.**
It generally allows pinpointing defects and thus resolving issues faster.
- type: textarea - type: textarea
attributes: attributes:
label: Example YAML snippet label: Example YAML snippet

View File

@@ -29,7 +29,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -57,6 +57,7 @@ jobs:
uses: home-assistant/actions/helpers/codenotary@master uses: home-assistant/actions/helpers/codenotary@master
with: with:
source: file://${{ github.workspace }}/OFFICIAL_IMAGE source: file://${{ github.workspace }}/OFFICIAL_IMAGE
asset: OFFICIAL_IMAGE-${{ steps.version.outputs.version }}
token: ${{ secrets.CAS_TOKEN }} token: ${{ secrets.CAS_TOKEN }}
build_python: build_python:
@@ -69,7 +70,7 @@ jobs:
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -103,7 +104,7 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.channel == 'dev' if: needs.init.outputs.channel == 'dev'
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -112,9 +113,8 @@ jobs:
shell: bash shell: bash
run: | run: |
python3 -m pip install packaging python3 -m pip install packaging
python3 -m pip install . python3 -m pip install --use-deprecated=legacy-resolver .
python3 script/version_bump.py nightly version="$(python3 script/version_bump.py nightly)"
version="$(python setup.py -V)"
- name: Write meta info file - name: Write meta info file
shell: bash shell: bash
@@ -122,20 +122,20 @@ jobs:
echo "${{ github.sha }};${{ github.ref }};${{ github.event_name }};${{ github.actor }}" > rootfs/OFFICIAL_IMAGE echo "${{ github.sha }};${{ github.ref }};${{ github.event_name }};${{ github.actor }}" > rootfs/OFFICIAL_IMAGE
- name: Login to DockerHub - name: Login to DockerHub
uses: docker/login-action@v1.12.0 uses: docker/login-action@v1.14.1
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@v1.12.0 uses: docker/login-action@v1.14.1
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image - name: Build base image
uses: home-assistant/builder@2021.12.0 uses: home-assistant/builder@2022.01.0
with: with:
args: | args: |
$BUILD_ARGS \ $BUILD_ARGS \
@@ -187,20 +187,20 @@ jobs:
fi fi
- name: Login to DockerHub - name: Login to DockerHub
uses: docker/login-action@v1.12.0 uses: docker/login-action@v1.14.1
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@v1.12.0 uses: docker/login-action@v1.14.1
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image - name: Build base image
uses: home-assistant/builder@2021.12.0 uses: home-assistant/builder@2022.01.0
with: with:
args: | args: |
$BUILD_ARGS \ $BUILD_ARGS \
@@ -243,22 +243,30 @@ jobs:
channel: beta channel: beta
publish_container: publish_container:
name: Publish meta container name: Publish meta container for ${{ matrix.registry }}
if: github.repository_owner == 'home-assistant' if: github.repository_owner == 'home-assistant'
needs: ["init", "build_base"] needs: ["init", "build_base"]
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
registry:
- "ghcr.io/home-assistant"
- "homeassistant"
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Login to DockerHub - name: Login to DockerHub
uses: docker/login-action@v1.12.0 if: matrix.registry == 'homeassistant'
uses: docker/login-action@v1.14.1
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@v1.12.0 if: matrix.registry == 'ghcr.io/home-assistant'
uses: docker/login-action@v1.14.1
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
@@ -273,38 +281,37 @@ jobs:
export DOCKER_CLI_EXPERIMENTAL=enabled export DOCKER_CLI_EXPERIMENTAL=enabled
function create_manifest() { function create_manifest() {
local docker_reg=${1} local tag_l=${1}
local tag_l=${2} local tag_r=${2}
local tag_r=${3}
docker manifest create "${docker_reg}/home-assistant:${tag_l}" \ docker manifest create "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/amd64-homeassistant:${tag_r}" \ "${{ matrix.registry }}/amd64-homeassistant:${tag_r}" \
"${docker_reg}/i386-homeassistant:${tag_r}" \ "${{ matrix.registry }}/i386-homeassistant:${tag_r}" \
"${docker_reg}/armhf-homeassistant:${tag_r}" \ "${{ matrix.registry }}/armhf-homeassistant:${tag_r}" \
"${docker_reg}/armv7-homeassistant:${tag_r}" \ "${{ matrix.registry }}/armv7-homeassistant:${tag_r}" \
"${docker_reg}/aarch64-homeassistant:${tag_r}" "${{ matrix.registry }}/aarch64-homeassistant:${tag_r}"
docker manifest annotate "${docker_reg}/home-assistant:${tag_l}" \ docker manifest annotate "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/amd64-homeassistant:${tag_r}" \ "${{ matrix.registry }}/amd64-homeassistant:${tag_r}" \
--os linux --arch amd64 --os linux --arch amd64
docker manifest annotate "${docker_reg}/home-assistant:${tag_l}" \ docker manifest annotate "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/i386-homeassistant:${tag_r}" \ "${{ matrix.registry }}/i386-homeassistant:${tag_r}" \
--os linux --arch 386 --os linux --arch 386
docker manifest annotate "${docker_reg}/home-assistant:${tag_l}" \ docker manifest annotate "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/armhf-homeassistant:${tag_r}" \ "${{ matrix.registry }}/armhf-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v6 --os linux --arch arm --variant=v6
docker manifest annotate "${docker_reg}/home-assistant:${tag_l}" \ docker manifest annotate "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/armv7-homeassistant:${tag_r}" \ "${{ matrix.registry }}/armv7-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v7 --os linux --arch arm --variant=v7
docker manifest annotate "${docker_reg}/home-assistant:${tag_l}" \ docker manifest annotate "${{ matrix.registry }}/home-assistant:${tag_l}" \
"${docker_reg}/aarch64-homeassistant:${tag_r}" \ "${{ matrix.registry }}/aarch64-homeassistant:${tag_r}" \
--os linux --arch arm64 --variant=v8 --os linux --arch arm64 --variant=v8
docker manifest push --purge "${docker_reg}/home-assistant:${tag_l}" docker manifest push --purge "${{ matrix.registry }}/home-assistant:${tag_l}"
} }
function validate_image() { function validate_image() {
@@ -315,36 +322,34 @@ jobs:
fi fi
} }
for docker_reg in "homeassistant" "ghcr.io/home-assistant"; do docker pull "${{ matrix.registry }}/amd64-homeassistant:${{ needs.init.outputs.version }}"
docker pull "${docker_reg}/amd64-homeassistant:${{ needs.init.outputs.version }}" docker pull "${{ matrix.registry }}/i386-homeassistant:${{ needs.init.outputs.version }}"
docker pull "${docker_reg}/i386-homeassistant:${{ needs.init.outputs.version }}" docker pull "${{ matrix.registry }}/armhf-homeassistant:${{ needs.init.outputs.version }}"
docker pull "${docker_reg}/armhf-homeassistant:${{ needs.init.outputs.version }}" docker pull "${{ matrix.registry }}/armv7-homeassistant:${{ needs.init.outputs.version }}"
docker pull "${docker_reg}/armv7-homeassistant:${{ needs.init.outputs.version }}" docker pull "${{ matrix.registry }}/aarch64-homeassistant:${{ needs.init.outputs.version }}"
docker pull "${docker_reg}/aarch64-homeassistant:${{ needs.init.outputs.version }}"
validate_image "${docker_reg}/amd64-homeassistant:${{ needs.init.outputs.version }}" validate_image "${{ matrix.registry }}/amd64-homeassistant:${{ needs.init.outputs.version }}"
validate_image "${docker_reg}/i386-homeassistant:${{ needs.init.outputs.version }}" validate_image "${{ matrix.registry }}/i386-homeassistant:${{ needs.init.outputs.version }}"
validate_image "${docker_reg}/armhf-homeassistant:${{ needs.init.outputs.version }}" validate_image "${{ matrix.registry }}/armhf-homeassistant:${{ needs.init.outputs.version }}"
validate_image "${docker_reg}/armv7-homeassistant:${{ needs.init.outputs.version }}" validate_image "${{ matrix.registry }}/armv7-homeassistant:${{ needs.init.outputs.version }}"
validate_image "${docker_reg}/aarch64-homeassistant:${{ needs.init.outputs.version }}" validate_image "${{ matrix.registry }}/aarch64-homeassistant:${{ needs.init.outputs.version }}"
# Create version tag # Create version tag
create_manifest "${docker_reg}" "${{ needs.init.outputs.version }}" "${{ needs.init.outputs.version }}" create_manifest "${{ needs.init.outputs.version }}" "${{ needs.init.outputs.version }}"
# Create general tags # Create general tags
if [[ "${{ needs.init.outputs.version }}" =~ d ]]; then if [[ "${{ needs.init.outputs.version }}" =~ d ]]; then
create_manifest "${docker_reg}" "dev" "${{ needs.init.outputs.version }}" create_manifest"dev" "${{ needs.init.outputs.version }}"
elif [[ "${{ needs.init.outputs.version }}" =~ b ]]; then elif [[ "${{ needs.init.outputs.version }}" =~ b ]]; then
create_manifest "${docker_reg}" "beta" "${{ needs.init.outputs.version }}" create_manifest "beta" "${{ needs.init.outputs.version }}"
create_manifest "${docker_reg}" "rc" "${{ needs.init.outputs.version }}" create_manifest "rc" "${{ needs.init.outputs.version }}"
else else
create_manifest "${docker_reg}" "stable" "${{ needs.init.outputs.version }}" create_manifest "stable" "${{ needs.init.outputs.version }}"
create_manifest "${docker_reg}" "latest" "${{ needs.init.outputs.version }}" create_manifest "latest" "${{ needs.init.outputs.version }}"
create_manifest "${docker_reg}" "beta" "${{ needs.init.outputs.version }}" create_manifest "beta" "${{ needs.init.outputs.version }}"
create_manifest "${docker_reg}" "rc" "${{ needs.init.outputs.version }}" create_manifest "rc" "${{ needs.init.outputs.version }}"
# Create series version tag (e.g. 2021.6) # Create series version tag (e.g. 2021.6)
v="${{ needs.init.outputs.version }}" v="${{ needs.init.outputs.version }}"
create_manifest "${docker_reg}" "${v%.*}" "${{ needs.init.outputs.version }}" create_manifest "${v%.*}" "${{ needs.init.outputs.version }}"
fi fi
done

View File

@@ -8,10 +8,21 @@ on:
- rc - rc
- master - master
pull_request: ~ pull_request: ~
workflow_dispatch:
inputs:
full:
description: 'Full run (regardless of changes)'
default: false
type: boolean
lint-only:
description: 'Skip pytest'
default: false
type: boolean
env: env:
CACHE_VERSION: 5 CACHE_VERSION: 9
PIP_CACHE_VERSION: 1 PIP_CACHE_VERSION: 3
HA_SHORT_VERSION: 2022.3
DEFAULT_PYTHON: 3.9 DEFAULT_PYTHON: 3.9
PRE_COMMIT_CACHE: ~/.cache/pre-commit PRE_COMMIT_CACHE: ~/.cache/pre-commit
PIP_CACHE: /tmp/pip-cache PIP_CACHE: /tmp/pip-cache
@@ -107,7 +118,8 @@ jobs:
if [[ "${{ github.ref }}" == "refs/heads/dev" ]] \ if [[ "${{ github.ref }}" == "refs/heads/dev" ]] \
|| [[ "${{ github.ref }}" == "refs/heads/master" ]] \ || [[ "${{ github.ref }}" == "refs/heads/master" ]] \
|| [[ "${{ github.ref }}" == "refs/heads/rc" ]] \ || [[ "${{ github.ref }}" == "refs/heads/rc" ]] \
|| [[ "${{ steps.core.outputs.any }}" == "true" ]]; || [[ "${{ steps.core.outputs.any }}" == "true" ]] \
|| [[ "${{ github.event.inputs.full }}" == "true" ]];
then then
test_groups="[1, 2, 3, 4, 5, 6]" test_groups="[1, 2, 3, 4, 5, 6]"
test_group_count=6 test_group_count=6
@@ -142,7 +154,7 @@ jobs:
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python id: python
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
- name: Generate partial Python venv restore key - name: Generate partial Python venv restore key
@@ -155,8 +167,8 @@ jobs:
- name: Generate partial pip restore key - name: Generate partial pip restore key
id: generate-pip-key id: generate-pip-key
run: >- run: >-
echo "::set-output name=key::base-pip-${{ env.PIP_CACHE_VERSION }}-$( echo "::set-output name=key::base-pip-${{ env.PIP_CACHE_VERSION }}-${{
date -u '+%Y-%m-%dT%H:%M:%s')" env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')"
- name: Restore base Python virtual environment - name: Restore base Python virtual environment
id: cache-venv id: cache-venv
uses: actions/cache@v2.1.7 uses: actions/cache@v2.1.7
@@ -183,15 +195,15 @@ jobs:
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-pip-key.outputs.key }} steps.generate-pip-key.outputs.key }}
restore-keys: | restore-keys: |
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-pip-${{ env.PIP_CACHE_VERSION }}- ${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-pip-${{ env.PIP_CACHE_VERSION }}-${{ env.HA_SHORT_VERSION }}-
- name: Create Python virtual environment - name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true' if: steps.cache-venv.outputs.cache-hit != 'true'
run: | run: |
python -m venv venv python -m venv venv
. venv/bin/activate . venv/bin/activate
python --version python --version
pip install --cache-dir=$PIP_CACHE -U "pip<20.3" setuptools wheel pip install --cache-dir=$PIP_CACHE -U "pip>=21.0,<22.1" setuptools wheel
pip install --cache-dir=$PIP_CACHE -r requirements.txt -r requirements_test.txt pip install --cache-dir=$PIP_CACHE -r requirements.txt -r requirements_test.txt --use-deprecated=legacy-resolver
- name: Generate partial pre-commit restore key - name: Generate partial pre-commit restore key
id: generate-pre-commit-key id: generate-pre-commit-key
run: >- run: >-
@@ -222,7 +234,7 @@ jobs:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
id: python id: python
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -272,7 +284,7 @@ jobs:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
id: python id: python
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -323,7 +335,7 @@ jobs:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
id: python id: python
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -365,7 +377,7 @@ jobs:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
id: python id: python
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -499,7 +511,7 @@ jobs:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
id: python id: python
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -523,10 +535,10 @@ jobs:
prepare-tests: prepare-tests:
name: Prepare tests for Python ${{ matrix.python-version }} name: Prepare tests for Python ${{ matrix.python-version }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 30 timeout-minutes: 60
strategy: strategy:
matrix: matrix:
python-version: [3.9] python-version: ["3.9", "3.10"]
outputs: outputs:
python-key: ${{ steps.generate-python-key.outputs.key }} python-key: ${{ steps.generate-python-key.outputs.key }}
container: homeassistant/ci-azure:${{ matrix.python-version }} container: homeassistant/ci-azure:${{ matrix.python-version }}
@@ -543,8 +555,8 @@ jobs:
- name: Generate partial pip restore key - name: Generate partial pip restore key
id: generate-pip-key id: generate-pip-key
run: >- run: >-
echo "::set-output name=key::pip-${{ env.PIP_CACHE_VERSION }}-$( echo "::set-output name=key::pip-${{ env.PIP_CACHE_VERSION }}-${{
date -u '+%Y-%m-%dT%H:%M:%s')" env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')"
- name: Restore full Python ${{ matrix.python-version }} virtual environment - name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv id: cache-venv
uses: actions/cache@v2.1.7 uses: actions/cache@v2.1.7
@@ -571,7 +583,7 @@ jobs:
${{ runner.os }}-${{ matrix.python-version }}-${{ ${{ runner.os }}-${{ matrix.python-version }}-${{
steps.generate-pip-key.outputs.key }} steps.generate-pip-key.outputs.key }}
restore-keys: | restore-keys: |
${{ runner.os }}-${{ matrix.python-version }}-pip-${{ env.PIP_CACHE_VERSION }}- ${{ runner.os }}-${{ matrix.python-version }}-pip-${{ env.PIP_CACHE_VERSION }}-${{ env.HA_SHORT_VERSION }}-
- name: Create full Python ${{ matrix.python-version }} virtual environment - name: Create full Python ${{ matrix.python-version }} virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true' if: steps.cache-venv.outputs.cache-hit != 'true'
run: | run: |
@@ -582,9 +594,9 @@ jobs:
python -m venv venv python -m venv venv
. venv/bin/activate . venv/bin/activate
python --version python --version
pip install --cache-dir=$PIP_CACHE -U "pip<20.3" setuptools wheel pip install --cache-dir=$PIP_CACHE -U "pip>=21.0,<22.1" setuptools wheel
pip install --cache-dir=$PIP_CACHE -r requirements_all.txt pip install --cache-dir=$PIP_CACHE -r requirements_all.txt --use-deprecated=legacy-resolver
pip install --cache-dir=$PIP_CACHE -r requirements_test.txt pip install --cache-dir=$PIP_CACHE -r requirements_test.txt --use-deprecated=legacy-resolver
pip install -e . pip install -e .
pylint: pylint:
@@ -706,7 +718,10 @@ jobs:
pytest: pytest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: needs.changes.outputs.test_full_suite == 'true' || needs.changes.outputs.tests_glob if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& (needs.changes.outputs.test_full_suite == 'true' || needs.changes.outputs.tests_glob)
needs: needs:
- changes - changes
- gen-requirements-all - gen-requirements-all
@@ -720,7 +735,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
group: ${{ fromJson(needs.changes.outputs.test_groups) }} group: ${{ fromJson(needs.changes.outputs.test_groups) }}
python-version: [3.9] python-version: ["3.9", "3.10"]
name: >- name: >-
Run tests Python ${{ matrix.python-version }} (${{ matrix.group }}) Run tests Python ${{ matrix.python-version }} (${{ matrix.group }})
container: homeassistant/ci-azure:${{ matrix.python-version }} container: homeassistant/ci-azure:${{ matrix.python-version }}

View File

@@ -24,7 +24,7 @@ jobs:
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
@@ -43,7 +43,7 @@ jobs:
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2.4.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.3.1 uses: actions/setup-python@v2.3.2
with: with:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}

View File

@@ -44,7 +44,7 @@ jobs:
echo "GRPC_PYTHON_BUILD_WITH_CYTHON=true" echo "GRPC_PYTHON_BUILD_WITH_CYTHON=true"
echo "GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY=true" echo "GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY=true"
# GRPC on armv7 needs -lexecinfo (issue #56669) since home assistant installs # GRPC on armv7 needs -lexecinfo (issue #56669) since home assistant installs
# execinfo-dev when building wheels. The setup.py does not have an option for # execinfo-dev when building wheels. The setuptools build setup does not have an option for
# adding a single LDFLAG so copy all relevant linux flags here (as of 1.43.0) # adding a single LDFLAG so copy all relevant linux flags here (as of 1.43.0)
echo "GRPC_PYTHON_LDFLAGS=-lpthread -Wl,-wrap,memcpy -static-libgcc -lexecinfo" echo "GRPC_PYTHON_LDFLAGS=-lpthread -Wl,-wrap,memcpy -static-libgcc -lexecinfo"
) > .env_file ) > .env_file
@@ -154,6 +154,7 @@ jobs:
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file} sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
sed -i "s|# bme680|bme680|g" ${requirement_file} sed -i "s|# bme680|bme680|g" ${requirement_file}
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file} sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
sed -i "s|# homeassistant-pyozw|homeassistant-pyozw|g" ${requirement_file}
done done
- name: Build wheels - name: Build wheels

View File

@@ -5,7 +5,7 @@ repos:
- id: pyupgrade - id: pyupgrade
args: [--py39-plus] args: [--py39-plus]
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.12b0 rev: 22.1.0
hooks: hooks:
- id: black - id: black
args: args:
@@ -17,7 +17,7 @@ repos:
hooks: hooks:
- id: codespell - id: codespell
args: args:
- --ignore-words-list=hass,alot,datas,dof,dur,ether,farenheit,hist,iff,iif,ines,ist,lightsensor,mut,nd,pres,referer,rime,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing,iam,incomfort,ba,haa - --ignore-words-list=hass,alot,datas,dof,dur,ether,farenheit,hist,iff,iif,ines,ist,lightsensor,mut,nd,pres,referer,rime,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing,iam,incomfort,ba,haa,pullrequests
- --skip="./.*,*.csv,*.json" - --skip="./.*,*.csv,*.json"
- --quiet-level=2 - --quiet-level=2
exclude_types: [csv, json] exclude_types: [csv, json]
@@ -78,7 +78,7 @@ repos:
- id: python-typing-update - id: python-typing-update
stages: [manual] stages: [manual]
args: args:
- --py38-plus - --py39-plus
- --force - --force
- --keep-updates - --keep-updates
files: ^(homeassistant|tests|script)/.+\.py$ files: ^(homeassistant|tests|script)/.+\.py$
@@ -114,11 +114,18 @@ repos:
pass_filenames: false pass_filenames: false
language: script language: script
types: [text] types: [text]
files: ^(homeassistant/.+/(manifest|strings)\.json|\.coveragerc|\.strict-typing|homeassistant/.+/services\.yaml|script/hassfest/.+\.py)$ files: ^(homeassistant/.+/(manifest|strings)\.json|\.coveragerc|homeassistant/.+/services\.yaml|script/hassfest/(?!metadata|mypy_config).+\.py)$
- id: hassfest-metadata - id: hassfest-metadata
name: hassfest-metadata name: hassfest-metadata
entry: script/run-in-env.sh python3 -m script.hassfest -p metadata entry: script/run-in-env.sh python3 -m script.hassfest -p metadata
pass_filenames: false pass_filenames: false
language: script language: script
types: [text] types: [text]
files: ^(script/hassfest/.+\.py|homeassistant/const\.py$|setup\.cfg)$ files: ^(script/hassfest/metadata\.py|homeassistant/const\.py$|setup\.cfg)$
- id: hassfest-mypy-config
name: hassfest-mypy-config
entry: script/run-in-env.sh python3 -m script.hassfest -p mypy_config
pass_filenames: false
language: script
types: [text]
files: ^(script/hassfest/mypy_config\.py|\.strict-typing|mypy\.ini)$

View File

@@ -1,10 +1,14 @@
# .readthedocs.yml # .readthedocs.yml
version: 2
build: build:
image: latest os: ubuntu-20.04
tools:
python: "3.9"
python: python:
version: 3.8 install:
setup_py_install: true - method: setuptools
path: .
requirements_file: requirements_docs.txt - requirements: requirements_docs.txt

View File

@@ -20,7 +20,9 @@ homeassistant.helpers.entity_values
homeassistant.helpers.reload homeassistant.helpers.reload
homeassistant.helpers.script_variables homeassistant.helpers.script_variables
homeassistant.helpers.translation homeassistant.helpers.translation
homeassistant.util.async_
homeassistant.util.color homeassistant.util.color
homeassistant.util.decorator
homeassistant.util.process homeassistant.util.process
homeassistant.util.unit_system homeassistant.util.unit_system
@@ -57,6 +59,11 @@ homeassistant.components.canary.*
homeassistant.components.cover.* homeassistant.components.cover.*
homeassistant.components.crownstone.* homeassistant.components.crownstone.*
homeassistant.components.cpuspeed.* homeassistant.components.cpuspeed.*
homeassistant.components.deconz
homeassistant.components.deconz.config_flow
homeassistant.components.deconz.diagnostics
homeassistant.components.deconz.gateway
homeassistant.components.deconz.services
homeassistant.components.device_automation.* homeassistant.components.device_automation.*
homeassistant.components.device_tracker.* homeassistant.components.device_tracker.*
homeassistant.components.devolo_home_control.* homeassistant.components.devolo_home_control.*
@@ -87,6 +94,14 @@ homeassistant.components.group.*
homeassistant.components.guardian.* homeassistant.components.guardian.*
homeassistant.components.history.* homeassistant.components.history.*
homeassistant.components.homeassistant.triggers.event homeassistant.components.homeassistant.triggers.event
homeassistant.components.homekit_controller
homeassistant.components.homekit_controller.alarm_control_panel
homeassistant.components.homekit_controller.button
homeassistant.components.homekit_controller.const
homeassistant.components.homekit_controller.lock
homeassistant.components.homekit_controller.select
homeassistant.components.homekit_controller.storage
homeassistant.components.homekit_controller.utils
homeassistant.components.homewizard.* homeassistant.components.homewizard.*
homeassistant.components.http.* homeassistant.components.http.*
homeassistant.components.huawei_lte.* homeassistant.components.huawei_lte.*
@@ -95,6 +110,7 @@ homeassistant.components.image_processing.*
homeassistant.components.input_button.* homeassistant.components.input_button.*
homeassistant.components.input_select.* homeassistant.components.input_select.*
homeassistant.components.integration.* homeassistant.components.integration.*
homeassistant.components.isy994.*
homeassistant.components.iqvia.* homeassistant.components.iqvia.*
homeassistant.components.jellyfin.* homeassistant.components.jellyfin.*
homeassistant.components.jewish_calendar.* homeassistant.components.jewish_calendar.*
@@ -109,6 +125,7 @@ homeassistant.components.lookin.*
homeassistant.components.luftdaten.* homeassistant.components.luftdaten.*
homeassistant.components.mailbox.* homeassistant.components.mailbox.*
homeassistant.components.media_player.* homeassistant.components.media_player.*
homeassistant.components.mjpeg.*
homeassistant.components.modbus.* homeassistant.components.modbus.*
homeassistant.components.modem_callerid.* homeassistant.components.modem_callerid.*
homeassistant.components.media_source.* homeassistant.components.media_source.*
@@ -132,8 +149,10 @@ homeassistant.components.openuv.*
homeassistant.components.overkiz.* homeassistant.components.overkiz.*
homeassistant.components.persistent_notification.* homeassistant.components.persistent_notification.*
homeassistant.components.pi_hole.* homeassistant.components.pi_hole.*
homeassistant.components.powerwall.*
homeassistant.components.proximity.* homeassistant.components.proximity.*
homeassistant.components.pvoutput.* homeassistant.components.pvoutput.*
homeassistant.components.pure_energie.*
homeassistant.components.rainmachine.* homeassistant.components.rainmachine.*
homeassistant.components.rdw.* homeassistant.components.rdw.*
homeassistant.components.recollect_waste.* homeassistant.components.recollect_waste.*
@@ -144,6 +163,7 @@ homeassistant.components.remote.*
homeassistant.components.renault.* homeassistant.components.renault.*
homeassistant.components.ridwell.* homeassistant.components.ridwell.*
homeassistant.components.rituals_perfume_genie.* homeassistant.components.rituals_perfume_genie.*
homeassistant.components.roku.*
homeassistant.components.rpi_power.* homeassistant.components.rpi_power.*
homeassistant.components.rtsp_to_webrtc.* homeassistant.components.rtsp_to_webrtc.*
homeassistant.components.samsungtv.* homeassistant.components.samsungtv.*
@@ -154,8 +174,8 @@ homeassistant.components.senseme.*
homeassistant.components.shelly.* homeassistant.components.shelly.*
homeassistant.components.simplisafe.* homeassistant.components.simplisafe.*
homeassistant.components.slack.* homeassistant.components.slack.*
homeassistant.components.sleepiq.*
homeassistant.components.smhi.* homeassistant.components.smhi.*
homeassistant.components.sonos.media_player
homeassistant.components.ssdp.* homeassistant.components.ssdp.*
homeassistant.components.stookalert.* homeassistant.components.stookalert.*
homeassistant.components.statistics.* homeassistant.components.statistics.*
@@ -196,6 +216,7 @@ homeassistant.components.webostv.*
homeassistant.components.websocket_api.* homeassistant.components.websocket_api.*
homeassistant.components.wemo.* homeassistant.components.wemo.*
homeassistant.components.whois.* homeassistant.components.whois.*
homeassistant.components.wiz.*
homeassistant.components.zodiac.* homeassistant.components.zodiac.*
homeassistant.components.zeroconf.* homeassistant.components.zeroconf.*
homeassistant.components.zone.* homeassistant.components.zone.*

4
.vscode/tasks.json vendored
View File

@@ -88,7 +88,7 @@
{ {
"label": "Install all Requirements", "label": "Install all Requirements",
"type": "shell", "type": "shell",
"command": "pip3 install -r requirements_all.txt", "command": "pip3 install --use-deprecated=legacy-resolver -r requirements_all.txt",
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true "isDefault": true
@@ -102,7 +102,7 @@
{ {
"label": "Install all Test Requirements", "label": "Install all Test Requirements",
"type": "shell", "type": "shell",
"command": "pip3 install -r requirements_test_all.txt", "command": "pip3 install --use-deprecated=legacy-resolver -r requirements_test_all.txt",
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true "isDefault": true

View File

@@ -4,7 +4,7 @@
# https://github.com/blog/2392-introducing-code-owners # https://github.com/blog/2392-introducing-code-owners
# Home Assistant Core # Home Assistant Core
setup.py @home-assistant/core setup.cfg @home-assistant/core
homeassistant/*.py @home-assistant/core homeassistant/*.py @home-assistant/core
homeassistant/helpers/* @home-assistant/core homeassistant/helpers/* @home-assistant/core
homeassistant/util/* @home-assistant/core homeassistant/util/* @home-assistant/core
@@ -43,8 +43,6 @@ homeassistant/components/airtouch4/* @LonePurpleWolf
tests/components/airtouch4/* @LonePurpleWolf tests/components/airtouch4/* @LonePurpleWolf
homeassistant/components/airvisual/* @bachya homeassistant/components/airvisual/* @bachya
tests/components/airvisual/* @bachya tests/components/airvisual/* @bachya
homeassistant/components/alarmdecoder/* @ajschmidt8
tests/components/alarmdecoder/* @ajschmidt8
homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy
tests/components/alexa/* @home-assistant/cloud @ochlocracy tests/components/alexa/* @home-assistant/cloud @ochlocracy
homeassistant/components/almond/* @gcampax @balloob homeassistant/components/almond/* @gcampax @balloob
@@ -216,6 +214,8 @@ homeassistant/components/digital_ocean/* @fabaff
homeassistant/components/discogs/* @thibmaek homeassistant/components/discogs/* @thibmaek
homeassistant/components/dlna_dmr/* @StevenLooman @chishm homeassistant/components/dlna_dmr/* @StevenLooman @chishm
tests/components/dlna_dmr/* @StevenLooman @chishm tests/components/dlna_dmr/* @StevenLooman @chishm
homeassistant/components/dlna_dms/* @chishm
tests/components/dlna_dms/* @chishm
homeassistant/components/dnsip/* @gjohansson-ST homeassistant/components/dnsip/* @gjohansson-ST
tests/components/dnsip/* @gjohansson-ST tests/components/dnsip/* @gjohansson-ST
homeassistant/components/doorbird/* @oblogic7 @bdraco @flacjacket homeassistant/components/doorbird/* @oblogic7 @bdraco @flacjacket
@@ -288,6 +288,8 @@ homeassistant/components/fireservicerota/* @cyberjunky
tests/components/fireservicerota/* @cyberjunky tests/components/fireservicerota/* @cyberjunky
homeassistant/components/firmata/* @DaAwesomeP homeassistant/components/firmata/* @DaAwesomeP
tests/components/firmata/* @DaAwesomeP tests/components/firmata/* @DaAwesomeP
homeassistant/components/fivem/* @Sander0542
tests/components/fivem/* @Sander0542
homeassistant/components/fixer/* @fabaff homeassistant/components/fixer/* @fabaff
homeassistant/components/fjaraskupan/* @elupus homeassistant/components/fjaraskupan/* @elupus
tests/components/fjaraskupan/* @elupus tests/components/fjaraskupan/* @elupus
@@ -354,6 +356,8 @@ tests/components/goodwe/* @mletenay @starkillerOG
homeassistant/components/google_assistant/* @home-assistant/cloud homeassistant/components/google_assistant/* @home-assistant/cloud
tests/components/google_assistant/* @home-assistant/cloud tests/components/google_assistant/* @home-assistant/cloud
homeassistant/components/google_cloud/* @lufton homeassistant/components/google_cloud/* @lufton
homeassistant/components/google_travel_time/* @eifinger
tests/components/google_travel_time/* @eifinger
homeassistant/components/gpsd/* @fabaff homeassistant/components/gpsd/* @fabaff
homeassistant/components/gree/* @cmroche homeassistant/components/gree/* @cmroche
tests/components/gree/* @cmroche tests/components/gree/* @cmroche
@@ -468,6 +472,8 @@ tests/components/iqvia/* @bachya
homeassistant/components/irish_rail_transport/* @ttroy50 homeassistant/components/irish_rail_transport/* @ttroy50
homeassistant/components/islamic_prayer_times/* @engrbm87 homeassistant/components/islamic_prayer_times/* @engrbm87
tests/components/islamic_prayer_times/* @engrbm87 tests/components/islamic_prayer_times/* @engrbm87
homeassistant/components/iss/* @DurgNomis-drol
tests/components/iss/* @DurgNomis-drol
homeassistant/components/isy994/* @bdraco @shbatm homeassistant/components/isy994/* @bdraco @shbatm
tests/components/isy994/* @bdraco @shbatm tests/components/isy994/* @bdraco @shbatm
homeassistant/components/izone/* @Swamp-Ig homeassistant/components/izone/* @Swamp-Ig
@@ -571,6 +577,8 @@ homeassistant/components/modem_callerid/* @tkdrob
tests/components/modem_callerid/* @tkdrob tests/components/modem_callerid/* @tkdrob
homeassistant/components/modern_forms/* @wonderslug homeassistant/components/modern_forms/* @wonderslug
tests/components/modern_forms/* @wonderslug tests/components/modern_forms/* @wonderslug
homeassistant/components/moehlenhoff_alpha2/* @j-a-n
tests/components/moehlenhoff_alpha2/* @j-a-n
homeassistant/components/monoprice/* @etsinko @OnFreund homeassistant/components/monoprice/* @etsinko @OnFreund
tests/components/monoprice/* @etsinko @OnFreund tests/components/monoprice/* @etsinko @OnFreund
homeassistant/components/moon/* @fabaff homeassistant/components/moon/* @fabaff
@@ -711,8 +719,8 @@ homeassistant/components/plaato/* @JohNan
tests/components/plaato/* @JohNan tests/components/plaato/* @JohNan
homeassistant/components/plex/* @jjlawren homeassistant/components/plex/* @jjlawren
tests/components/plex/* @jjlawren tests/components/plex/* @jjlawren
homeassistant/components/plugwise/* @CoMPaTech @bouwew @brefra homeassistant/components/plugwise/* @CoMPaTech @bouwew @brefra @frenck
tests/components/plugwise/* @CoMPaTech @bouwew @brefra tests/components/plugwise/* @CoMPaTech @bouwew @brefra @frenck
homeassistant/components/plum_lightpad/* @ColinHarrington @prystupa homeassistant/components/plum_lightpad/* @ColinHarrington @prystupa
tests/components/plum_lightpad/* @ColinHarrington @prystupa tests/components/plum_lightpad/* @ColinHarrington @prystupa
homeassistant/components/point/* @fredrike homeassistant/components/point/* @fredrike
@@ -732,6 +740,8 @@ tests/components/prosegur/* @dgomes
homeassistant/components/proxmoxve/* @jhollowe @Corbeno homeassistant/components/proxmoxve/* @jhollowe @Corbeno
homeassistant/components/ps4/* @ktnrg45 homeassistant/components/ps4/* @ktnrg45
tests/components/ps4/* @ktnrg45 tests/components/ps4/* @ktnrg45
homeassistant/components/pure_energie/* @klaasnicolaas
tests/components/pure_energie/* @klaasnicolaas
homeassistant/components/push/* @dgomes homeassistant/components/push/* @dgomes
tests/components/push/* @dgomes tests/components/push/* @dgomes
homeassistant/components/pvoutput/* @fabaff @frenck homeassistant/components/pvoutput/* @fabaff @frenck
@@ -747,6 +757,8 @@ homeassistant/components/qwikswitch/* @kellerza
tests/components/qwikswitch/* @kellerza tests/components/qwikswitch/* @kellerza
homeassistant/components/rachio/* @bdraco homeassistant/components/rachio/* @bdraco
tests/components/rachio/* @bdraco tests/components/rachio/* @bdraco
homeassistant/components/radio_browser/* @frenck
tests/components/radio_browser/* @frenck
homeassistant/components/radiotherm/* @vinnyfuria homeassistant/components/radiotherm/* @vinnyfuria
homeassistant/components/rainbird/* @konikvranik homeassistant/components/rainbird/* @konikvranik
homeassistant/components/raincloud/* @vanstinator homeassistant/components/raincloud/* @vanstinator
@@ -796,12 +808,13 @@ tests/components/ruckus_unleashed/* @gabe565
homeassistant/components/safe_mode/* @home-assistant/core homeassistant/components/safe_mode/* @home-assistant/core
tests/components/safe_mode/* @home-assistant/core tests/components/safe_mode/* @home-assistant/core
homeassistant/components/saj/* @fredericvl homeassistant/components/saj/* @fredericvl
homeassistant/components/samsungtv/* @escoand @chemelli74 homeassistant/components/samsungtv/* @escoand @chemelli74 @epenet
tests/components/samsungtv/* @escoand @chemelli74 tests/components/samsungtv/* @escoand @chemelli74 @epenet
homeassistant/components/scene/* @home-assistant/core homeassistant/components/scene/* @home-assistant/core
tests/components/scene/* @home-assistant/core tests/components/scene/* @home-assistant/core
homeassistant/components/schluter/* @prairieapps homeassistant/components/schluter/* @prairieapps
homeassistant/components/scrape/* @fabaff homeassistant/components/scrape/* @fabaff
tests/components/scrape/* @fabaff
homeassistant/components/screenlogic/* @dieselrabbit @bdraco homeassistant/components/screenlogic/* @dieselrabbit @bdraco
tests/components/screenlogic/* @dieselrabbit @bdraco tests/components/screenlogic/* @dieselrabbit @bdraco
homeassistant/components/script/* @home-assistant/core homeassistant/components/script/* @home-assistant/core
@@ -843,6 +856,8 @@ homeassistant/components/sisyphus/* @jkeljo
homeassistant/components/sky_hub/* @rogerselwyn homeassistant/components/sky_hub/* @rogerselwyn
homeassistant/components/slack/* @bachya homeassistant/components/slack/* @bachya
tests/components/slack/* @bachya tests/components/slack/* @bachya
homeassistant/components/sleepiq/* @mfugate1 @kbickar
tests/components/sleepiq/* @mfugate1 @kbickar
homeassistant/components/slide/* @ualex73 homeassistant/components/slide/* @ualex73
homeassistant/components/sma/* @kellerza @rklomp homeassistant/components/sma/* @kellerza @rklomp
tests/components/sma/* @kellerza @rklomp tests/components/sma/* @kellerza @rklomp
@@ -1031,8 +1046,8 @@ tests/components/vilfo/* @ManneW
homeassistant/components/vivotek/* @HarlemSquirrel homeassistant/components/vivotek/* @HarlemSquirrel
homeassistant/components/vizio/* @raman325 homeassistant/components/vizio/* @raman325
tests/components/vizio/* @raman325 tests/components/vizio/* @raman325
homeassistant/components/vlc_telnet/* @rodripf @dmcc @MartinHjelmare homeassistant/components/vlc_telnet/* @rodripf @MartinHjelmare
tests/components/vlc_telnet/* @rodripf @dmcc @MartinHjelmare tests/components/vlc_telnet/* @rodripf @MartinHjelmare
homeassistant/components/volkszaehler/* @fabaff homeassistant/components/volkszaehler/* @fabaff
homeassistant/components/volumio/* @OnFreund homeassistant/components/volumio/* @OnFreund
tests/components/volumio/* @OnFreund tests/components/volumio/* @OnFreund
@@ -1045,6 +1060,8 @@ homeassistant/components/waqi/* @andrey-git
homeassistant/components/watson_tts/* @rutkai homeassistant/components/watson_tts/* @rutkai
homeassistant/components/watttime/* @bachya homeassistant/components/watttime/* @bachya
tests/components/watttime/* @bachya tests/components/watttime/* @bachya
homeassistant/components/waze_travel_time/* @eifinger
tests/components/waze_travel_time/* @eifinger
homeassistant/components/weather/* @fabaff homeassistant/components/weather/* @fabaff
tests/components/weather/* @fabaff tests/components/weather/* @fabaff
homeassistant/components/webostv/* @bendavid @thecode homeassistant/components/webostv/* @bendavid @thecode
@@ -1064,6 +1081,8 @@ tests/components/wilight/* @leofig-rj
homeassistant/components/wirelesstag/* @sergeymaysak homeassistant/components/wirelesstag/* @sergeymaysak
homeassistant/components/withings/* @vangorra homeassistant/components/withings/* @vangorra
tests/components/withings/* @vangorra tests/components/withings/* @vangorra
homeassistant/components/wiz/* @sbidy
tests/components/wiz/* @sbidy
homeassistant/components/wled/* @frenck homeassistant/components/wled/* @frenck
tests/components/wled/* @frenck tests/components/wled/* @frenck
homeassistant/components/wolflink/* @adamkrol93 homeassistant/components/wolflink/* @adamkrol93
@@ -1087,8 +1106,8 @@ homeassistant/components/yamaha_musiccast/* @vigonotion @micha91
tests/components/yamaha_musiccast/* @vigonotion @micha91 tests/components/yamaha_musiccast/* @vigonotion @micha91
homeassistant/components/yandex_transport/* @rishatik92 @devbis homeassistant/components/yandex_transport/* @rishatik92 @devbis
tests/components/yandex_transport/* @rishatik92 @devbis tests/components/yandex_transport/* @rishatik92 @devbis
homeassistant/components/yeelight/* @zewelor @shenxn @starkillerOG homeassistant/components/yeelight/* @zewelor @shenxn @starkillerOG @alexyao2015
tests/components/yeelight/* @zewelor @shenxn @starkillerOG tests/components/yeelight/* @zewelor @shenxn @starkillerOG @alexyao2015
homeassistant/components/yeelightsunflower/* @lindsaymarkward homeassistant/components/yeelightsunflower/* @lindsaymarkward
homeassistant/components/yi/* @bachya homeassistant/components/yi/* @bachya
homeassistant/components/youless/* @gjong homeassistant/components/youless/* @gjong
@@ -1108,6 +1127,8 @@ homeassistant/components/zwave/* @home-assistant/z-wave
tests/components/zwave/* @home-assistant/z-wave tests/components/zwave/* @home-assistant/z-wave
homeassistant/components/zwave_js/* @home-assistant/z-wave homeassistant/components/zwave_js/* @home-assistant/z-wave
tests/components/zwave_js/* @home-assistant/z-wave tests/components/zwave_js/* @home-assistant/z-wave
homeassistant/components/zwave_me/* @lawfulchaos @Z-Wave-Me
tests/components/zwave_me/* @lawfulchaos @Z-Wave-Me
# Individual files # Individual files
homeassistant/components/demo/weather @fabaff homeassistant/components/demo/weather @fabaff

View File

@@ -12,17 +12,18 @@ COPY requirements.txt homeassistant/
COPY homeassistant/package_constraints.txt homeassistant/homeassistant/ COPY homeassistant/package_constraints.txt homeassistant/homeassistant/
RUN \ RUN \
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-r homeassistant/requirements.txt -r homeassistant/requirements.txt --use-deprecated=legacy-resolver
COPY requirements_all.txt homeassistant/ COPY requirements_all.txt homeassistant/
RUN \ RUN \
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ sed -i "s|# homeassistant-pyozw|homeassistant-pyozw|g" homeassistant/requirements_all.txt \
-r homeassistant/requirements_all.txt && pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-r homeassistant/requirements_all.txt --use-deprecated=legacy-resolver
## Setup Home Assistant Core ## Setup Home Assistant Core
COPY . homeassistant/ COPY . homeassistant/
RUN \ RUN \
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-e ./homeassistant \ -e ./homeassistant --use-deprecated=legacy-resolver \
&& python3 -m compileall homeassistant/homeassistant && python3 -m compileall homeassistant/homeassistant
# Fix Bug with Alpine 3.14 and sqlite 3.35 # Fix Bug with Alpine 3.14 and sqlite 3.35

View File

@@ -33,9 +33,9 @@ WORKDIR /workspaces
# Install Python dependencies from requirements # Install Python dependencies from requirements
COPY requirements.txt ./ COPY requirements.txt ./
COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt
RUN pip3 install -r requirements.txt RUN pip3 install -r requirements.txt --use-deprecated=legacy-resolver
COPY requirements_test.txt requirements_test_pre_commit.txt ./ COPY requirements_test.txt requirements_test_pre_commit.txt ./
RUN pip3 install -r requirements_test.txt RUN pip3 install -r requirements_test.txt --use-deprecated=legacy-resolver
RUN rm -rf requirements.txt requirements_test.txt requirements_test_pre_commit.txt homeassistant/ RUN rm -rf requirements.txt requirements_test.txt requirements_test_pre_commit.txt homeassistant/
# Set the default shell to bash instead of sh # Set the default shell to bash instead of sh

View File

@@ -1,11 +1,11 @@
image: homeassistant/{arch}-homeassistant image: homeassistant/{arch}-homeassistant
shadow_repository: ghcr.io/home-assistant shadow_repository: ghcr.io/home-assistant
build_from: build_from:
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2021.09.0 aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2022.02.0
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2021.09.0 armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2022.02.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2021.09.0 armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2022.02.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2021.09.0 amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2022.02.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2021.09.0 i386: ghcr.io/home-assistant/i386-homeassistant-base:2022.02.0
codenotary: codenotary:
signer: notary@home-assistant.io signer: notary@home-assistant.io
base_image: notary@home-assistant.io base_image: notary@home-assistant.io

View File

@@ -1,42 +0,0 @@
"""Provide backwards compat for async_timeout."""
from __future__ import annotations
import asyncio
from typing import Any
import async_timeout
from .helpers.frame import report
def timeout(
delay: float | None, loop: asyncio.AbstractEventLoop | None = None
) -> async_timeout.Timeout:
"""Backwards compatible timeout context manager that warns with loop usage."""
if loop is None:
loop = asyncio.get_running_loop()
else:
report(
"called async_timeout.timeout with loop keyword argument. The loop keyword argument is deprecated and calls will fail after Home Assistant 2022.3",
error_if_core=False,
)
if delay is not None:
deadline: float | None = loop.time() + delay
else:
deadline = None
return async_timeout.Timeout(deadline, loop)
def current_task(loop: asyncio.AbstractEventLoop) -> asyncio.Task[Any] | None:
"""Backwards compatible current_task."""
report(
"called async_timeout.current_task. The current_task call is deprecated and calls will fail after Home Assistant 2022.3; use asyncio.current_task instead",
error_if_core=False,
)
return asyncio.current_task()
def enable() -> None:
"""Enable backwards compat transitions."""
async_timeout.timeout = timeout
async_timeout.current_task = current_task # type: ignore[attr-defined]

View File

@@ -354,7 +354,7 @@ class AuthManager:
if provider is not None and hasattr(provider, "async_will_remove_credentials"): if provider is not None and hasattr(provider, "async_will_remove_credentials"):
# https://github.com/python/mypy/issues/1424 # https://github.com/python/mypy/issues/1424
await provider.async_will_remove_credentials(credentials) # type: ignore await provider.async_will_remove_credentials(credentials) # type: ignore[attr-defined]
await self._store.async_remove_credentials(credentials) await self._store.async_remove_credentials(credentials)

View File

@@ -16,7 +16,7 @@ from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.util.decorator import Registry from homeassistant.util.decorator import Registry
MULTI_FACTOR_AUTH_MODULES = Registry() MULTI_FACTOR_AUTH_MODULES: Registry[str, type[MultiFactorAuthModule]] = Registry()
MULTI_FACTOR_AUTH_MODULE_SCHEMA = vol.Schema( MULTI_FACTOR_AUTH_MODULE_SCHEMA = vol.Schema(
{ {
@@ -55,7 +55,7 @@ class MultiFactorAuthModule:
@property @property
def type(self) -> str: def type(self) -> str:
"""Return type of the module.""" """Return type of the module."""
return self.config[CONF_TYPE] # type: ignore return self.config[CONF_TYPE] # type: ignore[no-any-return]
@property @property
def name(self) -> str: def name(self) -> str:
@@ -129,7 +129,7 @@ async def auth_mfa_module_from_config(
hass: HomeAssistant, config: dict[str, Any] hass: HomeAssistant, config: dict[str, Any]
) -> MultiFactorAuthModule: ) -> MultiFactorAuthModule:
"""Initialize an auth module from a config.""" """Initialize an auth module from a config."""
module_name = config[CONF_TYPE] module_name: str = config[CONF_TYPE]
module = await _load_mfa_module(hass, module_name) module = await _load_mfa_module(hass, module_name)
try: try:
@@ -142,7 +142,7 @@ async def auth_mfa_module_from_config(
) )
raise raise
return MULTI_FACTOR_AUTH_MODULES[module_name](hass, config) # type: ignore return MULTI_FACTOR_AUTH_MODULES[module_name](hass, config)
async def _load_mfa_module(hass: HomeAssistant, module_name: str) -> types.ModuleType: async def _load_mfa_module(hass: HomeAssistant, module_name: str) -> types.ModuleType:

View File

@@ -251,7 +251,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
await self.async_notify( await self.async_notify(
code, code,
notify_setting.notify_service, # type: ignore notify_setting.notify_service, # type: ignore[arg-type]
notify_setting.target, notify_setting.target,
) )

View File

@@ -107,7 +107,7 @@ class TotpAuthModule(MultiFactorAuthModule):
ota_secret: str = secret or pyotp.random_base32() ota_secret: str = secret or pyotp.random_base32()
self._users[user_id] = ota_secret # type: ignore self._users[user_id] = ota_secret # type: ignore[index]
return ota_secret return ota_secret
async def async_setup_flow(self, user_id: str) -> SetupFlow: async def async_setup_flow(self, user_id: str) -> SetupFlow:
@@ -136,7 +136,7 @@ class TotpAuthModule(MultiFactorAuthModule):
if self._users is None: if self._users is None:
await self._async_load() await self._async_load()
if self._users.pop(user_id, None): # type: ignore if self._users.pop(user_id, None): # type: ignore[union-attr]
await self._async_save() await self._async_save()
async def async_is_user_setup(self, user_id: str) -> bool: async def async_is_user_setup(self, user_id: str) -> bool:
@@ -144,7 +144,7 @@ class TotpAuthModule(MultiFactorAuthModule):
if self._users is None: if self._users is None:
await self._async_load() await self._async_load()
return user_id in self._users # type: ignore return user_id in self._users # type: ignore[operator]
async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool: async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool:
"""Return True if validation passed.""" """Return True if validation passed."""
@@ -161,7 +161,7 @@ class TotpAuthModule(MultiFactorAuthModule):
"""Validate two factor authentication code.""" """Validate two factor authentication code."""
import pyotp # pylint: disable=import-outside-toplevel import pyotp # pylint: disable=import-outside-toplevel
if (ota_secret := self._users.get(user_id)) is None: # type: ignore if (ota_secret := self._users.get(user_id)) is None: # type: ignore[union-attr]
# even we cannot find user, we still do verify # even we cannot find user, we still do verify
# to make timing the same as if user was found. # to make timing the same as if user was found.
pyotp.TOTP(DUMMY_SECRET).verify(code, valid_window=1) pyotp.TOTP(DUMMY_SECRET).verify(code, valid_window=1)
@@ -182,8 +182,8 @@ class TotpSetupFlow(SetupFlow):
self._auth_module: TotpAuthModule = auth_module self._auth_module: TotpAuthModule = auth_module
self._user = user self._user = user
self._ota_secret: str = "" self._ota_secret: str = ""
self._url = None # type Optional[str] self._url: str | None = None
self._image = None # type Optional[str] self._image: str | None = None
async def async_step_init( async def async_step_init(
self, user_input: dict[str, str] | None = None self, user_input: dict[str, str] | None = None
@@ -218,7 +218,7 @@ class TotpSetupFlow(SetupFlow):
self._url, self._url,
self._image, self._image,
) = await hass.async_add_executor_job( ) = await hass.async_add_executor_job(
_generate_secret_and_qr_code, # type: ignore _generate_secret_and_qr_code,
str(self._user.name), str(self._user.name),
) )

View File

@@ -25,7 +25,7 @@ from ..models import Credentials, RefreshToken, User, UserMeta
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DATA_REQS = "auth_prov_reqs_processed" DATA_REQS = "auth_prov_reqs_processed"
AUTH_PROVIDERS = Registry() AUTH_PROVIDERS: Registry[str, type[AuthProvider]] = Registry()
AUTH_PROVIDER_SCHEMA = vol.Schema( AUTH_PROVIDER_SCHEMA = vol.Schema(
{ {
@@ -62,7 +62,7 @@ class AuthProvider:
@property @property
def type(self) -> str: def type(self) -> str:
"""Return type of the provider.""" """Return type of the provider."""
return self.config[CONF_TYPE] # type: ignore return self.config[CONF_TYPE] # type: ignore[no-any-return]
@property @property
def name(self) -> str: def name(self) -> str:
@@ -136,7 +136,7 @@ async def auth_provider_from_config(
hass: HomeAssistant, store: AuthStore, config: dict[str, Any] hass: HomeAssistant, store: AuthStore, config: dict[str, Any]
) -> AuthProvider: ) -> AuthProvider:
"""Initialize an auth provider from a config.""" """Initialize an auth provider from a config."""
provider_name = config[CONF_TYPE] provider_name: str = config[CONF_TYPE]
module = await load_auth_provider_module(hass, provider_name) module = await load_auth_provider_module(hass, provider_name)
try: try:
@@ -149,7 +149,7 @@ async def auth_provider_from_config(
) )
raise raise
return AUTH_PROVIDERS[provider_name](hass, store, config) # type: ignore return AUTH_PROVIDERS[provider_name](hass, store, config)
async def load_auth_provider_module( async def load_auth_provider_module(
@@ -250,7 +250,7 @@ class LoginFlow(data_entry_flow.FlowHandler):
auth_module, "async_initialize_login_mfa_step" auth_module, "async_initialize_login_mfa_step"
): ):
try: try:
await auth_module.async_initialize_login_mfa_step( # type: ignore await auth_module.async_initialize_login_mfa_step( # type: ignore[attr-defined]
self.user.id self.user.id
) )
except HomeAssistantError: except HomeAssistantError:

View File

@@ -120,7 +120,7 @@ class Data:
@property @property
def users(self) -> list[dict[str, str]]: def users(self) -> list[dict[str, str]]:
"""Return users.""" """Return users."""
return self._data["users"] # type: ignore return self._data["users"] # type: ignore[index,no-any-return]
def validate_login(self, username: str, password: str) -> None: def validate_login(self, username: str, password: str) -> None:
"""Validate a username and password. """Validate a username and password.

View File

@@ -8,7 +8,7 @@ from .util.async_ import protect_loop
def enable() -> None: def enable() -> None:
"""Enable the detection of blocking calls in the event loop.""" """Enable the detection of blocking calls in the event loop."""
# Prevent urllib3 and requests doing I/O in event loop # Prevent urllib3 and requests doing I/O in event loop
HTTPConnection.putrequest = protect_loop(HTTPConnection.putrequest) # type: ignore HTTPConnection.putrequest = protect_loop(HTTPConnection.putrequest) # type: ignore[assignment]
# Prevent sleeping in event loop. Non-strict since 2022.02 # Prevent sleeping in event loop. Non-strict since 2022.02
time.sleep = protect_loop(time.sleep, strict=False) time.sleep = protect_loop(time.sleep, strict=False)

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
import asyncio import asyncio
import contextlib import contextlib
from datetime import datetime from datetime import datetime, timedelta
import logging import logging
import logging.handlers import logging.handlers
import os import os
@@ -59,7 +59,7 @@ COOLDOWN_TIME = 60
MAX_LOAD_CONCURRENTLY = 6 MAX_LOAD_CONCURRENTLY = 6
DEBUGGER_INTEGRATIONS = {"debugpy"} DEBUGGER_INTEGRATIONS = {"debugpy"}
CORE_INTEGRATIONS = ("homeassistant", "persistent_notification") CORE_INTEGRATIONS = {"homeassistant", "persistent_notification"}
LOGGING_INTEGRATIONS = { LOGGING_INTEGRATIONS = {
# Set log levels # Set log levels
"logger", "logger",
@@ -69,7 +69,14 @@ LOGGING_INTEGRATIONS = {
# To record data # To record data
"recorder", "recorder",
} }
DISCOVERY_INTEGRATIONS = ("dhcp", "ssdp", "usb", "zeroconf")
STAGE_1_INTEGRATIONS = { STAGE_1_INTEGRATIONS = {
# We need to make sure discovery integrations
# update their deps before stage 2 integrations
# load them inadvertently before their deps have
# been updated which leads to using an old version
# of the dep, or worse (import errors).
*DISCOVERY_INTEGRATIONS,
# To make sure we forward data to other instances # To make sure we forward data to other instances
"mqtt_eventstream", "mqtt_eventstream",
# To provide account link implementations # To provide account link implementations
@@ -151,8 +158,11 @@ async def async_setup_hass(
safe_mode = True safe_mode = True
old_config = hass.config old_config = hass.config
old_logging = hass.data.get(DATA_LOGGING)
hass = core.HomeAssistant() hass = core.HomeAssistant()
if old_logging:
hass.data[DATA_LOGGING] = old_logging
hass.config.skip_pip = old_config.skip_pip hass.config.skip_pip = old_config.skip_pip
hass.config.internal_url = old_config.internal_url hass.config.internal_url = old_config.internal_url
hass.config.external_url = old_config.external_url hass.config.external_url = old_config.external_url
@@ -314,7 +324,7 @@ def async_enable_logging(
logging.getLogger("aiohttp.access").setLevel(logging.WARNING) logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
sys.excepthook = lambda *args: logging.getLogger(None).exception( sys.excepthook = lambda *args: logging.getLogger(None).exception(
"Uncaught exception", exc_info=args # type: ignore "Uncaught exception", exc_info=args # type: ignore[arg-type]
) )
threading.excepthook = lambda args: logging.getLogger(None).exception( threading.excepthook = lambda args: logging.getLogger(None).exception(
"Uncaught thread exception", "Uncaught thread exception",
@@ -450,7 +460,7 @@ async def _async_set_up_integrations(
) -> None: ) -> None:
"""Set up all the integrations.""" """Set up all the integrations."""
hass.data[DATA_SETUP_STARTED] = {} hass.data[DATA_SETUP_STARTED] = {}
setup_time = hass.data[DATA_SETUP_TIME] = {} setup_time: dict[str, timedelta] = hass.data.setdefault(DATA_SETUP_TIME, {})
watch_task = asyncio.create_task(_async_watch_pending_setups(hass)) watch_task = asyncio.create_task(_async_watch_pending_setups(hass))
@@ -459,9 +469,9 @@ async def _async_set_up_integrations(
# Resolve all dependencies so we know all integrations # Resolve all dependencies so we know all integrations
# that will have to be loaded and start rightaway # that will have to be loaded and start rightaway
integration_cache: dict[str, loader.Integration] = {} integration_cache: dict[str, loader.Integration] = {}
to_resolve = domains_to_setup to_resolve: set[str] = domains_to_setup
while to_resolve: while to_resolve:
old_to_resolve = to_resolve old_to_resolve: set[str] = to_resolve
to_resolve = set() to_resolve = set()
integrations_to_process = [ integrations_to_process = [
@@ -508,11 +518,11 @@ async def _async_set_up_integrations(
await async_setup_multi_components(hass, debuggers, config) await async_setup_multi_components(hass, debuggers, config)
# calculate what components to setup in what stage # calculate what components to setup in what stage
stage_1_domains = set() stage_1_domains: set[str] = set()
# Find all dependencies of any dependency of any stage 1 integration that # Find all dependencies of any dependency of any stage 1 integration that
# we plan on loading and promote them to stage 1 # we plan on loading and promote them to stage 1
deps_promotion = STAGE_1_INTEGRATIONS deps_promotion: set[str] = STAGE_1_INTEGRATIONS
while deps_promotion: while deps_promotion:
old_deps_promotion = deps_promotion old_deps_promotion = deps_promotion
deps_promotion = set() deps_promotion = set()
@@ -577,7 +587,7 @@ async def _async_set_up_integrations(
{ {
integration: timedelta.total_seconds() integration: timedelta.total_seconds()
for integration, timedelta in sorted( for integration, timedelta in sorted(
setup_time.items(), key=lambda item: item[1].total_seconds() # type: ignore setup_time.items(), key=lambda item: item[1].total_seconds()
) )
}, },
) )

View File

@@ -88,6 +88,8 @@ class AbodeCamera(AbodeDevice, Camera):
self, width: int | None = None, height: int | None = None self, width: int | None = None, height: int | None = None
) -> bytes | None: ) -> bytes | None:
"""Get a camera image.""" """Get a camera image."""
if not self.capture():
return None
self.refresh_image() self.refresh_image()
if self._response: if self._response:

View File

@@ -8,5 +8,6 @@
"homekit": { "homekit": {
"models": ["Abode", "Iota"] "models": ["Abode", "Iota"]
}, },
"iot_class": "cloud_push" "iot_class": "cloud_push",
"loggers": ["abodepy", "lomond"]
} }

View File

@@ -1,11 +1,33 @@
{ {
"config": { "config": {
"abort": {
"reauth_successful": "\u039f \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2",
"single_instance_allowed": "\u0388\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03c1\u03c5\u03b8\u03bc\u03b9\u03c3\u03c4\u03b5\u03af. \u039c\u03cc\u03bd\u03bf \u03bc\u03af\u03b1 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae."
},
"error": { "error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", "cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 \u03b1\u03c5\u03b8\u03b5\u03bd\u03c4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7" "invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 \u03b1\u03c5\u03b8\u03b5\u03bd\u03c4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
"invalid_mfa_code": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 MFA"
}, },
"step": { "step": {
"mfa": {
"data": {
"mfa_code": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 MFA (6 \u03c8\u03b7\u03c6\u03af\u03b1)"
},
"title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc MFA \u03b3\u03b9\u03b1 \u03c4\u03bf Abode"
},
"reauth_confirm": { "reauth_confirm": {
"data": {
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"username": "Email"
},
"title": "\u03a3\u03c5\u03bc\u03c0\u03bb\u03b7\u03c1\u03ce\u03c3\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf Abode"
},
"user": {
"data": {
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"username": "Email"
},
"title": "\u03a3\u03c5\u03bc\u03c0\u03bb\u03b7\u03c1\u03ce\u03c3\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf Abode" "title": "\u03a3\u03c5\u03bc\u03c0\u03bb\u03b7\u03c1\u03ce\u03c3\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf Abode"
} }
} }

View File

@@ -1,14 +1,34 @@
{ {
"config": { "config": {
"abort": { "abort": {
"single_instance_allowed": "Somente uma \u00fanica configura\u00e7\u00e3o de Abode \u00e9 permitida." "reauth_successful": "A reautentica\u00e7\u00e3o foi bem-sucedida",
"single_instance_allowed": "J\u00e1 configurado. Apenas uma configura\u00e7\u00e3o \u00e9 poss\u00edvel."
},
"error": {
"cannot_connect": "Falha ao conectar",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida",
"invalid_mfa_code": "C\u00f3digo MFA inv\u00e1lido"
}, },
"step": { "step": {
"mfa": {
"data": {
"mfa_code": "C\u00f3digo MFA (6 d\u00edgitos)"
},
"title": "Digite seu c\u00f3digo MFA para Abode"
},
"reauth_confirm": {
"data": {
"password": "Senha",
"username": "Email"
},
"title": "Preencha as informa\u00e7\u00f5es de login da Abode"
},
"user": { "user": {
"data": { "data": {
"password": "Senha", "password": "Senha",
"username": "Endere\u00e7o de e-mail" "username": "Email"
} },
"title": "Preencha suas informa\u00e7\u00f5es de login Abode"
} }
} }
} }

View File

@@ -0,0 +1,22 @@
{
"config": {
"abort": {
"reauth_successful": "Op\u00e4tovn\u00e9 overenie bolo \u00faspe\u0161n\u00e9"
},
"error": {
"invalid_auth": "Neplatn\u00e9 overenie"
},
"step": {
"reauth_confirm": {
"data": {
"username": "Email"
}
},
"user": {
"data": {
"username": "Email"
}
}
}
}
}

View File

@@ -2,7 +2,7 @@
"config": { "config": {
"abort": { "abort": {
"reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044f \u043f\u0440\u043e\u0439\u0448\u043b\u0430 \u0443\u0441\u043f\u0456\u0448\u043d\u043e", "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044f \u043f\u0440\u043e\u0439\u0448\u043b\u0430 \u0443\u0441\u043f\u0456\u0448\u043d\u043e",
"single_instance_allowed": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u041c\u043e\u0436\u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044e." "single_instance_allowed": "\u0412\u0436\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u043e\u0432\u0430\u043d\u043e. \u041c\u043e\u0436\u043b\u0438\u0432\u0430 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f."
}, },
"error": { "error": {
"cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f", "cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f",

View File

@@ -2,7 +2,7 @@
"config": { "config": {
"abort": { "abort": {
"reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f", "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f",
"single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002" "single_instance_allowed": "\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3001\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002"
}, },
"error": { "error": {
"cannot_connect": "\u9023\u7dda\u5931\u6557", "cannot_connect": "\u9023\u7dda\u5931\u6557",

View File

@@ -6,5 +6,6 @@
"codeowners": ["@bieniu"], "codeowners": ["@bieniu"],
"config_flow": true, "config_flow": true,
"quality_scale": "platinum", "quality_scale": "platinum",
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["accuweather"]
} }

View File

@@ -1,7 +1,21 @@
{ {
"config": { "config": {
"abort": {
"single_instance_allowed": "\u0388\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03c1\u03c5\u03b8\u03bc\u03b9\u03c3\u03c4\u03b5\u03af. \u039c\u03cc\u03bd\u03bf \u03bc\u03af\u03b1 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae."
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"invalid_api_key": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API",
"requests_exceeded": "\u0388\u03c7\u03b5\u03b9 \u03be\u03b5\u03c0\u03b5\u03c1\u03b1\u03c3\u03c4\u03b5\u03af \u03bf \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b1\u03b9\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03c0\u03c1\u03bf\u03c2 \u03c4\u03bf API \u03c4\u03bf\u03c5 Accuweather. \u03a0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b5\u03c4\u03b5 \u03ae \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API."
},
"step": { "step": {
"user": { "user": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2",
"longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2",
"name": "\u038c\u03bd\u03bf\u03bc\u03b1"
},
"description": "\u0391\u03bd \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1 \u03bc\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7, \u03c1\u03af\u03be\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b1\u03c4\u03b9\u03ac \u03b5\u03b4\u03ce: https://www.home-assistant.io/integrations/accuweather/\n\n\u039f\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03b9 \u03b1\u03b9\u03c3\u03b8\u03b7\u03c4\u03ae\u03c1\u03b5\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf\u03b9 \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae. \u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03bf\u03c5\u03c2 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf \u03bc\u03b7\u03c4\u03c1\u03ce\u03bf \u03bf\u03bd\u03c4\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd \u03bc\u03b5\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2.\n\u0397 \u03c0\u03c1\u03cc\u03b3\u03bd\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae. \u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03b7\u03bd \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b9\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2.", "description": "\u0391\u03bd \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1 \u03bc\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7, \u03c1\u03af\u03be\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b1\u03c4\u03b9\u03ac \u03b5\u03b4\u03ce: https://www.home-assistant.io/integrations/accuweather/\n\n\u039f\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03b9 \u03b1\u03b9\u03c3\u03b8\u03b7\u03c4\u03ae\u03c1\u03b5\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf\u03b9 \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae. \u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03bf\u03c5\u03c2 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf \u03bc\u03b7\u03c4\u03c1\u03ce\u03bf \u03bf\u03bd\u03c4\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd \u03bc\u03b5\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2.\n\u0397 \u03c0\u03c1\u03cc\u03b3\u03bd\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae. \u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03b7\u03bd \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b9\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2.",
"title": "AccuWeather" "title": "AccuWeather"
} }
@@ -12,12 +26,15 @@
"user": { "user": {
"data": { "data": {
"forecast": "\u03a0\u03c1\u03cc\u03b3\u03bd\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd" "forecast": "\u03a0\u03c1\u03cc\u03b3\u03bd\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd"
} },
"description": "\u039b\u03cc\u03b3\u03c9 \u03c4\u03c9\u03bd \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ce\u03bd \u03c4\u03b7\u03c2 \u03b4\u03c9\u03c1\u03b5\u03ac\u03bd \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03bf\u03cd API \u03c4\u03bf\u03c5 AccuWeather, \u03cc\u03c4\u03b1\u03bd \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03b3\u03bd\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd, \u03bf\u03b9 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b8\u03b1 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03ba\u03ac\u03b8\u03b5 80 \u03bb\u03b5\u03c0\u03c4\u03ac \u03b1\u03bd\u03c4\u03af \u03b3\u03b9\u03b1 \u03ba\u03ac\u03b8\u03b5 40 \u03bb\u03b5\u03c0\u03c4\u03ac.",
"title": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 AccuWeather"
} }
} }
}, },
"system_health": { "system_health": {
"info": { "info": {
"can_reach_server": "\u03a0\u03c1\u03bf\u03c3\u03b5\u03b3\u03b3\u03af\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae AccuWeather",
"remaining_requests": "\u03a5\u03c0\u03bf\u03bb\u03b5\u03b9\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1" "remaining_requests": "\u03a5\u03c0\u03bf\u03bb\u03b5\u03b9\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1"
} }
} }

View File

@@ -1,12 +1,22 @@
{ {
"config": { "config": {
"abort": {
"single_instance_allowed": "J\u00e1 configurado. Apenas uma configura\u00e7\u00e3o \u00e9 poss\u00edvel."
},
"error": {
"cannot_connect": "Falha ao conectar",
"invalid_api_key": "Chave de API inv\u00e1lida",
"requests_exceeded": "O n\u00famero permitido de solicita\u00e7\u00f5es para a API Accuweather foi excedido. Voc\u00ea precisa esperar ou alterar a chave de API."
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"api_key": "Chave API", "api_key": "Chave da API",
"latitude": "Latitude", "latitude": "Latitude",
"longitude": "Longitude" "longitude": "Longitude",
"name": "Nome"
}, },
"description": "Se precisar de ajuda com a configura\u00e7\u00e3o, d\u00ea uma olhada aqui: https://www.home-assistant.io/integrations/accuweather/ \n\nAlguns sensores n\u00e3o s\u00e3o ativados por padr\u00e3o. Voc\u00ea pode habilit\u00e1-los no registro da entidade ap\u00f3s a configura\u00e7\u00e3o da integra\u00e7\u00e3o.\nA previs\u00e3o do tempo n\u00e3o est\u00e1 habilitada por padr\u00e3o. Voc\u00ea pode habilit\u00e1-lo nas op\u00e7\u00f5es de integra\u00e7\u00e3o.",
"title": "AccuWeather" "title": "AccuWeather"
} }
} }
@@ -17,8 +27,15 @@
"data": { "data": {
"forecast": "Previs\u00e3o do Tempo" "forecast": "Previs\u00e3o do Tempo"
}, },
"description": "Devido \u00e0s limita\u00e7\u00f5es da vers\u00e3o gratuita da chave da API AccuWeather, quando voc\u00ea habilita a previs\u00e3o do tempo, as atualiza\u00e7\u00f5es de dados ser\u00e3o realizadas a cada 64 minutos em vez de a cada 32 minutos." "description": "Devido \u00e0s limita\u00e7\u00f5es da vers\u00e3o gratuita da chave da API AccuWeather, quando voc\u00ea habilita a previs\u00e3o do tempo, as atualiza\u00e7\u00f5es de dados ser\u00e3o realizadas a cada 64 minutos em vez de a cada 32 minutos.",
"title": "Op\u00e7\u00f5es do AccuWeather"
} }
} }
},
"system_health": {
"info": {
"can_reach_server": "Alcance o servidor AccuWeather",
"remaining_requests": "Solicita\u00e7\u00f5es permitidas restantes"
}
} }
} }

View File

@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "\u03a0\u03c4\u03ce\u03c3\u03b7",
"rising": "\u0391\u03c5\u03be\u03b1\u03bd\u03cc\u03bc\u03b5\u03bd\u03b7",
"steady": "\u03a3\u03c4\u03b1\u03b8\u03b5\u03c1\u03ae"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "Queda",
"rising": "Eleva\u00e7\u00e3o",
"steady": "Est\u00e1vel"
}
}
}

View File

@@ -0,0 +1,17 @@
{
"config": {
"error": {
"invalid_api_key": "Neplatn\u00fd API k\u013e\u00fa\u010d"
},
"step": {
"user": {
"data": {
"api_key": "API k\u013e\u00fa\u010d",
"latitude": "Zemepisn\u00e1 \u0161\u00edrka",
"longitude": "Zemepisn\u00e1 d\u013a\u017eka",
"name": "N\u00e1zov"
}
}
}
}
}

View File

@@ -1,7 +1,7 @@
{ {
"config": { "config": {
"abort": { "abort": {
"single_instance_allowed": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u041c\u043e\u0436\u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044e." "single_instance_allowed": "\u0412\u0436\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u043e\u0432\u0430\u043d\u043e. \u041c\u043e\u0436\u043b\u0438\u0432\u0430 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f."
}, },
"error": { "error": {
"cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f", "cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f",

View File

@@ -1,7 +1,7 @@
{ {
"config": { "config": {
"abort": { "abort": {
"single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002" "single_instance_allowed": "\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3001\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002"
}, },
"error": { "error": {
"cannot_connect": "\u9023\u7dda\u5931\u6557", "cannot_connect": "\u9023\u7dda\u5931\u6557",

View File

@@ -5,5 +5,6 @@
"documentation": "https://www.home-assistant.io/integrations/acmeda", "documentation": "https://www.home-assistant.io/integrations/acmeda",
"requirements": ["aiopulse==0.4.3"], "requirements": ["aiopulse==0.4.3"],
"codeowners": ["@atmurray"], "codeowners": ["@atmurray"],
"iot_class": "local_push" "iot_class": "local_push",
"loggers": ["aiopulse"]
} }

View File

@@ -1,5 +1,8 @@
{ {
"config": { "config": {
"abort": {
"no_devices_found": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ad\u03c2 \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {

View File

@@ -0,0 +1,9 @@
{
"config": {
"step": {
"user": {
"title": "Elija un concentrador para agregar"
}
}
}
}

View File

@@ -0,0 +1,15 @@
{
"config": {
"abort": {
"no_devices_found": "Nenhum dispositivo encontrado na rede"
},
"step": {
"user": {
"data": {
"id": "ID do host"
},
"title": "Escolha um hub para adicionar"
}
}
}
}

View File

@@ -146,8 +146,7 @@ class LocalAdaxDevice(ClimateEntity):
async def async_set_temperature(self, **kwargs): async def async_set_temperature(self, **kwargs):
"""Set new target temperature.""" """Set new target temperature."""
temperature = kwargs.get(ATTR_TEMPERATURE) if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
if temperature is None:
return return
await self._adax_data_handler.set_target_temperature(temperature) await self._adax_data_handler.set_target_temperature(temperature)

View File

@@ -9,5 +9,6 @@
"codeowners": [ "codeowners": [
"@danielhiversen" "@danielhiversen"
], ],
"iot_class": "local_polling" "iot_class": "local_polling",
"loggers": ["adax", "adax_local"]
} }

View File

@@ -0,0 +1,38 @@
{
"config": {
"abort": {
"already_configured": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af",
"heater_not_available": "\u039f \u03b8\u03b5\u03c1\u03bc\u03b1\u03bd\u03c4\u03ae\u03c1\u03b1\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2. \u03a0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b8\u03ad\u03c1\u03bc\u03b1\u03bd\u03c3\u03b7 \u03c0\u03b1\u03c4\u03ce\u03bd\u03c4\u03b1\u03c2 + \u03ba\u03b1\u03b9 OK \u03b3\u03b9\u03b1 \u03bc\u03b5\u03c1\u03b9\u03ba\u03ac \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1.",
"heater_not_found": "\u039f \u03b8\u03b5\u03c1\u03bc\u03b1\u03bd\u03c4\u03ae\u03c1\u03b1\u03c2 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5. \u03a0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03bc\u03b5\u03c4\u03b1\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03b8\u03b5\u03c1\u03bc\u03b1\u03bd\u03c4\u03ae\u03c1\u03b1 \u03c0\u03b9\u03bf \u03ba\u03bf\u03bd\u03c4\u03ac \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae Home Assistant.",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2"
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2"
},
"step": {
"cloud": {
"data": {
"account_id": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2"
}
},
"local": {
"data": {
"wifi_pswd": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 Wi-Fi",
"wifi_ssid": "Wi-Fi SSID"
},
"description": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03b8\u03b5\u03c1\u03bc\u03b1\u03bd\u03c4\u03ae\u03c1\u03b1 \u03c0\u03b1\u03c4\u03ce\u03bd\u03c4\u03b1\u03c2 + \u03ba\u03b1\u03b9 OK \u03bc\u03ad\u03c7\u03c1\u03b9 \u03bd\u03b1 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03c3\u03c4\u03b5\u03af \u03c3\u03c4\u03b7\u03bd \u03bf\u03b8\u03cc\u03bd\u03b7 \u03b7 \u03ad\u03bd\u03b4\u03b5\u03b9\u03be\u03b7 \"Reset\" (\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac). \u03a3\u03c4\u03b7 \u03c3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1, \u03c0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03ba\u03c1\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c0\u03b1\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf \u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af OK \u03c3\u03c4\u03b7 \u03b8\u03b5\u03c1\u03bc\u03ac\u03c3\u03c4\u03c1\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03bd\u03b1 \u03b1\u03c1\u03c7\u03af\u03c3\u03b5\u03b9 \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b2\u03bf\u03c3\u03b2\u03ae\u03bd\u03b5\u03b9 \u03c4\u03bf \u03bc\u03c0\u03bb\u03b5 led \u03c0\u03c1\u03b9\u03bd \u03c0\u03b1\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae. \u0397 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b8\u03b5\u03c1\u03bc\u03ac\u03c3\u03c4\u03c1\u03b1\u03c2 \u03b5\u03bd\u03b4\u03ad\u03c7\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03c1\u03ba\u03ad\u03c3\u03b5\u03b9 \u03bc\u03b5\u03c1\u03b9\u03ba\u03ac \u03bb\u03b5\u03c0\u03c4\u03ac."
},
"user": {
"data": {
"account_id": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"connection_type": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c4\u03cd\u03c0\u03bf\u03c5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"host": "\u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2",
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2"
},
"description": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03cd\u03c0\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2. \u03a4\u03bf\u03c0\u03b9\u03ba\u03ae \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03b8\u03b5\u03c1\u03bc\u03ac\u03c3\u03c4\u03c1\u03b5\u03c2 \u03bc\u03b5 bluetooth"
}
}
}
}

View File

@@ -1,8 +1,26 @@
{ {
"config": { "config": {
"abort": {
"heater_not_available": "Calentador no disponible. Intente restablecer el calentador presionando + y OK durante algunos segundos.",
"heater_not_found": "No se encontr\u00f3 el calentador. Intente acercar el calentador a la computadora de Home Assistant."
},
"step": { "step": {
"cloud": {
"data": {
"account_id": "ID de cuenta",
"password": "Contrase\u00f1a"
}
},
"local": {
"data": {
"wifi_pswd": "Contrase\u00f1a de Wi-Fi",
"wifi_ssid": "Wi-Fi SSID"
},
"description": "Reinicie el calentador presionando + y OK hasta que la pantalla muestre 'Restablecer'. Luego mantenga presionado el bot\u00f3n OK en el calentador hasta que el led azul comience a parpadear antes de presionar Enviar. La configuraci\u00f3n del calentador puede tardar algunos minutos."
},
"user": { "user": {
"data": { "data": {
"account_id": "ID de cuenta",
"connection_type": "Seleccione el tipo de conexi\u00f3n" "connection_type": "Seleccione el tipo de conexi\u00f3n"
}, },
"description": "Seleccione el tipo de conexi\u00f3n. Local requiere calentadores con bluetooth" "description": "Seleccione el tipo de conexi\u00f3n. Local requiere calentadores con bluetooth"

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"cloud": {
"data": {
"account_id": "Konta ID"
}
}
}
}
}

View File

@@ -0,0 +1,38 @@
{
"config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 est\u00e1 configurado",
"heater_not_available": "Aquecedor n\u00e3o dispon\u00edvel. Tente reiniciar o aquecedor pressionando + e OK por alguns segundos.",
"heater_not_found": "Aquecedor n\u00e3o encontrado. Tente aproximar o aquecedor do computador do Home Assistant.",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida"
},
"error": {
"cannot_connect": "Falha ao conectar",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida"
},
"step": {
"cloud": {
"data": {
"account_id": "ID da conta",
"password": "Senha"
}
},
"local": {
"data": {
"wifi_pswd": "Senha do Wi-Fi",
"wifi_ssid": "Wi-Fi SSID"
},
"description": "Reinicie o aquecedor pressionando + e OK at\u00e9 que o display mostre 'Reset'. Em seguida, pressione e segure o bot\u00e3o OK no aquecedor at\u00e9 que o led azul comece a piscar antes de pressionar Enviar. A configura\u00e7\u00e3o do aquecedor pode levar alguns minutos."
},
"user": {
"data": {
"account_id": "ID da conta",
"connection_type": "Selecione o tipo de conex\u00e3o",
"host": "Nome do host",
"password": "Senha"
},
"description": "Selecione o tipo de conex\u00e3o. Local requer aquecedores com bluetooth"
}
}
}
}

View File

@@ -0,0 +1,10 @@
{
"config": {
"abort": {
"invalid_auth": "Neplatn\u00e9 overenie"
},
"error": {
"invalid_auth": "Neplatn\u00e9 overenie"
}
}
}

View File

@@ -205,7 +205,7 @@ class AdGuardHomeDeviceEntity(AdGuardHomeEntity):
return DeviceInfo( return DeviceInfo(
entry_type=DeviceEntryType.SERVICE, entry_type=DeviceEntryType.SERVICE,
identifiers={ identifiers={
(DOMAIN, self.adguard.host, self.adguard.port, self.adguard.base_path) # type: ignore (DOMAIN, self.adguard.host, self.adguard.port, self.adguard.base_path) # type: ignore[arg-type]
}, },
manufacturer="AdGuard Team", manufacturer="AdGuard Team",
name="AdGuard Home", name="AdGuard Home",

View File

@@ -5,5 +5,6 @@
"documentation": "https://www.home-assistant.io/integrations/adguard", "documentation": "https://www.home-assistant.io/integrations/adguard",
"requirements": ["adguardhome==0.5.1"], "requirements": ["adguardhome==0.5.1"],
"codeowners": ["@frenck"], "codeowners": ["@frenck"],
"iot_class": "local_polling" "iot_class": "local_polling",
"loggers": ["adguardhome"]
} }

View File

@@ -1,5 +1,9 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af",
"existing_instance_updated": "\u0395\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03c3\u03b1 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7."
},
"error": { "error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2" "cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"
}, },
@@ -9,6 +13,14 @@
"title": "AdGuard Home \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03bf\u03c5 Home Assistant" "title": "AdGuard Home \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03bf\u03c5 Home Assistant"
}, },
"user": { "user": {
"data": {
"host": "\u0394\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2",
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"port": "\u0398\u03cd\u03c1\u03b1",
"ssl": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03ad\u03bd\u03b1 \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc SSL",
"username": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
"verify_ssl": "\u0395\u03c0\u03b1\u03bb\u03b7\u03b8\u03b5\u03cd\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc SSL"
},
"description": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03bf AdGuard Home \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03cd\u03b8\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf." "description": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03bf AdGuard Home \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03cd\u03b8\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf."
} }
} }

View File

@@ -1,19 +1,25 @@
{ {
"config": { "config": {
"abort": { "abort": {
"already_configured": "O servi\u00e7o j\u00e1 est\u00e1 configurado",
"existing_instance_updated": "Configura\u00e7\u00e3o existente atualizada." "existing_instance_updated": "Configura\u00e7\u00e3o existente atualizada."
}, },
"error": {
"cannot_connect": "Falha ao conectar"
},
"step": { "step": {
"hassio_confirm": { "hassio_confirm": {
"description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo complemento Supervisor: {addon} ?", "description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo add-on {addon}?",
"title": "AdGuard Home via add-on Supervisor" "title": "AdGuard Home via add-on"
}, },
"user": { "user": {
"data": { "data": {
"host": "Nome do host",
"password": "Senha", "password": "Senha",
"ssl": "O AdGuard Home usa um certificado SSL", "port": "Porta",
"ssl": "Usar um certificado SSL",
"username": "Usu\u00e1rio", "username": "Usu\u00e1rio",
"verify_ssl": "O AdGuard Home usa um certificado apropriado" "verify_ssl": "Verifique o certificado SSL"
}, },
"description": "Configure sua inst\u00e2ncia do AdGuard Home para permitir o monitoramento e o controle." "description": "Configure sua inst\u00e2ncia do AdGuard Home para permitir o monitoramento e o controle."
} }

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"port": "Port"
}
}
}
}
}

View File

@@ -4,5 +4,6 @@
"documentation": "https://www.home-assistant.io/integrations/ads", "documentation": "https://www.home-assistant.io/integrations/ads",
"requirements": ["pyads==3.2.2"], "requirements": ["pyads==3.2.2"],
"codeowners": [], "codeowners": [],
"iot_class": "local_push" "iot_class": "local_push",
"loggers": ["pyads"]
} }

View File

@@ -7,8 +7,11 @@
"@Bre77" "@Bre77"
], ],
"requirements": [ "requirements": [
"advantage_air==0.3.0" "advantage_air==0.3.1"
], ],
"quality_scale": "platinum", "quality_scale": "platinum",
"iot_class": "local_polling" "iot_class": "local_polling",
} "loggers": [
"advantage_air"
]
}

View File

@@ -1,7 +1,17 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"
},
"step": { "step": {
"user": { "user": {
"data": {
"ip_address": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 IP",
"port": "\u0398\u03cd\u03c1\u03b1"
},
"description": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03bf API \u03c4\u03bf\u03c5 \u03b5\u03c0\u03af\u03c4\u03bf\u03b9\u03c7\u03bf\u03c5 tablet Advantage Air.", "description": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03bf API \u03c4\u03bf\u03c5 \u03b5\u03c0\u03af\u03c4\u03bf\u03b9\u03c7\u03bf\u03c5 tablet Advantage Air.",
"title": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7" "title": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
} }

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 est\u00e1 configurado"
},
"error": {
"cannot_connect": "Falha ao conectar"
},
"step": {
"user": {
"data": {
"ip_address": "Endere\u00e7o IP",
"port": "Porta"
},
"description": "Conecte-se \u00e0 API do seu tablet Advantage Air montado na parede.",
"title": "Conectar"
}
}
}
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"port": "Port"
}
}
}
}
}

View File

@@ -5,5 +5,6 @@
"documentation": "https://www.home-assistant.io/integrations/aemet", "documentation": "https://www.home-assistant.io/integrations/aemet",
"requirements": ["AEMET-OpenData==0.2.1"], "requirements": ["AEMET-OpenData==0.2.1"],
"codeowners": [], "codeowners": [],
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["aemet_opendata"]
} }

View File

@@ -1,8 +1,17 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u039f \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"invalid_api_key": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2",
"longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2",
"name": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2" "name": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2"
}, },
"description": "\u03a1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 AEMET OpenData. \u0393\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API \u03bc\u03b5\u03c4\u03b1\u03b2\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 https://opendata.aemet.es/centrodedescargas/altaUsuario", "description": "\u03a1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 AEMET OpenData. \u0393\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API \u03bc\u03b5\u03c4\u03b1\u03b2\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 https://opendata.aemet.es/centrodedescargas/altaUsuario",

View File

@@ -0,0 +1,31 @@
{
"config": {
"abort": {
"already_configured": "Localiza\u00e7\u00e3o j\u00e1 est\u00e1 configurada"
},
"error": {
"invalid_api_key": "Chave de API inv\u00e1lida"
},
"step": {
"user": {
"data": {
"api_key": "Chave da API",
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Nome da integra\u00e7\u00e3o"
},
"description": "Configure a integra\u00e7\u00e3o AEMET OpenData. Para gerar a chave API acesse https://opendata.aemet.es/centrodedescargas/altaUsuario",
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Colete dados das esta\u00e7\u00f5es meteorol\u00f3gicas da AEMET"
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
{
"config": {
"error": {
"invalid_api_key": "Neplatn\u00fd API k\u013e\u00fa\u010d"
},
"step": {
"user": {
"data": {
"api_key": "API k\u013e\u00fa\u010d",
"latitude": "Zemepisn\u00e1 \u0161\u00edrka",
"longitude": "Zemepisn\u00e1 d\u013a\u017eka"
}
}
}
}
}

View File

@@ -7,4 +7,4 @@
], ],
"codeowners": [], "codeowners": [],
"iot_class": "cloud_polling" "iot_class": "cloud_polling"
} }

View File

@@ -149,10 +149,10 @@ class AfterShipSensor(SensorEntity):
status_to_ignore = {"delivered"} status_to_ignore = {"delivered"}
status_counts: dict[str, int] = {} status_counts: dict[str, int] = {}
trackings = [] parsed_trackings = []
not_delivered_count = 0 not_delivered_count = 0
for track in trackings: for track in trackings["trackings"]:
status = track["tag"].lower() status = track["tag"].lower()
name = ( name = (
track["tracking_number"] if track["title"] is None else track["title"] track["tracking_number"] if track["title"] is None else track["title"]
@@ -163,7 +163,7 @@ class AfterShipSensor(SensorEntity):
else track["checkpoints"][-1] else track["checkpoints"][-1]
) )
status_counts[status] = status_counts.get(status, 0) + 1 status_counts[status] = status_counts.get(status, 0) + 1
trackings.append( parsed_trackings.append(
{ {
"name": name, "name": name,
"tracking_number": track["tracking_number"], "tracking_number": track["tracking_number"],
@@ -183,7 +183,7 @@ class AfterShipSensor(SensorEntity):
self._attributes = { self._attributes = {
**status_counts, **status_counts,
ATTR_TRACKINGS: trackings, ATTR_TRACKINGS: parsed_trackings,
} }
self._state = not_delivered_count self._state = not_delivered_count

View File

@@ -5,13 +5,8 @@ import logging
from agent import AgentError from agent import AgentError
from homeassistant.components.camera import SUPPORT_ON_OFF from homeassistant.components.camera import SUPPORT_ON_OFF
from homeassistant.components.mjpeg.camera import ( from homeassistant.components.mjpeg import MjpegCamera, filter_urllib3_logging
CONF_MJPEG_URL, from homeassistant.const import ATTR_ATTRIBUTION
CONF_STILL_IMAGE_URL,
MjpegCamera,
filter_urllib3_logging,
)
from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME
from homeassistant.helpers import entity_platform from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
@@ -70,16 +65,15 @@ class AgentCamera(MjpegCamera):
def __init__(self, device): def __init__(self, device):
"""Initialize as a subclass of MjpegCamera.""" """Initialize as a subclass of MjpegCamera."""
device_info = {
CONF_NAME: device.name,
CONF_MJPEG_URL: f"{device.client._server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
CONF_STILL_IMAGE_URL: f"{device.client._server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
}
self.device = device self.device = device
self._removed = False self._removed = False
self._attr_name = f"{device.client.name} {device.name}" self._attr_name = f"{device.client.name} {device.name}"
self._attr_unique_id = f"{device._client.unique}_{device.typeID}_{device.id}" self._attr_unique_id = f"{device._client.unique}_{device.typeID}_{device.id}"
super().__init__(device_info) super().__init__(
name=device.name,
mjpeg_url=f"{device.client._server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
still_image_url=f"{device.client._server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
)
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(AGENT_DOMAIN, self.unique_id)}, identifiers={(AGENT_DOMAIN, self.unique_id)},
manufacturer="Agent", manufacturer="Agent",

View File

@@ -5,5 +5,6 @@
"requirements": ["agent-py==0.0.23"], "requirements": ["agent-py==0.0.23"],
"config_flow": true, "config_flow": true,
"codeowners": ["@ispysoftware"], "codeowners": ["@ispysoftware"],
"iot_class": "local_polling" "iot_class": "local_polling",
"loggers": ["agent"]
} }

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"already_in_progress": "\u0397 \u03c1\u03bf\u03ae \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7\u03c2 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03ae\u03b4\u03b7 \u03c3\u03b5 \u03b5\u03be\u03ad\u03bb\u03b9\u03be\u03b7",
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"
},
"step": {
"user": {
"data": {
"host": "\u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2",
"port": "\u0398\u03cd\u03c1\u03b1"
},
"title": "\u03a1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03bf\u03c5 Agent DVR"
}
}
}
}

View File

@@ -1,10 +1,19 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 est\u00e1 configurado"
},
"error": {
"already_in_progress": "O fluxo de configura\u00e7\u00e3o j\u00e1 est\u00e1 em andamento",
"cannot_connect": "Falha ao conectar"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"host": "Nome do host",
"port": "Porta" "port": "Porta"
} },
"title": "Configurar agente DVR"
} }
} }
} }

View File

@@ -0,0 +1,14 @@
{
"config": {
"error": {
"already_in_progress": "Konfigur\u00e1cia u\u017e prebieha"
},
"step": {
"user": {
"data": {
"port": "Port"
}
}
}
}
}

View File

@@ -6,5 +6,6 @@
"requirements": ["airly==1.1.0"], "requirements": ["airly==1.1.0"],
"config_flow": true, "config_flow": true,
"quality_scale": "platinum", "quality_scale": "platinum",
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["airly"]
} }

View File

@@ -1,11 +1,28 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": { "error": {
"invalid_api_key": "\u0386\u03ba\u03c5\u03c1\u03bf API \u03ba\u03bb\u03b5\u03b9\u03b4\u03af" "invalid_api_key": "\u0386\u03ba\u03c5\u03c1\u03bf API \u03ba\u03bb\u03b5\u03b9\u03b4\u03af",
"wrong_location": "\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03af \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7\u03c2 Airly \u03c3\u03c4\u03b7\u03bd \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae \u03b1\u03c5\u03c4\u03ae."
},
"step": {
"user": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2",
"longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2",
"name": "\u038c\u03bd\u03bf\u03bc\u03b1"
},
"description": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c0\u03bf\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b1\u03ad\u03c1\u03b1 Airly. \u0393\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API, \u03bc\u03b5\u03c4\u03b1\u03b2\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 https://developer.airly.eu/register",
"title": "Airly"
}
} }
}, },
"system_health": { "system_health": {
"info": { "info": {
"can_reach_server": "\u03a0\u03c1\u03bf\u03c3\u03ad\u03b3\u03b3\u03b9\u03c3\u03b7 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae Airly",
"requests_per_day": "\u0395\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1 \u03b1\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1", "requests_per_day": "\u0395\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1 \u03b1\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1",
"requests_remaining": "\u03a5\u03c0\u03bf\u03bb\u03b5\u03b9\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1" "requests_remaining": "\u03a5\u03c0\u03bf\u03bb\u03b5\u03b9\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1"
} }

View File

@@ -0,0 +1,30 @@
{
"config": {
"abort": {
"already_configured": "Localiza\u00e7\u00e3o j\u00e1 est\u00e1 configurada"
},
"error": {
"invalid_api_key": "Chave de API inv\u00e1lida",
"wrong_location": "N\u00e3o h\u00e1 esta\u00e7\u00f5es de medi\u00e7\u00e3o a\u00e9reas nesta \u00e1rea."
},
"step": {
"user": {
"data": {
"api_key": "Chave da API",
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Nome"
},
"description": "Configure a integra\u00e7\u00e3o da qualidade do ar airly. Para gerar a chave de API v\u00e1 para https://developer.airly.eu/register",
"title": "Airly"
}
}
},
"system_health": {
"info": {
"can_reach_server": "Alcance o servidor Airly",
"requests_per_day": "Solicita\u00e7\u00f5es permitidas por dia",
"requests_remaining": "Solicita\u00e7\u00f5es permitidas restantes"
}
}
}

View File

@@ -0,0 +1,17 @@
{
"config": {
"error": {
"invalid_api_key": "Neplatn\u00fd API k\u013e\u00fa\u010d"
},
"step": {
"user": {
"data": {
"api_key": "API k\u013e\u00fa\u010d",
"latitude": "Zemepisn\u00e1 \u0161\u00edrka",
"longitude": "Zemepisn\u00e1 d\u013a\u017eka",
"name": "N\u00e1zov"
}
}
}
}
}

View File

@@ -5,5 +5,6 @@
"documentation": "https://www.home-assistant.io/integrations/airnow", "documentation": "https://www.home-assistant.io/integrations/airnow",
"requirements": ["pyairnow==1.1.0"], "requirements": ["pyairnow==1.1.0"],
"codeowners": ["@asymworks"], "codeowners": ["@asymworks"],
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["pyairnow"]
} }

View File

@@ -0,0 +1,26 @@
{
"config": {
"abort": {
"already_configured": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
"invalid_location": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03ad\u03c3\u03bc\u03b1\u03c4\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1",
"unknown": "\u0391\u03c0\u03c1\u03cc\u03c3\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1"
},
"step": {
"user": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2",
"longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2",
"radius": "\u0391\u03ba\u03c4\u03af\u03bd\u03b1 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd (\u03bc\u03af\u03bb\u03b9\u03b1, \u03c0\u03c1\u03bf\u03b1\u03b9\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc)"
},
"description": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 AirNow \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c0\u03bf\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03ad\u03c1\u03b1. \u0393\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API \u03bc\u03b5\u03c4\u03b1\u03b2\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 https://docs.airnowapi.org/account/request/",
"title": "AirNow"
}
}
},
"title": "AirNow"
}

View File

@@ -0,0 +1,26 @@
{
"config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 est\u00e1 configurado"
},
"error": {
"cannot_connect": "Falha ao conectar",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida",
"invalid_location": "Nenhum resultado encontrado para esse local",
"unknown": "Erro inesperado"
},
"step": {
"user": {
"data": {
"api_key": "Chave da API",
"latitude": "Latitude",
"longitude": "Longitude",
"radius": "Raio da Esta\u00e7\u00e3o (milhas; opcional)"
},
"description": "Configure a integra\u00e7\u00e3o da qualidade do ar AirNow. Para gerar a chave de API, acesse https://docs.airnowapi.org/account/request/",
"title": "AirNow"
}
}
},
"title": "AirNow"
}

View File

@@ -0,0 +1,16 @@
{
"config": {
"error": {
"invalid_auth": "Neplatn\u00e9 overenie"
},
"step": {
"user": {
"data": {
"api_key": "API k\u013e\u00fa\u010d",
"latitude": "Zemepisn\u00e1 \u0161\u00edrka",
"longitude": "Zemepisn\u00e1 d\u013a\u017eka"
}
}
}
}
}

View File

@@ -7,5 +7,6 @@
"codeowners": [ "codeowners": [
"@danielhiversen" "@danielhiversen"
], ],
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["airthings"]
} }

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "\u039f \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
"unknown": "\u0391\u03c0\u03c1\u03cc\u03c3\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1"
},
"step": {
"user": {
"data": {
"description": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 {url} \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b2\u03c1\u03b5\u03af\u03c4\u03b5 \u03c4\u03b1 \u03b4\u03b9\u03b1\u03c0\u03b9\u03c3\u03c4\u03b5\u03c5\u03c4\u03ae\u03c1\u03b9\u03ac \u03c3\u03b1\u03c2",
"id": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc",
"secret": "\u039c\u03c5\u03c3\u03c4\u03b9\u03ba\u03cc"
}
}
}
}
}

View File

@@ -3,6 +3,8 @@
"step": { "step": {
"user": { "user": {
"data": { "data": {
"description": "Inicie sesi\u00f3n en {url} para encontrar sus credenciales",
"id": "ID",
"secret": "Secreto" "secret": "Secreto"
} }
} }

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "A conta j\u00e1 foi configurada"
},
"error": {
"cannot_connect": "Falha ao conectar",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida",
"unknown": "Erro inesperado"
},
"step": {
"user": {
"data": {
"description": "Fa\u00e7a login em {url} para encontrar suas credenciais",
"id": "ID",
"secret": "Segredo"
}
}
}
}
}

View File

@@ -0,0 +1,7 @@
{
"config": {
"error": {
"invalid_auth": "Neplatn\u00e9 overenie"
}
}
}

View File

@@ -9,5 +9,6 @@
"codeowners": [ "codeowners": [
"@LonePurpleWolf" "@LonePurpleWolf"
], ],
"iot_class": "local_polling" "iot_class": "local_polling",
"loggers": ["airtouch4pyapi"]
} }

View File

@@ -1,7 +1,17 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af"
},
"error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"no_units": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03ba\u03b1\u03bc\u03af\u03b1 \u03bf\u03bc\u03ac\u03b4\u03b1 AirTouch 4."
},
"step": { "step": {
"user": { "user": {
"data": {
"host": "\u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2"
},
"title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 {intergration}." "title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 {intergration}."
} }
} }

View File

@@ -0,0 +1,12 @@
{
"config": {
"error": {
"no_units": "No se pudo encontrar ning\u00fan grupo de AirTouch 4."
},
"step": {
"user": {
"title": "Configure los detalles de conexi\u00f3n de su AirTouch 4."
}
}
}
}

View File

@@ -0,0 +1,19 @@
{
"config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 est\u00e1 configurado"
},
"error": {
"cannot_connect": "Falha ao conectar",
"no_units": "N\u00e3o foi poss\u00edvel encontrar nenhum Grupo AirTouch 4."
},
"step": {
"user": {
"data": {
"host": "Nome do host"
},
"title": "Configure os detalhes de conex\u00e3o do AirTouch 4."
}
}
}
}

View File

@@ -5,5 +5,6 @@
"documentation": "https://www.home-assistant.io/integrations/airvisual", "documentation": "https://www.home-assistant.io/integrations/airvisual",
"requirements": ["pyairvisual==5.0.9"], "requirements": ["pyairvisual==5.0.9"],
"codeowners": ["@bachya"], "codeowners": ["@bachya"],
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["pyairvisual", "pysmb"]
} }

View File

@@ -1,13 +1,61 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af \u03ae \u03c4\u03bf Node/Pro ID \u03b5\u03af\u03bd\u03b1\u03b9 \u03ae\u03b4\u03b7 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf.",
"reauth_successful": "\u039f \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2"
},
"error": { "error": {
"cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2" "cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
"general_error": "\u0391\u03c0\u03c1\u03cc\u03c3\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1",
"invalid_api_key": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API",
"location_not_found": "\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5"
}, },
"step": { "step": {
"geography_by_coords": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2",
"longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2"
},
"description": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf AirVisual cloud API \u03b3\u03b9\u03b1 \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03cd\u03b8\u03b7\u03c3\u03b7 \u03b3\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03bf\u03cd \u03c0\u03bb\u03ac\u03c4\u03bf\u03c5\u03c2/\u03bc\u03ae\u03ba\u03bf\u03c5\u03c2.",
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b3\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03af\u03b1\u03c2"
},
"geography_by_name": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API",
"city": "\u03a0\u03cc\u03bb\u03b7",
"country": "\u03a7\u03ce\u03c1\u03b1",
"state": "\u03ba\u03c1\u03ac\u03c4\u03bf\u03c2"
},
"description": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf AirVisual cloud API \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03c0\u03cc\u03bb\u03b7/\u03c0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b1/\u03c7\u03ce\u03c1\u03b1.",
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b3\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03af\u03b1\u03c2"
},
"node_pro": {
"data": {
"ip_address": "\u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2",
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2"
},
"description": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ae \u03bc\u03bf\u03bd\u03ac\u03b4\u03b1 AirVisual. \u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03b1\u03ba\u03c4\u03b7\u03b8\u03b5\u03af \u03b1\u03c0\u03cc \u03c4\u03bf UI \u03c4\u03b7\u03c2 \u03bc\u03bf\u03bd\u03ac\u03b4\u03b1\u03c2.",
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b5\u03bd\u03cc\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5 AirVisual Node/Pro"
},
"reauth_confirm": { "reauth_confirm": {
"data": {
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API"
},
"title": "\u0395\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 AirVisual" "title": "\u0395\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 AirVisual"
}, },
"user": { "user": {
"description": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd AirVisual \u03c0\u03bf\u03c5 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af\u03c4\u03b5.",
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 AirVisual"
}
}
},
"options": {
"step": {
"init": {
"data": {
"show_on_map": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7\u03c2 \u03b3\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03af\u03b1\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c7\u03ac\u03c1\u03c4\u03b7"
},
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 AirVisual" "title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 AirVisual"
} }
} }

View File

@@ -1,14 +1,62 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "Localiza\u00e7\u00e3o j\u00e1 est\u00e1 configurada",
"reauth_successful": "A reautentica\u00e7\u00e3o foi bem-sucedida"
},
"error": { "error": {
"general_error": "Ocorreu um erro desconhecido.", "cannot_connect": "Falha ao conectar",
"invalid_api_key": "Chave de API fornecida \u00e9 inv\u00e1lida." "general_error": "Erro inesperado",
"invalid_api_key": "Chave de API inv\u00e1lida",
"location_not_found": "Localiza\u00e7\u00e3o n\u00e3o encontrada"
}, },
"step": { "step": {
"geography_by_coords": {
"data": {
"api_key": "Chave da API",
"latitude": "Latitude",
"longitude": "Longitude"
},
"description": "Use a API de nuvem AirVisual para monitorar uma latitude/longitude.",
"title": "Configurar uma geografia"
},
"geography_by_name": {
"data": {
"api_key": "Chave da API",
"city": "Cidade",
"country": "Pa\u00eds",
"state": "Estado"
},
"description": "Use a API de nuvem AirVisual para monitorar uma cidade/estado/pa\u00eds.",
"title": "Configurar uma geografia"
},
"node_pro": { "node_pro": {
"data": { "data": {
"ip_address": "Nome do host",
"password": "Senha" "password": "Senha"
} },
"description": "Monitore uma unidade AirVisual pessoal. A senha pode ser recuperada da interface do usu\u00e1rio da unidade.",
"title": "Configurar um n\u00f3/pro AirVisual"
},
"reauth_confirm": {
"data": {
"api_key": "Chave da API"
},
"title": "Reautenticar o AirVisual"
},
"user": {
"description": "Escolha que tipo de dados do AirVisual voc\u00ea deseja monitorar.",
"title": "Configurar o Airvisual"
}
}
},
"options": {
"step": {
"init": {
"data": {
"show_on_map": "Mostrar o monitoramento no mapa"
},
"title": "Configurar o AirVisual"
} }
} }
} }

View File

@@ -0,0 +1,20 @@
{
"state": {
"airvisual__pollutant_label": {
"co": "\u039c\u03bf\u03bd\u03bf\u03be\u03b5\u03af\u03b4\u03b9\u03bf \u03c4\u03bf\u03c5 \u03ac\u03bd\u03b8\u03c1\u03b1\u03ba\u03b1",
"n2": "\u0394\u03b9\u03bf\u03be\u03b5\u03af\u03b4\u03b9\u03bf \u03c4\u03bf\u03c5 \u03b1\u03b6\u03ce\u03c4\u03bf\u03c5",
"o3": "\u038c\u03b6\u03bf\u03bd",
"p1": "PM10",
"p2": "PM2.5",
"s2": "\u0394\u03b9\u03bf\u03be\u03b5\u03af\u03b4\u03b9\u03bf \u03c4\u03bf\u03c5 \u03b8\u03b5\u03af\u03bf\u03c5"
},
"airvisual__pollutant_level": {
"good": "\u039a\u03b1\u03bb\u03cc",
"hazardous": "\u0395\u03c0\u03b9\u03ba\u03af\u03bd\u03b4\u03c5\u03bd\u03bf",
"moderate": "\u039c\u03ad\u03c4\u03c1\u03b9\u03bf",
"unhealthy": "\u0391\u03bd\u03b8\u03c5\u03b3\u03b9\u03b5\u03b9\u03bd\u03cc",
"unhealthy_sensitive": "\u0391\u03bd\u03b8\u03c5\u03b3\u03b9\u03b5\u03b9\u03bd\u03cc \u03b3\u03b9\u03b1 \u03b5\u03c5\u03b1\u03af\u03c3\u03b8\u03b7\u03c4\u03b5\u03c2 \u03bf\u03bc\u03ac\u03b4\u03b5\u03c2",
"very_unhealthy": "\u03a0\u03bf\u03bb\u03cd \u03b1\u03bd\u03b8\u03c5\u03b3\u03b9\u03b5\u03b9\u03bd\u03cc"
}
}
}

View File

@@ -0,0 +1,20 @@
{
"state": {
"airvisual__pollutant_label": {
"co": "Mon\u00f3xido de carbono",
"n2": "Di\u00f3xido de nitrog\u00eanio",
"o3": "Oz\u00f4nio",
"p1": "PM10",
"p2": "PM2,5",
"s2": "Di\u00f3xido de enxofre"
},
"airvisual__pollutant_level": {
"good": "Bom",
"hazardous": "Perigoso",
"moderate": "Moderado",
"unhealthy": "Insalubre",
"unhealthy_sensitive": "Insalubre para grupos sens\u00edveis",
"very_unhealthy": "Muito insalubre"
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"reauth_successful": "Op\u00e4tovn\u00e9 overenie bolo \u00faspe\u0161n\u00e9"
},
"error": {
"invalid_api_key": "Neplatn\u00fd API k\u013e\u00fa\u010d"
},
"step": {
"geography_by_coords": {
"data": {
"api_key": "API k\u013e\u00fa\u010d",
"latitude": "Zemepisn\u00e1 \u0161\u00edrka",
"longitude": "Zemepisn\u00e1 d\u013a\u017eka"
}
},
"geography_by_name": {
"data": {
"api_key": "API k\u013e\u00fa\u010d"
}
},
"reauth_confirm": {
"data": {
"api_key": "API k\u013e\u00fa\u010d"
}
}
}
}
}

View File

@@ -4,5 +4,6 @@
"documentation": "https://www.home-assistant.io/integrations/aladdin_connect", "documentation": "https://www.home-assistant.io/integrations/aladdin_connect",
"requirements": ["aladdin_connect==0.4"], "requirements": ["aladdin_connect==0.4"],
"codeowners": [], "codeowners": [],
"iot_class": "cloud_polling" "iot_class": "cloud_polling",
"loggers": ["aladdin_connect"]
} }

View File

@@ -4,13 +4,23 @@
"arm_away": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03b5\u03ba\u03c4\u03cc\u03c2 \u03c3\u03c0\u03b9\u03c4\u03b9\u03bf\u03cd \u03c4\u03bf {entity_name}", "arm_away": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03b5\u03ba\u03c4\u03cc\u03c2 \u03c3\u03c0\u03b9\u03c4\u03b9\u03bf\u03cd \u03c4\u03bf {entity_name}",
"arm_home": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03c3\u03c0\u03af\u03c4\u03b9 \u03c4\u03bf {entity_name}", "arm_home": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03c3\u03c0\u03af\u03c4\u03b9 \u03c4\u03bf {entity_name}",
"arm_night": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03b2\u03c1\u03ac\u03b4\u03c5 \u03c4\u03bf {entity_name}", "arm_night": "\u039f\u03c0\u03bb\u03af\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03b2\u03c1\u03ac\u03b4\u03c5 \u03c4\u03bf {entity_name}",
"arm_vacation": "\u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 {entity_name} \u03c3\u03b5 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ad\u03c2",
"disarm": "\u0391\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 {entity_name}", "disarm": "\u0391\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 {entity_name}",
"trigger": "\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 {entity_name}" "trigger": "\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 {entity_name}"
}, },
"condition_type": {
"is_armed_away": "{entity_name} \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03b5\u03ba\u03c4\u03cc\u03c2",
"is_armed_home": "{entity_name} \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 \u03c3\u03c0\u03af\u03c4\u03b9",
"is_armed_night": "{entity_name} \u03b5\u03af\u03bd\u03b1\u03b9 \u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 \u03bd\u03cd\u03c7\u03c4\u03b1",
"is_armed_vacation": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03b5 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ad\u03c2",
"is_disarmed": "{entity_name} \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf",
"is_triggered": "{entity_name} \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5"
},
"trigger_type": { "trigger_type": {
"armed_away": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03b5\u03ba\u03c4\u03cc\u03c2 \u03c3\u03c0\u03b9\u03c4\u03b9\u03bf\u03cd", "armed_away": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03b5\u03ba\u03c4\u03cc\u03c2 \u03c3\u03c0\u03b9\u03c4\u03b9\u03bf\u03cd",
"armed_home": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03c3\u03c0\u03af\u03c4\u03b9", "armed_home": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03c3\u03c0\u03af\u03c4\u03b9",
"armed_night": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03cd\u03c7\u03c4\u03b1", "armed_night": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03cd\u03c7\u03c4\u03b1",
"armed_vacation": "{entity_name} \u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03b5 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ad\u03c2",
"disarmed": "{entity_name} \u03b1\u03c6\u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5", "disarmed": "{entity_name} \u03b1\u03c6\u03bf\u03c0\u03bb\u03af\u03c3\u03c4\u03b7\u03ba\u03b5",
"triggered": "{entity_name} \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5" "triggered": "{entity_name} \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5"
} }
@@ -22,6 +32,7 @@
"armed_custom_bypass": "\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b1\u03c1\u03ac\u03ba\u03b1\u03bc\u03c8\u03b7 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae", "armed_custom_bypass": "\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b1\u03c1\u03ac\u03ba\u03b1\u03bc\u03c8\u03b7 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae",
"armed_home": "\u03a3\u03c0\u03af\u03c4\u03b9 \u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf", "armed_home": "\u03a3\u03c0\u03af\u03c4\u03b9 \u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf",
"armed_night": "\u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03b2\u03c1\u03ac\u03b4\u03c5", "armed_night": "\u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03b2\u03c1\u03ac\u03b4\u03c5",
"armed_vacation": "\u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ce\u03bd",
"arming": "\u038c\u03c0\u03bb\u03b9\u03c3\u03b7", "arming": "\u038c\u03c0\u03bb\u03b9\u03c3\u03b7",
"disarmed": "\u0391\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2", "disarmed": "\u0391\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2",
"disarming": "\u0391\u03c6\u03cc\u03c0\u03bb\u03b9\u03c3\u03b7", "disarming": "\u0391\u03c6\u03cc\u03c0\u03bb\u03b9\u03c3\u03b7",

View File

@@ -4,13 +4,15 @@
"arm_away": "Armar {entity_name} longe", "arm_away": "Armar {entity_name} longe",
"arm_home": "Armar {entity_name} casa", "arm_home": "Armar {entity_name} casa",
"arm_night": "Armar {entity_name} noite", "arm_night": "Armar {entity_name} noite",
"arm_vacation": "Armar {entity_name} f\u00e9rias",
"disarm": "Desarmar {entity_name}", "disarm": "Desarmar {entity_name}",
"trigger": "Disparar {entidade_nome}" "trigger": "Disparar {entity_name}"
}, },
"condition_type": { "condition_type": {
"is_armed_away": "{entity_name} est\u00e1 armado modo longe", "is_armed_away": "{entity_name} est\u00e1 armado modo longe",
"is_armed_home": "{entity_name} est\u00e1 armadado modo casa", "is_armed_home": "{entity_name} est\u00e1 armadado modo casa",
"is_armed_night": "{entity_name} est\u00e1 armadado modo noite", "is_armed_night": "{entity_name} est\u00e1 armadado modo noite",
"is_armed_vacation": "{entity_name} est\u00e1 armadado modo f\u00e9rias",
"is_disarmed": "{entity_name} est\u00e1 desarmado", "is_disarmed": "{entity_name} est\u00e1 desarmado",
"is_triggered": "{entity_name} est\u00e1 acionado" "is_triggered": "{entity_name} est\u00e1 acionado"
}, },
@@ -18,6 +20,7 @@
"armed_away": "{entity_name} armado modo longe", "armed_away": "{entity_name} armado modo longe",
"armed_home": "{entity_name} armadado modo casa", "armed_home": "{entity_name} armadado modo casa",
"armed_night": "{entity_name} armadado para noite", "armed_night": "{entity_name} armadado para noite",
"armed_vacation": "{entity_name} armadado para f\u00e9rias",
"disarmed": "{entity_name} desarmado", "disarmed": "{entity_name} desarmado",
"triggered": "{entity_name} acionado" "triggered": "{entity_name} acionado"
} }
@@ -27,8 +30,9 @@
"armed": "Armado", "armed": "Armado",
"armed_away": "Armado ausente", "armed_away": "Armado ausente",
"armed_custom_bypass": "Armado em \u00e1reas espec\u00edficas", "armed_custom_bypass": "Armado em \u00e1reas espec\u00edficas",
"armed_home": "Armado casa", "armed_home": "Armado em casa",
"armed_night": "Armado noite", "armed_night": "Armado noturno",
"armed_vacation": "Armado f\u00e9rias",
"arming": "Armando", "arming": "Armando",
"disarmed": "Desarmado", "disarmed": "Desarmado",
"disarming": "Desarmando", "disarming": "Desarmando",

View File

@@ -155,7 +155,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return True return True
async def _update_listener(hass: HomeAssistant, entry: ConfigEntry): async def _update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Handle options update.""" """Handle options update."""
_LOGGER.debug("AlarmDecoder options updated: %s", entry.as_dict()["options"]) _LOGGER.debug("AlarmDecoder options updated: %s", entry.as_dict()["options"])
await hass.config_entries.async_reload(entry.entry_id) await hass.config_entries.async_reload(entry.entry_id)

View File

@@ -77,6 +77,7 @@ class AlarmDecoderBinarySensor(BinarySensorEntity):
self._zone_number = int(zone_number) self._zone_number = int(zone_number)
self._zone_type = zone_type self._zone_type = zone_type
self._attr_name = zone_name self._attr_name = zone_name
self._attr_is_on = False
self._rfid = zone_rfid self._rfid = zone_rfid
self._loop = zone_loop self._loop = zone_loop
self._relay_addr = relay_addr self._relay_addr = relay_addr

View File

@@ -3,7 +3,8 @@
"name": "AlarmDecoder", "name": "AlarmDecoder",
"documentation": "https://www.home-assistant.io/integrations/alarmdecoder", "documentation": "https://www.home-assistant.io/integrations/alarmdecoder",
"requirements": ["adext==0.4.2"], "requirements": ["adext==0.4.2"],
"codeowners": ["@ajschmidt8"], "codeowners": [],
"config_flow": true, "config_flow": true,
"iot_class": "local_push" "iot_class": "local_push",
"loggers": ["adext", "alarmdecoder"]
} }

Some files were not shown because too many files have changed in this diff Show More