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

View File

@@ -52,7 +52,9 @@ omit =
homeassistant/components/amazon_polly/*
homeassistant/components/amberelectric/__init__.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/ampio/*
homeassistant/components/android_ip_webcam/*
@@ -75,11 +77,13 @@ omit =
homeassistant/components/aruba/device_tracker.py
homeassistant/components/arwn/sensor.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/sensor.py
homeassistant/components/asterisk_cdr/mailbox.py
homeassistant/components/asterisk_mbox/*
homeassistant/components/asuswrt/__init__.py
homeassistant/components/asuswrt/diagnostics.py
homeassistant/components/asuswrt/router.py
homeassistant/components/aten_pe/*
homeassistant/components/atome/*
@@ -87,6 +91,7 @@ omit =
homeassistant/components/aurora/binary_sensor.py
homeassistant/components/aurora/const.py
homeassistant/components/aurora/sensor.py
homeassistant/components/aussie_broadband/diagnostics.py
homeassistant/components/avea/light.py
homeassistant/components/avion/light.py
homeassistant/components/azure_devops/__init__.py
@@ -189,7 +194,10 @@ omit =
homeassistant/components/crownstone/light.py
homeassistant/components/cups/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/darksky/weather.py
homeassistant/components/ddwrt/device_tracker.py
@@ -222,7 +230,12 @@ omit =
homeassistant/components/dnsip/sensor.py
homeassistant/components/dominos/*
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/downloader/*
homeassistant/components/dsmr_reader/*
@@ -256,7 +269,14 @@ omit =
homeassistant/components/egardia/*
homeassistant/components/eight_sleep/*
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/common.py
homeassistant/components/elmax/const.py
@@ -300,6 +320,7 @@ omit =
homeassistant/components/esphome/entry_data.py
homeassistant/components/esphome/fan.py
homeassistant/components/esphome/light.py
homeassistant/components/esphome/lock.py
homeassistant/components/esphome/number.py
homeassistant/components/esphome/select.py
homeassistant/components/esphome/sensor.py
@@ -339,6 +360,9 @@ omit =
homeassistant/components/firmata/sensor.py
homeassistant/components/firmata/switch.py
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/fjaraskupan/__init__.py
homeassistant/components/fjaraskupan/binary_sensor.py
@@ -370,13 +394,10 @@ omit =
homeassistant/components/freebox/router.py
homeassistant/components/freebox/sensor.py
homeassistant/components/freebox/switch.py
homeassistant/components/fritz/__init__.py
homeassistant/components/fritz/binary_sensor.py
homeassistant/components/fritz/button.py
homeassistant/components/fritz/common.py
homeassistant/components/fritz/const.py
homeassistant/components/fritz/device_tracker.py
homeassistant/components/fritz/diagnostics.py
homeassistant/components/fritz/sensor.py
homeassistant/components/fritz/services.py
homeassistant/components/fritz/switch.py
@@ -400,20 +421,15 @@ omit =
homeassistant/components/glances/__init__.py
homeassistant/components/glances/const.py
homeassistant/components/glances/sensor.py
homeassistant/components/gntp/notify.py
homeassistant/components/goalfeed/*
homeassistant/components/goodwe/__init__.py
homeassistant/components/goodwe/const.py
homeassistant/components/goodwe/number.py
homeassistant/components/goodwe/select.py
homeassistant/components/goodwe/sensor.py
homeassistant/components/google/__init__.py
homeassistant/components/google_cloud/tts.py
homeassistant/components/google_maps/device_tracker.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/gpsd/sensor.py
homeassistant/components/greenwave/light.py
@@ -430,7 +446,11 @@ omit =
homeassistant/components/habitica/__init__.py
homeassistant/components/habitica/const.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/harmony/const.py
homeassistant/components/harmony/data.py
@@ -471,7 +491,12 @@ omit =
homeassistant/components/horizon/media_player.py
homeassistant/components/hp_ilo/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/hunterdouglas_powerview/__init__.py
homeassistant/components/hunterdouglas_powerview/scene.py
@@ -497,7 +522,9 @@ omit =
homeassistant/components/izone/discovery.py
homeassistant/components/izone/__init__.py
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/ihc/*
homeassistant/components/imap/sensor.py
@@ -517,12 +544,17 @@ omit =
homeassistant/components/intellifire/coordinator.py
homeassistant/components/intellifire/binary_sensor.py
homeassistant/components/intellifire/sensor.py
homeassistant/components/intellifire/entity.py
homeassistant/components/incomfort/*
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/iqvia/*
homeassistant/components/iqvia/__init__.py
homeassistant/components/iqvia/sensor.py
homeassistant/components/irish_rail_transport/sensor.py
homeassistant/components/iss/__init__.py
homeassistant/components/iss/binary_sensor.py
homeassistant/components/isy994/__init__.py
homeassistant/components/isy994/binary_sensor.py
@@ -569,7 +601,10 @@ omit =
homeassistant/components/kodi/const.py
homeassistant/components/kodi/media_player.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/const.py
homeassistant/components/kostal_plenticore/helper.py
@@ -594,8 +629,13 @@ omit =
homeassistant/components/lcn/services.py
homeassistant/components/lg_netcast/media_player.py
homeassistant/components/lg_soundbar/media_player.py
homeassistant/components/life360/*
homeassistant/components/lifx/*
homeassistant/components/life360/__init__.py
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/lightwave/*
homeassistant/components/limitlessled/light.py
@@ -676,9 +716,15 @@ omit =
homeassistant/components/minio/*
homeassistant/components/mitemp_bt/sensor.py
homeassistant/components/mjpeg/camera.py
homeassistant/components/mjpeg/util.py
homeassistant/components/mochad/*
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/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/const.py
homeassistant/components/motion_blinds/cover.py
@@ -716,6 +762,7 @@ omit =
homeassistant/components/nad/media_player.py
homeassistant/components/nanoleaf/__init__.py
homeassistant/components/nanoleaf/button.py
homeassistant/components/nanoleaf/device_trigger.py
homeassistant/components/nanoleaf/diagnostics.py
homeassistant/components/nanoleaf/entity.py
homeassistant/components/nanoleaf/light.py
@@ -730,9 +777,11 @@ omit =
homeassistant/components/nest/legacy/*
homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/__init__.py
homeassistant/components/netgear/button.py
homeassistant/components/netgear/device_tracker.py
homeassistant/components/netgear/router.py
homeassistant/components/netgear/sensor.py
homeassistant/components/netgear/switch.py
homeassistant/components/netgear_lte/*
homeassistant/components/netio/switch.py
homeassistant/components/neurio_energy/sensor.py
@@ -759,6 +808,7 @@ omit =
homeassistant/components/nuki/const.py
homeassistant/components/nuki/binary_sensor.py
homeassistant/components/nuki/lock.py
homeassistant/components/nut/diagnostics.py
homeassistant/components/nx584/alarm_control_panel.py
homeassistant/components/nzbget/coordinator.py
homeassistant/components/obihai/*
@@ -820,6 +870,8 @@ omit =
homeassistant/components/overkiz/__init__.py
homeassistant/components/overkiz/binary_sensor.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_entities/*
homeassistant/components/overkiz/coordinator.py
@@ -832,6 +884,7 @@ omit =
homeassistant/components/overkiz/scene.py
homeassistant/components/overkiz/select.py
homeassistant/components/overkiz/sensor.py
homeassistant/components/overkiz/siren.py
homeassistant/components/overkiz/switch.py
homeassistant/components/ovo_energy/__init__.py
homeassistant/components/ovo_energy/const.py
@@ -845,6 +898,7 @@ omit =
homeassistant/components/pcal9535a/*
homeassistant/components/pencom/switch.py
homeassistant/components/philips_js/__init__.py
homeassistant/components/philips_js/diagnostics.py
homeassistant/components/philips_js/light.py
homeassistant/components/philips_js/media_player.py
homeassistant/components/philips_js/remote.py
@@ -867,9 +921,13 @@ omit =
homeassistant/components/plaato/entity.py
homeassistant/components/plaato/sensor.py
homeassistant/components/plex/media_player.py
homeassistant/components/plex/view.py
homeassistant/components/plum_lightpad/light.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/sensor.py
homeassistant/components/poolsense/binary_sensor.py
@@ -892,8 +950,15 @@ omit =
homeassistant/components/qrcode/image_processing.py
homeassistant/components/quantum_gateway/device_tracker.py
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/radio_browser/__init__.py
homeassistant/components/radio_browser/media_source.py
homeassistant/components/radiotherm/climate.py
homeassistant/components/rainbird/*
homeassistant/components/raincloud/*
@@ -948,7 +1013,6 @@ omit =
homeassistant/components/saj/sensor.py
homeassistant/components/satel_integra/*
homeassistant/components/schluter/*
homeassistant/components/scrape/sensor.py
homeassistant/components/screenlogic/__init__.py
homeassistant/components/screenlogic/binary_sensor.py
homeassistant/components/screenlogic/climate.py
@@ -973,6 +1037,9 @@ omit =
homeassistant/components/senseme/switch.py
homeassistant/components/sensibo/__init__.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_pm/sensor.py
homeassistant/components/sesame/lock.py
@@ -985,6 +1052,7 @@ omit =
homeassistant/components/shelly/climate.py
homeassistant/components/shelly/entity.py
homeassistant/components/shelly/light.py
homeassistant/components/shelly/number.py
homeassistant/components/shelly/sensor.py
homeassistant/components/shelly/utils.py
homeassistant/components/sht31/sensor.py
@@ -1021,7 +1089,11 @@ omit =
homeassistant/components/smarthab/__init__.py
homeassistant/components/smarthab/cover.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/snapcast/*
homeassistant/components/snmp/*
@@ -1030,7 +1102,8 @@ omit =
homeassistant/components/solaredge/coordinator.py
homeassistant/components/solaredge/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/sensor.py
homeassistant/components/soma/__init__.py
@@ -1052,21 +1125,34 @@ omit =
homeassistant/components/sonos/favorites.py
homeassistant/components/sonos/helpers.py
homeassistant/components/sonos/household_coordinator.py
homeassistant/components/sonos/media.py
homeassistant/components/sonos/media_browser.py
homeassistant/components/sonos/media_player.py
homeassistant/components/sonos/speaker.py
homeassistant/components/sonos/switch.py
homeassistant/components/sony_projector/switch.py
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/spotify/__init__.py
homeassistant/components/spotify/browse_media.py
homeassistant/components/spotify/media_player.py
homeassistant/components/spotify/system_health.py
homeassistant/components/spotify/util.py
homeassistant/components/squeezebox/__init__.py
homeassistant/components/squeezebox/browse_media.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/steam_online/sensor.py
homeassistant/components/stiebel_eltron/*
@@ -1116,7 +1202,12 @@ omit =
homeassistant/components/system_bridge/coordinator.py
homeassistant/components/system_bridge/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/tankerkoenig/*
homeassistant/components/tapsaff/binary_sensor.py
@@ -1160,6 +1251,7 @@ omit =
homeassistant/components/tolo/climate.py
homeassistant/components/tolo/fan.py
homeassistant/components/tolo/light.py
homeassistant/components/tolo/number.py
homeassistant/components/tolo/select.py
homeassistant/components/tolo/sensor.py
homeassistant/components/tomato/device_tracker.py
@@ -1189,7 +1281,7 @@ omit =
homeassistant/components/tractive/switch.py
homeassistant/components/tradfri/__init__.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/fan.py
homeassistant/components/tradfri/light.py
@@ -1237,7 +1329,9 @@ omit =
homeassistant/components/upcloud/__init__.py
homeassistant/components/upcloud/binary_sensor.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/uscis/sensor.py
homeassistant/components/vallox/__init__.py
@@ -1251,6 +1345,7 @@ omit =
homeassistant/components/velbus/climate.py
homeassistant/components/velbus/const.py
homeassistant/components/velbus/cover.py
homeassistant/components/velbus/diagnostics.py
homeassistant/components/velbus/light.py
homeassistant/components/velbus/sensor.py
homeassistant/components/velbus/switch.py
@@ -1303,10 +1398,10 @@ omit =
homeassistant/components/watson_tts/tts.py
homeassistant/components/watttime/__init__.py
homeassistant/components/watttime/sensor.py
homeassistant/components/waze_travel_time/__init__.py
homeassistant/components/waze_travel_time/helpers.py
homeassistant/components/waze_travel_time/sensor.py
homeassistant/components/wiffi/*
homeassistant/components/wiffi/__init__.py
homeassistant/components/wiffi/binary_sensor.py
homeassistant/components/wiffi/sensor.py
homeassistant/components/wiffi/wiffi_strings.py
homeassistant/components/wirelesstag/*
homeassistant/components/wolflink/__init__.py
homeassistant/components/wolflink/sensor.py
@@ -1357,6 +1452,7 @@ omit =
homeassistant/components/yale_smart_alarm/binary_sensor.py
homeassistant/components/yale_smart_alarm/const.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/lock.py
homeassistant/components/yamaha_musiccast/__init__.py
@@ -1396,6 +1492,16 @@ omit =
homeassistant/components/zwave/util.py
homeassistant/components/zwave_js/discovery.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]
# Regexes for lines to exclude from consideration

View File

@@ -75,6 +75,17 @@ body:
attributes:
value: |
# 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
attributes:
label: Example YAML snippet

View File

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

View File

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

View File

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

View File

@@ -44,7 +44,7 @@ jobs:
echo "GRPC_PYTHON_BUILD_WITH_CYTHON=true"
echo "GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY=true"
# 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)
echo "GRPC_PYTHON_LDFLAGS=-lpthread -Wl,-wrap,memcpy -static-libgcc -lexecinfo"
) > .env_file
@@ -154,6 +154,7 @@ jobs:
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
sed -i "s|# bme680|bme680|g" ${requirement_file}
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
sed -i "s|# homeassistant-pyozw|homeassistant-pyozw|g" ${requirement_file}
done
- name: Build wheels

View File

@@ -5,7 +5,7 @@ repos:
- id: pyupgrade
args: [--py39-plus]
- repo: https://github.com/psf/black
rev: 21.12b0
rev: 22.1.0
hooks:
- id: black
args:
@@ -17,7 +17,7 @@ repos:
hooks:
- id: codespell
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"
- --quiet-level=2
exclude_types: [csv, json]
@@ -78,7 +78,7 @@ repos:
- id: python-typing-update
stages: [manual]
args:
- --py38-plus
- --py39-plus
- --force
- --keep-updates
files: ^(homeassistant|tests|script)/.+\.py$
@@ -114,11 +114,18 @@ repos:
pass_filenames: false
language: script
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
name: hassfest-metadata
entry: script/run-in-env.sh python3 -m script.hassfest -p metadata
pass_filenames: false
language: script
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
version: 2
build:
image: latest
os: ubuntu-20.04
tools:
python: "3.9"
python:
version: 3.8
setup_py_install: true
requirements_file: requirements_docs.txt
install:
- method: setuptools
path: .
- requirements: requirements_docs.txt

View File

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

4
.vscode/tasks.json vendored
View File

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

View File

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

View File

@@ -12,17 +12,18 @@ COPY requirements.txt homeassistant/
COPY homeassistant/package_constraints.txt homeassistant/homeassistant/
RUN \
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/
RUN \
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-r homeassistant/requirements_all.txt
sed -i "s|# homeassistant-pyozw|homeassistant-pyozw|g" 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
COPY . homeassistant/
RUN \
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
# Fix Bug with Alpine 3.14 and sqlite 3.35

View File

@@ -33,9 +33,9 @@ WORKDIR /workspaces
# Install Python dependencies from requirements
COPY requirements.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 ./
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/
# Set the default shell to bash instead of sh

View File

@@ -1,11 +1,11 @@
image: homeassistant/{arch}-homeassistant
shadow_repository: ghcr.io/home-assistant
build_from:
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2021.09.0
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2021.09.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2021.09.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2021.09.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2021.09.0
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2022.02.0
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2022.02.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2022.02.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2022.02.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2022.02.0
codenotary:
signer: 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"):
# 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)

View File

@@ -16,7 +16,7 @@ from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
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(
{
@@ -55,7 +55,7 @@ class MultiFactorAuthModule:
@property
def type(self) -> str:
"""Return type of the module."""
return self.config[CONF_TYPE] # type: ignore
return self.config[CONF_TYPE] # type: ignore[no-any-return]
@property
def name(self) -> str:
@@ -129,7 +129,7 @@ async def auth_mfa_module_from_config(
hass: HomeAssistant, config: dict[str, Any]
) -> MultiFactorAuthModule:
"""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)
try:
@@ -142,7 +142,7 @@ async def auth_mfa_module_from_config(
)
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:

View File

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

View File

@@ -107,7 +107,7 @@ class TotpAuthModule(MultiFactorAuthModule):
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
async def async_setup_flow(self, user_id: str) -> SetupFlow:
@@ -136,7 +136,7 @@ class TotpAuthModule(MultiFactorAuthModule):
if self._users is None:
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()
async def async_is_user_setup(self, user_id: str) -> bool:
@@ -144,7 +144,7 @@ class TotpAuthModule(MultiFactorAuthModule):
if self._users is None:
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:
"""Return True if validation passed."""
@@ -161,7 +161,7 @@ class TotpAuthModule(MultiFactorAuthModule):
"""Validate two factor authentication code."""
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
# to make timing the same as if user was found.
pyotp.TOTP(DUMMY_SECRET).verify(code, valid_window=1)
@@ -182,8 +182,8 @@ class TotpSetupFlow(SetupFlow):
self._auth_module: TotpAuthModule = auth_module
self._user = user
self._ota_secret: str = ""
self._url = None # type Optional[str]
self._image = None # type Optional[str]
self._url: str | None = None
self._image: str | None = None
async def async_step_init(
self, user_input: dict[str, str] | None = None
@@ -218,7 +218,7 @@ class TotpSetupFlow(SetupFlow):
self._url,
self._image,
) = await hass.async_add_executor_job(
_generate_secret_and_qr_code, # type: ignore
_generate_secret_and_qr_code,
str(self._user.name),
)

View File

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

View File

@@ -120,7 +120,7 @@ class Data:
@property
def users(self) -> list[dict[str, str]]:
"""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:
"""Validate a username and password.

View File

@@ -8,7 +8,7 @@ from .util.async_ import protect_loop
def enable() -> None:
"""Enable the detection of blocking calls in the 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
time.sleep = protect_loop(time.sleep, strict=False)

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
import asyncio
import contextlib
from datetime import datetime
from datetime import datetime, timedelta
import logging
import logging.handlers
import os
@@ -59,7 +59,7 @@ COOLDOWN_TIME = 60
MAX_LOAD_CONCURRENTLY = 6
DEBUGGER_INTEGRATIONS = {"debugpy"}
CORE_INTEGRATIONS = ("homeassistant", "persistent_notification")
CORE_INTEGRATIONS = {"homeassistant", "persistent_notification"}
LOGGING_INTEGRATIONS = {
# Set log levels
"logger",
@@ -69,7 +69,14 @@ LOGGING_INTEGRATIONS = {
# To record data
"recorder",
}
DISCOVERY_INTEGRATIONS = ("dhcp", "ssdp", "usb", "zeroconf")
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
"mqtt_eventstream",
# To provide account link implementations
@@ -151,8 +158,11 @@ async def async_setup_hass(
safe_mode = True
old_config = hass.config
old_logging = hass.data.get(DATA_LOGGING)
hass = core.HomeAssistant()
if old_logging:
hass.data[DATA_LOGGING] = old_logging
hass.config.skip_pip = old_config.skip_pip
hass.config.internal_url = old_config.internal_url
hass.config.external_url = old_config.external_url
@@ -314,7 +324,7 @@ def async_enable_logging(
logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
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(
"Uncaught thread exception",
@@ -450,7 +460,7 @@ async def _async_set_up_integrations(
) -> None:
"""Set up all the integrations."""
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))
@@ -459,9 +469,9 @@ async def _async_set_up_integrations(
# Resolve all dependencies so we know all integrations
# that will have to be loaded and start rightaway
integration_cache: dict[str, loader.Integration] = {}
to_resolve = domains_to_setup
to_resolve: set[str] = domains_to_setup
while to_resolve:
old_to_resolve = to_resolve
old_to_resolve: set[str] = to_resolve
to_resolve = set()
integrations_to_process = [
@@ -508,11 +518,11 @@ async def _async_set_up_integrations(
await async_setup_multi_components(hass, debuggers, config)
# 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
# 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:
old_deps_promotion = deps_promotion
deps_promotion = set()
@@ -577,7 +587,7 @@ async def _async_set_up_integrations(
{
integration: timedelta.total_seconds()
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
) -> bytes | None:
"""Get a camera image."""
if not self.capture():
return None
self.refresh_image()
if self._response:

View File

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

View File

@@ -1,11 +1,33 @@
{
"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": {
"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": {
"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": {
"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"
}
}

View File

@@ -1,14 +1,34 @@
{
"config": {
"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": {
"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": {
"data": {
"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": {
"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",
"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": {
"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": {
"abort": {
"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": {
"cannot_connect": "\u9023\u7dda\u5931\u6557",

View File

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

View File

@@ -1,7 +1,21 @@
{
"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": {
"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.",
"title": "AccuWeather"
}
@@ -12,12 +26,15 @@
"user": {
"data": {
"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": {
"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"
}
}

View File

@@ -1,12 +1,22 @@
{
"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": {
"user": {
"data": {
"api_key": "Chave API",
"api_key": "Chave da API",
"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"
}
}
@@ -17,8 +27,15 @@
"data": {
"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": {
"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": {
"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": {
"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": {
"cannot_connect": "\u9023\u7dda\u5931\u6557",

View File

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

View File

@@ -1,5 +1,8 @@
{
"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": {
"user": {
"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):
"""Set new target temperature."""
temperature = kwargs.get(ATTR_TEMPERATURE)
if temperature is None:
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
return
await self._adax_data_handler.set_target_temperature(temperature)

View File

@@ -9,5 +9,6 @@
"codeowners": [
"@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": {
"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": {
"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": {
"data": {
"account_id": "ID de cuenta",
"connection_type": "Seleccione el tipo de conexi\u00f3n"
},
"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(
entry_type=DeviceEntryType.SERVICE,
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",
name="AdGuard Home",

View File

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

View File

@@ -1,5 +1,9 @@
{
"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": {
"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"
},
"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."
}
}

View File

@@ -1,19 +1,25 @@
{
"config": {
"abort": {
"already_configured": "O servi\u00e7o j\u00e1 est\u00e1 configurado",
"existing_instance_updated": "Configura\u00e7\u00e3o existente atualizada."
},
"error": {
"cannot_connect": "Falha ao conectar"
},
"step": {
"hassio_confirm": {
"description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo complemento Supervisor: {addon} ?",
"title": "AdGuard Home via add-on Supervisor"
"description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo add-on {addon}?",
"title": "AdGuard Home via add-on"
},
"user": {
"data": {
"host": "Nome do host",
"password": "Senha",
"ssl": "O AdGuard Home usa um certificado SSL",
"port": "Porta",
"ssl": "Usar um certificado SSL",
"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."
}

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",
"requirements": ["pyads==3.2.2"],
"codeowners": [],
"iot_class": "local_push"
"iot_class": "local_push",
"loggers": ["pyads"]
}

View File

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

View File

@@ -1,7 +1,17 @@
{
"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": {
"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.",
"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",
"requirements": ["AEMET-OpenData==0.2.1"],
"codeowners": [],
"iot_class": "cloud_polling"
"iot_class": "cloud_polling",
"loggers": ["aemet_opendata"]
}

View File

@@ -1,8 +1,17 @@
{
"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": {
"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 \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",

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": [],
"iot_class": "cloud_polling"
}
}

View File

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

View File

@@ -5,13 +5,8 @@ import logging
from agent import AgentError
from homeassistant.components.camera import SUPPORT_ON_OFF
from homeassistant.components.mjpeg.camera import (
CONF_MJPEG_URL,
CONF_STILL_IMAGE_URL,
MjpegCamera,
filter_urllib3_logging,
)
from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME
from homeassistant.components.mjpeg import MjpegCamera, filter_urllib3_logging
from homeassistant.const import ATTR_ATTRIBUTION
from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity import DeviceInfo
@@ -70,16 +65,15 @@ class AgentCamera(MjpegCamera):
def __init__(self, device):
"""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._removed = False
self._attr_name = f"{device.client.name} {device.name}"
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(
identifiers={(AGENT_DOMAIN, self.unique_id)},
manufacturer="Agent",

View File

@@ -5,5 +5,6 @@
"requirements": ["agent-py==0.0.23"],
"config_flow": true,
"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": {
"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": {
"user": {
"data": {
"host": "Nome do host",
"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"],
"config_flow": true,
"quality_scale": "platinum",
"iot_class": "cloud_polling"
"iot_class": "cloud_polling",
"loggers": ["airly"]
}

View File

@@ -1,11 +1,28 @@
{
"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": {
"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": {
"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_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",
"requirements": ["pyairnow==1.1.0"],
"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": [
"@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": {
"user": {
"data": {
"description": "Inicie sesi\u00f3n en {url} para encontrar sus credenciales",
"id": "ID",
"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": [
"@LonePurpleWolf"
],
"iot_class": "local_polling"
"iot_class": "local_polling",
"loggers": ["airtouch4pyapi"]
}

View File

@@ -1,7 +1,17 @@
{
"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": {
"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}."
}
}

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",
"requirements": ["pyairvisual==5.0.9"],
"codeowners": ["@bachya"],
"iot_class": "cloud_polling"
"iot_class": "cloud_polling",
"loggers": ["pyairvisual", "pysmb"]
}

View File

@@ -1,13 +1,61 @@
{
"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": {
"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": {
"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": {
"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"
},
"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"
}
}

View File

@@ -1,14 +1,62 @@
{
"config": {
"abort": {
"already_configured": "Localiza\u00e7\u00e3o j\u00e1 est\u00e1 configurada",
"reauth_successful": "A reautentica\u00e7\u00e3o foi bem-sucedida"
},
"error": {
"general_error": "Ocorreu um erro desconhecido.",
"invalid_api_key": "Chave de API fornecida \u00e9 inv\u00e1lida."
"cannot_connect": "Falha ao conectar",
"general_error": "Erro inesperado",
"invalid_api_key": "Chave de API inv\u00e1lida",
"location_not_found": "Localiza\u00e7\u00e3o n\u00e3o encontrada"
},
"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": {
"data": {
"ip_address": "Nome do host",
"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",
"requirements": ["aladdin_connect==0.4"],
"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_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_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}",
"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": {
"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_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",
"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_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_vacation": "\u039f\u03c0\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ce\u03bd",
"arming": "\u038c\u03c0\u03bb\u03b9\u03c3\u03b7",
"disarmed": "\u0391\u03c6\u03bf\u03c0\u03bb\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2",
"disarming": "\u0391\u03c6\u03cc\u03c0\u03bb\u03b9\u03c3\u03b7",

View File

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

View File

@@ -155,7 +155,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return True
async def _update_listener(hass: HomeAssistant, entry: ConfigEntry):
async def _update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Handle options update."""
_LOGGER.debug("AlarmDecoder options updated: %s", entry.as_dict()["options"])
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_type = zone_type
self._attr_name = zone_name
self._attr_is_on = False
self._rfid = zone_rfid
self._loop = zone_loop
self._relay_addr = relay_addr

View File

@@ -3,7 +3,8 @@
"name": "AlarmDecoder",
"documentation": "https://www.home-assistant.io/integrations/alarmdecoder",
"requirements": ["adext==0.4.2"],
"codeowners": ["@ajschmidt8"],
"codeowners": [],
"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