Merge pull request #27374 from home-assistant/rc

0.100.0
This commit is contained in:
Paulus Schoutsen 2019-10-09 18:05:46 -07:00 committed by GitHub
commit e2d2f69cb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1904 changed files with 34664 additions and 8497 deletions

View File

@ -143,6 +143,7 @@ omit =
homeassistant/components/dlna_dmr/media_player.py homeassistant/components/dlna_dmr/media_player.py
homeassistant/components/dnsip/sensor.py homeassistant/components/dnsip/sensor.py
homeassistant/components/dominos/* homeassistant/components/dominos/*
homeassistant/components/doods/*
homeassistant/components/doorbird/* homeassistant/components/doorbird/*
homeassistant/components/dovado/* homeassistant/components/dovado/*
homeassistant/components/downloader/* homeassistant/components/downloader/*
@ -155,7 +156,12 @@ omit =
homeassistant/components/ebox/sensor.py homeassistant/components/ebox/sensor.py
homeassistant/components/ebusd/* homeassistant/components/ebusd/*
homeassistant/components/ecoal_boiler/* homeassistant/components/ecoal_boiler/*
homeassistant/components/ecobee/* homeassistant/components/ecobee/__init__.py
homeassistant/components/ecobee/binary_sensor.py
homeassistant/components/ecobee/climate.py
homeassistant/components/ecobee/notify.py
homeassistant/components/ecobee/sensor.py
homeassistant/components/ecobee/weather.py
homeassistant/components/econet/water_heater.py homeassistant/components/econet/water_heater.py
homeassistant/components/ecovacs/* homeassistant/components/ecovacs/*
homeassistant/components/eddystone_temperature/sensor.py homeassistant/components/eddystone_temperature/sensor.py
@ -164,7 +170,7 @@ omit =
homeassistant/components/eight_sleep/* homeassistant/components/eight_sleep/*
homeassistant/components/eliqonline/sensor.py homeassistant/components/eliqonline/sensor.py
homeassistant/components/elkm1/* homeassistant/components/elkm1/*
homeassistant/components/elv/switch.py homeassistant/components/elv/*
homeassistant/components/emby/media_player.py homeassistant/components/emby/media_player.py
homeassistant/components/emoncms/sensor.py homeassistant/components/emoncms/sensor.py
homeassistant/components/emoncms_history/* homeassistant/components/emoncms_history/*
@ -197,7 +203,6 @@ omit =
homeassistant/components/evohome/* homeassistant/components/evohome/*
homeassistant/components/familyhub/camera.py homeassistant/components/familyhub/camera.py
homeassistant/components/fastdotcom/* homeassistant/components/fastdotcom/*
homeassistant/components/fedex/sensor.py
homeassistant/components/ffmpeg/camera.py homeassistant/components/ffmpeg/camera.py
homeassistant/components/fibaro/* homeassistant/components/fibaro/*
homeassistant/components/filesize/sensor.py homeassistant/components/filesize/sensor.py
@ -288,11 +293,15 @@ omit =
homeassistant/components/hydrawise/* homeassistant/components/hydrawise/*
homeassistant/components/hyperion/light.py homeassistant/components/hyperion/light.py
homeassistant/components/ialarm/alarm_control_panel.py homeassistant/components/ialarm/alarm_control_panel.py
homeassistant/components/iaqualink/binary_sensor.py
homeassistant/components/iaqualink/climate.py homeassistant/components/iaqualink/climate.py
homeassistant/components/iaqualink/light.py homeassistant/components/iaqualink/light.py
homeassistant/components/iaqualink/sensor.py homeassistant/components/iaqualink/sensor.py
homeassistant/components/iaqualink/switch.py homeassistant/components/iaqualink/switch.py
homeassistant/components/icloud/device_tracker.py homeassistant/components/icloud/device_tracker.py
homeassistant/components/izone/climate.py
homeassistant/components/izone/discovery.py
homeassistant/components/izone/__init__.py
homeassistant/components/idteck_prox/* homeassistant/components/idteck_prox/*
homeassistant/components/ifttt/* homeassistant/components/ifttt/*
homeassistant/components/iglo/light.py homeassistant/components/iglo/light.py
@ -313,6 +322,7 @@ omit =
homeassistant/components/itunes/media_player.py homeassistant/components/itunes/media_player.py
homeassistant/components/joaoapps_join/* homeassistant/components/joaoapps_join/*
homeassistant/components/juicenet/* homeassistant/components/juicenet/*
homeassistant/components/kaiterra/*
homeassistant/components/kankun/switch.py homeassistant/components/kankun/switch.py
homeassistant/components/keba/* homeassistant/components/keba/*
homeassistant/components/keenetic_ndms2/device_tracker.py homeassistant/components/keenetic_ndms2/device_tracker.py
@ -343,7 +353,6 @@ omit =
homeassistant/components/lifx_legacy/light.py homeassistant/components/lifx_legacy/light.py
homeassistant/components/lightwave/* homeassistant/components/lightwave/*
homeassistant/components/limitlessled/light.py homeassistant/components/limitlessled/light.py
homeassistant/components/linksys_ap/device_tracker.py
homeassistant/components/linksys_smart/device_tracker.py homeassistant/components/linksys_smart/device_tracker.py
homeassistant/components/linky/__init__.py homeassistant/components/linky/__init__.py
homeassistant/components/linky/sensor.py homeassistant/components/linky/sensor.py
@ -434,12 +443,14 @@ omit =
homeassistant/components/nuki/lock.py homeassistant/components/nuki/lock.py
homeassistant/components/nut/sensor.py homeassistant/components/nut/sensor.py
homeassistant/components/nx584/alarm_control_panel.py homeassistant/components/nx584/alarm_control_panel.py
homeassistant/components/nzbget/__init__.py
homeassistant/components/nzbget/sensor.py homeassistant/components/nzbget/sensor.py
homeassistant/components/obihai/* homeassistant/components/obihai/*
homeassistant/components/octoprint/* homeassistant/components/octoprint/*
homeassistant/components/oem/climate.py homeassistant/components/oem/climate.py
homeassistant/components/oasa_telematics/sensor.py homeassistant/components/oasa_telematics/sensor.py
homeassistant/components/ohmconnect/sensor.py homeassistant/components/ohmconnect/sensor.py
homeassistant/components/ombi/*
homeassistant/components/onewire/sensor.py homeassistant/components/onewire/sensor.py
homeassistant/components/onkyo/media_player.py homeassistant/components/onkyo/media_player.py
homeassistant/components/onvif/camera.py homeassistant/components/onvif/camera.py
@ -476,7 +487,10 @@ omit =
homeassistant/components/pioneer/media_player.py homeassistant/components/pioneer/media_player.py
homeassistant/components/pjlink/media_player.py homeassistant/components/pjlink/media_player.py
homeassistant/components/plaato/* homeassistant/components/plaato/*
homeassistant/components/plex/* homeassistant/components/plex/__init__.py
homeassistant/components/plex/media_player.py
homeassistant/components/plex/sensor.py
homeassistant/components/plex/server.py
homeassistant/components/plugwise/* homeassistant/components/plugwise/*
homeassistant/components/plum_lightpad/* homeassistant/components/plum_lightpad/*
homeassistant/components/pocketcasts/sensor.py homeassistant/components/pocketcasts/sensor.py
@ -544,6 +558,7 @@ omit =
homeassistant/components/russound_rio/media_player.py homeassistant/components/russound_rio/media_player.py
homeassistant/components/russound_rnet/media_player.py homeassistant/components/russound_rnet/media_player.py
homeassistant/components/sabnzbd/* homeassistant/components/sabnzbd/*
homeassistant/components/saj/sensor.py
homeassistant/components/satel_integra/* homeassistant/components/satel_integra/*
homeassistant/components/scrape/sensor.py homeassistant/components/scrape/sensor.py
homeassistant/components/scsgate/* homeassistant/components/scsgate/*
@ -585,6 +600,8 @@ omit =
homeassistant/components/solaredge/sensor.py homeassistant/components/solaredge/sensor.py
homeassistant/components/solaredge_local/sensor.py homeassistant/components/solaredge_local/sensor.py
homeassistant/components/solax/sensor.py homeassistant/components/solax/sensor.py
homeassistant/components/soma/cover.py
homeassistant/components/soma/__init__.py
homeassistant/components/somfy/* homeassistant/components/somfy/*
homeassistant/components/somfy_mylink/* homeassistant/components/somfy_mylink/*
homeassistant/components/sonarr/sensor.py homeassistant/components/sonarr/sensor.py
@ -597,7 +614,6 @@ omit =
homeassistant/components/spotcrime/sensor.py homeassistant/components/spotcrime/sensor.py
homeassistant/components/spotify/media_player.py homeassistant/components/spotify/media_player.py
homeassistant/components/squeezebox/media_player.py homeassistant/components/squeezebox/media_player.py
homeassistant/components/srp_energy/sensor.py
homeassistant/components/starlingbank/sensor.py homeassistant/components/starlingbank/sensor.py
homeassistant/components/steam_online/sensor.py homeassistant/components/steam_online/sensor.py
homeassistant/components/stiebel_eltron/* homeassistant/components/stiebel_eltron/*
@ -618,7 +634,6 @@ omit =
homeassistant/components/synologydsm/sensor.py homeassistant/components/synologydsm/sensor.py
homeassistant/components/syslog/notify.py homeassistant/components/syslog/notify.py
homeassistant/components/systemmonitor/sensor.py homeassistant/components/systemmonitor/sensor.py
homeassistant/components/sytadin/sensor.py
homeassistant/components/tado/* homeassistant/components/tado/*
homeassistant/components/tado/device_tracker.py homeassistant/components/tado/device_tracker.py
homeassistant/components/tahoma/* homeassistant/components/tahoma/*
@ -660,9 +675,14 @@ omit =
homeassistant/components/trackr/device_tracker.py homeassistant/components/trackr/device_tracker.py
homeassistant/components/tradfri/* homeassistant/components/tradfri/*
homeassistant/components/tradfri/light.py homeassistant/components/tradfri/light.py
homeassistant/components/tradfri/cover.py
homeassistant/components/trafikverket_train/sensor.py homeassistant/components/trafikverket_train/sensor.py
homeassistant/components/trafikverket_weatherstation/sensor.py homeassistant/components/trafikverket_weatherstation/sensor.py
homeassistant/components/transmission/* homeassistant/components/transmission/__init__.py
homeassistant/components/transmission/sensor.py
homeassistant/components/transmission/switch.py
homeassistant/components/transmission/const.py
homeassistant/components/transmission/errors.py
homeassistant/components/travisci/sensor.py homeassistant/components/travisci/sensor.py
homeassistant/components/tuya/* homeassistant/components/tuya/*
homeassistant/components/twentemilieu/const.py homeassistant/components/twentemilieu/const.py
@ -678,10 +698,8 @@ omit =
homeassistant/components/upcloud/* homeassistant/components/upcloud/*
homeassistant/components/upnp/* homeassistant/components/upnp/*
homeassistant/components/upc_connect/* homeassistant/components/upc_connect/*
homeassistant/components/ups/sensor.py
homeassistant/components/uptimerobot/binary_sensor.py homeassistant/components/uptimerobot/binary_sensor.py
homeassistant/components/uscis/sensor.py homeassistant/components/uscis/sensor.py
homeassistant/components/usps/*
homeassistant/components/vallox/* homeassistant/components/vallox/*
homeassistant/components/vasttrafik/sensor.py homeassistant/components/vasttrafik/sensor.py
homeassistant/components/velbus/__init__.py homeassistant/components/velbus/__init__.py
@ -738,6 +756,7 @@ omit =
homeassistant/components/yale_smart_alarm/alarm_control_panel.py homeassistant/components/yale_smart_alarm/alarm_control_panel.py
homeassistant/components/yamaha/media_player.py homeassistant/components/yamaha/media_player.py
homeassistant/components/yamaha_musiccast/media_player.py homeassistant/components/yamaha_musiccast/media_player.py
homeassistant/components/yandex_transport/*
homeassistant/components/yeelight/* homeassistant/components/yeelight/*
homeassistant/components/yeelightsunflower/light.py homeassistant/components/yeelightsunflower/light.py
homeassistant/components/yi/camera.py homeassistant/components/yi/camera.py
@ -755,6 +774,7 @@ omit =
homeassistant/components/zha/core/device.py homeassistant/components/zha/core/device.py
homeassistant/components/zha/core/gateway.py homeassistant/components/zha/core/gateway.py
homeassistant/components/zha/core/helpers.py homeassistant/components/zha/core/helpers.py
homeassistant/components/zha/core/patches.py
homeassistant/components/zha/core/registries.py homeassistant/components/zha/core/registries.py
homeassistant/components/zha/device_entity.py homeassistant/components/zha/device_entity.py
homeassistant/components/zha/entity.py homeassistant/components/zha/entity.py

View File

@ -8,6 +8,7 @@
"runArgs": ["-e", "GIT_EDITOR=\"code --wait\""], "runArgs": ["-e", "GIT_EDITOR=\"code --wait\""],
"extensions": [ "extensions": [
"ms-python.python", "ms-python.python",
"visualstudioexptteam.vscodeintellicode",
"ms-azure-devops.azure-pipelines", "ms-azure-devops.azure-pipelines",
"redhat.vscode-yaml", "redhat.vscode-yaml",
"esbenp.prettier-vscode" "esbenp.prettier-vscode"

View File

@ -23,9 +23,9 @@
Please provide details about your environment. Please provide details about your environment.
--> -->
**Component/platform:** **Integration:**
<!-- <!--
Please add the link to the documentation at https://www.home-assistant.io/components/ of the component/platform in question. Please add the link to the documentation at https://www.home-assistant.io/integrations/ of the integration in question.
--> -->

View File

@ -29,9 +29,9 @@ about: Create a report to help us improve
Please provide details about your environment. Please provide details about your environment.
--> -->
**Component/platform:** **Integration:**
<!-- <!--
Please add the link to the documentation at https://www.home-assistant.io/components/ of the component/platform in question. Please add the link to the documentation at https://www.home-assistant.io/integrations/ of the integration in question.
--> -->

1
.github/stale.yml vendored
View File

@ -13,6 +13,7 @@ onlyLabels: []
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels: exemptLabels:
- under investigation - under investigation
- Help wanted
# Set to true to ignore issues in a project (defaults to false) # Set to true to ignore issues in a project (defaults to false)
exemptProjects: true exemptProjects: true

View File

@ -30,4 +30,4 @@ matrix:
cache: pip cache: pip
install: pip install -U tox install: pip install -U tox
language: python language: python
script: travis_wait 40 tox --develop script: travis_wait 50 tox --develop

View File

@ -1,4 +1,4 @@
# This file is generated by script/manifest/codeowners.py # This file is generated by script/hassfest/codeowners.py
# People marked here will be automatically requested for a review # People marked here will be automatically requested for a review
# when the code that they own is touched. # when the code that they own is touched.
# https://github.com/blog/2392-introducing-code-owners # https://github.com/blog/2392-introducing-code-owners
@ -16,6 +16,7 @@ homeassistant/scripts/check_config.py @kellerza
homeassistant/components/adguard/* @frenck homeassistant/components/adguard/* @frenck
homeassistant/components/airvisual/* @bachya homeassistant/components/airvisual/* @bachya
homeassistant/components/alarm_control_panel/* @colinodell homeassistant/components/alarm_control_panel/* @colinodell
homeassistant/components/alexa/* @home-assistant/cloud
homeassistant/components/alpha_vantage/* @fabaff homeassistant/components/alpha_vantage/* @fabaff
homeassistant/components/amazon_polly/* @robbiet480 homeassistant/components/amazon_polly/* @robbiet480
homeassistant/components/ambiclimate/* @danielhiversen homeassistant/components/ambiclimate/* @danielhiversen
@ -73,6 +74,7 @@ homeassistant/components/digital_ocean/* @fabaff
homeassistant/components/discogs/* @thibmaek homeassistant/components/discogs/* @thibmaek
homeassistant/components/doorbird/* @oblogic7 homeassistant/components/doorbird/* @oblogic7
homeassistant/components/dweet/* @fabaff homeassistant/components/dweet/* @fabaff
homeassistant/components/ecobee/* @marthoc
homeassistant/components/ecovacs/* @OverloadUT homeassistant/components/ecovacs/* @OverloadUT
homeassistant/components/egardia/* @jeroenterheerdt homeassistant/components/egardia/* @jeroenterheerdt
homeassistant/components/eight_sleep/* @mezz64 homeassistant/components/eight_sleep/* @mezz64
@ -105,6 +107,7 @@ homeassistant/components/geonetnz_quakes/* @exxamalte
homeassistant/components/gitter/* @fabaff homeassistant/components/gitter/* @fabaff
homeassistant/components/glances/* @fabaff homeassistant/components/glances/* @fabaff
homeassistant/components/gntp/* @robbiet480 homeassistant/components/gntp/* @robbiet480
homeassistant/components/google_assistant/* @home-assistant/cloud
homeassistant/components/google_cloud/* @lufton homeassistant/components/google_cloud/* @lufton
homeassistant/components/google_translate/* @awarecan homeassistant/components/google_translate/* @awarecan
homeassistant/components/google_travel_time/* @robbiet480 homeassistant/components/google_travel_time/* @robbiet480
@ -115,6 +118,7 @@ homeassistant/components/gtfs/* @robbiet480
homeassistant/components/harmony/* @ehendrix23 homeassistant/components/harmony/* @ehendrix23
homeassistant/components/hassio/* @home-assistant/hass-io homeassistant/components/hassio/* @home-assistant/hass-io
homeassistant/components/heos/* @andrewsayre homeassistant/components/heos/* @andrewsayre
homeassistant/components/here_travel_time/* @eifinger
homeassistant/components/hikvision/* @mezz64 homeassistant/components/hikvision/* @mezz64
homeassistant/components/hikvisioncam/* @fbradyirl homeassistant/components/hikvisioncam/* @fbradyirl
homeassistant/components/history/* @home-assistant/core homeassistant/components/history/* @home-assistant/core
@ -144,7 +148,9 @@ homeassistant/components/ios/* @robbiet480
homeassistant/components/ipma/* @dgomes homeassistant/components/ipma/* @dgomes
homeassistant/components/iqvia/* @bachya homeassistant/components/iqvia/* @bachya
homeassistant/components/irish_rail_transport/* @ttroy50 homeassistant/components/irish_rail_transport/* @ttroy50
homeassistant/components/izone/* @Swamp-Ig
homeassistant/components/jewish_calendar/* @tsvi homeassistant/components/jewish_calendar/* @tsvi
homeassistant/components/kaiterra/* @Michsior14
homeassistant/components/keba/* @dannerph homeassistant/components/keba/* @dannerph
homeassistant/components/knx/* @Julius2342 homeassistant/components/knx/* @Julius2342
homeassistant/components/kodi/* @armills homeassistant/components/kodi/* @armills
@ -153,9 +159,6 @@ homeassistant/components/lametric/* @robbiet480
homeassistant/components/launch_library/* @ludeeus homeassistant/components/launch_library/* @ludeeus
homeassistant/components/lcn/* @alengwenus homeassistant/components/lcn/* @alengwenus
homeassistant/components/life360/* @pnbruckner homeassistant/components/life360/* @pnbruckner
homeassistant/components/lifx/* @amelchio
homeassistant/components/lifx_cloud/* @amelchio
homeassistant/components/lifx_legacy/* @amelchio
homeassistant/components/linky/* @Quentame homeassistant/components/linky/* @Quentame
homeassistant/components/linux_battery/* @fabaff homeassistant/components/linux_battery/* @fabaff
homeassistant/components/liveboxplaytv/* @pschmitt homeassistant/components/liveboxplaytv/* @pschmitt
@ -181,12 +184,12 @@ homeassistant/components/monoprice/* @etsinko
homeassistant/components/moon/* @fabaff homeassistant/components/moon/* @fabaff
homeassistant/components/mpd/* @fabaff homeassistant/components/mpd/* @fabaff
homeassistant/components/mqtt/* @home-assistant/core homeassistant/components/mqtt/* @home-assistant/core
homeassistant/components/mysensors/* @MartinHjelmare
homeassistant/components/mystrom/* @fabaff homeassistant/components/mystrom/* @fabaff
homeassistant/components/nello/* @pschmitt homeassistant/components/nello/* @pschmitt
homeassistant/components/ness_alarm/* @nickw444 homeassistant/components/ness_alarm/* @nickw444
homeassistant/components/nest/* @awarecan homeassistant/components/nest/* @awarecan
homeassistant/components/netdata/* @fabaff homeassistant/components/netdata/* @fabaff
homeassistant/components/netgear_lte/* @amelchio
homeassistant/components/nextbus/* @vividboarder homeassistant/components/nextbus/* @vividboarder
homeassistant/components/nissan_leaf/* @filcole homeassistant/components/nissan_leaf/* @filcole
homeassistant/components/nmbs/* @thibmaek homeassistant/components/nmbs/* @thibmaek
@ -197,8 +200,10 @@ homeassistant/components/nsw_fuel_station/* @nickw444
homeassistant/components/nsw_rural_fire_service_feed/* @exxamalte homeassistant/components/nsw_rural_fire_service_feed/* @exxamalte
homeassistant/components/nuki/* @pvizeli homeassistant/components/nuki/* @pvizeli
homeassistant/components/nws/* @MatthewFlamm homeassistant/components/nws/* @MatthewFlamm
homeassistant/components/nzbget/* @chriscla
homeassistant/components/obihai/* @dshokouhi homeassistant/components/obihai/* @dshokouhi
homeassistant/components/ohmconnect/* @robbiet480 homeassistant/components/ohmconnect/* @robbiet480
homeassistant/components/ombi/* @larssont
homeassistant/components/onboarding/* @home-assistant/core homeassistant/components/onboarding/* @home-assistant/core
homeassistant/components/opentherm_gw/* @mvn23 homeassistant/components/opentherm_gw/* @mvn23
homeassistant/components/openuv/* @bachya homeassistant/components/openuv/* @bachya
@ -209,7 +214,7 @@ homeassistant/components/panel_custom/* @home-assistant/frontend
homeassistant/components/panel_iframe/* @home-assistant/frontend homeassistant/components/panel_iframe/* @home-assistant/frontend
homeassistant/components/persistent_notification/* @home-assistant/core homeassistant/components/persistent_notification/* @home-assistant/core
homeassistant/components/philips_js/* @elupus homeassistant/components/philips_js/* @elupus
homeassistant/components/pi_hole/* @fabaff homeassistant/components/pi_hole/* @fabaff @johnluetke
homeassistant/components/plaato/* @JohNan homeassistant/components/plaato/* @JohNan
homeassistant/components/plant/* @ChristianKuehnel homeassistant/components/plant/* @ChristianKuehnel
homeassistant/components/plex/* @jjlawren homeassistant/components/plex/* @jjlawren
@ -223,6 +228,7 @@ homeassistant/components/qld_bushfire/* @exxamalte
homeassistant/components/qnap/* @colinodell homeassistant/components/qnap/* @colinodell
homeassistant/components/quantum_gateway/* @cisasteelersfan homeassistant/components/quantum_gateway/* @cisasteelersfan
homeassistant/components/qwikswitch/* @kellerza homeassistant/components/qwikswitch/* @kellerza
homeassistant/components/rainbird/* @konikvranik
homeassistant/components/raincloud/* @vanstinator homeassistant/components/raincloud/* @vanstinator
homeassistant/components/rainforest_eagle/* @gtdiehl homeassistant/components/rainforest_eagle/* @gtdiehl
homeassistant/components/rainmachine/* @bachya homeassistant/components/rainmachine/* @bachya
@ -231,6 +237,7 @@ homeassistant/components/repetier/* @MTrab
homeassistant/components/rfxtrx/* @danielhiversen homeassistant/components/rfxtrx/* @danielhiversen
homeassistant/components/rmvtransport/* @cgtobi homeassistant/components/rmvtransport/* @cgtobi
homeassistant/components/roomba/* @pschmitt homeassistant/components/roomba/* @pschmitt
homeassistant/components/saj/* @fredericvl
homeassistant/components/scene/* @home-assistant/core homeassistant/components/scene/* @home-assistant/core
homeassistant/components/scrape/* @fabaff homeassistant/components/scrape/* @fabaff
homeassistant/components/script/* @home-assistant/core homeassistant/components/script/* @home-assistant/core
@ -248,11 +255,11 @@ homeassistant/components/smarthab/* @outadoc
homeassistant/components/smartthings/* @andrewsayre homeassistant/components/smartthings/* @andrewsayre
homeassistant/components/smarty/* @z0mbieprocess homeassistant/components/smarty/* @z0mbieprocess
homeassistant/components/smtp/* @fabaff homeassistant/components/smtp/* @fabaff
homeassistant/components/solaredge_local/* @drobtravels homeassistant/components/solaredge_local/* @drobtravels @scheric
homeassistant/components/solax/* @squishykid homeassistant/components/solax/* @squishykid
homeassistant/components/soma/* @ratsept
homeassistant/components/somfy/* @tetienne homeassistant/components/somfy/* @tetienne
homeassistant/components/songpal/* @rytilahti homeassistant/components/songpal/* @rytilahti
homeassistant/components/sonos/* @amelchio
homeassistant/components/spaceapi/* @fabaff homeassistant/components/spaceapi/* @fabaff
homeassistant/components/spider/* @peternijssen homeassistant/components/spider/* @peternijssen
homeassistant/components/sql/* @dgomes homeassistant/components/sql/* @dgomes
@ -270,7 +277,6 @@ homeassistant/components/switchmate/* @danielhiversen
homeassistant/components/syncthru/* @nielstron homeassistant/components/syncthru/* @nielstron
homeassistant/components/synology_srm/* @aerialls homeassistant/components/synology_srm/* @aerialls
homeassistant/components/syslog/* @fabaff homeassistant/components/syslog/* @fabaff
homeassistant/components/sytadin/* @gautric
homeassistant/components/tahoma/* @philklei homeassistant/components/tahoma/* @philklei
homeassistant/components/tautulli/* @ludeeus homeassistant/components/tautulli/* @ludeeus
homeassistant/components/tellduslive/* @fredrike homeassistant/components/tellduslive/* @fredrike
@ -282,11 +288,13 @@ homeassistant/components/threshold/* @fabaff
homeassistant/components/tibber/* @danielhiversen homeassistant/components/tibber/* @danielhiversen
homeassistant/components/tile/* @bachya homeassistant/components/tile/* @bachya
homeassistant/components/time_date/* @fabaff homeassistant/components/time_date/* @fabaff
homeassistant/components/todoist/* @boralyl
homeassistant/components/toon/* @frenck homeassistant/components/toon/* @frenck
homeassistant/components/tplink/* @rytilahti homeassistant/components/tplink/* @rytilahti
homeassistant/components/traccar/* @ludeeus homeassistant/components/traccar/* @ludeeus
homeassistant/components/tradfri/* @ggravlingen homeassistant/components/tradfri/* @ggravlingen
homeassistant/components/trafikverket_train/* @endor-force homeassistant/components/trafikverket_train/* @endor-force
homeassistant/components/transmission/* @engrbm87
homeassistant/components/tts/* @robbiet480 homeassistant/components/tts/* @robbiet480
homeassistant/components/twentemilieu/* @frenck homeassistant/components/twentemilieu/* @frenck
homeassistant/components/twilio_call/* @robbiet480 homeassistant/components/twilio_call/* @robbiet480
@ -315,12 +323,14 @@ homeassistant/components/wemo/* @sqldiablo
homeassistant/components/withings/* @vangorra homeassistant/components/withings/* @vangorra
homeassistant/components/worldclock/* @fabaff homeassistant/components/worldclock/* @fabaff
homeassistant/components/wwlln/* @bachya homeassistant/components/wwlln/* @bachya
homeassistant/components/xbox_live/* @MartinHjelmare
homeassistant/components/xfinity/* @cisasteelersfan homeassistant/components/xfinity/* @cisasteelersfan
homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi
homeassistant/components/xiaomi_miio/* @rytilahti @syssi homeassistant/components/xiaomi_miio/* @rytilahti @syssi
homeassistant/components/xiaomi_tv/* @simse homeassistant/components/xiaomi_tv/* @simse
homeassistant/components/xmpp/* @fabaff @flowolf homeassistant/components/xmpp/* @fabaff @flowolf
homeassistant/components/yamaha_musiccast/* @jalmeroth homeassistant/components/yamaha_musiccast/* @jalmeroth
homeassistant/components/yandex_transport/* @rishatik92
homeassistant/components/yeelight/* @rytilahti @zewelor homeassistant/components/yeelight/* @rytilahti @zewelor
homeassistant/components/yeelightsunflower/* @lindsaymarkward homeassistant/components/yeelightsunflower/* @lindsaymarkward
homeassistant/components/yessssms/* @flowolf homeassistant/components/yessssms/* @flowolf

View File

@ -32,4 +32,4 @@ of a component, check the `Home Assistant help section <https://home-assistant.i
.. |screenshot-states| image:: https://raw.github.com/home-assistant/home-assistant/master/docs/screenshots.png .. |screenshot-states| image:: https://raw.github.com/home-assistant/home-assistant/master/docs/screenshots.png
:target: https://home-assistant.io/demo/ :target: https://home-assistant.io/demo/
.. |screenshot-components| image:: https://raw.github.com/home-assistant/home-assistant/dev/docs/screenshot-components.png .. |screenshot-components| image:: https://raw.github.com/home-assistant/home-assistant/dev/docs/screenshot-components.png
:target: https://home-assistant.io/components/ :target: https://home-assistant.io/integrations/

View File

@ -112,6 +112,8 @@ stages:
# Find offending deps with `pipdeptree -r -p typing` # Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing pip uninstall -y typing
- script: | - script: |
set -e
. venv/bin/activate . venv/bin/activate
pytest --timeout=9 --durations=10 -qq -o console_output_style=count -p no:sugar tests pytest --timeout=9 --durations=10 -qq -o console_output_style=count -p no:sugar tests
script/check_dirty script/check_dirty

View File

@ -233,3 +233,45 @@ stages:
fi fi
displayName: 'Create Meta-Image' displayName: 'Create Meta-Image'
- stage: 'Addidional'
jobs:
- job: 'Updater'
pool:
vmImage: 'ubuntu-latest'
variables:
- group: gcloud
steps:
- template: templates/azp-step-ha-version.yaml@azure
- script: |
set -e
export CLOUDSDK_CORE_DISABLE_PROMPTS=1
curl -o google-cloud-sdk.tar.gz https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz
tar -C . -xvf google-cloud-sdk.tar.gz
rm -f google-cloud-sdk.tar.gz
./google-cloud-sdk/install.sh
displayName: 'Setup gCloud'
condition: eq(variables['homeassistantReleaseStable'], 'true')
- script: |
set -e
export CLOUDSDK_CORE_DISABLE_PROMPTS=1
echo "$(gcloudAnalytic)" > gcloud_auth.json
./google-cloud-sdk/bin/gcloud auth activate-service-account --key-file gcloud_auth.json
rm -f gcloud_auth.json
displayName: 'Auth gCloud'
condition: eq(variables['homeassistantReleaseStable'], 'true')
- script: |
set -e
export CLOUDSDK_CORE_DISABLE_PROMPTS=1
./google-cloud-sdk/bin/gcloud functions deploy Analytics-Receiver \
--project home-assistant-analytics \
--update-env-vars VERSION=$(homeassistantRelease) \
--source gs://analytics-src/function-source.zip
displayName: 'Push details to updater'
condition: eq(variables['homeassistantReleaseStable'], 'true')

View File

@ -45,7 +45,6 @@ jobs:
requirement_files="requirements_wheels.txt requirements_diff.txt" requirement_files="requirements_wheels.txt requirements_diff.txt"
for requirement_file in ${requirement_files}; do for requirement_file in ${requirement_files}; do
sed -i "s|# pytradfri|pytradfri|g" ${requirement_file}
sed -i "s|# pybluez|pybluez|g" ${requirement_file} sed -i "s|# pybluez|pybluez|g" ${requirement_file}
sed -i "s|# bluepy|bluepy|g" ${requirement_file} sed -i "s|# bluepy|bluepy|g" ${requirement_file}
sed -i "s|# beacontools|beacontools|g" ${requirement_file} sed -i "s|# beacontools|beacontools|g" ${requirement_file}
@ -63,9 +62,15 @@ jobs:
sed -i "s|# homekit|homekit|g" ${requirement_file} sed -i "s|# homekit|homekit|g" ${requirement_file}
sed -i "s|# decora_wifi|decora_wifi|g" ${requirement_file} sed -i "s|# decora_wifi|decora_wifi|g" ${requirement_file}
sed -i "s|# decora|decora|g" ${requirement_file} sed -i "s|# decora|decora|g" ${requirement_file}
sed -i "s|# avion|avion|g" ${requirement_file}
sed -i "s|# PySwitchbot|PySwitchbot|g" ${requirement_file} sed -i "s|# PySwitchbot|PySwitchbot|g" ${requirement_file}
sed -i "s|# pySwitchmate|pySwitchmate|g" ${requirement_file} sed -i "s|# pySwitchmate|pySwitchmate|g" ${requirement_file}
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file} sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
sed -i "s|# py_noaa|py_noaa|g" ${requirement_file} sed -i "s|# py_noaa|py_noaa|g" ${requirement_file}
sed -i "s|# bme680|bme680|g" ${requirement_file}
if [[ "$(buildArch)" =~ arm ]]; then
sed -i "s|# VL53L1X|VL53L1X|g" ${requirement_file}
fi
done done
displayName: 'Prepare requirements files for Hass.io' displayName: 'Prepare requirements files for Hass.io'

View File

@ -1,6 +1,4 @@
"""Start Home Assistant.""" """Start Home Assistant."""
from __future__ import print_function
import argparse import argparse
import os import os
import platform import platform

View File

@ -22,7 +22,7 @@ from . import (
SetupFlow, SetupFlow,
) )
REQUIREMENTS = ["pyotp==2.2.7"] REQUIREMENTS = ["pyotp==2.3.0"]
CONF_MESSAGE = "message" CONF_MESSAGE = "message"
@ -251,8 +251,10 @@ class NotifyAuthModule(MultiFactorAuthModule):
_LOGGER.error("Cannot find user %s", user_id) _LOGGER.error("Cannot find user %s", user_id)
return return
await self.async_notify( # type: ignore await self.async_notify(
code, notify_setting.notify_service, notify_setting.target code,
notify_setting.notify_service, # type: ignore
notify_setting.target,
) )
async def async_notify( async def async_notify(

View File

@ -16,7 +16,7 @@ from . import (
SetupFlow, SetupFlow,
) )
REQUIREMENTS = ["pyotp==2.2.7", "PyQRCode==1.2.1"] REQUIREMENTS = ["pyotp==2.3.0", "PyQRCode==1.2.1"]
CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend({}, extra=vol.PREVENT_EXTRA) CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend({}, extra=vol.PREVENT_EXTRA)
@ -215,8 +215,9 @@ class TotpSetupFlow(SetupFlow):
else: else:
hass = self._auth_module.hass hass = self._auth_module.hass
self._ota_secret, self._url, self._image = await hass.async_add_executor_job( # type: ignore self._ota_secret, self._url, self._image = await hass.async_add_executor_job(
_generate_secret_and_qr_code, str(self._user.name) _generate_secret_and_qr_code, # type: ignore
str(self._user.name),
) )
return self.async_show_form( return self.async_show_form(

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "La clau API no \u00e9s correcta.",
"name_exists": "El nom ja existeix.",
"wrong_location": "No hi ha estacions de mesura Airly en aquesta zona."
},
"step": {
"user": {
"data": {
"api_key": "Clau API d'Airly",
"latitude": "Latitud",
"longitude": "Longitud",
"name": "Nom de la integraci\u00f3"
},
"description": "Configura una integraci\u00f3 de qualitat d\u2019aire Airly. Per generar la clau API, v\u00e9s a https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "API-n\u00f8glen er ikke korrekt.",
"name_exists": "Navnet findes allerede.",
"wrong_location": "Ingen Airly m\u00e5lestationer i dette omr\u00e5de."
},
"step": {
"user": {
"data": {
"api_key": "Airly API-n\u00f8gle",
"latitude": "Breddegrad",
"longitude": "L\u00e6ngdegrad",
"name": "Integrationens navn"
},
"description": "Konfigurer Airly luftkvalitet integration. For at generere API-n\u00f8gle, g\u00e5 til https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,18 @@
{
"config": {
"error": {
"name_exists": "Name existiert bereits"
},
"step": {
"user": {
"data": {
"latitude": "Breitengrad",
"longitude": "L\u00e4ngengrad",
"name": "Name der Integration"
},
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "API key is not correct.",
"name_exists": "Name already exists.",
"wrong_location": "No Airly measuring stations in this area."
},
"step": {
"user": {
"data": {
"api_key": "Airly API key",
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Name of the integration"
},
"description": "Set up Airly air quality integration. To generate API key go to https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "La clave de la API no es correcta.",
"name_exists": "El nombre ya existe.",
"wrong_location": "No hay estaciones de medici\u00f3n Airly en esta zona."
},
"step": {
"user": {
"data": {
"api_key": "Clave API de Airly",
"latitude": "Latitud",
"longitude": "Longitud",
"name": "Nombre de la integraci\u00f3n"
},
"description": "Establecer la integraci\u00f3n de la calidad del aire de Airly. Para generar la clave de la API vaya a https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,21 @@
{
"config": {
"error": {
"auth": "La cl\u00e9 API n'est pas correcte.",
"name_exists": "Le nom existe d\u00e9j\u00e0.",
"wrong_location": "Aucune station de mesure Airly dans cette zone."
},
"step": {
"user": {
"data": {
"api_key": "Cl\u00e9 API Airly",
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Nom de l'int\u00e9gration"
},
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "La chiave API non \u00e8 corretta.",
"name_exists": "Il nome \u00e8 gi\u00e0 esistente",
"wrong_location": "Nessuna stazione di misurazione Airly in quest'area."
},
"step": {
"user": {
"data": {
"api_key": "Chiave API Airly",
"latitude": "Latitudine",
"longitude": "Logitudine",
"name": "Nome dell'integrazione"
},
"description": "Configurazione dell'integrazione della qualit\u00e0 dell'aria Airly. Per generare la chiave API andare su https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "Api Schl\u00ebssel ass net korrekt.",
"name_exists": "Numm g\u00ebtt et schonn",
"wrong_location": "Keng Airly Moos Statioun an d\u00ebsem Ber\u00e4ich"
},
"step": {
"user": {
"data": {
"api_key": "Airly API Schl\u00ebssel",
"latitude": "Breedegrad",
"longitude": "L\u00e4ngegrad",
"name": "Numm vun der Installatioun"
},
"description": "Airly Loft Qualit\u00e9it Integratioun ariichten. Fir een API Schl\u00ebssel z'erstelle gitt op https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,10 @@
{
"config": {
"step": {
"user": {
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "API-n\u00f8kkelen er ikke korrekt.",
"name_exists": "Navnet finnes allerede.",
"wrong_location": "Ingen Airly m\u00e5lestasjoner i dette omr\u00e5det."
},
"step": {
"user": {
"data": {
"api_key": "Airly API-n\u00f8kkel",
"latitude": "Breddegrad",
"longitude": "Lengdegrad",
"name": "Navn p\u00e5 integrasjonen"
},
"description": "Sett opp Airly luftkvalitet integrering. For \u00e5 generere API-n\u00f8kkel g\u00e5 til https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "Klucz API jest nieprawid\u0142owy.",
"name_exists": "Nazwa ju\u017c istnieje.",
"wrong_location": "Brak stacji pomiarowych Airly w tym rejonie."
},
"step": {
"user": {
"data": {
"api_key": "Klucz API Airly",
"latitude": "Szeroko\u015b\u0107 geograficzna",
"longitude": "D\u0142ugo\u015b\u0107 geograficzna",
"name": "Nazwa integracji"
},
"description": "Konfiguracja integracji Airly. By wygenerowa\u0107 klucz API, przejd\u017a na stron\u0119 https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API.",
"name_exists": "\u042d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.",
"wrong_location": "\u0412 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 Airly."
},
"step": {
"user": {
"data": {
"api_key": "\u041a\u043b\u044e\u0447 API",
"latitude": "\u0428\u0438\u0440\u043e\u0442\u0430",
"longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430",
"name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435"
},
"description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 Airly. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 API, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 https://developer.airly.eu/register.",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "Klju\u010d API ni pravilen.",
"name_exists": "Ime \u017ee obstaja",
"wrong_location": "Na tem obmo\u010dju ni merilnih postaj Airly."
},
"step": {
"user": {
"data": {
"api_key": "Airly API klju\u010d",
"latitude": "Zemljepisna \u0161irina",
"longitude": "Zemljepisna dol\u017eina",
"name": "Ime integracije"
},
"description": "Nastavite Airly integracijo za kakovost zraka. \u010ce \u017eelite ustvariti API klju\u010d pojdite na https://developer.airly.eu/register",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -0,0 +1,22 @@
{
"config": {
"error": {
"auth": "API \u5bc6\u9470\u4e0d\u6b63\u78ba\u3002",
"name_exists": "\u8a72\u540d\u7a31\u5df2\u5b58\u5728",
"wrong_location": "\u8a72\u5340\u57df\u6c92\u6709 Arily \u76e3\u6e2c\u7ad9\u3002"
},
"step": {
"user": {
"data": {
"api_key": "Airly API \u5bc6\u9470",
"latitude": "\u7def\u5ea6",
"longitude": "\u7d93\u5ea6",
"name": "\u6574\u5408\u540d\u7a31"
},
"description": "\u6b32\u8a2d\u5b9a Airly \u7a7a\u6c23\u54c1\u8cea\u6574\u5408\u3002\u8acb\u81f3 https://developer.airly.eu/register \u7522\u751f API \u5bc6\u9470",
"title": "Airly"
}
},
"title": "Airly"
}
}

View File

@ -1,7 +1,7 @@
{ {
"domain": "abode", "domain": "abode",
"name": "Abode", "name": "Abode",
"documentation": "https://www.home-assistant.io/components/abode", "documentation": "https://www.home-assistant.io/integrations/abode",
"requirements": [ "requirements": [
"abodepy==0.15.0" "abodepy==0.15.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "acer_projector", "domain": "acer_projector",
"name": "Acer projector", "name": "Acer projector",
"documentation": "https://www.home-assistant.io/components/acer_projector", "documentation": "https://www.home-assistant.io/integrations/acer_projector",
"requirements": [ "requirements": [
"pyserial==3.1.1" "pyserial==3.1.1"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "actiontec", "domain": "actiontec",
"name": "Actiontec", "name": "Actiontec",
"documentation": "https://www.home-assistant.io/components/actiontec", "documentation": "https://www.home-assistant.io/integrations/actiontec",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"codeowners": [] "codeowners": []

View File

@ -9,7 +9,7 @@
}, },
"step": { "step": {
"hassio_confirm": { "hassio_confirm": {
"description": "Vil du konfigurere Home Assistant til at oprette forbindelse til Adguard Home, der leveres af Hass.io add-on: {addon}?", "description": "Vil du konfigurere Home Assistant til at oprette forbindelse til AdGuard Home, der leveres af Hass.io add-on: {addon}?",
"title": "AdGuard Home via Hass.io add-on" "title": "AdGuard Home via Hass.io add-on"
}, },
"user": { "user": {

View File

@ -0,0 +1,13 @@
{
"config": {
"step": {
"user": {
"data": {
"password": "Jelsz\u00f3",
"port": "Port",
"username": "Felhaszn\u00e1l\u00f3n\u00e9v"
}
}
}
}
}

View File

@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"username": "Brukarnamn"
}
}
}
}
}

View File

@ -2,7 +2,7 @@
"config": { "config": {
"abort": { "abort": {
"existing_instance_updated": "Oppdatert eksisterende konfigurasjon.", "existing_instance_updated": "Oppdatert eksisterende konfigurasjon.",
"single_instance_allowed": "Kun \u00e9n enkelt konfigurasjon av AdGuard Hjemer tillatt." "single_instance_allowed": "Kun en konfigurasjon av AdGuard Hjemer tillatt."
}, },
"error": { "error": {
"connection_error": "Tilkobling mislyktes." "connection_error": "Tilkobling mislyktes."

View File

@ -22,7 +22,7 @@
"verify_ssl": "AdGuard Home u\u017cywa odpowiedniego certyfikatu." "verify_ssl": "AdGuard Home u\u017cywa odpowiedniego certyfikatu."
}, },
"description": "Skonfiguruj instancj\u0119 AdGuard Home, aby umo\u017cliwi\u0107 monitorowanie i kontrol\u0119.", "description": "Skonfiguruj instancj\u0119 AdGuard Home, aby umo\u017cliwi\u0107 monitorowanie i kontrol\u0119.",
"title": "Po\u0142\u0105cz sw\u00f3j AdGuard Home" "title": "Po\u0142\u0105cz AdGuard Home"
} }
}, },
"title": "AdGuard Home" "title": "AdGuard Home"

View File

@ -9,7 +9,7 @@
}, },
"step": { "step": {
"hassio_confirm": { "hassio_confirm": {
"description": "\u017delite konfigurirati Home Assistant-a za povezavo z AdGuard Home, ki ga ponuja hass.io add-on {addon} ?", "description": "\u017delite konfigurirati Home Assistant-a za povezavo z AdGuard Home, ki ga ponuja Hass.io add-on {addon} ?",
"title": "AdGuard Home preko dodatka Hass.io" "title": "AdGuard Home preko dodatka Hass.io"
}, },
"user": { "user": {

View File

@ -2,7 +2,7 @@
"domain": "adguard", "domain": "adguard",
"name": "AdGuard Home", "name": "AdGuard Home",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/components/adguard", "documentation": "https://www.home-assistant.io/integrations/adguard",
"requirements": [ "requirements": [
"adguardhome==0.2.1" "adguardhome==0.2.1"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "ads", "domain": "ads",
"name": "Ads", "name": "Ads",
"documentation": "https://www.home-assistant.io/components/ads", "documentation": "https://www.home-assistant.io/integrations/ads",
"requirements": [ "requirements": [
"pyads==3.0.7" "pyads==3.0.7"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aftership", "domain": "aftership",
"name": "Aftership", "name": "Aftership",
"documentation": "https://www.home-assistant.io/components/aftership", "documentation": "https://www.home-assistant.io/integrations/aftership",
"requirements": [ "requirements": [
"pyaftership==0.1.2" "pyaftership==0.1.2"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "air_quality", "domain": "air_quality",
"name": "Air quality", "name": "Air quality",
"documentation": "https://www.home-assistant.io/components/air_quality", "documentation": "https://www.home-assistant.io/integrations/air_quality",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"codeowners": [] "codeowners": []

View File

@ -1,7 +1,7 @@
{ {
"domain": "airvisual", "domain": "airvisual",
"name": "Airvisual", "name": "Airvisual",
"documentation": "https://www.home-assistant.io/components/airvisual", "documentation": "https://www.home-assistant.io/integrations/airvisual",
"requirements": [ "requirements": [
"pyairvisual==3.0.1" "pyairvisual==3.0.1"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aladdin_connect", "domain": "aladdin_connect",
"name": "Aladdin connect", "name": "Aladdin connect",
"documentation": "https://www.home-assistant.io/components/aladdin_connect", "documentation": "https://www.home-assistant.io/integrations/aladdin_connect",
"requirements": [ "requirements": [
"aladdin_connect==0.3" "aladdin_connect==0.3"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "alarm_control_panel", "domain": "alarm_control_panel",
"name": "Alarm control panel", "name": "Alarm control panel",
"documentation": "https://www.home-assistant.io/components/alarm_control_panel", "documentation": "https://www.home-assistant.io/integrations/alarm_control_panel",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"codeowners": [ "codeowners": [

View File

@ -1,7 +1,7 @@
{ {
"domain": "alarmdecoder", "domain": "alarmdecoder",
"name": "Alarmdecoder", "name": "Alarmdecoder",
"documentation": "https://www.home-assistant.io/components/alarmdecoder", "documentation": "https://www.home-assistant.io/integrations/alarmdecoder",
"requirements": [ "requirements": [
"alarmdecoder==1.13.2" "alarmdecoder==1.13.2"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "alarmdotcom", "domain": "alarmdotcom",
"name": "Alarmdotcom", "name": "Alarmdotcom",
"documentation": "https://www.home-assistant.io/components/alarmdotcom", "documentation": "https://www.home-assistant.io/integrations/alarmdotcom",
"requirements": [ "requirements": [
"pyalarmdotcom==0.3.2" "pyalarmdotcom==0.3.2"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "alert", "domain": "alert",
"name": "Alert", "name": "Alert",
"documentation": "https://www.home-assistant.io/components/alert", "documentation": "https://www.home-assistant.io/integrations/alert",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"after_dependencies": [ "after_dependencies": [

View File

@ -1,5 +1,4 @@
"""Alexa capabilities.""" """Alexa capabilities."""
from datetime import datetime
import logging import logging
from homeassistant.const import ( from homeassistant.const import (
@ -16,6 +15,7 @@ from homeassistant.const import (
import homeassistant.components.climate.const as climate import homeassistant.components.climate.const as climate
from homeassistant.components import light, fan, cover from homeassistant.components import light, fan, cover
import homeassistant.util.color as color_util import homeassistant.util.color as color_util
import homeassistant.util.dt as dt_util
from .const import ( from .const import (
API_TEMP_UNITS, API_TEMP_UNITS,
@ -109,7 +109,7 @@ class AlexaCapibility:
"name": prop_name, "name": prop_name,
"namespace": self.name(), "namespace": self.name(),
"value": prop_value, "value": prop_value,
"timeOfSample": datetime.now().strftime(DATE_FORMAT), "timeOfSample": dt_util.utcnow().strftime(DATE_FORMAT),
"uncertaintyInMilliseconds": 0, "uncertaintyInMilliseconds": 0,
} }
@ -326,7 +326,7 @@ class AlexaColorTemperatureController(AlexaCapibility):
return color_util.color_temperature_mired_to_kelvin( return color_util.color_temperature_mired_to_kelvin(
self.entity.attributes["color_temp"] self.entity.attributes["color_temp"]
) )
return 0 return None
class AlexaPercentageController(AlexaCapibility): class AlexaPercentageController(AlexaCapibility):
@ -445,7 +445,7 @@ class AlexaTemperatureSensor(AlexaCapibility):
unit = self.hass.config.units.temperature_unit unit = self.hass.config.units.temperature_unit
temp = self.entity.attributes.get(climate.ATTR_CURRENT_TEMPERATURE) temp = self.entity.attributes.get(climate.ATTR_CURRENT_TEMPERATURE)
if temp in (STATE_UNAVAILABLE, STATE_UNKNOWN): if temp in (STATE_UNAVAILABLE, STATE_UNKNOWN, None):
return None return None
try: try:
@ -572,6 +572,9 @@ class AlexaThermostatController(AlexaCapibility):
def get_property(self, name): def get_property(self, name):
"""Read and return a property.""" """Read and return a property."""
if self.entity.state == STATE_UNAVAILABLE:
return None
if name == "thermostatMode": if name == "thermostatMode":
preset = self.entity.attributes.get(climate.ATTR_PRESET_MODE) preset = self.entity.attributes.get(climate.ATTR_PRESET_MODE)

View File

@ -52,6 +52,8 @@ from .capabilities import (
ENTITY_ADAPTERS = Registry() ENTITY_ADAPTERS = Registry()
TRANSLATION_TABLE = dict.fromkeys(map(ord, r"}{\/|\"()[]+~!><*%"), None)
class DisplayCategory: class DisplayCategory:
"""Possible display categories for Discovery response. """Possible display categories for Discovery response.
@ -74,9 +76,18 @@ class DisplayCategory:
# Indicates a door. # Indicates a door.
DOOR = "DOOR" DOOR = "DOOR"
# Indicates a doorbell.
DOOR_BELL = "DOORBELL"
# Indicates a fan.
FAN = "FAN"
# Indicates light sources or fixtures. # Indicates light sources or fixtures.
LIGHT = "LIGHT" LIGHT = "LIGHT"
# Indicates a microwave oven.
MICROWAVE = "MICROWAVE"
# Indicates an endpoint that detects and reports motion. # Indicates an endpoint that detects and reports motion.
MOTION_SENSOR = "MOTION_SENSOR" MOTION_SENSOR = "MOTION_SENSOR"
@ -89,6 +100,9 @@ class DisplayCategory:
# order is unimportant. Applies to Scenes # order is unimportant. Applies to Scenes
SCENE_TRIGGER = "SCENE_TRIGGER" SCENE_TRIGGER = "SCENE_TRIGGER"
# Indicates a security panel.
SECURITY_PANEL = "SECURITY_PANEL"
# Indicates an endpoint that locks. # Indicates an endpoint that locks.
SMARTLOCK = "SMARTLOCK" SMARTLOCK = "SMARTLOCK"
@ -134,15 +148,18 @@ class AlexaEntity:
def friendly_name(self): def friendly_name(self):
"""Return the Alexa API friendly name.""" """Return the Alexa API friendly name."""
return self.entity_conf.get(CONF_NAME, self.entity.name) return self.entity_conf.get(CONF_NAME, self.entity.name).translate(
TRANSLATION_TABLE
)
def description(self): def description(self):
"""Return the Alexa API description.""" """Return the Alexa API description."""
return self.entity_conf.get(CONF_DESCRIPTION, self.entity.entity_id) description = self.entity_conf.get(CONF_DESCRIPTION) or self.entity_id
return f"{description} via Home Assistant".translate(TRANSLATION_TABLE)
def alexa_id(self): def alexa_id(self):
"""Return the Alexa API entity id.""" """Return the Alexa API entity id."""
return self.entity.entity_id.replace(".", "#") return self.entity.entity_id.replace(".", "#").translate(TRANSLATION_TABLE)
def display_categories(self): def display_categories(self):
"""Return a list of display categories.""" """Return a list of display categories."""
@ -319,7 +336,7 @@ class FanCapabilities(AlexaEntity):
def default_display_categories(self): def default_display_categories(self):
"""Return the display categories for this entity.""" """Return the display categories for this entity."""
return [DisplayCategory.OTHER] return [DisplayCategory.FAN]
def interfaces(self): def interfaces(self):
"""Yield the supported interfaces.""" """Yield the supported interfaces."""
@ -389,10 +406,11 @@ class SceneCapabilities(AlexaEntity):
"""Class to represent Scene capabilities.""" """Class to represent Scene capabilities."""
def description(self): def description(self):
"""Return the description of the entity.""" """Return the Alexa API description."""
# Required description as per Amazon Scene docs description = AlexaEntity.description(self)
scene_fmt = "{} (Scene connected via Home Assistant)" if "scene" not in description.casefold():
return scene_fmt.format(AlexaEntity.description(self)) return f"{description} (Scene)"
return description
def default_display_categories(self): def default_display_categories(self):
"""Return the display categories for this entity.""" """Return the display categories for this entity."""

View File

@ -1,9 +1,9 @@
"""Support for Alexa skill service end point.""" """Support for Alexa skill service end point."""
import copy import copy
from datetime import datetime
import logging import logging
import uuid import uuid
import homeassistant.util.dt as dt_util
from homeassistant.components import http from homeassistant.components import http
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers import template from homeassistant.helpers import template
@ -89,7 +89,7 @@ class AlexaFlashBriefingView(http.HomeAssistantView):
else: else:
output[ATTR_REDIRECTION_URL] = item.get(CONF_DISPLAY_URL) output[ATTR_REDIRECTION_URL] = item.get(CONF_DISPLAY_URL)
output[ATTR_UPDATE_DATE] = datetime.now().strftime(DATE_FORMAT) output[ATTR_UPDATE_DATE] = dt_util.utcnow().strftime(DATE_FORMAT)
briefing.append(output) briefing.append(output)

View File

@ -1,5 +1,4 @@
"""Alexa message handlers.""" """Alexa message handlers."""
from datetime import datetime
import logging import logging
import math import math
@ -28,6 +27,7 @@ from homeassistant.const import (
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
) )
import homeassistant.util.color as color_util import homeassistant.util.color as color_util
import homeassistant.util.dt as dt_util
from homeassistant.util.decorator import Registry from homeassistant.util.decorator import Registry
from homeassistant.util.temperature import convert as convert_temperature from homeassistant.util.temperature import convert as convert_temperature
@ -275,7 +275,7 @@ async def async_api_activate(hass, config, directive, context):
payload = { payload = {
"cause": {"type": Cause.VOICE_INTERACTION}, "cause": {"type": Cause.VOICE_INTERACTION},
"timestamp": "%sZ" % (datetime.utcnow().isoformat(),), "timestamp": f"{dt_util.utcnow().replace(tzinfo=None).isoformat()}Z",
} }
return directive.response( return directive.response(
@ -299,7 +299,7 @@ async def async_api_deactivate(hass, config, directive, context):
payload = { payload = {
"cause": {"type": Cause.VOICE_INTERACTION}, "cause": {"type": Cause.VOICE_INTERACTION},
"timestamp": "%sZ" % (datetime.utcnow().isoformat(),), "timestamp": f"{dt_util.utcnow().replace(tzinfo=None).isoformat()}Z",
} }
return directive.response( return directive.response(

View File

@ -1,10 +1,8 @@
{ {
"domain": "alexa", "domain": "alexa",
"name": "Alexa", "name": "Alexa",
"documentation": "https://www.home-assistant.io/components/alexa", "documentation": "https://www.home-assistant.io/integrations/alexa",
"requirements": [], "requirements": [],
"dependencies": [ "dependencies": ["http"],
"http" "codeowners": ["@home-assistant/cloud"]
],
"codeowners": []
} }

View File

@ -131,6 +131,10 @@ async def async_send_add_or_update_message(hass, config, entity_ids):
for entity_id in entity_ids: for entity_id in entity_ids:
domain = entity_id.split(".", 1)[0] domain = entity_id.split(".", 1)[0]
if domain not in ENTITY_ADAPTERS:
continue
alexa_entity = ENTITY_ADAPTERS[domain](hass, config, hass.states.get(entity_id)) alexa_entity = ENTITY_ADAPTERS[domain](hass, config, hass.states.get(entity_id))
endpoints.append(alexa_entity.serialize_discovery()) endpoints.append(alexa_entity.serialize_discovery())
@ -161,6 +165,10 @@ async def async_send_delete_message(hass, config, entity_ids):
for entity_id in entity_ids: for entity_id in entity_ids:
domain = entity_id.split(".", 1)[0] domain = entity_id.split(".", 1)[0]
if domain not in ENTITY_ADAPTERS:
continue
alexa_entity = ENTITY_ADAPTERS[domain](hass, config, hass.states.get(entity_id)) alexa_entity = ENTITY_ADAPTERS[domain](hass, config, hass.states.get(entity_id))
endpoints.append({"endpointId": alexa_entity.alexa_id()}) endpoints.append({"endpointId": alexa_entity.alexa_id()})

View File

@ -1,7 +1,7 @@
{ {
"domain": "alpha_vantage", "domain": "alpha_vantage",
"name": "Alpha vantage", "name": "Alpha vantage",
"documentation": "https://www.home-assistant.io/components/alpha_vantage", "documentation": "https://www.home-assistant.io/integrations/alpha_vantage",
"requirements": [ "requirements": [
"alpha_vantage==2.1.0" "alpha_vantage==2.1.0"
], ],

View File

@ -1,9 +1,9 @@
{ {
"domain": "amazon_polly", "domain": "amazon_polly",
"name": "Amazon polly", "name": "Amazon polly",
"documentation": "https://www.home-assistant.io/components/amazon_polly", "documentation": "https://www.home-assistant.io/integrations/amazon_polly",
"requirements": [ "requirements": [
"boto3==1.9.16" "boto3==1.9.233"
], ],
"dependencies": [], "dependencies": [],
"codeowners": [ "codeowners": [

View File

@ -33,6 +33,7 @@ SUPPORTED_REGIONS = [
"sa-east-1", "sa-east-1",
] ]
CONF_ENGINE = "engine"
CONF_VOICE = "voice" CONF_VOICE = "voice"
CONF_OUTPUT_FORMAT = "output_format" CONF_OUTPUT_FORMAT = "output_format"
CONF_SAMPLE_RATE = "sample_rate" CONF_SAMPLE_RATE = "sample_rate"
@ -101,10 +102,12 @@ SUPPORTED_VOICES = [
SUPPORTED_OUTPUT_FORMATS = ["mp3", "ogg_vorbis", "pcm"] SUPPORTED_OUTPUT_FORMATS = ["mp3", "ogg_vorbis", "pcm"]
SUPPORTED_SAMPLE_RATES = ["8000", "16000", "22050"] SUPPORTED_ENGINES = ["neural", "standard"]
SUPPORTED_SAMPLE_RATES = ["8000", "16000", "22050", "24000"]
SUPPORTED_SAMPLE_RATES_MAP = { SUPPORTED_SAMPLE_RATES_MAP = {
"mp3": ["8000", "16000", "22050"], "mp3": ["8000", "16000", "22050", "24000"],
"ogg_vorbis": ["8000", "16000", "22050"], "ogg_vorbis": ["8000", "16000", "22050"],
"pcm": ["8000", "16000"], "pcm": ["8000", "16000"],
} }
@ -113,6 +116,7 @@ SUPPORTED_TEXT_TYPES = ["text", "ssml"]
CONTENT_TYPE_EXTENSIONS = {"audio/mpeg": "mp3", "audio/ogg": "ogg", "audio/pcm": "pcm"} CONTENT_TYPE_EXTENSIONS = {"audio/mpeg": "mp3", "audio/ogg": "ogg", "audio/pcm": "pcm"}
DEFAULT_ENGINE = "standard"
DEFAULT_VOICE = "Joanna" DEFAULT_VOICE = "Joanna"
DEFAULT_OUTPUT_FORMAT = "mp3" DEFAULT_OUTPUT_FORMAT = "mp3"
DEFAULT_TEXT_TYPE = "text" DEFAULT_TEXT_TYPE = "text"
@ -126,6 +130,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORTED_VOICES), vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORTED_VOICES),
vol.Optional(CONF_ENGINE, default=DEFAULT_ENGINE): vol.In(SUPPORTED_ENGINES),
vol.Optional(CONF_OUTPUT_FORMAT, default=DEFAULT_OUTPUT_FORMAT): vol.In( vol.Optional(CONF_OUTPUT_FORMAT, default=DEFAULT_OUTPUT_FORMAT): vol.In(
SUPPORTED_OUTPUT_FORMATS SUPPORTED_OUTPUT_FORMATS
), ),
@ -225,6 +230,7 @@ class AmazonPollyProvider(Provider):
return None, None return None, None
resp = self.client.synthesize_speech( resp = self.client.synthesize_speech(
Engine=self.config[CONF_ENGINE],
OutputFormat=self.config[CONF_OUTPUT_FORMAT], OutputFormat=self.config[CONF_OUTPUT_FORMAT],
SampleRate=self.config[CONF_SAMPLE_RATE], SampleRate=self.config[CONF_SAMPLE_RATE],
Text=message, Text=message,

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "S'ha produ\u00eft un error desconegut al generat un testimoni d'acc\u00e9s.", "access_token": "S'ha produ\u00eft un error desconegut al generat un testimoni d'acc\u00e9s.",
"already_setup": "El compte d\u2019Ambi Climate est\u00e0 configurat.", "already_setup": "El compte d\u2019Ambi Climate est\u00e0 configurat.",
"no_config": "Necessites configurar Ambi Climate abans de poder autenticar-t'hi. Llegeix les [instruccions](https://www.home-assistant.io/components/ambiclimate/)." "no_config": "Necessites configurar Ambiclimate abans de poder autenticar-t'hi. Llegeix les [instruccions](https://www.home-assistant.io/components/ambiclimate/)."
}, },
"create_entry": { "create_entry": {
"default": "Autenticaci\u00f3 exitosa amb Ambi Climate." "default": "Autenticaci\u00f3 exitosa amb Ambi Climate."
@ -14,7 +14,7 @@
}, },
"step": { "step": {
"auth": { "auth": {
"description": "V\u00e9s a l'[enlla\u00e7]({authorization_url}) i <b>Permet</b> l'acc\u00e9s al teu compte de Ambi Climate, despr\u00e9s torna i prem <b>Envia</b> (a sota).\n(Assegura't que l'enlla\u00e7 de retorn \u00e9s el seg\u00fcent {cb_url})", "description": "V\u00e9s a l'[enlla\u00e7]({authorization_url}) i <b>Permet</b> l'acc\u00e9s al teu compte de Ambiclimate, despr\u00e9s torna i prem <b>Envia</b> (a sota).\n(Assegura't que l'enlla\u00e7 de retorn \u00e9s el seg\u00fcent {cb_url})",
"title": "Autenticaci\u00f3 amb Ambi Climate" "title": "Autenticaci\u00f3 amb Ambi Climate"
} }
}, },

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070 \uc0dd\uc131\uc5d0 \uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.", "access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070 \uc0dd\uc131\uc5d0 \uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.",
"already_setup": "Ambi Climate \uacc4\uc815\uc774 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "already_setup": "Ambi Climate \uacc4\uc815\uc774 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"no_config": "Ambi Climate \ub97c \uc778\uc99d\ud558\ub824\uba74 \uba3c\uc800 Ambi Climate \ub97c \uad6c\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. [\uc548\ub0b4](https://www.home-assistant.io/components/ambiclimate/) \ub97c \uc77d\uc5b4\ubcf4\uc138\uc694." "no_config": "Ambiclimate \ub97c \uc778\uc99d\ud558\ub824\uba74 \uba3c\uc800 Ambiclimate \ub97c \uad6c\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. [\uc548\ub0b4](https://www.home-assistant.io/components/ambiclimate/) \ub97c \uc77d\uc5b4\ubcf4\uc138\uc694."
}, },
"create_entry": { "create_entry": {
"default": "Ambi Climate \ub85c \uc131\uacf5\uc801\uc73c\ub85c \uc778\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4." "default": "Ambi Climate \ub85c \uc131\uacf5\uc801\uc73c\ub85c \uc778\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4."

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "Onbekannte Feeler beim gener\u00e9ieren vum Acc\u00e8s Jeton.", "access_token": "Onbekannte Feeler beim gener\u00e9ieren vum Acc\u00e8s Jeton.",
"already_setup": "Den Ambiclimate Kont ass konfigur\u00e9iert.", "already_setup": "Den Ambiclimate Kont ass konfigur\u00e9iert.",
"no_config": "Dir musst Ambiclimate konfigur\u00e9ieren, ier Dir d\u00ebs Authentifiz\u00e9ierung k\u00ebnnt benotzen.[Liest w.e.g. d'Instruktioune](https://www.home-assistant.io/components/ambiclimatet/)." "no_config": "Dir musst Ambiclimate konfigur\u00e9ieren, ier Dir d\u00ebs Authentifiz\u00e9ierung k\u00ebnnt benotzen.[Liest w.e.g. d'Instruktioune](https://www.home-assistant.io/components/ambiclimate/)."
}, },
"create_entry": { "create_entry": {
"default": "Erfollegr\u00e4ich mat Ambiclimate authentifiz\u00e9iert." "default": "Erfollegr\u00e4ich mat Ambiclimate authentifiz\u00e9iert."

View File

@ -9,12 +9,12 @@
"default": "Vellykket autentisering med Ambiclimate" "default": "Vellykket autentisering med Ambiclimate"
}, },
"error": { "error": {
"follow_link": "Vennligst f\u00f8lg lenken og godkjen f\u00f8r du trykker p\u00e5 Send", "follow_link": "Vennligst f\u00f8lg lenken og godkjenn f\u00f8r du trykker p\u00e5 Send",
"no_token": "Ikke autentisert med Ambiclimate" "no_token": "Ikke autentisert med Ambiclimate"
}, },
"step": { "step": {
"auth": { "auth": {
"description": "Vennligst f\u00f8lg denne [linken]({authorization_url}) og <b>Tillat</b> tilgang til din Ambiclimate konto, og kom s\u00e5 tilbake og trykk <b>Send</b> nedenfor.\n(Kontroller at den angitte URL-adressen for tilbakeringing er {cb_url})", "description": "Vennligst f\u00f8lg denne [linken]({authorization_url}) og <b>Tillat</b> tilgang til din Ambiclimate konto, kom deretter tilbake og trykk <b>Send</b> nedenfor.\n(Kontroller at den angitte URL-adressen for tilbakeringing er {cb_url})",
"title": "Autensiere Ambiclimate" "title": "Autensiere Ambiclimate"
} }
}, },

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "Nieznany b\u0142\u0105d podczas generowania tokena dost\u0119pu.", "access_token": "Nieznany b\u0142\u0105d podczas generowania tokena dost\u0119pu.",
"already_setup": "Konto Ambiclimate jest skonfigurowane.", "already_setup": "Konto Ambiclimate jest skonfigurowane.",
"no_config": "Musisz skonfigurowa\u0107 Ambiclimate, zanim b\u0119dziesz m\u00f3g\u0142 si\u0119 w nim uwierzytelni\u0107. [Przeczytaj instrukcj\u0119](https://www.home-assistant.io/components/ambiclimate/)." "no_config": "Musisz skonfigurowa\u0107 Ambiclimate, zanim b\u0119dziesz m\u00f3g\u0142 si\u0119 w nim uwierzytelni\u0107. [Przeczytaj instrukcj\u0119] (https://www.home-assistant.io/components/ambiclimate/)."
}, },
"create_entry": { "create_entry": {
"default": "Pomy\u015blnie uwierzytelniono z Ambiclimate" "default": "Pomy\u015blnie uwierzytelniono z Ambiclimate"

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.", "access_token": "\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.",
"already_setup": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Ambi Climate \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.", "already_setup": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Ambi Climate \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.",
"no_config": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Ambi Climate \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438](https://www.home-assistant.io/components/ambiclimate/)." "no_config": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Ambiclimate \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438](https://www.home-assistant.io/components/ambiclimate/)."
}, },
"create_entry": { "create_entry": {
"default": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e." "default": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e."

View File

@ -3,7 +3,7 @@
"abort": { "abort": {
"access_token": "Neznana napaka pri ustvarjanju \u017eetona za dostop.", "access_token": "Neznana napaka pri ustvarjanju \u017eetona za dostop.",
"already_setup": "Ra\u010dun Ambiclimate je konfiguriran.", "already_setup": "Ra\u010dun Ambiclimate je konfiguriran.",
"no_config": "Ambiclimat morate konfigurirati, preden lahko z njo preverjate pristnost. [Preberite navodila] (https://www.home-assistant.io/components/ambiclimate/)." "no_config": "Ambiclimate morate konfigurirati, preden lahko z njo preverjate pristnost. [Preberite navodila] (https://www.home-assistant.io/components/ambiclimate/)."
}, },
"create_entry": { "create_entry": {
"default": "Uspe\u0161no overjeno z funkcijo Ambiclimate" "default": "Uspe\u0161no overjeno z funkcijo Ambiclimate"

View File

@ -6,7 +6,7 @@
"no_config": "\u5fc5\u9808\u5148\u8a2d\u5b9a Ambiclimate \u65b9\u80fd\u9032\u884c\u8a8d\u8b49\u3002[\u8acb\u53c3\u95b1\u6559\u5b78\u6307\u5f15]\uff08https://www.home-assistant.io/components/ambiclimate/\uff09\u3002" "no_config": "\u5fc5\u9808\u5148\u8a2d\u5b9a Ambiclimate \u65b9\u80fd\u9032\u884c\u8a8d\u8b49\u3002[\u8acb\u53c3\u95b1\u6559\u5b78\u6307\u5f15]\uff08https://www.home-assistant.io/components/ambiclimate/\uff09\u3002"
}, },
"create_entry": { "create_entry": {
"default": "\u5df2\u6210\u529f\u8a8d\u8b49 Ambiclimate \u88dd\u7f6e\u3002" "default": "\u5df2\u6210\u529f\u8a8d\u8b49 Ambiclimate \u8a2d\u5099\u3002"
}, },
"error": { "error": {
"follow_link": "\u8acb\u65bc\u50b3\u9001\u524d\uff0c\u5148\u4f7f\u7528\u9023\u7d50\u4e26\u9032\u884c\u8a8d\u8b49\u3002", "follow_link": "\u8acb\u65bc\u50b3\u9001\u524d\uff0c\u5148\u4f7f\u7528\u9023\u7d50\u4e26\u9032\u884c\u8a8d\u8b49\u3002",

View File

@ -2,7 +2,7 @@
"domain": "ambiclimate", "domain": "ambiclimate",
"name": "Ambiclimate", "name": "Ambiclimate",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/components/ambiclimate", "documentation": "https://www.home-assistant.io/integrations/ambiclimate",
"requirements": [ "requirements": [
"ambiclimate==0.2.1" "ambiclimate==0.2.1"
], ],

View File

@ -14,6 +14,6 @@
"title": "Completa tu informaci\u00f3n" "title": "Completa tu informaci\u00f3n"
} }
}, },
"title": "Ambient PWS" "title": "Ambiente PWS"
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"config": { "config": {
"error": { "error": {
"identifier_exists": "\u041a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 API \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d", "identifier_exists": "\u041a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 API \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d.",
"invalid_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "invalid_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f",
"no_devices": "\u0412 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b" "no_devices": "\u0412 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b"
}, },

View File

@ -3,7 +3,7 @@
"error": { "error": {
"identifier_exists": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u5df2\u8a3b\u518a", "identifier_exists": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u5df2\u8a3b\u518a",
"invalid_key": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u7121\u6548", "invalid_key": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u7121\u6548",
"no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u88dd\u7f6e" "no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u8a2d\u5099"
}, },
"step": { "step": {
"user": { "user": {

View File

@ -2,7 +2,7 @@
"domain": "ambient_station", "domain": "ambient_station",
"name": "Ambient station", "name": "Ambient station",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/components/ambient_station", "documentation": "https://www.home-assistant.io/integrations/ambient_station",
"requirements": [ "requirements": [
"aioambient==0.3.2" "aioambient==0.3.2"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "amcrest", "domain": "amcrest",
"name": "Amcrest", "name": "Amcrest",
"documentation": "https://www.home-assistant.io/components/amcrest", "documentation": "https://www.home-assistant.io/integrations/amcrest",
"requirements": [ "requirements": [
"amcrest==1.5.3" "amcrest==1.5.3"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "ampio", "domain": "ampio",
"name": "Ampio", "name": "Ampio",
"documentation": "https://www.home-assistant.io/components/ampio", "documentation": "https://www.home-assistant.io/integrations/ampio",
"requirements": [ "requirements": [
"asmog==0.0.6" "asmog==0.0.6"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "android_ip_webcam", "domain": "android_ip_webcam",
"name": "Android ip webcam", "name": "Android ip webcam",
"documentation": "https://www.home-assistant.io/components/android_ip_webcam", "documentation": "https://www.home-assistant.io/integrations/android_ip_webcam",
"requirements": [ "requirements": [
"pydroid-ipcam==0.8" "pydroid-ipcam==0.8"
], ],

View File

@ -1,9 +1,10 @@
{ {
"domain": "androidtv", "domain": "androidtv",
"name": "Androidtv", "name": "Androidtv",
"documentation": "https://www.home-assistant.io/components/androidtv", "documentation": "https://www.home-assistant.io/integrations/androidtv",
"requirements": [ "requirements": [
"androidtv==0.0.27" "adb-shell==0.0.4",
"androidtv==0.0.30"
], ],
"dependencies": [], "dependencies": [],
"codeowners": ["@JeffLIrion"] "codeowners": ["@JeffLIrion"]

View File

@ -3,6 +3,12 @@ import functools
import logging import logging
import voluptuous as vol import voluptuous as vol
from adb_shell.exceptions import (
InvalidChecksumError,
InvalidCommandError,
InvalidResponseError,
TcpTimeoutException,
)
from androidtv import setup, ha_state_detection_rules_validator from androidtv import setup, ha_state_detection_rules_validator
from androidtv.constants import APPS, KEYS from androidtv.constants import APPS, KEYS
@ -123,11 +129,15 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Android TV / Fire TV platform.""" """Set up the Android TV / Fire TV platform."""
hass.data.setdefault(ANDROIDTV_DOMAIN, {}) hass.data.setdefault(ANDROIDTV_DOMAIN, {})
host = "{0}:{1}".format(config[CONF_HOST], config[CONF_PORT]) host = f"{config[CONF_HOST]}:{config[CONF_PORT]}"
if CONF_ADB_SERVER_IP not in config: if CONF_ADB_SERVER_IP not in config:
# Use "python-adb" (Python ADB implementation) # Use "adb_shell" (Python ADB implementation)
adb_log = "using Python ADB implementation " adb_log = "using Python ADB implementation " + (
f"with adbkey='{config[CONF_ADBKEY]}'"
if CONF_ADBKEY in config
else "without adbkey authentication"
)
if CONF_ADBKEY in config: if CONF_ADBKEY in config:
aftv = setup( aftv = setup(
host, host,
@ -135,7 +145,6 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
device_class=config[CONF_DEVICE_CLASS], device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES], state_detection_rules=config[CONF_STATE_DETECTION_RULES],
) )
adb_log += "with adbkey='{0}'".format(config[CONF_ADBKEY])
else: else:
aftv = setup( aftv = setup(
@ -143,7 +152,6 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
device_class=config[CONF_DEVICE_CLASS], device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES], state_detection_rules=config[CONF_STATE_DETECTION_RULES],
) )
adb_log += "without adbkey authentication"
else: else:
# Use "pure-python-adb" (communicate with ADB server) # Use "pure-python-adb" (communicate with ADB server)
aftv = setup( aftv = setup(
@ -153,9 +161,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
device_class=config[CONF_DEVICE_CLASS], device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES], state_detection_rules=config[CONF_STATE_DETECTION_RULES],
) )
adb_log = "using ADB server at {0}:{1}".format( adb_log = f"using ADB server at {config[CONF_ADB_SERVER_IP]}:{config[CONF_ADB_SERVER_PORT]}"
config[CONF_ADB_SERVER_IP], config[CONF_ADB_SERVER_PORT]
)
if not aftv.available: if not aftv.available:
# Determine the name that will be used for the device in the log # Determine the name that will be used for the device in the log
@ -251,6 +257,7 @@ def adb_decorator(override_available=False):
"establishing attempt in the next update. Error: %s", "establishing attempt in the next update. Error: %s",
err, err,
) )
self.aftv.adb.close()
self._available = False # pylint: disable=protected-access self._available = False # pylint: disable=protected-access
return None return None
@ -278,14 +285,7 @@ class ADBDevice(MediaPlayerDevice):
# ADB exceptions to catch # ADB exceptions to catch
if not self.aftv.adb_server_ip: if not self.aftv.adb_server_ip:
# Using "python-adb" (Python ADB implementation) # Using "adb_shell" (Python ADB implementation)
from adb.adb_protocol import (
InvalidChecksumError,
InvalidCommandError,
InvalidResponseError,
)
from adb.usb_exceptions import TcpTimeoutException
self.exceptions = ( self.exceptions = (
AttributeError, AttributeError,
BrokenPipeError, BrokenPipeError,

View File

@ -1,7 +1,7 @@
{ {
"domain": "anel_pwrctrl", "domain": "anel_pwrctrl",
"name": "Anel pwrctrl", "name": "Anel pwrctrl",
"documentation": "https://www.home-assistant.io/components/anel_pwrctrl", "documentation": "https://www.home-assistant.io/integrations/anel_pwrctrl",
"requirements": [ "requirements": [
"anel_pwrctrl-homeassistant==0.0.1.dev2" "anel_pwrctrl-homeassistant==0.0.1.dev2"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "anthemav", "domain": "anthemav",
"name": "Anthemav", "name": "Anthemav",
"documentation": "https://www.home-assistant.io/components/anthemav", "documentation": "https://www.home-assistant.io/integrations/anthemav",
"requirements": [ "requirements": [
"anthemav==1.1.10" "anthemav==1.1.10"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "apache_kafka", "domain": "apache_kafka",
"name": "Apache Kafka", "name": "Apache Kafka",
"documentation": "https://www.home-assistant.io/components/apache_kafka", "documentation": "https://www.home-assistant.io/integrations/apache_kafka",
"requirements": [ "requirements": [
"aiokafka==0.5.1" "aiokafka==0.5.1"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "apcupsd", "domain": "apcupsd",
"name": "Apcupsd", "name": "Apcupsd",
"documentation": "https://www.home-assistant.io/components/apcupsd", "documentation": "https://www.home-assistant.io/integrations/apcupsd",
"requirements": [ "requirements": [
"apcaccess==0.0.13" "apcaccess==0.0.13"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "api", "domain": "api",
"name": "Home Assistant API", "name": "Home Assistant API",
"documentation": "https://www.home-assistant.io/components/api", "documentation": "https://www.home-assistant.io/integrations/api",
"requirements": [], "requirements": [],
"dependencies": [ "dependencies": [
"http" "http"

View File

@ -1,7 +1,7 @@
{ {
"domain": "apns", "domain": "apns",
"name": "Apns", "name": "Apns",
"documentation": "https://www.home-assistant.io/components/apns", "documentation": "https://www.home-assistant.io/integrations/apns",
"requirements": [ "requirements": [
"apns2==0.3.0" "apns2==0.3.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "apple_tv", "domain": "apple_tv",
"name": "Apple tv", "name": "Apple tv",
"documentation": "https://www.home-assistant.io/components/apple_tv", "documentation": "https://www.home-assistant.io/integrations/apple_tv",
"requirements": [ "requirements": [
"pyatv==0.3.13" "pyatv==0.3.13"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aprs", "domain": "aprs",
"name": "APRS", "name": "APRS",
"documentation": "https://www.home-assistant.io/components/aprs", "documentation": "https://www.home-assistant.io/integrations/aprs",
"dependencies": [], "dependencies": [],
"codeowners": ["@PhilRW"], "codeowners": ["@PhilRW"],
"requirements": [ "requirements": [

View File

@ -1,7 +1,7 @@
{ {
"domain": "aqualogic", "domain": "aqualogic",
"name": "Aqualogic", "name": "Aqualogic",
"documentation": "https://www.home-assistant.io/components/aqualogic", "documentation": "https://www.home-assistant.io/integrations/aqualogic",
"requirements": [ "requirements": [
"aqualogic==1.0" "aqualogic==1.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aquostv", "domain": "aquostv",
"name": "Aquostv", "name": "Aquostv",
"documentation": "https://www.home-assistant.io/components/aquostv", "documentation": "https://www.home-assistant.io/integrations/aquostv",
"requirements": [ "requirements": [
"sharp_aquos_rc==0.3.2" "sharp_aquos_rc==0.3.2"
], ],

View File

@ -0,0 +1,5 @@
{
"config": {
"title": "Arcam FMJ"
}
}

View File

@ -0,0 +1,5 @@
{
"config": {
"title": "Arcam FMJ"
}
}

View File

@ -0,0 +1,5 @@
{
"config": {
"title": "Arcam FMJ"
}
}

View File

@ -0,0 +1,5 @@
{
"config": {
"title": "Arcam FMJ"
}
}

View File

@ -2,7 +2,7 @@
"domain": "arcam_fmj", "domain": "arcam_fmj",
"name": "Arcam FMJ Receiver control", "name": "Arcam FMJ Receiver control",
"config_flow": false, "config_flow": false,
"documentation": "https://www.home-assistant.io/components/arcam_fmj", "documentation": "https://www.home-assistant.io/integrations/arcam_fmj",
"requirements": [ "requirements": [
"arcam-fmj==0.4.3" "arcam-fmj==0.4.3"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "arduino", "domain": "arduino",
"name": "Arduino", "name": "Arduino",
"documentation": "https://www.home-assistant.io/components/arduino", "documentation": "https://www.home-assistant.io/integrations/arduino",
"requirements": [ "requirements": [
"PyMata==2.14" "PyMata==2.14"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "arest", "domain": "arest",
"name": "Arest", "name": "Arest",
"documentation": "https://www.home-assistant.io/components/arest", "documentation": "https://www.home-assistant.io/integrations/arest",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"codeowners": [ "codeowners": [

View File

@ -1,7 +1,7 @@
{ {
"domain": "arlo", "domain": "arlo",
"name": "Arlo", "name": "Arlo",
"documentation": "https://www.home-assistant.io/components/arlo", "documentation": "https://www.home-assistant.io/integrations/arlo",
"requirements": [ "requirements": [
"pyarlo==0.2.3" "pyarlo==0.2.3"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aruba", "domain": "aruba",
"name": "Aruba", "name": "Aruba",
"documentation": "https://www.home-assistant.io/components/aruba", "documentation": "https://www.home-assistant.io/integrations/aruba",
"requirements": [ "requirements": [
"pexpect==4.6.0" "pexpect==4.6.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "arwn", "domain": "arwn",
"name": "Arwn", "name": "Arwn",
"documentation": "https://www.home-assistant.io/components/arwn", "documentation": "https://www.home-assistant.io/integrations/arwn",
"requirements": [], "requirements": [],
"dependencies": [ "dependencies": [
"mqtt" "mqtt"

View File

@ -1,7 +1,7 @@
{ {
"domain": "asterisk_cdr", "domain": "asterisk_cdr",
"name": "Asterisk cdr", "name": "Asterisk cdr",
"documentation": "https://www.home-assistant.io/components/asterisk_cdr", "documentation": "https://www.home-assistant.io/integrations/asterisk_cdr",
"requirements": [], "requirements": [],
"dependencies": [ "dependencies": [
"asterisk_mbox" "asterisk_mbox"

View File

@ -1,7 +1,7 @@
{ {
"domain": "asterisk_mbox", "domain": "asterisk_mbox",
"name": "Asterisk mbox", "name": "Asterisk mbox",
"documentation": "https://www.home-assistant.io/components/asterisk_mbox", "documentation": "https://www.home-assistant.io/integrations/asterisk_mbox",
"requirements": [ "requirements": [
"asterisk_mbox==0.5.0" "asterisk_mbox==0.5.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "asuswrt", "domain": "asuswrt",
"name": "Asuswrt", "name": "Asuswrt",
"documentation": "https://www.home-assistant.io/components/asuswrt", "documentation": "https://www.home-assistant.io/integrations/asuswrt",
"requirements": [ "requirements": [
"aioasuswrt==1.1.21" "aioasuswrt==1.1.21"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "atome", "domain": "atome",
"name": "Atome", "name": "Atome",
"documentation": "https://www.home-assistant.io/components/atome", "documentation": "https://www.home-assistant.io/integrations/atome",
"dependencies": [], "dependencies": [],
"codeowners": ["@baqs"], "codeowners": ["@baqs"],
"requirements": ["pyatome==0.1.1"] "requirements": ["pyatome==0.1.1"]

View File

@ -1,7 +1,7 @@
{ {
"domain": "august", "domain": "august",
"name": "August", "name": "August",
"documentation": "https://www.home-assistant.io/components/august", "documentation": "https://www.home-assistant.io/integrations/august",
"requirements": [ "requirements": [
"py-august==0.7.0" "py-august==0.7.0"
], ],

View File

@ -1,7 +1,7 @@
{ {
"domain": "aurora", "domain": "aurora",
"name": "Aurora", "name": "Aurora",
"documentation": "https://www.home-assistant.io/components/aurora", "documentation": "https://www.home-assistant.io/integrations/aurora",
"requirements": [], "requirements": [],
"dependencies": [], "dependencies": [],
"codeowners": [] "codeowners": []

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