This commit is contained in:
Franck Nijhof 2022-10-05 20:13:12 +02:00 committed by GitHub
commit eb003f34f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3620 changed files with 84378 additions and 33432 deletions

View File

@ -8,9 +8,6 @@ omit =
# omit pieces of code that rely on external devices being present
homeassistant/components/acer_projector/*
homeassistant/components/actiontec/const.py
homeassistant/components/actiontec/device_tracker.py
homeassistant/components/actiontec/model.py
homeassistant/components/acmeda/__init__.py
homeassistant/components/acmeda/base.py
homeassistant/components/acmeda/const.py
@ -19,6 +16,9 @@ omit =
homeassistant/components/acmeda/helpers.py
homeassistant/components/acmeda/hub.py
homeassistant/components/acmeda/sensor.py
homeassistant/components/actiontec/const.py
homeassistant/components/actiontec/device_tracker.py
homeassistant/components/actiontec/model.py
homeassistant/components/adax/__init__.py
homeassistant/components/adax/climate.py
homeassistant/components/adguard/__init__.py
@ -62,14 +62,17 @@ omit =
homeassistant/components/androidtv/diagnostics.py
homeassistant/components/anel_pwrctrl/switch.py
homeassistant/components/anthemav/media_player.py
homeassistant/components/apcupsd/*
homeassistant/components/apcupsd/__init__.py
homeassistant/components/apcupsd/binary_sensor.py
homeassistant/components/apcupsd/sensor.py
homeassistant/components/apple_tv/__init__.py
homeassistant/components/apple_tv/browse_media.py
homeassistant/components/apple_tv/media_player.py
homeassistant/components/apple_tv/remote.py
homeassistant/components/aqualogic/*
homeassistant/components/aquostv/media_player.py
homeassistant/components/arcam_fmj/media_player.py
homeassistant/components/arcam_fmj/__init__.py
homeassistant/components/arcam_fmj/media_player.py
homeassistant/components/arest/binary_sensor.py
homeassistant/components/arest/sensor.py
homeassistant/components/arest/switch.py
@ -106,9 +109,9 @@ omit =
homeassistant/components/baf/switch.py
homeassistant/components/baidu/tts.py
homeassistant/components/balboa/__init__.py
homeassistant/components/beewi_smartclim/sensor.py
homeassistant/components/bbox/device_tracker.py
homeassistant/components/bbox/sensor.py
homeassistant/components/beewi_smartclim/sensor.py
homeassistant/components/bitcoin/sensor.py
homeassistant/components/bizkaibus/sensor.py
homeassistant/components/blink/__init__.py
@ -138,6 +141,7 @@ omit =
homeassistant/components/bosch_shc/sensor.py
homeassistant/components/bosch_shc/switch.py
homeassistant/components/braviatv/__init__.py
homeassistant/components/braviatv/button.py
homeassistant/components/braviatv/const.py
homeassistant/components/braviatv/coordinator.py
homeassistant/components/braviatv/entity.py
@ -152,8 +156,8 @@ omit =
homeassistant/components/brottsplatskartan/sensor.py
homeassistant/components/browser/*
homeassistant/components/brunt/__init__.py
homeassistant/components/brunt/cover.py
homeassistant/components/brunt/const.py
homeassistant/components/brunt/cover.py
homeassistant/components/bsblan/climate.py
homeassistant/components/bt_home_hub_5/device_tracker.py
homeassistant/components/bt_smarthub/device_tracker.py
@ -180,20 +184,20 @@ omit =
homeassistant/components/concord232/alarm_control_panel.py
homeassistant/components/concord232/binary_sensor.py
homeassistant/components/control4/__init__.py
homeassistant/components/control4/light.py
homeassistant/components/control4/const.py
homeassistant/components/control4/director_utils.py
homeassistant/components/control4/light.py
homeassistant/components/coolmaster/__init__.py
homeassistant/components/coolmaster/climate.py
homeassistant/components/coolmaster/const.py
homeassistant/components/cppm_tracker/device_tracker.py
homeassistant/components/crownstone/__init__.py
homeassistant/components/crownstone/const.py
homeassistant/components/crownstone/listeners.py
homeassistant/components/crownstone/helpers.py
homeassistant/components/crownstone/devices.py
homeassistant/components/crownstone/entry_manager.py
homeassistant/components/crownstone/helpers.py
homeassistant/components/crownstone/light.py
homeassistant/components/crownstone/listeners.py
homeassistant/components/cups/sensor.py
homeassistant/components/currencylayer/sensor.py
homeassistant/components/daikin/__init__.py
@ -236,7 +240,9 @@ omit =
homeassistant/components/doorbird/util.py
homeassistant/components/dovado/*
homeassistant/components/downloader/*
homeassistant/components/dsmr_reader/*
homeassistant/components/dsmr_reader/__init__.py
homeassistant/components/dsmr_reader/definitions.py
homeassistant/components/dsmr_reader/sensor.py
homeassistant/components/dte_energy_bridge/sensor.py
homeassistant/components/dublin_bus_transport/sensor.py
homeassistant/components/dunehd/__init__.py
@ -260,15 +266,15 @@ omit =
homeassistant/components/econet/const.py
homeassistant/components/econet/sensor.py
homeassistant/components/econet/water_heater.py
homeassistant/components/ecovacs/*
homeassistant/components/ecowitt/__init__.py
homeassistant/components/ecowitt/binary_sensor.py
homeassistant/components/ecowitt/diagnostics.py
homeassistant/components/ecowitt/entity.py
homeassistant/components/ecowitt/sensor.py
homeassistant/components/ecovacs/*
homeassistant/components/edl21/*
homeassistant/components/eddystone_temperature/sensor.py
homeassistant/components/edimax/switch.py
homeassistant/components/edl21/*
homeassistant/components/egardia/*
homeassistant/components/eight_sleep/__init__.py
homeassistant/components/eight_sleep/binary_sensor.py
@ -284,9 +290,9 @@ omit =
homeassistant/components/elkm1/sensor.py
homeassistant/components/elkm1/switch.py
homeassistant/components/elmax/__init__.py
homeassistant/components/elmax/binary_sensor.py
homeassistant/components/elmax/common.py
homeassistant/components/elmax/const.py
homeassistant/components/elmax/binary_sensor.py
homeassistant/components/elmax/switch.py
homeassistant/components/elv/*
homeassistant/components/emby/media_player.py
@ -317,16 +323,17 @@ omit =
homeassistant/components/epson/media_player.py
homeassistant/components/epsonworkforce/sensor.py
homeassistant/components/eq3btsmart/climate.py
homeassistant/components/escea/__init__.py
homeassistant/components/escea/climate.py
homeassistant/components/escea/discovery.py
homeassistant/components/escea/__init__.py
homeassistant/components/esphome/__init__.py
homeassistant/components/esphome/binary_sensor.py
homeassistant/components/esphome/bluetooth.py
homeassistant/components/esphome/bluetooth/*
homeassistant/components/esphome/button.py
homeassistant/components/esphome/camera.py
homeassistant/components/esphome/climate.py
homeassistant/components/esphome/cover.py
homeassistant/components/esphome/domain_data.py
homeassistant/components/esphome/entry_data.py
homeassistant/components/esphome/fan.py
homeassistant/components/esphome/light.py
@ -341,16 +348,16 @@ omit =
homeassistant/components/everlights/light.py
homeassistant/components/evohome/*
homeassistant/components/ezviz/__init__.py
homeassistant/components/ezviz/camera.py
homeassistant/components/ezviz/coordinator.py
homeassistant/components/ezviz/const.py
homeassistant/components/ezviz/entity.py
homeassistant/components/ezviz/binary_sensor.py
homeassistant/components/ezviz/camera.py
homeassistant/components/ezviz/const.py
homeassistant/components/ezviz/coordinator.py
homeassistant/components/ezviz/entity.py
homeassistant/components/ezviz/sensor.py
homeassistant/components/ezviz/switch.py
homeassistant/components/familyhub/camera.py
homeassistant/components/faa_delays/__init__.py
homeassistant/components/faa_delays/binary_sensor.py
homeassistant/components/familyhub/camera.py
homeassistant/components/fastdotcom/*
homeassistant/components/ffmpeg/camera.py
homeassistant/components/fibaro/__init__.py
@ -401,9 +408,6 @@ omit =
homeassistant/components/flume/coordinator.py
homeassistant/components/flume/entity.py
homeassistant/components/flume/sensor.py
homeassistant/components/flunearyou/__init__.py
homeassistant/components/flunearyou/repairs.py
homeassistant/components/flunearyou/sensor.py
homeassistant/components/folder/sensor.py
homeassistant/components/folder_watcher/*
homeassistant/components/foobot/sensor.py
@ -423,8 +427,8 @@ omit =
homeassistant/components/fritz/services.py
homeassistant/components/fritz/switch.py
homeassistant/components/fritzbox_callmonitor/__init__.py
homeassistant/components/fritzbox_callmonitor/const.py
homeassistant/components/fritzbox_callmonitor/base.py
homeassistant/components/fritzbox_callmonitor/const.py
homeassistant/components/fritzbox_callmonitor/sensor.py
homeassistant/components/frontier_silicon/const.py
homeassistant/components/frontier_silicon/media_player.py
@ -460,8 +464,8 @@ omit =
homeassistant/components/gpsd/sensor.py
homeassistant/components/greenwave/light.py
homeassistant/components/group/notify.py
homeassistant/components/growatt_server/sensor.py
homeassistant/components/growatt_server/__init__.py
homeassistant/components/growatt_server/sensor.py
homeassistant/components/gstreamer/media_player.py
homeassistant/components/gtfs/sensor.py
homeassistant/components/guardian/__init__.py
@ -507,9 +511,9 @@ omit =
homeassistant/components/home_connect/light.py
homeassistant/components/home_connect/sensor.py
homeassistant/components/home_connect/switch.py
homeassistant/components/homematic/*
homeassistant/components/home_plus_control/api.py
homeassistant/components/home_plus_control/switch.py
homeassistant/components/homematic/*
homeassistant/components/homeworks/*
homeassistant/components/honeywell/__init__.py
homeassistant/components/honeywell/climate.py
@ -533,9 +537,9 @@ omit =
homeassistant/components/hunterdouglas_powerview/sensor.py
homeassistant/components/hunterdouglas_powerview/shade_data.py
homeassistant/components/hunterdouglas_powerview/util.py
homeassistant/components/hvv_departures/__init__.py
homeassistant/components/hvv_departures/binary_sensor.py
homeassistant/components/hvv_departures/sensor.py
homeassistant/components/hvv_departures/__init__.py
homeassistant/components/hydrawise/*
homeassistant/components/ialarm/alarm_control_panel.py
homeassistant/components/iammeter/sensor.py
@ -548,9 +552,6 @@ omit =
homeassistant/components/icloud/account.py
homeassistant/components/icloud/device_tracker.py
homeassistant/components/icloud/sensor.py
homeassistant/components/izone/climate.py
homeassistant/components/izone/discovery.py
homeassistant/components/izone/__init__.py
homeassistant/components/idteck_prox/*
homeassistant/components/ifttt/__init__.py
homeassistant/components/ifttt/alarm_control_panel.py
@ -559,6 +560,7 @@ omit =
homeassistant/components/ihc/*
homeassistant/components/imap/sensor.py
homeassistant/components/imap_email_content/sensor.py
homeassistant/components/incomfort/*
homeassistant/components/insteon/binary_sensor.py
homeassistant/components/insteon/climate.py
homeassistant/components/insteon/const.py
@ -571,13 +573,13 @@ omit =
homeassistant/components/insteon/switch.py
homeassistant/components/insteon/utils.py
homeassistant/components/intellifire/__init__.py
homeassistant/components/intellifire/coordinator.py
homeassistant/components/intellifire/climate.py
homeassistant/components/intellifire/binary_sensor.py
homeassistant/components/intellifire/climate.py
homeassistant/components/intellifire/coordinator.py
homeassistant/components/intellifire/entity.py
homeassistant/components/intellifire/fan.py
homeassistant/components/intellifire/sensor.py
homeassistant/components/intellifire/switch.py
homeassistant/components/intellifire/entity.py
homeassistant/components/incomfort/*
homeassistant/components/intesishome/*
homeassistant/components/ios/__init__.py
homeassistant/components/ios/notify.py
@ -603,6 +605,9 @@ omit =
homeassistant/components/isy994/util.py
homeassistant/components/itach/remote.py
homeassistant/components/itunes/media_player.py
homeassistant/components/izone/__init__.py
homeassistant/components/izone/climate.py
homeassistant/components/izone/discovery.py
homeassistant/components/jellyfin/__init__.py
homeassistant/components/jellyfin/media_source.py
homeassistant/components/joaoapps_join/*
@ -628,6 +633,11 @@ omit =
homeassistant/components/kef/*
homeassistant/components/keyboard/*
homeassistant/components/keyboard_remote/*
homeassistant/components/keymitt_ble/__init__.py
homeassistant/components/keymitt_ble/const.py
homeassistant/components/keymitt_ble/entity.py
homeassistant/components/keymitt_ble/switch.py
homeassistant/components/keymitt_ble/coordinator.py
homeassistant/components/kira/*
homeassistant/components/kiwi/lock.py
homeassistant/components/kodi/__init__.py
@ -647,10 +657,6 @@ omit =
homeassistant/components/kostal_plenticore/switch.py
homeassistant/components/kwb/sensor.py
homeassistant/components/lacrosse/sensor.py
homeassistant/components/lametric/__init__.py
homeassistant/components/lametric/button.py
homeassistant/components/lametric/coordinator.py
homeassistant/components/lametric/entity.py
homeassistant/components/lametric/notify.py
homeassistant/components/lametric/number.py
homeassistant/components/lannouncer/notify.py
@ -668,6 +674,9 @@ omit =
homeassistant/components/led_ble/util.py
homeassistant/components/lg_netcast/media_player.py
homeassistant/components/lg_soundbar/media_player.py
homeassistant/components/lidarr/__init__.py
homeassistant/components/lidarr/coordinator.py
homeassistant/components/lidarr/sensor.py
homeassistant/components/life360/__init__.py
homeassistant/components/life360/const.py
homeassistant/components/life360/coordinator.py
@ -686,13 +695,13 @@ omit =
homeassistant/components/logi_circle/sensor.py
homeassistant/components/london_underground/sensor.py
homeassistant/components/lookin/__init__.py
homeassistant/components/lookin/climate.py
homeassistant/components/lookin/coordinator.py
homeassistant/components/lookin/entity.py
homeassistant/components/lookin/light.py
homeassistant/components/lookin/media_player.py
homeassistant/components/lookin/models.py
homeassistant/components/lookin/sensor.py
homeassistant/components/lookin/climate.py
homeassistant/components/lookin/media_player.py
homeassistant/components/lookin/light.py
homeassistant/components/luci/device_tracker.py
homeassistant/components/luftdaten/sensor.py
homeassistant/components/lupusec/*
@ -728,7 +737,6 @@ omit =
homeassistant/components/melnor/__init__.py
homeassistant/components/melnor/const.py
homeassistant/components/melnor/models.py
homeassistant/components/melnor/switch.py
homeassistant/components/message_bird/notify.py
homeassistant/components/met/weather.py
homeassistant/components/met_eireann/__init__.py
@ -778,9 +786,11 @@ omit =
homeassistant/components/mullvad/binary_sensor.py
homeassistant/components/mutesync/__init__.py
homeassistant/components/mutesync/binary_sensor.py
homeassistant/components/nest/const.py
homeassistant/components/mvglive/sensor.py
homeassistant/components/mycroft/*
homeassistant/components/myq/__init__.py
homeassistant/components/myq/cover.py
homeassistant/components/myq/light.py
homeassistant/components/mysensors/__init__.py
homeassistant/components/mysensors/binary_sensor.py
homeassistant/components/mysensors/climate.py
@ -796,9 +806,6 @@ omit =
homeassistant/components/mystrom/binary_sensor.py
homeassistant/components/mystrom/light.py
homeassistant/components/mystrom/switch.py
homeassistant/components/myq/__init__.py
homeassistant/components/myq/cover.py
homeassistant/components/myq/light.py
homeassistant/components/nad/media_player.py
homeassistant/components/nanoleaf/__init__.py
homeassistant/components/nanoleaf/button.py
@ -814,6 +821,7 @@ omit =
homeassistant/components/neato/switch.py
homeassistant/components/neato/vacuum.py
homeassistant/components/nederlandse_spoorwegen/sensor.py
homeassistant/components/nest/const.py
homeassistant/components/nest/legacy/*
homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/__init__.py
@ -826,36 +834,44 @@ omit =
homeassistant/components/netgear_lte/*
homeassistant/components/netio/switch.py
homeassistant/components/neurio_energy/sensor.py
homeassistant/components/nexia/entity.py
homeassistant/components/nexia/climate.py
homeassistant/components/nexia/entity.py
homeassistant/components/nexia/switch.py
homeassistant/components/nextcloud/*
homeassistant/components/nfandroidtv/__init__.py
homeassistant/components/nfandroidtv/notify.py
homeassistant/components/nibe_heatpump/__init__.py
homeassistant/components/nibe_heatpump/binary_sensor.py
homeassistant/components/nibe_heatpump/number.py
homeassistant/components/nibe_heatpump/select.py
homeassistant/components/nibe_heatpump/sensor.py
homeassistant/components/nibe_heatpump/switch.py
homeassistant/components/niko_home_control/light.py
homeassistant/components/nilu/air_quality.py
homeassistant/components/nissan_leaf/*
homeassistant/components/nmap_tracker/__init__.py
homeassistant/components/nmap_tracker/device_tracker.py
homeassistant/components/nmbs/sensor.py
homeassistant/components/noaa_tides/sensor.py
homeassistant/components/nobo_hub/__init__.py
homeassistant/components/nobo_hub/climate.py
homeassistant/components/norway_air/air_quality.py
homeassistant/components/notify_events/notify.py
homeassistant/components/notion/__init__.py
homeassistant/components/notion/binary_sensor.py
homeassistant/components/notion/sensor.py
homeassistant/components/noaa_tides/sensor.py
homeassistant/components/norway_air/air_quality.py
homeassistant/components/notify_events/notify.py
homeassistant/components/nsw_fuel_station/sensor.py
homeassistant/components/nuki/__init__.py
homeassistant/components/nuki/const.py
homeassistant/components/nuki/binary_sensor.py
homeassistant/components/nuki/const.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/oasa_telematics/sensor.py
homeassistant/components/obihai/*
homeassistant/components/octoprint/__init__.py
homeassistant/components/oem/climate.py
homeassistant/components/oasa_telematics/sensor.py
homeassistant/components/ohmconnect/sensor.py
homeassistant/components/ombi/*
homeassistant/components/omnilogic/__init__.py
@ -889,8 +905,8 @@ omit =
homeassistant/components/opengarage/entity.py
homeassistant/components/opengarage/sensor.py
homeassistant/components/openhome/__init__.py
homeassistant/components/openhome/media_player.py
homeassistant/components/openhome/const.py
homeassistant/components/openhome/media_player.py
homeassistant/components/opensensemap/air_quality.py
homeassistant/components/opensky/sensor.py
homeassistant/components/opentherm_gw/__init__.py
@ -915,9 +931,9 @@ omit =
homeassistant/components/overkiz/button.py
homeassistant/components/overkiz/climate.py
homeassistant/components/overkiz/climate_entities/*
homeassistant/components/overkiz/coordinator.py
homeassistant/components/overkiz/cover.py
homeassistant/components/overkiz/cover_entities/*
homeassistant/components/overkiz/coordinator.py
homeassistant/components/overkiz/diagnostics.py
homeassistant/components/overkiz/entity.py
homeassistant/components/overkiz/executor.py
@ -946,8 +962,8 @@ omit =
homeassistant/components/picotts/tts.py
homeassistant/components/pilight/*
homeassistant/components/ping/__init__.py
homeassistant/components/ping/const.py
homeassistant/components/ping/binary_sensor.py
homeassistant/components/ping/const.py
homeassistant/components/ping/device_tracker.py
homeassistant/components/pioneer/media_player.py
homeassistant/components/pjlink/media_player.py
@ -966,13 +982,13 @@ omit =
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
homeassistant/components/poolsense/sensor.py
homeassistant/components/powerwall/__init__.py
homeassistant/components/proliphix/climate.py
homeassistant/components/progettihwsw/__init__.py
homeassistant/components/progettihwsw/binary_sensor.py
homeassistant/components/progettihwsw/switch.py
homeassistant/components/proliphix/climate.py
homeassistant/components/prowl/notify.py
homeassistant/components/proxmoxve/*
homeassistant/components/proxy/camera.py
@ -993,14 +1009,13 @@ omit =
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/__init__.py
homeassistant/components/radiotherm/entity.py
homeassistant/components/radiotherm/climate.py
homeassistant/components/radiotherm/coordinator.py
homeassistant/components/radiotherm/data.py
homeassistant/components/radiotherm/entity.py
homeassistant/components/radiotherm/switch.py
homeassistant/components/radiotherm/util.py
homeassistant/components/rainbird/*
@ -1009,6 +1024,7 @@ omit =
homeassistant/components/rainmachine/binary_sensor.py
homeassistant/components/rainmachine/button.py
homeassistant/components/rainmachine/model.py
homeassistant/components/rainmachine/select.py
homeassistant/components/rainmachine/sensor.py
homeassistant/components/rainmachine/switch.py
homeassistant/components/rainmachine/update.py
@ -1021,9 +1037,9 @@ omit =
homeassistant/components/reddit/*
homeassistant/components/rejseplanen/sensor.py
homeassistant/components/remember_the_milk/__init__.py
homeassistant/components/remote_rpi_gpio/*
homeassistant/components/repetier/__init__.py
homeassistant/components/repetier/sensor.py
homeassistant/components/remote_rpi_gpio/*
homeassistant/components/rest/notify.py
homeassistant/components/rest/switch.py
homeassistant/components/rfxtrx/diagnostics.py
@ -1085,8 +1101,6 @@ omit =
homeassistant/components/sesame/lock.py
homeassistant/components/seven_segments/image_processing.py
homeassistant/components/seventeentrack/sensor.py
homeassistant/components/shiftr/*
homeassistant/components/shodan/sensor.py
homeassistant/components/shelly/__init__.py
homeassistant/components/shelly/binary_sensor.py
homeassistant/components/shelly/climate.py
@ -1095,15 +1109,26 @@ omit =
homeassistant/components/shelly/number.py
homeassistant/components/shelly/sensor.py
homeassistant/components/shelly/utils.py
homeassistant/components/shiftr/*
homeassistant/components/shodan/sensor.py
homeassistant/components/sia/__init__.py
homeassistant/components/sia/alarm_control_panel.py
homeassistant/components/sia/binary_sensor.py
homeassistant/components/sia/const.py
homeassistant/components/sia/hub.py
homeassistant/components/sia/sia_entity_base.py
homeassistant/components/sia/utils.py
homeassistant/components/sigfox/sensor.py
homeassistant/components/simplepush/__init__.py
homeassistant/components/simplepush/notify.py
homeassistant/components/simplisafe/__init__.py
homeassistant/components/simplisafe/alarm_control_panel.py
homeassistant/components/simplisafe/binary_sensor.py
homeassistant/components/simplisafe/button.py
homeassistant/components/simplisafe/lock.py
homeassistant/components/simplisafe/sensor.py
homeassistant/components/simulated/sensor.py
homeassistant/components/sinch/*
homeassistant/components/sisyphus/*
homeassistant/components/sky_hub/*
homeassistant/components/skybeacon/sensor.py
@ -1117,15 +1142,9 @@ omit =
homeassistant/components/skybell/switch.py
homeassistant/components/slack/__init__.py
homeassistant/components/slack/notify.py
homeassistant/components/sia/__init__.py
homeassistant/components/sia/alarm_control_panel.py
homeassistant/components/sia/binary_sensor.py
homeassistant/components/sia/const.py
homeassistant/components/sia/hub.py
homeassistant/components/sia/utils.py
homeassistant/components/sia/sia_entity_base.py
homeassistant/components/sinch/*
homeassistant/components/slide/*
homeassistant/components/slimproto/__init__.py
homeassistant/components/slimproto/media_player.py
homeassistant/components/sma/__init__.py
homeassistant/components/sma/sensor.py
homeassistant/components/smappee/__init__.py
@ -1180,8 +1199,6 @@ omit =
homeassistant/components/spotify/media_player.py
homeassistant/components/spotify/system_health.py
homeassistant/components/spotify/util.py
homeassistant/components/slimproto/__init__.py
homeassistant/components/slimproto/media_player.py
homeassistant/components/squeezebox/__init__.py
homeassistant/components/squeezebox/browse_media.py
homeassistant/components/squeezebox/media_player.py
@ -1203,22 +1220,29 @@ omit =
homeassistant/components/streamlabswater/*
homeassistant/components/suez_water/*
homeassistant/components/supervisord/sensor.py
homeassistant/components/supla/*
homeassistant/components/surepetcare/__init__.py
homeassistant/components/surepetcare/entity.py
homeassistant/components/surepetcare/binary_sensor.py
homeassistant/components/surepetcare/entity.py
homeassistant/components/surepetcare/sensor.py
homeassistant/components/swiss_hydrological_data/sensor.py
homeassistant/components/swiss_public_transport/sensor.py
homeassistant/components/swisscom/device_tracker.py
homeassistant/components/switchbot/switch.py
homeassistant/components/switchbot/binary_sensor.py
homeassistant/components/switchbee/__init__.py
homeassistant/components/switchbee/button.py
homeassistant/components/switchbee/coordinator.py
homeassistant/components/switchbee/entity.py
homeassistant/components/switchbee/light.py
homeassistant/components/switchbee/switch.py
homeassistant/components/switchbot/__init__.py
homeassistant/components/switchbot/binary_sensor.py
homeassistant/components/switchbot/const.py
homeassistant/components/switchbot/entity.py
homeassistant/components/switchbot/coordinator.py
homeassistant/components/switchbot/cover.py
homeassistant/components/switchbot/entity.py
homeassistant/components/switchbot/light.py
homeassistant/components/switchbot/sensor.py
homeassistant/components/switchbot/coordinator.py
homeassistant/components/switchbot/switch.py
homeassistant/components/switchmate/switch.py
homeassistant/components/syncthing/__init__.py
homeassistant/components/syncthing/sensor.py
@ -1230,9 +1254,9 @@ omit =
homeassistant/components/synology_dsm/binary_sensor.py
homeassistant/components/synology_dsm/button.py
homeassistant/components/synology_dsm/camera.py
homeassistant/components/synology_dsm/common.py
homeassistant/components/synology_dsm/coordinator.py
homeassistant/components/synology_dsm/diagnostics.py
homeassistant/components/synology_dsm/common.py
homeassistant/components/synology_dsm/entity.py
homeassistant/components/synology_dsm/sensor.py
homeassistant/components/synology_dsm/service.py
@ -1318,8 +1342,8 @@ omit =
homeassistant/components/totalconnect/const.py
homeassistant/components/touchline/climate.py
homeassistant/components/tplink_lte/*
homeassistant/components/traccar/device_tracker.py
homeassistant/components/traccar/const.py
homeassistant/components/traccar/device_tracker.py
homeassistant/components/tractive/__init__.py
homeassistant/components/tractive/binary_sensor.py
homeassistant/components/tractive/device_tracker.py
@ -1340,10 +1364,10 @@ omit =
homeassistant/components/trafikverket_weatherstation/__init__.py
homeassistant/components/trafikverket_weatherstation/coordinator.py
homeassistant/components/trafikverket_weatherstation/sensor.py
homeassistant/components/transmission/sensor.py
homeassistant/components/transmission/switch.py
homeassistant/components/transmission/const.py
homeassistant/components/transmission/errors.py
homeassistant/components/transmission/sensor.py
homeassistant/components/transmission/switch.py
homeassistant/components/travisci/sensor.py
homeassistant/components/tuya/__init__.py
homeassistant/components/tuya/alarm_control_panel.py
@ -1372,21 +1396,20 @@ omit =
homeassistant/components/ubus/device_tracker.py
homeassistant/components/ue_smart_radio/media_player.py
homeassistant/components/ukraine_alarm/__init__.py
homeassistant/components/ukraine_alarm/const.py
homeassistant/components/ukraine_alarm/binary_sensor.py
homeassistant/components/ukraine_alarm/const.py
homeassistant/components/unifiled/*
homeassistant/components/upb/__init__.py
homeassistant/components/upb/const.py
homeassistant/components/upb/light.py
homeassistant/components/upb/scene.py
homeassistant/components/upc_connect/*
homeassistant/components/upcloud/__init__.py
homeassistant/components/upcloud/binary_sensor.py
homeassistant/components/upcloud/switch.py
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
homeassistant/components/vallox/fan.py
homeassistant/components/vallox/sensor.py
@ -1424,17 +1447,17 @@ omit =
homeassistant/components/vesync/sensor.py
homeassistant/components/vesync/switch.py
homeassistant/components/viaggiatreno/sensor.py
homeassistant/components/vicare/__init__.py
homeassistant/components/vicare/binary_sensor.py
homeassistant/components/vicare/button.py
homeassistant/components/vicare/climate.py
homeassistant/components/vicare/const.py
homeassistant/components/vicare/diagnostics.py
homeassistant/components/vicare/__init__.py
homeassistant/components/vicare/sensor.py
homeassistant/components/vicare/water_heater.py
homeassistant/components/vilfo/__init__.py
homeassistant/components/vilfo/sensor.py
homeassistant/components/vilfo/const.py
homeassistant/components/vilfo/sensor.py
homeassistant/components/vivotek/camera.py
homeassistant/components/vlc/media_player.py
homeassistant/components/vlc_telnet/__init__.py
@ -1467,8 +1490,8 @@ omit =
homeassistant/components/wiffi/wiffi_strings.py
homeassistant/components/wirelesstag/*
homeassistant/components/wolflink/__init__.py
homeassistant/components/wolflink/sensor.py
homeassistant/components/wolflink/const.py
homeassistant/components/wolflink/sensor.py
homeassistant/components/worldtidesinfo/sensor.py
homeassistant/components/worxlandroid/sensor.py
homeassistant/components/x10/light.py
@ -1511,12 +1534,6 @@ omit =
homeassistant/components/xiaomi_tv/media_player.py
homeassistant/components/xmpp/notify.py
homeassistant/components/xs1/*
homeassistant/components/yalexs_ble/__init__.py
homeassistant/components/yalexs_ble/binary_sensor.py
homeassistant/components/yalexs_ble/entity.py
homeassistant/components/yalexs_ble/lock.py
homeassistant/components/yalexs_ble/sensor.py
homeassistant/components/yalexs_ble/util.py
homeassistant/components/yale_smart_alarm/__init__.py
homeassistant/components/yale_smart_alarm/alarm_control_panel.py
homeassistant/components/yale_smart_alarm/binary_sensor.py
@ -1526,6 +1543,12 @@ omit =
homeassistant/components/yale_smart_alarm/diagnostics.py
homeassistant/components/yale_smart_alarm/entity.py
homeassistant/components/yale_smart_alarm/lock.py
homeassistant/components/yalexs_ble/__init__.py
homeassistant/components/yalexs_ble/binary_sensor.py
homeassistant/components/yalexs_ble/entity.py
homeassistant/components/yalexs_ble/lock.py
homeassistant/components/yalexs_ble/sensor.py
homeassistant/components/yalexs_ble/util.py
homeassistant/components/yamaha_musiccast/__init__.py
homeassistant/components/yamaha_musiccast/media_player.py
homeassistant/components/yamaha_musiccast/number.py
@ -1569,14 +1592,11 @@ omit =
homeassistant/components/zhong_hong/climate.py
homeassistant/components/ziggo_mediabox_xl/media_player.py
homeassistant/components/zoneminder/*
homeassistant/components/supla/*
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/cover.py
homeassistant/components/zwave_me/climate.py
homeassistant/components/zwave_me/cover.py
homeassistant/components/zwave_me/fan.py
homeassistant/components/zwave_me/helpers.py
homeassistant/components/zwave_me/light.py

View File

@ -159,7 +159,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2022.07.0
uses: home-assistant/builder@2022.09.0
with:
args: |
$BUILD_ARGS \
@ -225,7 +225,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2022.07.0
uses: home-assistant/builder@2022.09.0
with:
args: |
$BUILD_ARGS \

View File

@ -22,7 +22,9 @@ on:
env:
CACHE_VERSION: 1
PIP_CACHE_VERSION: 1
HA_SHORT_VERSION: 2022.9
HA_SHORT_VERSION: 2022.10
# Pin latest Python patch versions to avoid issues
# with runners using different versions.
DEFAULT_PYTHON: 3.9.14
ALL_PYTHON_VERSIONS: "['3.9.14', '3.10.7']"
PRE_COMMIT_CACHE: ~/.cache/pre-commit
@ -842,9 +844,9 @@ jobs:
uses: actions/download-artifact@v3
- name: Upload coverage to Codecov (full coverage)
if: needs.info.outputs.test_full_suite == 'true'
uses: codecov/codecov-action@v3.1.0
uses: codecov/codecov-action@v3.1.1
with:
flags: full-suite
- name: Upload coverage to Codecov (partial coverage)
if: needs.info.outputs.test_full_suite == 'false'
uses: codecov/codecov-action@v3.1.0
uses: codecov/codecov-action@v3.1.1

View File

@ -17,7 +17,7 @@ jobs:
# - No PRs marked as no-stale
# - No issues marked as no-stale or help-wanted
- name: 90 days stale issues & PRs policy
uses: actions/stale@v5
uses: actions/stale@v6.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 90
@ -54,7 +54,7 @@ jobs:
# - No PRs marked as no-stale or new-integrations
# - No issues (-1)
- name: 30 days stale PRs policy
uses: actions/stale@v5
uses: actions/stale@v6.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 30
@ -79,7 +79,7 @@ jobs:
# - No Issues marked as no-stale or help-wanted
# - No PRs (-1)
- name: Needs more information stale issues policy
uses: actions/stale@v5
uses: actions/stale@v6.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
only-labels: "needs-more-information"

View File

@ -1,17 +1,17 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.37.3
rev: v2.38.0
hooks:
- id: pyupgrade
args: [--py39-plus]
- repo: https://github.com/psf/black
rev: 22.6.0
rev: 22.8.0
hooks:
- id: black
args:
- --safe
- --quiet
files: ^((homeassistant|script|tests)/.+)?[^/]+\.py$
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$
- repo: https://github.com/codespell-project/codespell
rev: v2.1.0
hooks:
@ -106,7 +106,7 @@ repos:
pass_filenames: false
language: script
types: [text]
files: ^(homeassistant/.+/manifest\.json|pyproject\.toml|\.pre-commit-config\.yaml|script/gen_requirements_all\.py)$
files: ^(homeassistant/.+/manifest\.json|homeassistant/brands/.+\.json|pyproject\.toml|\.pre-commit-config\.yaml|script/gen_requirements_all\.py)$
- id: hassfest
name: hassfest
entry: script/run-in-env.sh python3 -m script.hassfest

View File

@ -3,3 +3,4 @@
azure-*.yml
docs/source/_templates/*
homeassistant/components/*/translations/*.json
homeassistant/generated/*

View File

@ -17,6 +17,7 @@ homeassistant.helpers.area_registry
homeassistant.helpers.condition
homeassistant.helpers.debounce
homeassistant.helpers.deprecation
homeassistant.helpers.device_registry
homeassistant.helpers.discovery
homeassistant.helpers.dispatcher
homeassistant.helpers.entity
@ -38,10 +39,9 @@ homeassistant.util.unit_system
# --- Add components below this line ---
homeassistant.components
homeassistant.components.alert.*
homeassistant.components.abode.*
homeassistant.components.acer_projector.*
homeassistant.components.accuweather.*
homeassistant.components.acer_projector.*
homeassistant.components.actiontec.*
homeassistant.components.adguard.*
homeassistant.components.aftership.*
@ -51,8 +51,8 @@ homeassistant.components.airvisual.*
homeassistant.components.airzone.*
homeassistant.components.aladdin_connect.*
homeassistant.components.alarm_control_panel.*
homeassistant.components.alert.*
homeassistant.components.amazon_polly.*
homeassistant.components.ambee.*
homeassistant.components.ambient_station.*
homeassistant.components.amcrest.*
homeassistant.components.ampio.*
@ -77,9 +77,10 @@ homeassistant.components.calendar.*
homeassistant.components.camera.*
homeassistant.components.canary.*
homeassistant.components.cover.*
homeassistant.components.crownstone.*
homeassistant.components.cpuspeed.*
homeassistant.components.crownstone.*
homeassistant.components.deconz.*
homeassistant.components.demo.*
homeassistant.components.device_automation.*
homeassistant.components.device_tracker.*
homeassistant.components.devolo_home_control.*
@ -93,8 +94,8 @@ homeassistant.components.efergy.*
homeassistant.components.elgato.*
homeassistant.components.elkm1.*
homeassistant.components.emulated_hue.*
homeassistant.components.esphome.*
homeassistant.components.energy.*
homeassistant.components.esphome.*
homeassistant.components.evil_genius_labs.*
homeassistant.components.fan.*
homeassistant.components.fastdotcom.*
@ -102,14 +103,13 @@ homeassistant.components.feedreader.*
homeassistant.components.file_upload.*
homeassistant.components.filesize.*
homeassistant.components.fitbit.*
homeassistant.components.flunearyou.*
homeassistant.components.flux_led.*
homeassistant.components.forecast_solar.*
homeassistant.components.fritz.*
homeassistant.components.fritzbox.*
homeassistant.components.fritzbox_callmonitor.*
homeassistant.components.fronius.*
homeassistant.components.frontend.*
homeassistant.components.fritz.*
homeassistant.components.fully_kiosk.*
homeassistant.components.geo_location.*
homeassistant.components.geocaching.*
@ -144,12 +144,13 @@ homeassistant.components.homewizard.*
homeassistant.components.http.*
homeassistant.components.huawei_lte.*
homeassistant.components.hyperion.*
homeassistant.components.ibeacon.*
homeassistant.components.image_processing.*
homeassistant.components.input_button.*
homeassistant.components.input_select.*
homeassistant.components.integration.*
homeassistant.components.isy994.*
homeassistant.components.iqvia.*
homeassistant.components.isy994.*
homeassistant.components.jellyfin.*
homeassistant.components.jewish_calendar.*
homeassistant.components.kaleidescape.*
@ -159,8 +160,8 @@ homeassistant.components.lacrosse_view.*
homeassistant.components.lametric.*
homeassistant.components.laundrify.*
homeassistant.components.lcn.*
homeassistant.components.light.*
homeassistant.components.lifx.*
homeassistant.components.light.*
homeassistant.components.litterrobot.*
homeassistant.components.local_ip.*
homeassistant.components.lock.*
@ -195,15 +196,15 @@ homeassistant.components.onewire.*
homeassistant.components.open_meteo.*
homeassistant.components.openexchangerates.*
homeassistant.components.openuv.*
homeassistant.components.peco.*
homeassistant.components.overkiz.*
homeassistant.components.peco.*
homeassistant.components.persistent_notification.*
homeassistant.components.pi_hole.*
homeassistant.components.powerwall.*
homeassistant.components.proximity.*
homeassistant.components.prusalink.*
homeassistant.components.pvoutput.*
homeassistant.components.pure_energie.*
homeassistant.components.pvoutput.*
homeassistant.components.qnap_qsw.*
homeassistant.components.rainmachine.*
homeassistant.components.rdw.*
@ -212,6 +213,7 @@ homeassistant.components.recorder.*
homeassistant.components.remote.*
homeassistant.components.renault.*
homeassistant.components.repairs.*
homeassistant.components.rfxtrx.*
homeassistant.components.rhasspy.*
homeassistant.components.ridwell.*
homeassistant.components.rituals_perfume_genie.*
@ -222,9 +224,9 @@ homeassistant.components.samsungtv.*
homeassistant.components.scene.*
homeassistant.components.schedule.*
homeassistant.components.select.*
homeassistant.components.senseme.*
homeassistant.components.sensibo.*
homeassistant.components.sensor.*
homeassistant.components.senseme.*
homeassistant.components.senz.*
homeassistant.components.shelly.*
homeassistant.components.simplisafe.*
@ -232,13 +234,14 @@ homeassistant.components.slack.*
homeassistant.components.sleepiq.*
homeassistant.components.smhi.*
homeassistant.components.ssdp.*
homeassistant.components.stookalert.*
homeassistant.components.statistics.*
homeassistant.components.steamist.*
homeassistant.components.stookalert.*
homeassistant.components.stream.*
homeassistant.components.sun.*
homeassistant.components.surepetcare.*
homeassistant.components.switch.*
homeassistant.components.switchbee.*
homeassistant.components.switcher_kis.*
homeassistant.components.synology_dsm.*
homeassistant.components.systemmonitor.*
@ -247,8 +250,9 @@ homeassistant.components.tailscale.*
homeassistant.components.tautulli.*
homeassistant.components.tcp.*
homeassistant.components.tile.*
homeassistant.components.tplink.*
homeassistant.components.tilt_ble.*
homeassistant.components.tolo.*
homeassistant.components.tplink.*
homeassistant.components.tractive.*
homeassistant.components.tradfri.*
homeassistant.components.trafikverket_ferry.*
@ -277,7 +281,7 @@ homeassistant.components.whois.*
homeassistant.components.wiz.*
homeassistant.components.worldclock.*
homeassistant.components.yale_smart_alarm.*
homeassistant.components.zodiac.*
homeassistant.components.zeroconf.*
homeassistant.components.zodiac.*
homeassistant.components.zone.*
homeassistant.components.zwave_js.*

View File

@ -61,8 +61,6 @@ build.json @home-assistant/supervisor
/tests/components/alexa/ @home-assistant/cloud @ochlocracy
/homeassistant/components/almond/ @gcampax @balloob
/tests/components/almond/ @gcampax @balloob
/homeassistant/components/ambee/ @frenck
/tests/components/ambee/ @frenck
/homeassistant/components/amberelectric/ @madpilot
/tests/components/amberelectric/ @madpilot
/homeassistant/components/ambiclimate/ @danielhiversen
@ -80,6 +78,8 @@ build.json @home-assistant/supervisor
/tests/components/anthemav/ @hyralex
/homeassistant/components/apache_kafka/ @bachya
/tests/components/apache_kafka/ @bachya
/homeassistant/components/apcupsd/ @yuxincs
/tests/components/apcupsd/ @yuxincs
/homeassistant/components/api/ @home-assistant/core
/tests/components/api/ @home-assistant/core
/homeassistant/components/apple_tv/ @postlund
@ -129,6 +129,8 @@ build.json @home-assistant/supervisor
/tests/components/baf/ @bdraco @jfroy
/homeassistant/components/balboa/ @garbled1
/tests/components/balboa/ @garbled1
/homeassistant/components/bayesian/ @HarvsG
/tests/components/bayesian/ @HarvsG
/homeassistant/components/beewi_smartclim/ @alemuro
/homeassistant/components/binary_sensor/ @home-assistant/core
/tests/components/binary_sensor/ @home-assistant/core
@ -179,8 +181,6 @@ build.json @home-assistant/supervisor
/homeassistant/components/cisco_ios/ @fbradyirl
/homeassistant/components/cisco_mobility_express/ @fbradyirl
/homeassistant/components/cisco_webex_teams/ @fbradyirl
/homeassistant/components/climacell/ @raman325
/tests/components/climacell/ @raman325
/homeassistant/components/climate/ @home-assistant/core
/tests/components/climate/ @home-assistant/core
/homeassistant/components/cloud/ @home-assistant/cloud
@ -265,7 +265,8 @@ build.json @home-assistant/supervisor
/tests/components/doorbird/ @oblogic7 @bdraco @flacjacket
/homeassistant/components/dsmr/ @Robbie1221 @frenck
/tests/components/dsmr/ @Robbie1221 @frenck
/homeassistant/components/dsmr_reader/ @depl0y
/homeassistant/components/dsmr_reader/ @depl0y @glodenox
/tests/components/dsmr_reader/ @depl0y @glodenox
/homeassistant/components/dunehd/ @bieniu
/tests/components/dunehd/ @bieniu
/homeassistant/components/dwd_weather_warnings/ @runningman84 @stephan192 @Hummel95
@ -357,8 +358,6 @@ build.json @home-assistant/supervisor
/tests/components/flo/ @dmulcahey
/homeassistant/components/flume/ @ChrisMandich @bdraco @jeeftor
/tests/components/flume/ @ChrisMandich @bdraco @jeeftor
/homeassistant/components/flunearyou/ @bachya
/tests/components/flunearyou/ @bachya
/homeassistant/components/flux_led/ @icemanch @bdraco
/tests/components/flux_led/ @icemanch @bdraco
/homeassistant/components/forecast_solar/ @klaasnicolaas @frenck
@ -423,6 +422,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/google_assistant/ @home-assistant/cloud
/tests/components/google_assistant/ @home-assistant/cloud
/homeassistant/components/google_cloud/ @lufton
/homeassistant/components/google_sheets/ @tkdrob
/tests/components/google_sheets/ @tkdrob
/homeassistant/components/google_travel_time/ @eifinger
/tests/components/google_travel_time/ @eifinger
/homeassistant/components/govee_ble/ @bdraco
@ -509,6 +510,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/iammeter/ @lewei50
/homeassistant/components/iaqualink/ @flz
/tests/components/iaqualink/ @flz
/homeassistant/components/ibeacon/ @bdraco
/tests/components/ibeacon/ @bdraco
/homeassistant/components/icloud/ @Quentame @nzapponi
/tests/components/icloud/ @Quentame @nzapponi
/homeassistant/components/ign_sismologia/ @exxamalte
@ -578,7 +581,11 @@ build.json @home-assistant/supervisor
/homeassistant/components/keenetic_ndms2/ @foxel
/tests/components/keenetic_ndms2/ @foxel
/homeassistant/components/kef/ @basnijholt
/homeassistant/components/kegtron/ @Ernst79
/tests/components/kegtron/ @Ernst79
/homeassistant/components/keyboard_remote/ @bendavid @lanrat
/homeassistant/components/keymitt_ble/ @spycle
/tests/components/keymitt_ble/ @spycle
/homeassistant/components/kmtronic/ @dgomes
/tests/components/kmtronic/ @dgomes
/homeassistant/components/knx/ @Julius2342 @farmio @marvin-w
@ -608,6 +615,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/led_ble/ @bdraco
/tests/components/led_ble/ @bdraco
/homeassistant/components/lg_netcast/ @Drafteed
/homeassistant/components/lidarr/ @tkdrob
/tests/components/lidarr/ @tkdrob
/homeassistant/components/life360/ @pnbruckner
/tests/components/life360/ @pnbruckner
/homeassistant/components/lifx/ @bdraco @Djelibeybi
@ -742,6 +751,8 @@ build.json @home-assistant/supervisor
/tests/components/nextdns/ @bieniu
/homeassistant/components/nfandroidtv/ @tkdrob
/tests/components/nfandroidtv/ @tkdrob
/homeassistant/components/nibe_heatpump/ @elupus
/tests/components/nibe_heatpump/ @elupus
/homeassistant/components/nightscout/ @marciogranzotto
/tests/components/nightscout/ @marciogranzotto
/homeassistant/components/nilu/ @hfurubotten
@ -750,6 +761,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/nissan_leaf/ @filcole
/homeassistant/components/nmbs/ @thibmaek
/homeassistant/components/noaa_tides/ @jdelaney72
/homeassistant/components/nobo_hub/ @echoromeo @oyvindwe
/tests/components/nobo_hub/ @echoromeo @oyvindwe
/homeassistant/components/notify/ @home-assistant/core
/tests/components/notify/ @home-assistant/core
/homeassistant/components/notify_events/ @matrozov @papajojo
@ -879,6 +892,8 @@ build.json @home-assistant/supervisor
/tests/components/qwikswitch/ @kellerza
/homeassistant/components/rachio/ @bdraco
/tests/components/rachio/ @bdraco
/homeassistant/components/radarr/ @tkdrob
/tests/components/radarr/ @tkdrob
/homeassistant/components/radio_browser/ @frenck
/tests/components/radio_browser/ @frenck
/homeassistant/components/radiotherm/ @bdraco @vinnyfuria
@ -1085,6 +1100,8 @@ build.json @home-assistant/supervisor
/tests/components/switch/ @home-assistant/core
/homeassistant/components/switch_as_x/ @home-assistant/core
/tests/components/switch_as_x/ @home-assistant/core
/homeassistant/components/switchbee/ @jafar-atili
/tests/components/switchbee/ @jafar-atili
/homeassistant/components/switchbot/ @bdraco @danielhiversen @RenierM26 @murtas @Eloston
/tests/components/switchbot/ @bdraco @danielhiversen @RenierM26 @murtas @Eloston
/homeassistant/components/switcher_kis/ @tomerfi @thecode
@ -1130,6 +1147,8 @@ build.json @home-assistant/supervisor
/tests/components/tibber/ @danielhiversen
/homeassistant/components/tile/ @bachya
/tests/components/tile/ @bachya
/homeassistant/components/tilt_ble/ @apt-itude
/tests/components/tilt_ble/ @apt-itude
/homeassistant/components/time_date/ @fabaff
/tests/components/time_date/ @fabaff
/homeassistant/components/tmb/ @alemuro

View File

@ -26,7 +26,7 @@ from . import (
SetupFlow,
)
REQUIREMENTS = ["pyotp==2.6.0"]
REQUIREMENTS = ["pyotp==2.7.0"]
CONF_MESSAGE = "message"

View File

@ -19,7 +19,7 @@ from . import (
SetupFlow,
)
REQUIREMENTS = ["pyotp==2.6.0", "PyQRCode==1.2.1"]
REQUIREMENTS = ["pyotp==2.7.0", "PyQRCode==1.2.1"]
CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend({}, extra=vol.PREVENT_EXTRA)

View File

@ -0,0 +1,5 @@
{
"domain": "amazon",
"name": "Amazon",
"integrations": ["alexa", "amazon_polly", "aws", "route53"]
}

View File

@ -0,0 +1,12 @@
{
"domain": "apple",
"name": "Apple",
"integrations": [
"apple_tv",
"homekit_controller",
"homekit",
"ibeacon",
"icloud",
"itunes"
]
}

View File

@ -0,0 +1,5 @@
{
"domain": "aruba",
"name": "Aruba",
"integrations": ["aruba", "cppm_tracker"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "asterisk",
"name": "Asterisk",
"integrations": ["asterisk_cdr", "asterisk_mbox"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "august",
"name": "August Home",
"integrations": ["august", "yalexs_ble"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "cisco",
"name": "Cisco",
"integrations": ["cisco_ios", "cisco_mobility_express", "cisco_webex_teams"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "clicksend",
"name": "ClickSend",
"integrations": ["clicksend", "clicksend_tts"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "denon",
"name": "Denon",
"integrations": ["denon", "denonavr", "heos"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "devolo",
"name": "devolo",
"integrations": ["devolo_home_control", "devolo_home_network"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "dlna",
"name": "DLNA",
"integrations": ["dlna_dmr", "dlna_dms"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "elgato",
"name": "Elgato",
"integrations": ["avea", "elgato"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "emoncms",
"name": "emoncms",
"integrations": ["emoncms", "emoncms_history"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "epson",
"name": "Epson",
"integrations": ["epson", "epsonworkforce"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "eq3",
"name": "eQ-3",
"integrations": ["eq3btsmart", "maxcube"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "ffmpeg",
"name": "FFmpeg",
"integrations": ["ffmpeg", "ffmpeg_motion", "ffmpeg_noise"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "fritzbox",
"name": "FRITZ!Box",
"integrations": ["fritz", "fritzbox", "fritzbox_callmonitor"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "geonet",
"name": "GeoNet",
"integrations": ["geonetnz_quakes", "geonetnz_volcano"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "globalcache",
"name": "Global Caché",
"integrations": ["gc100", "itach"]
}

View File

@ -0,0 +1,20 @@
{
"domain": "google",
"name": "Google",
"integrations": [
"google_assistant",
"google_cloud",
"google_domains",
"google_maps",
"google_pubsub",
"google_sheets",
"google_translate",
"google_travel_time",
"google_wifi",
"google",
"nest",
"cast",
"hangouts",
"dialogflow"
]
}

View File

@ -0,0 +1,5 @@
{
"domain": "hikvision",
"name": "Hikvision",
"integrations": ["hikvision", "hikvisioncam"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "homematic",
"name": "Homematic",
"integrations": ["homematic", "homematicip_cloud"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "honeywell",
"name": "Honeywell",
"integrations": ["lyric", "evohome", "honeywell"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "ibm",
"name": "IBM",
"integrations": ["watson_iot", "watson_tts"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "inovelli",
"name": "Inovelli",
"iot_standards": ["zigbee", "zwave"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "jasco",
"name": "Jasco",
"iot_standards": ["zwave"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "leviton",
"name": "Leviton",
"iot_standards": ["zwave"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "lg",
"name": "LG",
"integrations": ["lg_netcast", "lg_soundbar", "webostv"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "logitech",
"name": "Logitech",
"integrations": ["harmony", "ue_smart_radio", "squeezebox"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "lutron",
"name": "Lutron",
"integrations": ["lutron", "lutron_caseta", "homeworks"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "melnor",
"name": "Melnor",
"integrations": ["melnor", "raincloud"]
}

View File

@ -0,0 +1,16 @@
{
"domain": "microsoft",
"name": "Microsoft",
"integrations": [
"azure_devops",
"azure_event_hub",
"azure_service_bus",
"microsoft_face_detect",
"microsoft_face_identify",
"microsoft_face",
"microsoft",
"msteams",
"xbox",
"xbox_live"
]
}

View File

@ -0,0 +1,12 @@
{
"domain": "mqtt",
"name": "MQTT",
"integrations": [
"manual_mqtt",
"mqtt",
"mqtt_eventstream",
"mqtt_json",
"mqtt_room",
"mqtt_statestream"
]
}

View File

@ -0,0 +1,5 @@
{
"domain": "netgear",
"name": "NETGEAR",
"integrations": ["netgear", "netgear_lte"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "openwrt",
"name": "OpenWrt",
"integrations": ["luci", "ubus"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "panasonic",
"name": "Panasonic",
"integrations": ["panasonic_bluray", "panasonic_viera"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "philips",
"name": "Philips",
"integrations": ["dynalite", "hue", "philips_js"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "qnap",
"name": "QNAP",
"integrations": ["qnap", "qnap_qsw"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "raspberry_pi",
"name": "Raspberry Pi",
"integrations": ["rpi_camera", "rpi_power", "remote_rpi_gpio"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "russound",
"name": "Russound",
"integrations": ["russound_rio", "russound_rnet"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "samsung",
"name": "Samsung",
"integrations": ["familyhub", "samsungtv", "syncthru"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "solaredge",
"name": "SolarEdge",
"integrations": ["solaredge", "solaredge_local"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "sony",
"name": "Sony",
"integrations": ["braviatv", "ps4", "sony_projector", "songpal"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "synology",
"name": "Synology",
"integrations": ["synology_chat", "synology_dsm", "synology_srm"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "telegram",
"name": "Telegram",
"integrations": ["telegram", "telegram_bot"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "telldus",
"name": "Telldus",
"integrations": ["tellduslive", "tellstick"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "tesla",
"name": "Tesla",
"integrations": ["powerwall", "tesla_wall_connector"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "third_reality",
"name": "Third Reality",
"iot_standards": ["zigbee"]
}

View File

@ -0,0 +1,9 @@
{
"domain": "trafikverket",
"name": "Trafikverket",
"integrations": [
"trafikverket_ferry",
"trafikverket_train",
"trafikverket_weatherstation"
]
}

View File

@ -0,0 +1,5 @@
{
"domain": "twilio",
"name": "Twilio",
"integrations": ["twilio", "twilio_call", "twilio_sms"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "u_tec",
"name": "U-tec",
"iot_standards": ["zwave"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "ubiquiti",
"name": "Ubiquiti",
"integrations": ["unifi", "unifi_direct", "unifiled", "unifiprotect"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "vlc",
"name": "VideoLAN",
"integrations": ["vlc", "vlc_telnet"]
}

View File

@ -0,0 +1,11 @@
{
"domain": "xiaomi",
"name": "Xiaomi",
"integrations": [
"xiaomi_aqara",
"xiaomi_ble",
"xiaomi_miio",
"xiaomi_tv",
"xiaomi"
]
}

View File

@ -0,0 +1,5 @@
{
"domain": "yale",
"name": "Yale",
"integrations": ["august", "yale_smart_alarm", "yalexs_ble"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "yandex",
"name": "Yandex",
"integrations": ["yandex_transport", "yandextts"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "yeelight",
"name": "Yeelight",
"integrations": ["yeelight", "yeelightsunflower"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "zooz",
"name": "Zooz",
"iot_standards": ["zwave"]
}

View File

@ -1,7 +1,7 @@
{
"config": {
"abort": {
"reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente",
"reauth_successful": "La autenticaci\u00f3n se volvi\u00f3 a realizar correctamente",
"single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n."
},
"error": {

View File

@ -6,20 +6,29 @@
},
"error": {
"cannot_connect": "Falha na liga\u00e7\u00e3o",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida"
"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": "Introduza seu c\u00f3digo MFA para Abode"
},
"reauth_confirm": {
"data": {
"password": "Palavra-passe",
"username": "Email"
}
},
"title": "Preencha as informa\u00e7\u00f5es de login de Abode"
},
"user": {
"data": {
"password": "Palavra-passe",
"username": "Email"
}
},
"title": "Preencha as informa\u00e7\u00f5es de login de Abode"
}
}
}

View File

@ -17,5 +17,14 @@
}
}
}
},
"options": {
"step": {
"user": {
"data": {
"forecast": "\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u0437\u0430 \u0432\u0440\u0435\u043c\u0435\u0442\u043e"
}
}
}
}
}

View File

@ -8,7 +8,8 @@
},
"error": {
"cannot_connect": "Falha na liga\u00e7\u00e3o",
"invalid_api_key": "Chave de API inv\u00e1lida"
"invalid_api_key": "Chave de API inv\u00e1lida",
"requests_exceeded": "O n\u00famero permitido de pedidos \u00e0 API do Accuweather foi excedido. \u00c9 necess\u00e1rio aguardar ou alterar a chave API."
},
"step": {
"user": {
@ -26,8 +27,15 @@
"user": {
"data": {
"forecast": "Previs\u00e3o meteorol\u00f3gica"
}
},
"description": "Devido \u00e0s limita\u00e7\u00f5es da vers\u00e3o gratuita da chave AccuWeather API, quando se activa a previs\u00e3o do tempo, as actualiza\u00e7\u00f5es de dados ser\u00e3o realizadas a cada 80 minutos em vez de a cada 40 minutos."
}
}
},
"system_health": {
"info": {
"can_reach_server": "Alcance o servidor AccuWeather",
"remaining_requests": "Pedidos permitidos restantes"
}
}
}

View File

@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "A decrescer",
"rising": "A aumentar",
"steady": "Est\u00e1vel"
}
}
}

View File

@ -2,6 +2,13 @@
"config": {
"abort": {
"no_devices_found": "Nenhum dispositivo encontrado na rede"
},
"step": {
"user": {
"data": {
"id": "ID do anfitri\u00e3o"
}
}
}
}
}

View File

@ -31,7 +31,9 @@ PLATFORM_SCHEMA: Final = BASE_PLATFORM_SCHEMA.extend(
)
def get_scanner(hass: HomeAssistant, config: ConfigType) -> DeviceScanner | None:
def get_scanner(
hass: HomeAssistant, config: ConfigType
) -> ActiontecDeviceScanner | None:
"""Validate the configuration and return an Actiontec scanner."""
scanner = ActiontecDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None

View File

@ -6,8 +6,11 @@ from typing import Any
from adax import Adax
from adax_local import Adax as AdaxLocal
from homeassistant.components.climate import ClimateEntity
from homeassistant.components.climate.const import ClimateEntityFeature, HVACMode
from homeassistant.components.climate import (
ClimateEntity,
ClimateEntityFeature,
HVACMode,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_TEMPERATURE,

View File

@ -1,6 +1,9 @@
{
"config": {
"abort": {
"already_configured": "DIspositivo j\u00e1 est\u00e1 configurado",
"heater_not_available": "Aquecedor n\u00e3o dispon\u00edvel. Tente reiniciar o aquecedor premindo + e OK durante alguns segundos.",
"heater_not_found": "Aquecedor n\u00e3o encontrado. Tente mover o aquecedor para mais perto do computador com Home Assistant.",
"invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida"
},
"error": {
@ -9,8 +12,22 @@
"step": {
"cloud": {
"data": {
"account_id": "ID da conta",
"password": "Palavra-passe"
}
},
"local": {
"data": {
"wifi_pswd": "Senha Wi-Fi",
"wifi_ssid": "Wi-Fi SSID"
},
"description": "Reiniciar o aquecedor premindo + e OK at\u00e9 a visualiza\u00e7\u00e3o mostrar 'Reiniciar'. Depois premir e manter premido o bot\u00e3o OK no aquecedor at\u00e9 que o led azul comece a piscar antes de premir Submeter. A configura\u00e7\u00e3o do aquecedor pode demorar alguns minutos."
},
"user": {
"data": {
"connection_type": "Selecione o tipo de liga\u00e7\u00e3o"
},
"description": "Selecione o tipo de liga\u00e7\u00e3o. 'Local' requer aquecedores com bluetooth"
}
}
}

View File

@ -8,7 +8,8 @@
},
"step": {
"hassio_confirm": {
"title": "AdGuard Home via Supervisor add-on"
"description": "Deseja configurar o Home Assistant para se ligar ao AdGuard Home fornecido pelo add-on: {addon}?",
"title": "AdGuard Home via add-on Supervisor"
},
"user": {
"data": {

View File

@ -7,6 +7,7 @@ from advantage_air import ApiError, advantage_air
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@ -60,7 +61,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if await func(param):
await coordinator.async_refresh()
except ApiError as err:
_LOGGER.warning(err)
raise HomeAssistantError(err) from err
return error_handle
@ -69,8 +70,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {
"coordinator": coordinator,
"async_change": error_handle_factory(api.aircon.async_set),
"async_set_light": error_handle_factory(api.lights.async_set),
"aircon": error_handle_factory(api.aircon.async_set),
"lights": error_handle_factory(api.lights.async_set),
}
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)

View File

@ -1,6 +1,8 @@
"""Binary Sensor platform for Advantage Air integration."""
from __future__ import annotations
from typing import Any
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
@ -26,15 +28,16 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities: list[BinarySensorEntity] = []
for ac_key, ac_device in instance["coordinator"].data["aircons"].items():
entities.append(AdvantageAirFilter(instance, ac_key))
for zone_key, zone in ac_device["zones"].items():
# Only add motion sensor when motion is enabled
if zone["motionConfig"] >= 2:
entities.append(AdvantageAirZoneMotion(instance, ac_key, zone_key))
# Only add MyZone if it is available
if zone["type"] != 0:
entities.append(AdvantageAirZoneMyZone(instance, ac_key, zone_key))
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key, ac_device in aircons.items():
entities.append(AdvantageAirFilter(instance, ac_key))
for zone_key, zone in ac_device["zones"].items():
# Only add motion sensor when motion is enabled
if zone["motionConfig"] >= 2:
entities.append(AdvantageAirZoneMotion(instance, ac_key, zone_key))
# Only add MyZone if it is available
if zone["type"] != 0:
entities.append(AdvantageAirZoneMyZone(instance, ac_key, zone_key))
async_add_entities(entities)
@ -45,13 +48,13 @@ class AdvantageAirFilter(AdvantageAirAcEntity, BinarySensorEntity):
_attr_entity_category = EntityCategory.DIAGNOSTIC
_attr_name = "Filter"
def __init__(self, instance, ac_key):
def __init__(self, instance: dict[str, Any], ac_key: str) -> None:
"""Initialize an Advantage Air Filter sensor."""
super().__init__(instance, ac_key)
self._attr_unique_id += "-filter"
@property
def is_on(self):
def is_on(self) -> bool:
"""Return if filter needs cleaning."""
return self._ac["filterCleanStatus"]
@ -61,14 +64,14 @@ class AdvantageAirZoneMotion(AdvantageAirZoneEntity, BinarySensorEntity):
_attr_device_class = BinarySensorDeviceClass.MOTION
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone Motion sensor."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = f'{self._zone["name"]} motion'
self._attr_unique_id += "-motion"
@property
def is_on(self):
def is_on(self) -> bool:
"""Return if motion is detect."""
return self._zone["motion"] == 20
@ -79,13 +82,13 @@ class AdvantageAirZoneMyZone(AdvantageAirZoneEntity, BinarySensorEntity):
_attr_entity_registry_enabled_default = False
_attr_entity_category = EntityCategory.DIAGNOSTIC
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone MyZone sensor."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = f'{self._zone["name"]} myZone'
self._attr_unique_id += "-myzone"
@property
def is_on(self):
def is_on(self) -> bool:
"""Return if this zone is the myZone."""
return self._zone["number"] == self._ac["myZone"]

View File

@ -4,12 +4,12 @@ from __future__ import annotations
import logging
from typing import Any
from homeassistant.components.climate import ClimateEntity
from homeassistant.components.climate.const import (
from homeassistant.components.climate import (
FAN_AUTO,
FAN_HIGH,
FAN_LOW,
FAN_MEDIUM,
ClimateEntity,
ClimateEntityFeature,
HVACMode,
)
@ -70,12 +70,13 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities: list[ClimateEntity] = []
for ac_key, ac_device in instance["coordinator"].data["aircons"].items():
entities.append(AdvantageAirAC(instance, ac_key))
for zone_key, zone in ac_device["zones"].items():
# Only add zone climate control when zone is in temperature control
if zone["type"] != 0:
entities.append(AdvantageAirZone(instance, ac_key, zone_key))
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key, ac_device in aircons.items():
entities.append(AdvantageAirAC(instance, ac_key))
for zone_key, zone in ac_device["zones"].items():
# Only add zone climate control when zone is in temperature control
if zone["type"] != 0:
entities.append(AdvantageAirZone(instance, ac_key, zone_key))
async_add_entities(entities)
@ -92,37 +93,37 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.FAN_MODE
)
def __init__(self, instance, ac_key):
def __init__(self, instance: dict[str, Any], ac_key: str) -> None:
"""Initialize an AdvantageAir AC unit."""
super().__init__(instance, ac_key)
if self._ac.get("myAutoModeEnabled"):
self._attr_hvac_modes = AC_HVAC_MODES + [HVACMode.AUTO]
@property
def target_temperature(self):
def target_temperature(self) -> float:
"""Return the current target temperature."""
return self._ac["setTemp"]
@property
def hvac_mode(self):
def hvac_mode(self) -> HVACMode | None:
"""Return the current HVAC modes."""
if self._ac["state"] == ADVANTAGE_AIR_STATE_ON:
return ADVANTAGE_AIR_HVAC_MODES.get(self._ac["mode"])
return HVACMode.OFF
@property
def fan_mode(self):
def fan_mode(self) -> str | None:
"""Return the current fan modes."""
return ADVANTAGE_AIR_FAN_MODES.get(self._ac["fan"])
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set the HVAC Mode and State."""
if hvac_mode == HVACMode.OFF:
await self.async_change(
await self.aircon(
{self.ac_key: {"info": {"state": ADVANTAGE_AIR_STATE_OFF}}}
)
else:
await self.async_change(
await self.aircon(
{
self.ac_key: {
"info": {
@ -135,14 +136,14 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
async def async_set_fan_mode(self, fan_mode: str) -> None:
"""Set the Fan Mode."""
await self.async_change(
await self.aircon(
{self.ac_key: {"info": {"fan": HASS_FAN_MODES.get(fan_mode)}}}
)
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set the Temperature."""
temp = kwargs.get(ATTR_TEMPERATURE)
await self.async_change({self.ac_key: {"info": {"setTemp": temp}}})
await self.aircon({self.ac_key: {"info": {"setTemp": temp}}})
class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
@ -155,7 +156,7 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
_attr_hvac_modes = ZONE_HVAC_MODES
_attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an AdvantageAir Zone control."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = self._zone["name"]
@ -164,26 +165,26 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
)
@property
def hvac_mode(self):
def hvac_mode(self) -> HVACMode:
"""Return the current state as HVAC mode."""
if self._zone["state"] == ADVANTAGE_AIR_STATE_OPEN:
return HVACMode.HEAT_COOL
return HVACMode.OFF
@property
def current_temperature(self):
def current_temperature(self) -> float:
"""Return the current temperature."""
return self._zone["measuredTemp"]
@property
def target_temperature(self):
def target_temperature(self) -> float:
"""Return the target temperature."""
return self._zone["setTemp"]
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set the HVAC Mode and State."""
if hvac_mode == HVACMode.OFF:
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_CLOSE}}
@ -191,7 +192,7 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
}
)
else:
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_OPEN}}
@ -202,6 +203,4 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set the Temperature."""
temp = kwargs.get(ATTR_TEMPERATURE)
await self.async_change(
{self.ac_key: {"zones": {self.zone_key: {"setTemp": temp}}}}
)
await self.aircon({self.ac_key: {"zones": {self.zone_key: {"setTemp": temp}}}})

View File

@ -1,9 +1,14 @@
"""Config Flow for Advantage Air integration."""
from __future__ import annotations
from typing import Any
from advantage_air import ApiError, advantage_air
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import ADVANTAGE_AIR_RETRY, DOMAIN
@ -25,7 +30,9 @@ class AdvantageAirConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
DOMAIN = DOMAIN
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Get configuration from the user."""
errors = {}
if user_input:

View File

@ -30,12 +30,13 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities = []
for ac_key, ac_device in instance["coordinator"].data["aircons"].items():
for zone_key, zone in ac_device["zones"].items():
# Only add zone vent controls when zone in vent control mode.
if zone["type"] == 0:
entities.append(AdvantageAirZoneVent(instance, ac_key, zone_key))
entities: list[CoverEntity] = []
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key, ac_device in aircons.items():
for zone_key, zone in ac_device["zones"].items():
# Only add zone vent controls when zone in vent control mode.
if zone["type"] == 0:
entities.append(AdvantageAirZoneVent(instance, ac_key, zone_key))
async_add_entities(entities)
@ -49,7 +50,7 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, CoverEntity):
| CoverEntityFeature.SET_POSITION
)
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone Vent."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = self._zone["name"]
@ -68,7 +69,7 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, CoverEntity):
async def async_open_cover(self, **kwargs: Any) -> None:
"""Fully open zone vent."""
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {
@ -80,7 +81,7 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, CoverEntity):
async def async_close_cover(self, **kwargs: Any) -> None:
"""Fully close zone vent."""
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_CLOSE}}
@ -92,7 +93,7 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, CoverEntity):
"""Change vent position."""
position = round(kwargs[ATTR_POSITION] / 5) * 5
if position == 0:
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_CLOSE}}
@ -100,7 +101,7 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, CoverEntity):
}
)
else:
await self.async_change(
await self.aircon(
{
self.ac_key: {
"zones": {

View File

@ -1,5 +1,7 @@
"""Advantage Air parent entity class."""
from typing import Any
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
@ -11,20 +13,20 @@ class AdvantageAirEntity(CoordinatorEntity):
_attr_has_entity_name = True
def __init__(self, instance):
def __init__(self, instance: dict[str, Any]) -> None:
"""Initialize common aspects of an Advantage Air entity."""
super().__init__(instance["coordinator"])
self._attr_unique_id = self.coordinator.data["system"]["rid"]
self._attr_unique_id: str = self.coordinator.data["system"]["rid"]
class AdvantageAirAcEntity(AdvantageAirEntity):
"""Parent class for Advantage Air AC Entities."""
def __init__(self, instance, ac_key):
def __init__(self, instance: dict[str, Any], ac_key: str) -> None:
"""Initialize common aspects of an Advantage Air ac entity."""
super().__init__(instance)
self.async_change = instance["async_change"]
self.ac_key = ac_key
self.aircon = instance["aircon"]
self.ac_key: str = ac_key
self._attr_unique_id += f"-{ac_key}"
self._attr_device_info = DeviceInfo(
@ -36,19 +38,19 @@ class AdvantageAirAcEntity(AdvantageAirEntity):
)
@property
def _ac(self):
def _ac(self) -> dict[str, Any]:
return self.coordinator.data["aircons"][self.ac_key]["info"]
class AdvantageAirZoneEntity(AdvantageAirAcEntity):
"""Parent class for Advantage Air Zone Entities."""
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize common aspects of an Advantage Air zone entity."""
super().__init__(instance, ac_key)
self.zone_key = zone_key
self.zone_key: str = zone_key
self._attr_unique_id += f"-{zone_key}"
@property
def _zone(self):
def _zone(self) -> dict[str, Any]:
return self.coordinator.data["aircons"][self.ac_key]["zones"][self.zone_key]

View File

@ -24,9 +24,9 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities = []
if "myLights" in instance["coordinator"].data:
for light in instance["coordinator"].data["myLights"]["lights"].values():
entities: list[LightEntity] = []
if my_lights := instance["coordinator"].data.get("myLights"):
for light in my_lights["lights"].values():
if light.get("relay"):
entities.append(AdvantageAirLight(instance, light))
else:
@ -39,11 +39,11 @@ class AdvantageAirLight(AdvantageAirEntity, LightEntity):
_attr_supported_color_modes = {ColorMode.ONOFF}
def __init__(self, instance, light):
def __init__(self, instance: dict[str, Any], light: dict[str, Any]) -> None:
"""Initialize an Advantage Air Light."""
super().__init__(instance)
self.async_set_light = instance["async_set_light"]
self._id = light["id"]
self.lights = instance["lights"]
self._id: str = light["id"]
self._attr_unique_id += f"-{self._id}"
self._attr_device_info = DeviceInfo(
identifiers={(ADVANTAGE_AIR_DOMAIN, self._attr_unique_id)},
@ -54,7 +54,7 @@ class AdvantageAirLight(AdvantageAirEntity, LightEntity):
)
@property
def _light(self):
def _light(self) -> dict[str, Any]:
"""Return the light object."""
return self.coordinator.data["myLights"]["lights"][self._id]
@ -65,11 +65,11 @@ class AdvantageAirLight(AdvantageAirEntity, LightEntity):
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the light on."""
await self.async_set_light({"id": self._id, "state": ADVANTAGE_AIR_STATE_ON})
await self.lights({"id": self._id, "state": ADVANTAGE_AIR_STATE_ON})
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the light off."""
await self.async_set_light({"id": self._id, "state": ADVANTAGE_AIR_STATE_OFF})
await self.lights({"id": self._id, "state": ADVANTAGE_AIR_STATE_OFF})
class AdvantageAirLightDimmable(AdvantageAirLight):
@ -84,7 +84,7 @@ class AdvantageAirLightDimmable(AdvantageAirLight):
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the light on and optionally set the brightness."""
data = {"id": self._id, "state": ADVANTAGE_AIR_STATE_ON}
data: dict[str, Any] = {"id": self._id, "state": ADVANTAGE_AIR_STATE_ON}
if ATTR_BRIGHTNESS in kwargs:
data["value"] = round(kwargs[ATTR_BRIGHTNESS] * 100 / 255)
await self.async_set_light(data)
await self.lights(data)

View File

@ -1,4 +1,6 @@
"""Select platform for Advantage Air integration."""
from typing import Any
from homeassistant.components.select import SelectEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
@ -19,9 +21,10 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities = []
for ac_key in instance["coordinator"].data["aircons"]:
entities.append(AdvantageAirMyZone(instance, ac_key))
entities: list[SelectEntity] = []
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key in aircons:
entities.append(AdvantageAirMyZone(instance, ac_key))
async_add_entities(entities)
@ -31,7 +34,7 @@ class AdvantageAirMyZone(AdvantageAirAcEntity, SelectEntity):
_attr_icon = "mdi:home-thermometer"
_attr_name = "MyZone"
def __init__(self, instance, ac_key):
def __init__(self, instance: dict[str, Any], ac_key: str) -> None:
"""Initialize an Advantage Air MyZone control."""
super().__init__(instance, ac_key)
self._attr_unique_id += "-myzone"
@ -52,6 +55,6 @@ class AdvantageAirMyZone(AdvantageAirAcEntity, SelectEntity):
async def async_select_option(self, option: str) -> None:
"""Set the MyZone."""
await self.async_change(
await self.aircon(
{self.ac_key: {"info": {"myZone": self._name_to_number[option]}}}
)

View File

@ -1,6 +1,9 @@
"""Sensor platform for Advantage Air integration."""
from __future__ import annotations
from decimal import Decimal
from typing import Any
import voluptuous as vol
from homeassistant.components.sensor import (
@ -35,17 +38,18 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities: list[SensorEntity] = []
for ac_key, ac_device in instance["coordinator"].data["aircons"].items():
entities.append(AdvantageAirTimeTo(instance, ac_key, "On"))
entities.append(AdvantageAirTimeTo(instance, ac_key, "Off"))
for zone_key, zone in ac_device["zones"].items():
# Only show damper and temp sensors when zone is in temperature control
if zone["type"] != 0:
entities.append(AdvantageAirZoneVent(instance, ac_key, zone_key))
entities.append(AdvantageAirZoneTemp(instance, ac_key, zone_key))
# Only show wireless signal strength sensors when using wireless sensors
if zone["rssi"] > 0:
entities.append(AdvantageAirZoneSignal(instance, ac_key, zone_key))
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key, ac_device in aircons.items():
entities.append(AdvantageAirTimeTo(instance, ac_key, "On"))
entities.append(AdvantageAirTimeTo(instance, ac_key, "Off"))
for zone_key, zone in ac_device["zones"].items():
# Only show damper and temp sensors when zone is in temperature control
if zone["type"] != 0:
entities.append(AdvantageAirZoneVent(instance, ac_key, zone_key))
entities.append(AdvantageAirZoneTemp(instance, ac_key, zone_key))
# Only show wireless signal strength sensors when using wireless sensors
if zone["rssi"] > 0:
entities.append(AdvantageAirZoneSignal(instance, ac_key, zone_key))
async_add_entities(entities)
platform = entity_platform.async_get_current_platform()
@ -62,7 +66,7 @@ class AdvantageAirTimeTo(AdvantageAirAcEntity, SensorEntity):
_attr_native_unit_of_measurement = ADVANTAGE_AIR_SET_COUNTDOWN_UNIT
_attr_entity_category = EntityCategory.DIAGNOSTIC
def __init__(self, instance, ac_key, action):
def __init__(self, instance: dict[str, Any], ac_key: str, action: str) -> None:
"""Initialize the Advantage Air timer control."""
super().__init__(instance, ac_key)
self.action = action
@ -71,21 +75,21 @@ class AdvantageAirTimeTo(AdvantageAirAcEntity, SensorEntity):
self._attr_unique_id += f"-timeto{action}"
@property
def native_value(self):
def native_value(self) -> Decimal:
"""Return the current value."""
return self._ac[self._time_key]
@property
def icon(self):
def icon(self) -> str:
"""Return a representative icon of the timer."""
if self._ac[self._time_key] > 0:
return "mdi:timer-outline"
return "mdi:timer-off-outline"
async def set_time_to(self, **kwargs):
async def set_time_to(self, **kwargs: Any) -> None:
"""Set the timer value."""
value = min(720, max(0, int(kwargs[ADVANTAGE_AIR_SET_COUNTDOWN_VALUE])))
await self.async_change({self.ac_key: {"info": {self._time_key: value}}})
await self.aircon({self.ac_key: {"info": {self._time_key: value}}})
class AdvantageAirZoneVent(AdvantageAirZoneEntity, SensorEntity):
@ -95,21 +99,21 @@ class AdvantageAirZoneVent(AdvantageAirZoneEntity, SensorEntity):
_attr_state_class = SensorStateClass.MEASUREMENT
_attr_entity_category = EntityCategory.DIAGNOSTIC
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone Vent Sensor."""
super().__init__(instance, ac_key, zone_key=zone_key)
self._attr_name = f'{self._zone["name"]} vent'
self._attr_unique_id += "-vent"
@property
def native_value(self):
def native_value(self) -> Decimal:
"""Return the current value of the air vent."""
if self._zone["state"] == ADVANTAGE_AIR_STATE_OPEN:
return self._zone["value"]
return 0
return Decimal(0)
@property
def icon(self):
def icon(self) -> str:
"""Return a representative icon."""
if self._zone["state"] == ADVANTAGE_AIR_STATE_OPEN:
return "mdi:fan"
@ -123,19 +127,19 @@ class AdvantageAirZoneSignal(AdvantageAirZoneEntity, SensorEntity):
_attr_state_class = SensorStateClass.MEASUREMENT
_attr_entity_category = EntityCategory.DIAGNOSTIC
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone wireless signal sensor."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = f'{self._zone["name"]} signal'
self._attr_unique_id += "-signal"
@property
def native_value(self):
def native_value(self) -> Decimal:
"""Return the current value of the wireless signal."""
return self._zone["rssi"]
@property
def icon(self):
def icon(self) -> str:
"""Return a representative icon."""
if self._zone["rssi"] >= 80:
return "mdi:wifi-strength-4"
@ -157,13 +161,13 @@ class AdvantageAirZoneTemp(AdvantageAirZoneEntity, SensorEntity):
_attr_entity_registry_enabled_default = False
_attr_entity_category = EntityCategory.DIAGNOSTIC
def __init__(self, instance, ac_key, zone_key):
def __init__(self, instance: dict[str, Any], ac_key: str, zone_key: str) -> None:
"""Initialize an Advantage Air Zone Temp Sensor."""
super().__init__(instance, ac_key, zone_key)
self._attr_name = f'{self._zone["name"]} temperature'
self._attr_unique_id += "-temp"
@property
def native_value(self):
def native_value(self) -> Decimal:
"""Return the current value of the measured temperature."""
return self._zone["measuredTemp"]

View File

@ -23,10 +23,11 @@ async def async_setup_entry(
instance = hass.data[ADVANTAGE_AIR_DOMAIN][config_entry.entry_id]
entities = []
for ac_key, ac_device in instance["coordinator"].data["aircons"].items():
if ac_device["info"]["freshAirStatus"] != "none":
entities.append(AdvantageAirFreshAir(instance, ac_key))
entities: list[SwitchEntity] = []
if aircons := instance["coordinator"].data.get("aircons"):
for ac_key, ac_device in aircons.items():
if ac_device["info"]["freshAirStatus"] != "none":
entities.append(AdvantageAirFreshAir(instance, ac_key))
async_add_entities(entities)
@ -36,24 +37,24 @@ class AdvantageAirFreshAir(AdvantageAirAcEntity, SwitchEntity):
_attr_icon = "mdi:air-filter"
_attr_name = "Fresh air"
def __init__(self, instance, ac_key):
def __init__(self, instance: dict[str, Any], ac_key: str) -> None:
"""Initialize an Advantage Air fresh air control."""
super().__init__(instance, ac_key)
self._attr_unique_id += "-freshair"
@property
def is_on(self):
def is_on(self) -> bool:
"""Return the fresh air status."""
return self._ac["freshAirStatus"] == ADVANTAGE_AIR_STATE_ON
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn fresh air on."""
await self.async_change(
await self.aircon(
{self.ac_key: {"info": {"freshAirStatus": ADVANTAGE_AIR_STATE_ON}}}
)
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn fresh air off."""
await self.async_change(
await self.aircon(
{self.ac_key: {"info": {"freshAirStatus": ADVANTAGE_AIR_STATE_OFF}}}
)

View File

@ -1,4 +1,6 @@
"""Advantage Air Update platform."""
from typing import Any
from homeassistant.components.update import UpdateEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
@ -26,7 +28,7 @@ class AdvantageAirApp(AdvantageAirEntity, UpdateEntity):
_attr_name = "App"
def __init__(self, instance):
def __init__(self, instance: dict[str, Any]) -> None:
"""Initialize the Advantage Air App."""
super().__init__(instance)
self._attr_device_info = DeviceInfo(
@ -40,12 +42,12 @@ class AdvantageAirApp(AdvantageAirEntity, UpdateEntity):
)
@property
def installed_version(self):
def installed_version(self) -> str:
"""Return the current app version."""
return self.coordinator.data["system"]["myAppRev"]
@property
def latest_version(self):
def latest_version(self) -> str:
"""Return if there is an update."""
if self.coordinator.data["system"]["needsUpdate"]:
return "Needs Update"

View File

@ -14,7 +14,7 @@
"longitude": "\u7d4c\u5ea6",
"name": "\u7d71\u5408\u306e\u540d\u524d"
},
"description": "AEMET OpenData\u7d71\u5408\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u307e\u3059\u3002 API\u30ad\u30fc\u3092\u751f\u6210\u3059\u308b\u306b\u306f\u3001https://opendata.aemet.es/centrodedescargas/altaUsuario \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u304f\u3060\u3055\u3044"
"description": "API \u30ad\u30fc\u3092\u751f\u6210\u3059\u308b\u306b\u306f\u3001https://opendata.aemet.es/centrodedescargas/altaUsuario \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u304f\u3060\u3055\u3044"
}
}
},

View File

@ -1,7 +1,30 @@
{
"config": {
"abort": {
"already_configured": "A 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": "Para gerar a chave API v\u00e1 a https://opendata.aemet.es/centrodedescargas/altaUsuario"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Recolha de dados das esta\u00e7\u00f5es meteorol\u00f3gicas AEMET"
}
}
}
}
}

View File

@ -50,10 +50,12 @@ PROP_TO_ATTR: Final[dict[str, str]] = {
"sulphur_dioxide": ATTR_SO2,
}
# mypy: disallow-any-generics
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the air quality component."""
component = hass.data[DOMAIN] = EntityComponent(
component = hass.data[DOMAIN] = EntityComponent[AirQualityEntity](
_LOGGER, DOMAIN, hass, SCAN_INTERVAL
)
await component.async_setup(config)
@ -62,13 +64,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up a config entry."""
component: EntityComponent = hass.data[DOMAIN]
component: EntityComponent[AirQualityEntity] = hass.data[DOMAIN]
return await component.async_setup_entry(entry)
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
component: EntityComponent = hass.data[DOMAIN]
component: EntityComponent[AirQualityEntity] = hass.data[DOMAIN]
return await component.async_unload_entry(entry)

View File

@ -3,5 +3,6 @@
"name": "Air Quality",
"documentation": "https://www.home-assistant.io/integrations/air_quality",
"codeowners": ["@home-assistant/core"],
"quality_scale": "internal"
"quality_scale": "internal",
"integration_type": "entity"
}

View File

@ -7,11 +7,15 @@ ATTR_API_ADVICE: Final = "ADVICE"
ATTR_API_CAQI: Final = "CAQI"
ATTR_API_CAQI_DESCRIPTION: Final = "DESCRIPTION"
ATTR_API_CAQI_LEVEL: Final = "LEVEL"
ATTR_API_CO: Final = "CO"
ATTR_API_HUMIDITY: Final = "HUMIDITY"
ATTR_API_NO2: Final = "NO2"
ATTR_API_O3: Final = "O3"
ATTR_API_PM10: Final = "PM10"
ATTR_API_PM1: Final = "PM1"
ATTR_API_PM25: Final = "PM25"
ATTR_API_PRESSURE: Final = "PRESSURE"
ATTR_API_SO2: Final = "SO2"
ATTR_API_TEMPERATURE: Final = "TEMPERATURE"
ATTR_ADVICE: Final = "advice"

View File

@ -33,11 +33,15 @@ from .const import (
ATTR_API_CAQI,
ATTR_API_CAQI_DESCRIPTION,
ATTR_API_CAQI_LEVEL,
ATTR_API_CO,
ATTR_API_HUMIDITY,
ATTR_API_NO2,
ATTR_API_O3,
ATTR_API_PM1,
ATTR_API_PM10,
ATTR_API_PM25,
ATTR_API_PRESSURE,
ATTR_API_SO2,
ATTR_API_TEMPERATURE,
ATTR_DESCRIPTION,
ATTR_LEVEL,
@ -64,7 +68,7 @@ class AirlySensorEntityDescription(SensorEntityDescription):
SENSOR_TYPES: tuple[AirlySensorEntityDescription, ...] = (
AirlySensorEntityDescription(
key=ATTR_API_CAQI,
device_class=SensorDeviceClass.AQI,
icon="mdi:air-filter",
name=ATTR_API_CAQI,
native_unit_of_measurement="CAQI",
),
@ -112,6 +116,33 @@ SENSOR_TYPES: tuple[AirlySensorEntityDescription, ...] = (
state_class=SensorStateClass.MEASUREMENT,
value=lambda value: round(value, 1),
),
AirlySensorEntityDescription(
key=ATTR_API_CO,
name=ATTR_API_CO,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=SensorStateClass.MEASUREMENT,
),
AirlySensorEntityDescription(
key=ATTR_API_NO2,
device_class=SensorDeviceClass.NITROGEN_DIOXIDE,
name=ATTR_API_NO2,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=SensorStateClass.MEASUREMENT,
),
AirlySensorEntityDescription(
key=ATTR_API_SO2,
device_class=SensorDeviceClass.SULPHUR_DIOXIDE,
name=ATTR_API_SO2,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=SensorStateClass.MEASUREMENT,
),
AirlySensorEntityDescription(
key=ATTR_API_O3,
device_class=SensorDeviceClass.OZONE,
name=ATTR_API_O3,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=SensorStateClass.MEASUREMENT,
),
)
@ -191,4 +222,32 @@ class AirlySensor(CoordinatorEntity[AirlyDataUpdateCoordinator], SensorEntity):
self._attrs[ATTR_PERCENT] = round(
self.coordinator.data[f"{ATTR_API_PM10}_{SUFFIX_PERCENT}"]
)
if self.entity_description.key == ATTR_API_CO:
self._attrs[ATTR_LIMIT] = self.coordinator.data[
f"{ATTR_API_CO}_{SUFFIX_LIMIT}"
]
self._attrs[ATTR_PERCENT] = round(
self.coordinator.data[f"{ATTR_API_CO}_{SUFFIX_PERCENT}"]
)
if self.entity_description.key == ATTR_API_NO2:
self._attrs[ATTR_LIMIT] = self.coordinator.data[
f"{ATTR_API_NO2}_{SUFFIX_LIMIT}"
]
self._attrs[ATTR_PERCENT] = round(
self.coordinator.data[f"{ATTR_API_NO2}_{SUFFIX_PERCENT}"]
)
if self.entity_description.key == ATTR_API_SO2:
self._attrs[ATTR_LIMIT] = self.coordinator.data[
f"{ATTR_API_SO2}_{SUFFIX_LIMIT}"
]
self._attrs[ATTR_PERCENT] = round(
self.coordinator.data[f"{ATTR_API_SO2}_{SUFFIX_PERCENT}"]
)
if self.entity_description.key == ATTR_API_O3:
self._attrs[ATTR_LIMIT] = self.coordinator.data[
f"{ATTR_API_O3}_{SUFFIX_LIMIT}"
]
self._attrs[ATTR_PERCENT] = round(
self.coordinator.data[f"{ATTR_API_O3}_{SUFFIX_PERCENT}"]
)
return self._attrs

View File

@ -13,7 +13,8 @@
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Nome"
}
},
"description": "Para gerar a chave API v\u00e1 a https://developer.airly.eu/register"
}
}
}

View File

@ -14,7 +14,8 @@
"api_key": "Chave da API",
"latitude": "Latitude",
"longitude": "Longitude"
}
},
"description": "Para gerar a chave API v\u00e1 a https://docs.airnowapi.org/account/request/"
}
}
}

View File

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

View File

@ -4,14 +4,14 @@ from __future__ import annotations
import logging
from typing import Any
from homeassistant.components.climate import ClimateEntity
from homeassistant.components.climate.const import (
from homeassistant.components.climate import (
FAN_AUTO,
FAN_DIFFUSE,
FAN_FOCUS,
FAN_HIGH,
FAN_LOW,
FAN_MEDIUM,
ClimateEntity,
ClimateEntityFeature,
HVACMode,
)

View File

@ -1,5 +1,11 @@
{
"config": {
"abort": {
"already_configured": "Dispositivo j\u00e1 configurado"
},
"error": {
"cannot_connect": "Falha de liga\u00e7\u00e3o"
},
"step": {
"user": {
"data": {

View File

@ -2,7 +2,7 @@
"config": {
"abort": {
"already_configured": "La ubicaci\u00f3n ya est\u00e1 configurada o el Nodo/Pro ID ya est\u00e1 registrado.",
"reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente"
"reauth_successful": "La autenticaci\u00f3n se volvi\u00f3 a realizar correctamente"
},
"error": {
"cannot_connect": "No se pudo conectar",

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