homeassistant 2025.8.0b3__py3-none-any.whl → 2025.8.0b4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- homeassistant/components/airos/translations/ko.json +13 -0
- homeassistant/components/airtouch5/translations/ko.json +11 -0
- homeassistant/components/airzone/translations/ko.json +9 -0
- homeassistant/components/airzone_cloud/translations/ko.json +13 -0
- homeassistant/components/alexa_devices/translations/ko.json +18 -0
- homeassistant/components/alexa_devices/translations/nl.json +7 -1
- homeassistant/components/alexa_devices/translations/sk.json +222 -5
- homeassistant/components/altruist/translations/ko.json +11 -0
- homeassistant/components/analytics_insights/translations/ga.json +7 -2
- homeassistant/components/androidtv_remote/translations/ko.json +5 -0
- homeassistant/components/anthropic/__init__.py +78 -11
- homeassistant/components/anthropic/config_flow.py +1 -1
- homeassistant/components/anthropic/translations/ko.json +12 -1
- homeassistant/components/aprilaire/translations/ko.json +10 -0
- homeassistant/components/apsystems/translations/ko.json +9 -0
- homeassistant/components/aquacell/translations/ko.json +1 -1
- homeassistant/components/aseko_pool_live/translations/ko.json +6 -0
- homeassistant/components/assist_satellite/translations/sl.json +7 -0
- homeassistant/components/august/manifest.json +1 -1
- homeassistant/components/autarco/translations/ko.json +17 -0
- homeassistant/components/axis/manifest.json +1 -1
- homeassistant/components/bang_olufsen/translations/ga.json +15 -0
- homeassistant/components/blebox/translations/ko.json +3 -1
- homeassistant/components/blink/translations/ga.json +7 -0
- homeassistant/components/blue_current/translations/ko.json +9 -0
- homeassistant/components/bluesound/translations/ko.json +10 -0
- homeassistant/components/bluetooth/manifest.json +1 -1
- homeassistant/components/bosch_alarm/translations/ko.json +22 -0
- homeassistant/components/bring/translations/ko.json +22 -0
- homeassistant/components/brother/translations/ko.json +5 -0
- homeassistant/components/bsblan/translations/ko.json +6 -0
- homeassistant/components/cambridge_audio/translations/ko.json +16 -0
- homeassistant/components/ccm15/translations/ko.json +12 -0
- homeassistant/components/chacon_dio/translations/ko.json +12 -0
- homeassistant/components/cloud/manifest.json +1 -1
- homeassistant/components/cloud/translations/he.json +4 -0
- homeassistant/components/co2signal/translations/ko.json +5 -0
- homeassistant/components/comelit/translations/ko.json +7 -0
- homeassistant/components/cookidoo/translations/ko.json +24 -0
- homeassistant/components/datadog/translations/ko.json +12 -0
- homeassistant/components/datadog/translations/sv.json +17 -1
- homeassistant/components/devolo_home_control/translations/ko.json +5 -0
- homeassistant/components/devolo_home_network/translations/ko.json +7 -1
- homeassistant/components/doorbird/translations/ko.json +6 -0
- homeassistant/components/downloader/__init__.py +3 -0
- homeassistant/components/downloader/services.py +24 -14
- homeassistant/components/downloader/strings.json +8 -0
- homeassistant/components/downloader/translations/cs.json +8 -0
- homeassistant/components/downloader/translations/de.json +8 -0
- homeassistant/components/downloader/translations/en.json +8 -0
- homeassistant/components/downloader/translations/et.json +8 -0
- homeassistant/components/downloader/translations/ru.json +8 -0
- homeassistant/components/downloader/translations/sk.json +8 -0
- homeassistant/components/downloader/translations/zh-Hans.json +8 -0
- homeassistant/components/downloader/translations/zh-Hant.json +8 -0
- homeassistant/components/duke_energy/translations/ko.json +12 -0
- homeassistant/components/duotecno/translations/ko.json +1 -0
- homeassistant/components/ecovacs/translations/ga.json +51 -1
- homeassistant/components/ecovacs/translations/ko.json +11 -0
- homeassistant/components/eheimdigital/translations/ko.json +16 -0
- homeassistant/components/electric_kiwi/translations/ga.json +3 -0
- homeassistant/components/electric_kiwi/translations/ko.json +3 -0
- homeassistant/components/elevenlabs/translations/ko.json +1 -1
- homeassistant/components/elmax/translations/ko.json +6 -0
- homeassistant/components/elvia/translations/ko.json +11 -0
- homeassistant/components/emoncms/translations/cs.json +8 -0
- homeassistant/components/emoncms/translations/ko.json +12 -0
- homeassistant/components/emoncms/translations/zh-Hans.json +8 -0
- homeassistant/components/energenie_power_sockets/translations/ko.json +11 -0
- homeassistant/components/enigma2/translations/ko.json +14 -0
- homeassistant/components/enphase_envoy/translations/ga.json +9 -0
- homeassistant/components/enphase_envoy/translations/ko.json +13 -0
- homeassistant/components/epic_games_store/translations/ko.json +12 -0
- homeassistant/components/epion/translations/ko.json +11 -0
- homeassistant/components/feedreader/translations/ko.json +16 -0
- homeassistant/components/filter/translations/ko.json +9 -0
- homeassistant/components/fitbit/translations/ko.json +3 -0
- homeassistant/components/flexit_bacnet/translations/ga.json +21 -0
- homeassistant/components/fritz/translations/ko.json +9 -0
- homeassistant/components/fritzbox/translations/ko.json +5 -0
- homeassistant/components/fritzbox_callmonitor/translations/ko.json +11 -0
- homeassistant/components/fronius/translations/ko.json +5 -0
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/fujitsu_fglair/translations/ko.json +17 -0
- homeassistant/components/fyta/translations/ko.json +16 -0
- homeassistant/components/generic_hygrostat/translations/ko.json +11 -0
- homeassistant/components/generic_thermostat/translations/ko.json +9 -0
- homeassistant/components/geniushub/translations/ko.json +16 -0
- homeassistant/components/geocaching/translations/ko.json +3 -0
- homeassistant/components/gios/translations/sv.json +3 -0
- homeassistant/components/glances/translations/ga.json +48 -0
- homeassistant/components/goalzero/translations/ru.json +3 -0
- homeassistant/components/google/translations/ko.json +3 -0
- homeassistant/components/google_assistant_sdk/translations/ko.json +3 -0
- homeassistant/components/google_drive/translations/ko.json +11 -0
- homeassistant/components/google_generative_ai_conversation/strings.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/cs.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/de.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/el.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/en-GB.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/en.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/es.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/et.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/fr.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/ga.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/ja.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/ko.json +38 -0
- homeassistant/components/google_generative_ai_conversation/translations/lt.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/pt.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/sk.json +0 -5
- homeassistant/components/google_generative_ai_conversation/translations/sl.json +9 -0
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hans.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hant.json +3 -3
- homeassistant/components/google_mail/translations/ko.json +3 -0
- homeassistant/components/google_photos/translations/ko.json +5 -0
- homeassistant/components/google_sheets/translations/ko.json +3 -0
- homeassistant/components/google_tasks/translations/ko.json +3 -0
- homeassistant/components/google_travel_time/translations/ko.json +5 -0
- homeassistant/components/gpsd/translations/ko.json +16 -1
- homeassistant/components/group/translations/ga.json +9 -0
- homeassistant/components/group/translations/sk.json +18 -0
- homeassistant/components/habitica/translations/ko.json +32 -0
- homeassistant/components/hassio/issues.py +4 -2
- homeassistant/components/hassio/strings.json +38 -30
- homeassistant/components/hassio/translations/bg.json +0 -1
- homeassistant/components/hassio/translations/ca.json +0 -22
- homeassistant/components/hassio/translations/cs.json +37 -25
- homeassistant/components/hassio/translations/da.json +0 -2
- homeassistant/components/hassio/translations/de.json +34 -26
- homeassistant/components/hassio/translations/el.json +0 -26
- homeassistant/components/hassio/translations/en-GB.json +0 -25
- homeassistant/components/hassio/translations/en.json +34 -26
- homeassistant/components/hassio/translations/es.json +0 -26
- homeassistant/components/hassio/translations/et.json +0 -26
- homeassistant/components/hassio/translations/fi.json +0 -23
- homeassistant/components/hassio/translations/fr.json +0 -24
- homeassistant/components/hassio/translations/fy.json +0 -7
- homeassistant/components/hassio/translations/ga.json +3 -1
- homeassistant/components/hassio/translations/gsw.json +0 -2
- homeassistant/components/hassio/translations/he.json +34 -26
- homeassistant/components/hassio/translations/hr.json +0 -2
- homeassistant/components/hassio/translations/hu.json +0 -25
- homeassistant/components/hassio/translations/id.json +0 -25
- homeassistant/components/hassio/translations/it.json +0 -22
- homeassistant/components/hassio/translations/ja.json +0 -23
- homeassistant/components/hassio/translations/ko.json +3 -22
- homeassistant/components/hassio/translations/lt.json +0 -26
- homeassistant/components/hassio/translations/nb.json +0 -22
- homeassistant/components/hassio/translations/nl.json +0 -23
- homeassistant/components/hassio/translations/pl.json +0 -22
- homeassistant/components/hassio/translations/pt-BR.json +0 -22
- homeassistant/components/hassio/translations/pt.json +0 -25
- homeassistant/components/hassio/translations/ro.json +0 -22
- homeassistant/components/hassio/translations/ru.json +0 -25
- homeassistant/components/hassio/translations/sk.json +3 -25
- homeassistant/components/hassio/translations/sl.json +0 -21
- homeassistant/components/hassio/translations/sv.json +0 -25
- homeassistant/components/hassio/translations/tr.json +0 -25
- homeassistant/components/hassio/translations/uk.json +0 -22
- homeassistant/components/hassio/translations/vi.json +0 -23
- homeassistant/components/hassio/translations/zh-Hans.json +3 -25
- homeassistant/components/hassio/translations/zh-Hant.json +0 -26
- homeassistant/components/heos/translations/ko.json +21 -0
- homeassistant/components/hko/translations/ko.json +11 -0
- homeassistant/components/home_connect/translations/ko.json +3 -0
- homeassistant/components/home_connect/translations/ru.json +6 -4
- homeassistant/components/homeassistant/translations/de.json +1 -1
- homeassistant/components/homee/translations/ko.json +22 -0
- homeassistant/components/homee/translations/ru.json +5 -0
- homeassistant/components/homematicip_cloud/translations/sv.json +11 -0
- homeassistant/components/homeworks/translations/ko.json +41 -0
- homeassistant/components/html5/translations/ko.json +9 -0
- homeassistant/components/http/translations/sv.json +1 -1
- homeassistant/components/hue/translations/ga.json +5 -0
- homeassistant/components/husqvarna_automower/translations/ga.json +6 -0
- homeassistant/components/husqvarna_automower/translations/he.json +2 -0
- homeassistant/components/husqvarna_automower/translations/ko.json +11 -0
- homeassistant/components/huum/translations/ko.json +12 -0
- homeassistant/components/hydrawise/translations/ko.json +15 -0
- homeassistant/components/ibeacon/translations/ga.json +15 -0
- homeassistant/components/imeon_inverter/translations/ko.json +13 -0
- homeassistant/components/immich/translations/he.json +10 -0
- homeassistant/components/immich/translations/ko.json +18 -0
- homeassistant/components/immich/translations/sv.json +5 -1
- homeassistant/components/incomfort/translations/ko.json +13 -0
- homeassistant/components/intellifire/translations/ko.json +8 -0
- homeassistant/components/iometer/translations/ko.json +11 -0
- homeassistant/components/iotty/translations/ko.json +11 -0
- homeassistant/components/iskra/translations/ko.json +22 -0
- homeassistant/components/ista_ecotrend/translations/ko.json +22 -0
- homeassistant/components/ituran/translations/sv.json +3 -0
- homeassistant/components/jewish_calendar/translations/ko.json +17 -0
- homeassistant/components/justnimbus/translations/ga.json +27 -0
- homeassistant/components/kitchen_sink/translations/ko.json +11 -0
- homeassistant/components/knocki/translations/ko.json +12 -0
- homeassistant/components/knx/manifest.json +1 -1
- homeassistant/components/kostal_plenticore/translations/ko.json +6 -0
- homeassistant/components/kulersky/translations/ko.json +7 -0
- homeassistant/components/lamarzocco/translations/ga.json +13 -0
- homeassistant/components/lamarzocco/translations/ko.json +26 -0
- homeassistant/components/lametric/translations/ko.json +3 -0
- homeassistant/components/lcn/translations/ko.json +58 -0
- homeassistant/components/lcn/translations/ru.json +1 -0
- homeassistant/components/leaone/translations/ga.json +8 -0
- homeassistant/components/leaone/translations/ko.json +11 -0
- homeassistant/components/leaone/translations/zh-Hans.json +2 -1
- homeassistant/components/lektrico/translations/ko.json +10 -0
- homeassistant/components/letpot/translations/ko.json +17 -0
- homeassistant/components/lg_netcast/translations/ko.json +12 -0
- homeassistant/components/linkplay/translations/ko.json +11 -0
- homeassistant/components/linkplay/translations/sv.json +1 -0
- homeassistant/components/litterrobot/translations/sv.json +2 -1
- homeassistant/components/local_file/translations/ko.json +9 -0
- homeassistant/components/luftdaten/translations/ru.json +7 -0
- homeassistant/components/lupusec/translations/ko.json +13 -0
- homeassistant/components/lutron/translations/ko.json +13 -0
- homeassistant/components/lyric/translations/ko.json +3 -0
- homeassistant/components/madvr/translations/ko.json +18 -0
- homeassistant/components/mastodon/translations/ko.json +10 -0
- homeassistant/components/matter/translations/ru.json +3 -0
- homeassistant/components/matter/translations/sv.json +3 -0
- homeassistant/components/matter/vacuum.py +0 -11
- homeassistant/components/mcp/translations/ko.json +16 -0
- homeassistant/components/mealie/todo.py +1 -0
- homeassistant/components/mealie/translations/ko.json +14 -0
- homeassistant/components/mealie/translations/sk.json +14 -1
- homeassistant/components/mealie/translations/sv.json +9 -1
- homeassistant/components/melcloud/translations/ko.json +5 -0
- homeassistant/components/metoffice/translations/ko.json +5 -0
- homeassistant/components/microbees/translations/ko.json +11 -0
- homeassistant/components/miele/translations/cs.json +24 -1
- homeassistant/components/miele/translations/de.json +5 -5
- homeassistant/components/miele/translations/he.json +4 -0
- homeassistant/components/miele/translations/ko.json +5 -0
- homeassistant/components/miele/translations/nl.json +22 -0
- homeassistant/components/miele/translations/sk.json +13 -2
- homeassistant/components/miele/translations/zh-Hans.json +12 -1
- homeassistant/components/mold_indicator/translations/ko.json +1 -0
- homeassistant/components/monarch_money/translations/ko.json +12 -0
- homeassistant/components/monzo/translations/ko.json +3 -0
- homeassistant/components/motionmount/translations/ga.json +9 -0
- homeassistant/components/motionmount/translations/ko.json +17 -0
- homeassistant/components/mpd/translations/ko.json +13 -0
- homeassistant/components/mqtt/strings.json +4 -0
- homeassistant/components/mqtt/translations/cs.json +5 -0
- homeassistant/components/mqtt/translations/de.json +4 -0
- homeassistant/components/mqtt/translations/en.json +4 -0
- homeassistant/components/mqtt/translations/he.json +127 -3
- homeassistant/components/mqtt/translations/ko.json +28 -0
- homeassistant/components/mqtt/translations/ru.json +36 -0
- homeassistant/components/mqtt/translations/sk.json +106 -2
- homeassistant/components/mqtt/translations/sv.json +18 -0
- homeassistant/components/mqtt/vacuum.py +31 -5
- homeassistant/components/music_assistant/translations/he.json +2 -1
- homeassistant/components/myuplink/translations/ko.json +9 -0
- homeassistant/components/nam/translations/ko.json +5 -0
- homeassistant/components/nasweb/translations/ko.json +13 -0
- homeassistant/components/neato/translations/ko.json +3 -0
- homeassistant/components/nest/translations/ko.json +3 -0
- homeassistant/components/netatmo/translations/ko.json +3 -0
- homeassistant/components/netgear_lte/translations/ko.json +10 -0
- homeassistant/components/nextcloud/translations/ko.json +1 -1
- homeassistant/components/nice_go/translations/ko.json +16 -0
- homeassistant/components/niko_home_control/translations/ko.json +11 -0
- homeassistant/components/ntfy/translations/ko.json +38 -0
- homeassistant/components/nuki/translations/sv.json +1 -1
- homeassistant/components/nut/translations/ko.json +14 -0
- homeassistant/components/ohme/translations/ko.json +20 -0
- homeassistant/components/ollama/strings.json +3 -3
- homeassistant/components/ollama/translations/cs.json +3 -3
- homeassistant/components/ollama/translations/de.json +3 -3
- homeassistant/components/ollama/translations/el.json +0 -5
- homeassistant/components/ollama/translations/en-GB.json +0 -5
- homeassistant/components/ollama/translations/en.json +3 -3
- homeassistant/components/ollama/translations/es.json +0 -5
- homeassistant/components/ollama/translations/et.json +3 -3
- homeassistant/components/ollama/translations/fr.json +0 -5
- homeassistant/components/ollama/translations/ga.json +0 -5
- homeassistant/components/ollama/translations/ja.json +0 -5
- homeassistant/components/ollama/translations/ko.json +31 -0
- homeassistant/components/ollama/translations/lt.json +0 -5
- homeassistant/components/ollama/translations/mk.json +0 -5
- homeassistant/components/ollama/translations/pt.json +0 -5
- homeassistant/components/ollama/translations/ru.json +3 -3
- homeassistant/components/ollama/translations/sk.json +0 -5
- homeassistant/components/ollama/translations/zh-Hans.json +3 -3
- homeassistant/components/ollama/translations/zh-Hant.json +3 -3
- homeassistant/components/ondilo_ico/translations/ko.json +3 -0
- homeassistant/components/onedrive/translations/ko.json +11 -0
- homeassistant/components/onewire/translations/ko.json +6 -0
- homeassistant/components/onkyo/translations/ko.json +16 -0
- homeassistant/components/open_router/strings.json +2 -2
- homeassistant/components/open_router/translations/cs.json +2 -2
- homeassistant/components/open_router/translations/de.json +2 -2
- homeassistant/components/open_router/translations/en-GB.json +0 -4
- homeassistant/components/open_router/translations/en.json +2 -2
- homeassistant/components/open_router/translations/es.json +0 -4
- homeassistant/components/open_router/translations/et.json +2 -2
- homeassistant/components/open_router/translations/fr.json +0 -4
- homeassistant/components/open_router/translations/ga.json +0 -4
- homeassistant/components/open_router/translations/ko.json +11 -0
- homeassistant/components/open_router/translations/ru.json +4 -0
- homeassistant/components/open_router/translations/zh-Hans.json +2 -2
- homeassistant/components/open_router/translations/zh-Hant.json +2 -2
- homeassistant/components/openai_conversation/__init__.py +93 -20
- homeassistant/components/openai_conversation/config_flow.py +1 -1
- homeassistant/components/openai_conversation/strings.json +3 -3
- homeassistant/components/openai_conversation/translations/cs.json +3 -3
- homeassistant/components/openai_conversation/translations/de.json +3 -3
- homeassistant/components/openai_conversation/translations/el.json +0 -5
- homeassistant/components/openai_conversation/translations/en-GB.json +0 -5
- homeassistant/components/openai_conversation/translations/en.json +3 -3
- homeassistant/components/openai_conversation/translations/es.json +0 -5
- homeassistant/components/openai_conversation/translations/et.json +3 -3
- homeassistant/components/openai_conversation/translations/fr.json +0 -5
- homeassistant/components/openai_conversation/translations/ga.json +0 -5
- homeassistant/components/openai_conversation/translations/it.json +0 -5
- homeassistant/components/openai_conversation/translations/ko.json +20 -0
- homeassistant/components/openai_conversation/translations/lt.json +0 -5
- homeassistant/components/openai_conversation/translations/mk.json +0 -5
- homeassistant/components/openai_conversation/translations/pt.json +0 -5
- homeassistant/components/openai_conversation/translations/ru.json +3 -3
- homeassistant/components/openai_conversation/translations/sk.json +0 -5
- homeassistant/components/openai_conversation/translations/zh-Hans.json +3 -3
- homeassistant/components/openai_conversation/translations/zh-Hant.json +3 -3
- homeassistant/components/openweathermap/translations/ru.json +2 -1
- homeassistant/components/opower/config_flow.py +141 -75
- homeassistant/components/opower/const.py +1 -0
- homeassistant/components/opower/coordinator.py +4 -3
- homeassistant/components/opower/manifest.json +1 -1
- homeassistant/components/opower/strings.json +33 -16
- homeassistant/components/opower/translations/bg.json +0 -10
- homeassistant/components/opower/translations/ca.json +0 -8
- homeassistant/components/opower/translations/cs.json +26 -9
- homeassistant/components/opower/translations/de.json +26 -9
- homeassistant/components/opower/translations/el.json +0 -25
- homeassistant/components/opower/translations/en-GB.json +0 -23
- homeassistant/components/opower/translations/en.json +26 -9
- homeassistant/components/opower/translations/es.json +0 -23
- homeassistant/components/opower/translations/et.json +0 -23
- homeassistant/components/opower/translations/fi.json +0 -2
- homeassistant/components/opower/translations/fr.json +0 -11
- homeassistant/components/opower/translations/fy.json +0 -12
- homeassistant/components/opower/translations/ga.json +0 -16
- homeassistant/components/opower/translations/he.json +0 -12
- homeassistant/components/opower/translations/hu.json +0 -9
- homeassistant/components/opower/translations/id.json +0 -3
- homeassistant/components/opower/translations/it.json +0 -2
- homeassistant/components/opower/translations/ja.json +0 -20
- homeassistant/components/opower/translations/ko.json +20 -2
- homeassistant/components/opower/translations/lt.json +0 -23
- homeassistant/components/opower/translations/nb.json +0 -6
- homeassistant/components/opower/translations/nl.json +0 -9
- homeassistant/components/opower/translations/pl.json +0 -6
- homeassistant/components/opower/translations/pt-BR.json +0 -2
- homeassistant/components/opower/translations/pt.json +0 -23
- homeassistant/components/opower/translations/ro.json +0 -2
- homeassistant/components/opower/translations/ru.json +0 -22
- homeassistant/components/opower/translations/sk.json +0 -23
- homeassistant/components/opower/translations/sl.json +0 -6
- homeassistant/components/opower/translations/sv.json +0 -21
- homeassistant/components/opower/translations/tr.json +0 -2
- homeassistant/components/opower/translations/uk.json +0 -2
- homeassistant/components/opower/translations/zh-Hans.json +0 -23
- homeassistant/components/opower/translations/zh-Hant.json +0 -23
- homeassistant/components/osoenergy/translations/zh-Hans.json +1 -0
- homeassistant/components/otbr/translations/ko.json +1 -1
- homeassistant/components/otp/translations/ko.json +11 -0
- homeassistant/components/overkiz/translations/ko.json +1 -0
- homeassistant/components/overseerr/translations/ko.json +15 -0
- homeassistant/components/ovo_energy/translations/ko.json +5 -0
- homeassistant/components/p1_monitor/translations/ko.json +2 -1
- homeassistant/components/palazzetti/translations/ko.json +11 -0
- homeassistant/components/paperless_ngx/translations/ko.json +25 -0
- homeassistant/components/peblar/translations/ko.json +26 -0
- homeassistant/components/pi_hole/translations/ko.json +1 -0
- homeassistant/components/playstation_network/translations/sk.json +19 -0
- homeassistant/components/plugwise/translations/ko.json +5 -0
- homeassistant/components/point/translations/ko.json +7 -0
- homeassistant/components/powerfox/translations/ko.json +23 -0
- homeassistant/components/probe_plus/translations/ko.json +11 -0
- homeassistant/components/proximity/translations/ga.json +19 -1
- homeassistant/components/pterodactyl/translations/ko.json +17 -0
- homeassistant/components/pyload/translations/ko.json +34 -0
- homeassistant/components/qbittorrent/translations/ko.json +10 -1
- homeassistant/components/qnap/translations/ga.json +12 -0
- homeassistant/components/rabbitair/translations/ko.json +12 -0
- homeassistant/components/rainbird/translations/ko.json +5 -0
- homeassistant/components/random/translations/cs.json +2 -0
- homeassistant/components/random/translations/zh-Hans.json +1 -0
- homeassistant/components/rehlko/translations/ko.json +17 -0
- homeassistant/components/reolink/__init__.py +1 -1
- homeassistant/components/reolink/diagnostics.py +2 -2
- homeassistant/components/reolink/manifest.json +1 -1
- homeassistant/components/reolink/sensor.py +1 -1
- homeassistant/components/reolink/translations/sv.json +28 -13
- homeassistant/components/rfxtrx/translations/ga.json +5 -0
- homeassistant/components/ring/translations/ko.json +5 -0
- homeassistant/components/risco/translations/he.json +8 -0
- homeassistant/components/romy/translations/ko.json +14 -0
- homeassistant/components/russound_rio/translations/ko.json +19 -0
- homeassistant/components/ruuvitag_ble/translations/ko.json +11 -0
- homeassistant/components/samsungtv/translations/ko.json +6 -0
- homeassistant/components/sanix/translations/ko.json +11 -0
- homeassistant/components/scrape/translations/cs.json +1 -0
- homeassistant/components/scrape/translations/ru.json +1 -0
- homeassistant/components/scrape/translations/zh-Hans.json +1 -0
- homeassistant/components/sensibo/translations/ko.json +15 -0
- homeassistant/components/sensirion_ble/translations/ga.json +8 -0
- homeassistant/components/sensirion_ble/translations/ko.json +11 -0
- homeassistant/components/sensor/translations/ko.json +3 -0
- homeassistant/components/sensor/translations/sv.json +1 -0
- homeassistant/components/sensorpush_cloud/translations/ko.json +12 -0
- homeassistant/components/sensoterra/translations/ko.json +18 -0
- homeassistant/components/senz/translations/ko.json +3 -0
- homeassistant/components/seventeentrack/translations/ko.json +12 -0
- homeassistant/components/sharkiq/translations/ko.json +6 -0
- homeassistant/components/shelly/translations/ko.json +8 -1
- homeassistant/components/shelly/translations/sv.json +10 -2
- homeassistant/components/sky_remote/translations/ko.json +11 -0
- homeassistant/components/slide_local/translations/ko.json +18 -0
- homeassistant/components/sma/translations/ko.json +12 -0
- homeassistant/components/smappee/translations/ko.json +3 -0
- homeassistant/components/smarla/translations/ko.json +11 -0
- homeassistant/components/smartthings/translations/ko.json +209 -4
- homeassistant/components/smarty/translations/ko.json +11 -0
- homeassistant/components/smlight/translations/ko.json +15 -0
- homeassistant/components/snoo/translations/ko.json +12 -0
- homeassistant/components/solarlog/translations/ko.json +15 -0
- homeassistant/components/sonos/manifest.json +1 -1
- homeassistant/components/spotify/translations/ko.json +3 -0
- homeassistant/components/sql/translations/cs.json +1 -0
- homeassistant/components/statistics/translations/ko.json +9 -0
- homeassistant/components/stiebel_eltron/translations/ko.json +12 -0
- homeassistant/components/streamlabswater/translations/ko.json +9 -0
- homeassistant/components/switch_as_x/translations/ga.json +24 -0
- homeassistant/components/switchbot/manifest.json +1 -1
- homeassistant/components/switcher_kis/translations/ko.json +12 -0
- homeassistant/components/system_bridge/translations/ko.json +5 -0
- homeassistant/components/tailwind/translations/ko.json +1 -0
- homeassistant/components/technove/translations/ko.json +11 -0
- homeassistant/components/tedee/translations/ko.json +16 -0
- homeassistant/components/telegram_bot/translations/ko.json +19 -0
- homeassistant/components/template/strings.json +1 -1
- homeassistant/components/template/translations/cs.json +25 -9
- homeassistant/components/template/translations/de.json +1 -1
- homeassistant/components/template/translations/en-GB.json +1 -2
- homeassistant/components/template/translations/en.json +1 -1
- homeassistant/components/template/translations/es.json +1 -2
- homeassistant/components/template/translations/et.json +1 -1
- homeassistant/components/template/translations/fr.json +1 -2
- homeassistant/components/template/translations/ga.json +7 -2
- homeassistant/components/template/translations/he.json +15 -3
- homeassistant/components/template/translations/ko.json +106 -1
- homeassistant/components/template/translations/nl.json +1 -0
- homeassistant/components/template/translations/ru.json +35 -5
- homeassistant/components/template/translations/sk.json +243 -28
- homeassistant/components/template/translations/sv.json +4 -0
- homeassistant/components/template/translations/zh-Hans.json +16 -1
- homeassistant/components/template/translations/zh-Hant.json +1 -1
- homeassistant/components/tesla_fleet/translations/ko.json +9 -0
- homeassistant/components/teslemetry/translations/ko.json +30 -0
- homeassistant/components/tessie/translations/ga.json +29 -0
- homeassistant/components/tessie/translations/ko.json +5 -0
- homeassistant/components/thethingsnetwork/translations/ko.json +3 -1
- homeassistant/components/tilt_pi/translations/ko.json +11 -0
- homeassistant/components/time_date/translations/ga.json +3 -0
- homeassistant/components/toon/translations/ko.json +3 -0
- homeassistant/components/totalconnect/translations/ko.json +3 -0
- homeassistant/components/touchline_sl/translations/ko.json +12 -0
- homeassistant/components/tplink/translations/ko.json +29 -0
- homeassistant/components/traccar_server/translations/ko.json +20 -0
- homeassistant/components/trafikverket_camera/translations/ko.json +11 -0
- homeassistant/components/trafikverket_train/translations/ko.json +5 -0
- homeassistant/components/trafikverket_weatherstation/translations/ko.json +5 -0
- homeassistant/components/transmission/translations/ko.json +1 -0
- homeassistant/components/trend/translations/ko.json +9 -0
- homeassistant/components/triggercmd/translations/ko.json +11 -0
- homeassistant/components/tuya/__init__.py +15 -0
- homeassistant/components/tuya/sensor.py +7 -0
- homeassistant/components/tuya/translations/sk.json +6 -0
- homeassistant/components/tuya/translations/sv.json +33 -0
- homeassistant/components/tuya/vacuum.py +1 -15
- homeassistant/components/unifiprotect/translations/ko.json +3 -0
- homeassistant/components/unifiprotect/translations/ru.json +5 -1
- homeassistant/components/uptime_kuma/translations/ko.json +30 -0
- homeassistant/components/uptime_kuma/translations/sk.json +3 -1
- homeassistant/components/uptime_kuma/translations/sv.json +1 -0
- homeassistant/components/vacuum/__init__.py +12 -2
- homeassistant/components/vallox/translations/ru.json +5 -0
- homeassistant/components/velbus/translations/ko.json +14 -0
- homeassistant/components/velux/translations/ko.json +15 -0
- homeassistant/components/vesync/translations/ko.json +6 -0
- homeassistant/components/vodafone_station/translations/ko.json +7 -0
- homeassistant/components/volvo/translations/ko.json +11 -0
- homeassistant/components/volvo/translations/sv.json +21 -0
- homeassistant/components/waze_travel_time/translations/ru.json +10 -0
- homeassistant/components/weatherflow_cloud/translations/sk.json +27 -0
- homeassistant/components/weatherflow_cloud/translations/sv.json +9 -0
- homeassistant/components/webdav/translations/ko.json +12 -0
- homeassistant/components/webmin/translations/ko.json +14 -0
- homeassistant/components/weheat/translations/ko.json +11 -0
- homeassistant/components/whirlpool/translations/ko.json +5 -0
- homeassistant/components/whois/translations/ru.json +1 -0
- homeassistant/components/withings/translations/ko.json +3 -0
- homeassistant/components/wmspro/translations/ko.json +11 -0
- homeassistant/components/worldclock/translations/ko.json +11 -0
- homeassistant/components/xbox/translations/ko.json +3 -0
- homeassistant/components/xiaomi_ble/translations/ga.json +11 -1
- homeassistant/components/xiaomi_ble/translations/ko.json +6 -0
- homeassistant/components/yale/manifest.json +1 -1
- homeassistant/components/yale/translations/ko.json +11 -0
- homeassistant/components/yale_smart_alarm/translations/ko.json +6 -0
- homeassistant/components/yolink/translations/ko.json +3 -0
- homeassistant/components/zha/manifest.json +1 -1
- homeassistant/components/zha/translations/ga.json +3 -0
- homeassistant/components/zha/translations/ru.json +6 -0
- homeassistant/components/zha/translations/sk.json +12 -0
- homeassistant/components/zimi/translations/ko.json +18 -0
- homeassistant/components/zwave_js/translations/cs.json +1 -0
- homeassistant/components/zwave_js/translations/ko.json +20 -0
- homeassistant/components/zwave_js/translations/ru.json +1 -0
- homeassistant/components/zwave_js/translations/zh-Hans.json +1 -0
- homeassistant/const.py +1 -1
- homeassistant/package_constraints.txt +3 -3
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/METADATA +2 -2
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/RECORD +532 -444
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/WHEEL +0 -0
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.8.0b3.dist-info → homeassistant-2025.8.0b4.dist-info}/top_level.txt +0 -0
|
@@ -9,6 +9,8 @@ from typing import Any
|
|
|
9
9
|
from opower import (
|
|
10
10
|
CannotConnect,
|
|
11
11
|
InvalidAuth,
|
|
12
|
+
MfaChallenge,
|
|
13
|
+
MfaHandlerBase,
|
|
12
14
|
Opower,
|
|
13
15
|
create_cookie_jar,
|
|
14
16
|
get_supported_utility_names,
|
|
@@ -16,49 +18,34 @@ from opower import (
|
|
|
16
18
|
)
|
|
17
19
|
import voluptuous as vol
|
|
18
20
|
|
|
19
|
-
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
|
|
21
|
+
from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult
|
|
20
22
|
from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME
|
|
21
23
|
from homeassistant.core import HomeAssistant, callback
|
|
22
24
|
from homeassistant.helpers.aiohttp_client import async_create_clientsession
|
|
23
25
|
from homeassistant.helpers.typing import VolDictType
|
|
24
26
|
|
|
25
|
-
from .const import CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN
|
|
27
|
+
from .const import CONF_LOGIN_DATA, CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN
|
|
26
28
|
|
|
27
29
|
_LOGGER = logging.getLogger(__name__)
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{
|
|
32
|
-
vol.Required(CONF_UTILITY): vol.In(get_supported_utility_names()),
|
|
33
|
-
vol.Required(CONF_USERNAME): str,
|
|
34
|
-
vol.Required(CONF_PASSWORD): str,
|
|
35
|
-
}
|
|
36
|
-
)
|
|
31
|
+
CONF_MFA_CODE = "mfa_code"
|
|
32
|
+
CONF_MFA_METHOD = "mfa_method"
|
|
37
33
|
|
|
38
34
|
|
|
39
35
|
async def _validate_login(
|
|
40
|
-
hass: HomeAssistant,
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
hass: HomeAssistant,
|
|
37
|
+
data: Mapping[str, Any],
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Validate login data and raise exceptions on failure."""
|
|
43
40
|
api = Opower(
|
|
44
41
|
async_create_clientsession(hass, cookie_jar=create_cookie_jar()),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
data[CONF_UTILITY],
|
|
43
|
+
data[CONF_USERNAME],
|
|
44
|
+
data[CONF_PASSWORD],
|
|
45
|
+
data.get(CONF_TOTP_SECRET),
|
|
46
|
+
data.get(CONF_LOGIN_DATA),
|
|
49
47
|
)
|
|
50
|
-
|
|
51
|
-
try:
|
|
52
|
-
await api.async_login()
|
|
53
|
-
except InvalidAuth:
|
|
54
|
-
_LOGGER.exception(
|
|
55
|
-
"Invalid auth when connecting to %s", login_data[CONF_UTILITY]
|
|
56
|
-
)
|
|
57
|
-
errors["base"] = "invalid_auth"
|
|
58
|
-
except CannotConnect:
|
|
59
|
-
_LOGGER.exception("Could not connect to %s", login_data[CONF_UTILITY])
|
|
60
|
-
errors["base"] = "cannot_connect"
|
|
61
|
-
return errors
|
|
48
|
+
await api.async_login()
|
|
62
49
|
|
|
63
50
|
|
|
64
51
|
class OpowerConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
@@ -68,81 +55,147 @@ class OpowerConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
68
55
|
|
|
69
56
|
def __init__(self) -> None:
|
|
70
57
|
"""Initialize a new OpowerConfigFlow."""
|
|
71
|
-
self.
|
|
58
|
+
self._data: dict[str, Any] = {}
|
|
59
|
+
self.mfa_handler: MfaHandlerBase | None = None
|
|
72
60
|
|
|
73
61
|
async def async_step_user(
|
|
74
62
|
self, user_input: dict[str, Any] | None = None
|
|
75
63
|
) -> ConfigFlowResult:
|
|
76
|
-
"""Handle the initial step."""
|
|
64
|
+
"""Handle the initial step (select utility)."""
|
|
65
|
+
if user_input is not None:
|
|
66
|
+
self._data[CONF_UTILITY] = user_input[CONF_UTILITY]
|
|
67
|
+
return await self.async_step_credentials()
|
|
68
|
+
|
|
69
|
+
return self.async_show_form(
|
|
70
|
+
step_id="user",
|
|
71
|
+
data_schema=vol.Schema(
|
|
72
|
+
{vol.Required(CONF_UTILITY): vol.In(get_supported_utility_names())}
|
|
73
|
+
),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
async def async_step_credentials(
|
|
77
|
+
self, user_input: dict[str, Any] | None = None
|
|
78
|
+
) -> ConfigFlowResult:
|
|
79
|
+
"""Handle credentials step."""
|
|
77
80
|
errors: dict[str, str] = {}
|
|
81
|
+
utility = select_utility(self._data[CONF_UTILITY])
|
|
82
|
+
|
|
78
83
|
if user_input is not None:
|
|
84
|
+
self._data.update(user_input)
|
|
85
|
+
|
|
79
86
|
self._async_abort_entries_match(
|
|
80
87
|
{
|
|
81
|
-
CONF_UTILITY:
|
|
82
|
-
CONF_USERNAME:
|
|
88
|
+
CONF_UTILITY: self._data[CONF_UTILITY],
|
|
89
|
+
CONF_USERNAME: self._data[CONF_USERNAME],
|
|
83
90
|
}
|
|
84
91
|
)
|
|
85
|
-
if select_utility(user_input[CONF_UTILITY]).accepts_mfa():
|
|
86
|
-
self.utility_info = user_input
|
|
87
|
-
return await self.async_step_mfa()
|
|
88
92
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
try:
|
|
94
|
+
await _validate_login(self.hass, self._data)
|
|
95
|
+
except MfaChallenge as exc:
|
|
96
|
+
self.mfa_handler = exc.handler
|
|
97
|
+
return await self.async_step_mfa_options()
|
|
98
|
+
except InvalidAuth:
|
|
99
|
+
errors["base"] = "invalid_auth"
|
|
100
|
+
except CannotConnect:
|
|
101
|
+
errors["base"] = "cannot_connect"
|
|
102
|
+
else:
|
|
103
|
+
return self._async_create_opower_entry(self._data)
|
|
104
|
+
|
|
105
|
+
schema_dict: VolDictType = {
|
|
106
|
+
vol.Required(CONF_USERNAME): str,
|
|
107
|
+
vol.Required(CONF_PASSWORD): str,
|
|
108
|
+
}
|
|
109
|
+
if utility.accepts_totp_secret():
|
|
110
|
+
schema_dict[vol.Optional(CONF_TOTP_SECRET)] = str
|
|
111
|
+
|
|
95
112
|
return self.async_show_form(
|
|
96
|
-
step_id="
|
|
113
|
+
step_id="credentials",
|
|
97
114
|
data_schema=self.add_suggested_values_to_schema(
|
|
98
|
-
|
|
115
|
+
vol.Schema(schema_dict), user_input
|
|
99
116
|
),
|
|
100
117
|
errors=errors,
|
|
101
118
|
)
|
|
102
119
|
|
|
103
|
-
async def
|
|
120
|
+
async def async_step_mfa_options(
|
|
104
121
|
self, user_input: dict[str, Any] | None = None
|
|
105
122
|
) -> ConfigFlowResult:
|
|
106
|
-
"""Handle MFA step."""
|
|
107
|
-
assert self.utility_info is not None
|
|
123
|
+
"""Handle MFA options step."""
|
|
108
124
|
errors: dict[str, str] = {}
|
|
125
|
+
assert self.mfa_handler is not None
|
|
126
|
+
|
|
109
127
|
if user_input is not None:
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
128
|
+
method = user_input[CONF_MFA_METHOD]
|
|
129
|
+
try:
|
|
130
|
+
await self.mfa_handler.async_select_mfa_option(method)
|
|
131
|
+
except CannotConnect:
|
|
132
|
+
errors["base"] = "cannot_connect"
|
|
133
|
+
else:
|
|
134
|
+
return await self.async_step_mfa_code()
|
|
135
|
+
|
|
136
|
+
mfa_options = await self.mfa_handler.async_get_mfa_options()
|
|
137
|
+
if not mfa_options:
|
|
138
|
+
return await self.async_step_mfa_code()
|
|
139
|
+
return self.async_show_form(
|
|
140
|
+
step_id="mfa_options",
|
|
141
|
+
data_schema=self.add_suggested_values_to_schema(
|
|
142
|
+
vol.Schema({vol.Required(CONF_MFA_METHOD): vol.In(mfa_options)}),
|
|
143
|
+
user_input,
|
|
144
|
+
),
|
|
145
|
+
errors=errors,
|
|
146
|
+
)
|
|
124
147
|
|
|
125
|
-
|
|
148
|
+
async def async_step_mfa_code(
|
|
149
|
+
self, user_input: dict[str, Any] | None = None
|
|
150
|
+
) -> ConfigFlowResult:
|
|
151
|
+
"""Handle MFA code submission step."""
|
|
152
|
+
assert self.mfa_handler is not None
|
|
153
|
+
errors: dict[str, str] = {}
|
|
154
|
+
if user_input is not None:
|
|
155
|
+
code = user_input[CONF_MFA_CODE]
|
|
156
|
+
try:
|
|
157
|
+
login_data = await self.mfa_handler.async_submit_mfa_code(code)
|
|
158
|
+
except InvalidAuth:
|
|
159
|
+
errors["base"] = "invalid_mfa_code"
|
|
160
|
+
except CannotConnect:
|
|
161
|
+
errors["base"] = "cannot_connect"
|
|
162
|
+
else:
|
|
163
|
+
self._data[CONF_LOGIN_DATA] = login_data
|
|
164
|
+
if self.source == SOURCE_REAUTH:
|
|
165
|
+
return self.async_update_reload_and_abort(
|
|
166
|
+
self._get_reauth_entry(), data=self._data
|
|
167
|
+
)
|
|
168
|
+
return self._async_create_opower_entry(self._data)
|
|
126
169
|
|
|
127
170
|
return self.async_show_form(
|
|
128
|
-
step_id="
|
|
129
|
-
data_schema=
|
|
171
|
+
step_id="mfa_code",
|
|
172
|
+
data_schema=self.add_suggested_values_to_schema(
|
|
173
|
+
vol.Schema({vol.Required(CONF_MFA_CODE): str}), user_input
|
|
174
|
+
),
|
|
130
175
|
errors=errors,
|
|
131
176
|
)
|
|
132
177
|
|
|
133
178
|
@callback
|
|
134
|
-
def _async_create_opower_entry(
|
|
179
|
+
def _async_create_opower_entry(
|
|
180
|
+
self, data: dict[str, Any], **kwargs: Any
|
|
181
|
+
) -> ConfigFlowResult:
|
|
135
182
|
"""Create the config entry."""
|
|
136
183
|
return self.async_create_entry(
|
|
137
184
|
title=f"{data[CONF_UTILITY]} ({data[CONF_USERNAME]})",
|
|
138
185
|
data=data,
|
|
186
|
+
**kwargs,
|
|
139
187
|
)
|
|
140
188
|
|
|
141
189
|
async def async_step_reauth(
|
|
142
190
|
self, entry_data: Mapping[str, Any]
|
|
143
191
|
) -> ConfigFlowResult:
|
|
144
192
|
"""Handle configuration by re-auth."""
|
|
145
|
-
|
|
193
|
+
reauth_entry = self._get_reauth_entry()
|
|
194
|
+
self._data = dict(reauth_entry.data)
|
|
195
|
+
return self.async_show_form(
|
|
196
|
+
step_id="reauth_confirm",
|
|
197
|
+
description_placeholders={CONF_NAME: reauth_entry.title},
|
|
198
|
+
)
|
|
146
199
|
|
|
147
200
|
async def async_step_reauth_confirm(
|
|
148
201
|
self, user_input: dict[str, Any] | None = None
|
|
@@ -150,21 +203,34 @@ class OpowerConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
150
203
|
"""Dialog that informs the user that reauth is required."""
|
|
151
204
|
errors: dict[str, str] = {}
|
|
152
205
|
reauth_entry = self._get_reauth_entry()
|
|
206
|
+
|
|
153
207
|
if user_input is not None:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
208
|
+
self._data.update(user_input)
|
|
209
|
+
try:
|
|
210
|
+
await _validate_login(self.hass, self._data)
|
|
211
|
+
except MfaChallenge as exc:
|
|
212
|
+
self.mfa_handler = exc.handler
|
|
213
|
+
return await self.async_step_mfa_options()
|
|
214
|
+
except InvalidAuth:
|
|
215
|
+
errors["base"] = "invalid_auth"
|
|
216
|
+
except CannotConnect:
|
|
217
|
+
errors["base"] = "cannot_connect"
|
|
218
|
+
else:
|
|
219
|
+
return self.async_update_reload_and_abort(reauth_entry, data=self._data)
|
|
158
220
|
|
|
159
|
-
|
|
160
|
-
|
|
221
|
+
utility = select_utility(self._data[CONF_UTILITY])
|
|
222
|
+
schema_dict: VolDictType = {
|
|
223
|
+
vol.Required(CONF_USERNAME): str,
|
|
161
224
|
vol.Required(CONF_PASSWORD): str,
|
|
162
225
|
}
|
|
163
|
-
if
|
|
164
|
-
|
|
226
|
+
if utility.accepts_totp_secret():
|
|
227
|
+
schema_dict[vol.Optional(CONF_TOTP_SECRET)] = str
|
|
228
|
+
|
|
165
229
|
return self.async_show_form(
|
|
166
230
|
step_id="reauth_confirm",
|
|
167
|
-
data_schema=
|
|
231
|
+
data_schema=self.add_suggested_values_to_schema(
|
|
232
|
+
vol.Schema(schema_dict), self._data
|
|
233
|
+
),
|
|
168
234
|
errors=errors,
|
|
169
235
|
description_placeholders={CONF_NAME: reauth_entry.title},
|
|
170
236
|
)
|
|
@@ -14,7 +14,7 @@ from opower import (
|
|
|
14
14
|
ReadResolution,
|
|
15
15
|
create_cookie_jar,
|
|
16
16
|
)
|
|
17
|
-
from opower.exceptions import ApiException, CannotConnect, InvalidAuth
|
|
17
|
+
from opower.exceptions import ApiException, CannotConnect, InvalidAuth, MfaChallenge
|
|
18
18
|
|
|
19
19
|
from homeassistant.components.recorder import get_instance
|
|
20
20
|
from homeassistant.components.recorder.models import (
|
|
@@ -36,7 +36,7 @@ from homeassistant.helpers.aiohttp_client import async_create_clientsession
|
|
|
36
36
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
37
37
|
from homeassistant.util import dt as dt_util
|
|
38
38
|
|
|
39
|
-
from .const import CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN
|
|
39
|
+
from .const import CONF_LOGIN_DATA, CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN
|
|
40
40
|
|
|
41
41
|
_LOGGER = logging.getLogger(__name__)
|
|
42
42
|
|
|
@@ -69,6 +69,7 @@ class OpowerCoordinator(DataUpdateCoordinator[dict[str, Forecast]]):
|
|
|
69
69
|
config_entry.data[CONF_USERNAME],
|
|
70
70
|
config_entry.data[CONF_PASSWORD],
|
|
71
71
|
config_entry.data.get(CONF_TOTP_SECRET),
|
|
72
|
+
config_entry.data.get(CONF_LOGIN_DATA),
|
|
72
73
|
)
|
|
73
74
|
|
|
74
75
|
@callback
|
|
@@ -90,7 +91,7 @@ class OpowerCoordinator(DataUpdateCoordinator[dict[str, Forecast]]):
|
|
|
90
91
|
# Given the infrequent updating (every 12h)
|
|
91
92
|
# assume previous session has expired and re-login.
|
|
92
93
|
await self.api.async_login()
|
|
93
|
-
except InvalidAuth as err:
|
|
94
|
+
except (InvalidAuth, MfaChallenge) as err:
|
|
94
95
|
_LOGGER.error("Error during login: %s", err)
|
|
95
96
|
raise ConfigEntryAuthFailed from err
|
|
96
97
|
except CannotConnect as err:
|
|
@@ -3,27 +3,43 @@
|
|
|
3
3
|
"step": {
|
|
4
4
|
"user": {
|
|
5
5
|
"data": {
|
|
6
|
-
"utility": "Utility name"
|
|
7
|
-
"username": "[%key:common::config_flow::data::username%]",
|
|
8
|
-
"password": "[%key:common::config_flow::data::password%]"
|
|
6
|
+
"utility": "Utility name"
|
|
9
7
|
},
|
|
10
8
|
"data_description": {
|
|
11
|
-
"utility": "The name of your utility provider"
|
|
12
|
-
"username": "The username for your utility account",
|
|
13
|
-
"password": "The password for your utility account"
|
|
9
|
+
"utility": "The name of your utility provider"
|
|
14
10
|
}
|
|
15
11
|
},
|
|
16
|
-
"
|
|
17
|
-
"
|
|
12
|
+
"credentials": {
|
|
13
|
+
"title": "Enter Credentials",
|
|
18
14
|
"data": {
|
|
19
15
|
"username": "[%key:common::config_flow::data::username%]",
|
|
20
16
|
"password": "[%key:common::config_flow::data::password%]",
|
|
21
17
|
"totp_secret": "TOTP secret"
|
|
22
18
|
},
|
|
23
19
|
"data_description": {
|
|
24
|
-
"username": "
|
|
25
|
-
"password": "
|
|
26
|
-
"totp_secret": "
|
|
20
|
+
"username": "The username for your utility account",
|
|
21
|
+
"password": "The password for your utility account",
|
|
22
|
+
"totp_secret": "This is not a 6-digit code. It is a string of around 16 characters containing the shared secret that enables your authenticator app to generate the correct time-based code at the appropriate time. See the documentation."
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"mfa_options": {
|
|
26
|
+
"title": "Multi-factor authentication",
|
|
27
|
+
"description": "Your account requires multi-factor authentication (MFA). Select a method to receive your security code.",
|
|
28
|
+
"data": {
|
|
29
|
+
"mfa_method": "MFA method"
|
|
30
|
+
},
|
|
31
|
+
"data_description": {
|
|
32
|
+
"mfa_method": "How to receive your security code"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"mfa_code": {
|
|
36
|
+
"title": "Enter security code",
|
|
37
|
+
"description": "A security code has been sent via your selected method. Please enter it below to complete login.",
|
|
38
|
+
"data": {
|
|
39
|
+
"mfa_code": "Security code"
|
|
40
|
+
},
|
|
41
|
+
"data_description": {
|
|
42
|
+
"mfa_code": "Typically a 6-digit code"
|
|
27
43
|
}
|
|
28
44
|
},
|
|
29
45
|
"reauth_confirm": {
|
|
@@ -31,18 +47,19 @@
|
|
|
31
47
|
"data": {
|
|
32
48
|
"username": "[%key:common::config_flow::data::username%]",
|
|
33
49
|
"password": "[%key:common::config_flow::data::password%]",
|
|
34
|
-
"totp_secret": "[%key:component::opower::config::step::
|
|
50
|
+
"totp_secret": "[%key:component::opower::config::step::credentials::data::totp_secret%]"
|
|
35
51
|
},
|
|
36
52
|
"data_description": {
|
|
37
|
-
"username": "[%key:component::opower::config::step::
|
|
38
|
-
"password": "[%key:component::opower::config::step::
|
|
39
|
-
"totp_secret": "
|
|
53
|
+
"username": "[%key:component::opower::config::step::credentials::data_description::username%]",
|
|
54
|
+
"password": "[%key:component::opower::config::step::credentials::data_description::password%]",
|
|
55
|
+
"totp_secret": "[%key:component::opower::config::step::credentials::data_description::totp_secret%]"
|
|
40
56
|
}
|
|
41
57
|
}
|
|
42
58
|
},
|
|
43
59
|
"error": {
|
|
44
60
|
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
|
45
|
-
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
|
|
61
|
+
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
|
62
|
+
"invalid_mfa_code": "The security code is incorrect. Please try again."
|
|
46
63
|
},
|
|
47
64
|
"abort": {
|
|
48
65
|
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
|
|
@@ -9,12 +9,6 @@
|
|
|
9
9
|
"invalid_auth": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f"
|
|
10
10
|
},
|
|
11
11
|
"step": {
|
|
12
|
-
"mfa": {
|
|
13
|
-
"data": {
|
|
14
|
-
"password": "\u041f\u0430\u0440\u043e\u043b\u0430",
|
|
15
|
-
"username": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
12
|
"reauth_confirm": {
|
|
19
13
|
"data": {
|
|
20
14
|
"password": "\u041f\u0430\u0440\u043e\u043b\u0430",
|
|
@@ -23,10 +17,6 @@
|
|
|
23
17
|
"title": "\u0410\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 {name} \u0435 \u0438\u0437\u0442\u0435\u043a\u043b\u0430"
|
|
24
18
|
},
|
|
25
19
|
"user": {
|
|
26
|
-
"data": {
|
|
27
|
-
"password": "\u041f\u0430\u0440\u043e\u043b\u0430",
|
|
28
|
-
"username": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435"
|
|
29
|
-
},
|
|
30
20
|
"data_description": {
|
|
31
21
|
"utility": "The name of your utility provider"
|
|
32
22
|
}
|
|
@@ -9,12 +9,6 @@
|
|
|
9
9
|
"invalid_auth": "Autenticaci\u00f3 inv\u00e0lida"
|
|
10
10
|
},
|
|
11
11
|
"step": {
|
|
12
|
-
"mfa": {
|
|
13
|
-
"data": {
|
|
14
|
-
"password": "Contrasenya",
|
|
15
|
-
"username": "Nom d'usuari"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
12
|
"reauth_confirm": {
|
|
19
13
|
"data": {
|
|
20
14
|
"password": "Contrasenya",
|
|
@@ -24,8 +18,6 @@
|
|
|
24
18
|
},
|
|
25
19
|
"user": {
|
|
26
20
|
"data": {
|
|
27
|
-
"password": "Contrasenya",
|
|
28
|
-
"username": "Nom d'usuari",
|
|
29
21
|
"utility": "Nom de la xarxa"
|
|
30
22
|
}
|
|
31
23
|
}
|
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
},
|
|
7
7
|
"error": {
|
|
8
8
|
"cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit",
|
|
9
|
-
"invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed"
|
|
9
|
+
"invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed",
|
|
10
|
+
"invalid_mfa_code": "Bezpe\u010dnostn\u00ed k\u00f3d je nespr\u00e1vn\u00fd. Zkuste to znovu."
|
|
10
11
|
},
|
|
11
12
|
"step": {
|
|
12
|
-
"
|
|
13
|
+
"credentials": {
|
|
13
14
|
"data": {
|
|
14
15
|
"password": "Heslo",
|
|
15
16
|
"totp_secret": "Tajn\u00fd kl\u00ed\u010d TOTP",
|
|
@@ -17,10 +18,30 @@
|
|
|
17
18
|
},
|
|
18
19
|
"data_description": {
|
|
19
20
|
"password": "Heslo k va\u0161emu \u00fa\u010dtu pro energie",
|
|
20
|
-
"totp_secret": "
|
|
21
|
+
"totp_secret": "Toto nen\u00ed 6m\u00edstn\u00fd k\u00f3d. Je to \u0159et\u011bzec o d\u00e9lce p\u0159ibli\u017en\u011b 16 znak\u016f obsahuj\u00edc\u00ed sd\u00edlen\u00fd tajn\u00fd kl\u00ed\u010d, kter\u00fd umo\u017e\u0148uje va\u0161\u00ed ov\u011b\u0159ovac\u00ed aplikaci vygenerovat spr\u00e1vn\u00fd k\u00f3d zalo\u017een\u00fd na \u010dase ve spr\u00e1vn\u00fd \u010das. Viz dokumentace.",
|
|
21
22
|
"username": "U\u017eivatelsk\u00e9 jm\u00e9no k va\u0161emu \u00fa\u010dtu pro energie"
|
|
22
23
|
},
|
|
23
|
-
"
|
|
24
|
+
"title": "Zadejte p\u0159ihla\u0161ovac\u00ed \u00fadaje"
|
|
25
|
+
},
|
|
26
|
+
"mfa_code": {
|
|
27
|
+
"data": {
|
|
28
|
+
"mfa_code": "Bezpe\u010dnostn\u00ed k\u00f3d"
|
|
29
|
+
},
|
|
30
|
+
"data_description": {
|
|
31
|
+
"mfa_code": "Obvykle \u0161estim\u00edstn\u00fd k\u00f3d"
|
|
32
|
+
},
|
|
33
|
+
"description": "Bezpe\u010dnostn\u00ed k\u00f3d byl odesl\u00e1n zvolenou metodou. Zadejte jej n\u00ed\u017ee pro dokon\u010den\u00ed p\u0159ihl\u00e1\u0161en\u00ed.",
|
|
34
|
+
"title": "Zadat bezpe\u010dnostn\u00ed k\u00f3d"
|
|
35
|
+
},
|
|
36
|
+
"mfa_options": {
|
|
37
|
+
"data": {
|
|
38
|
+
"mfa_method": "Metoda MFA"
|
|
39
|
+
},
|
|
40
|
+
"data_description": {
|
|
41
|
+
"mfa_method": "Jak z\u00edskat bezpe\u010dnostn\u00ed k\u00f3d"
|
|
42
|
+
},
|
|
43
|
+
"description": "V\u00e1\u0161 \u00fa\u010det vy\u017eaduje v\u00edcefaktorov\u00e9 ov\u011b\u0159ov\u00e1n\u00ed (MFA). Vyberte metodu, jak chcete, abyste obdr\u017eeli bezpe\u010dnostn\u00ed k\u00f3d.",
|
|
44
|
+
"title": "V\u00edcefaktorov\u00e9 ov\u011b\u0159ov\u00e1n\u00ed"
|
|
24
45
|
},
|
|
25
46
|
"reauth_confirm": {
|
|
26
47
|
"data": {
|
|
@@ -30,20 +51,16 @@
|
|
|
30
51
|
},
|
|
31
52
|
"data_description": {
|
|
32
53
|
"password": "Heslo k va\u0161emu \u00fa\u010dtu pro energie",
|
|
33
|
-
"totp_secret": "
|
|
54
|
+
"totp_secret": "Toto nen\u00ed 6m\u00edstn\u00fd k\u00f3d. Je to \u0159et\u011bzec o d\u00e9lce p\u0159ibli\u017en\u011b 16 znak\u016f obsahuj\u00edc\u00ed sd\u00edlen\u00fd tajn\u00fd kl\u00ed\u010d, kter\u00fd umo\u017e\u0148uje va\u0161\u00ed ov\u011b\u0159ovac\u00ed aplikaci vygenerovat spr\u00e1vn\u00fd k\u00f3d zalo\u017een\u00fd na \u010dase ve spr\u00e1vn\u00fd \u010das. Viz dokumentace.",
|
|
34
55
|
"username": "U\u017eivatelsk\u00e9 jm\u00e9no k va\u0161emu \u00fa\u010dtu pro energie"
|
|
35
56
|
},
|
|
36
57
|
"title": "Platnost ov\u011b\u0159en\u00ed pro {name} vypr\u0161ela"
|
|
37
58
|
},
|
|
38
59
|
"user": {
|
|
39
60
|
"data": {
|
|
40
|
-
"password": "Heslo",
|
|
41
|
-
"username": "U\u017eivatelsk\u00e9 jm\u00e9no",
|
|
42
61
|
"utility": "N\u00e1zev utility"
|
|
43
62
|
},
|
|
44
63
|
"data_description": {
|
|
45
|
-
"password": "Heslo k va\u0161emu \u00fa\u010dtu pro energie",
|
|
46
|
-
"username": "U\u017eivatelsk\u00e9 jm\u00e9no k va\u0161emu \u00fa\u010dtu pro energie",
|
|
47
64
|
"utility": "N\u00e1zev va\u0161eho poskytovatele energi\u00ed"
|
|
48
65
|
}
|
|
49
66
|
}
|
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
},
|
|
7
7
|
"error": {
|
|
8
8
|
"cannot_connect": "Verbindung fehlgeschlagen",
|
|
9
|
-
"invalid_auth": "Ung\u00fcltige Authentifizierung"
|
|
9
|
+
"invalid_auth": "Ung\u00fcltige Authentifizierung",
|
|
10
|
+
"invalid_mfa_code": "Der Sicherheitscode ist falsch. Bitte versuche es erneut."
|
|
10
11
|
},
|
|
11
12
|
"step": {
|
|
12
|
-
"
|
|
13
|
+
"credentials": {
|
|
13
14
|
"data": {
|
|
14
15
|
"password": "Passwort",
|
|
15
16
|
"totp_secret": "TOTP-Geheimnis",
|
|
@@ -17,10 +18,30 @@
|
|
|
17
18
|
},
|
|
18
19
|
"data_description": {
|
|
19
20
|
"password": "Das Passwort f\u00fcr dein Versorgerkonto",
|
|
20
|
-
"totp_secret": "
|
|
21
|
+
"totp_secret": "Dies ist kein 6-stelliger Code. Es handelt sich um eine Folge von etwa 16 Zeichen, die das gemeinsame Geheimnis enth\u00e4lt, das es deiner Authentifizierungs-App erm\u00f6glicht, zum richtigen Zeitpunkt den richtigen zeitbasierten Code zu generieren. Weitere Informationen finden sich in der Dokumentation.",
|
|
21
22
|
"username": "Der Benutzername f\u00fcr dein Versorgerkonto"
|
|
22
23
|
},
|
|
23
|
-
"
|
|
24
|
+
"title": "Anmeldedaten eingeben"
|
|
25
|
+
},
|
|
26
|
+
"mfa_code": {
|
|
27
|
+
"data": {
|
|
28
|
+
"mfa_code": "Sicherheitscode"
|
|
29
|
+
},
|
|
30
|
+
"data_description": {
|
|
31
|
+
"mfa_code": "In der Regel ein 6-stelliger Code"
|
|
32
|
+
},
|
|
33
|
+
"description": "Ein Sicherheitscode wurde \u00fcber die von dir gew\u00e4hlte Methode gesendet. Bitte gib ihn unten ein, um die Anmeldung abzuschlie\u00dfen.",
|
|
34
|
+
"title": "Sicherheitscode eingeben"
|
|
35
|
+
},
|
|
36
|
+
"mfa_options": {
|
|
37
|
+
"data": {
|
|
38
|
+
"mfa_method": "MFA-Methode"
|
|
39
|
+
},
|
|
40
|
+
"data_description": {
|
|
41
|
+
"mfa_method": "Wie du deinen Sicherheitscode erh\u00e4ltst"
|
|
42
|
+
},
|
|
43
|
+
"description": "F\u00fcr dein Konto ist eine Multi-Faktor-Authentifizierung (MFA) erforderlich. W\u00e4hle eine Methode zum Erhalt deines Sicherheitscodes.",
|
|
44
|
+
"title": "Multi-Faktor-Authentifizierung"
|
|
24
45
|
},
|
|
25
46
|
"reauth_confirm": {
|
|
26
47
|
"data": {
|
|
@@ -30,20 +51,16 @@
|
|
|
30
51
|
},
|
|
31
52
|
"data_description": {
|
|
32
53
|
"password": "Das Passwort f\u00fcr dein Versorgerkonto",
|
|
33
|
-
"totp_secret": "
|
|
54
|
+
"totp_secret": "Dies ist kein 6-stelliger Code. Es handelt sich um eine Folge von etwa 16 Zeichen, die das gemeinsame Geheimnis enth\u00e4lt, das es deiner Authentifizierungs-App erm\u00f6glicht, zum richtigen Zeitpunkt den richtigen zeitbasierten Code zu generieren. Weitere Informationen finden sich in der Dokumentation.",
|
|
34
55
|
"username": "Der Benutzername f\u00fcr dein Versorgerkonto"
|
|
35
56
|
},
|
|
36
57
|
"title": "Authentifizierung f\u00fcr {name} abgelaufen"
|
|
37
58
|
},
|
|
38
59
|
"user": {
|
|
39
60
|
"data": {
|
|
40
|
-
"password": "Passwort",
|
|
41
|
-
"username": "Benutzername",
|
|
42
61
|
"utility": "Name des Versorgers"
|
|
43
62
|
},
|
|
44
63
|
"data_description": {
|
|
45
|
-
"password": "Das Passwort f\u00fcr dein Versorgerkonto",
|
|
46
|
-
"username": "Der Benutzername f\u00fcr dein Versorgerkonto",
|
|
47
64
|
"utility": "Der Name deines Versorgungsunternehmens"
|
|
48
65
|
}
|
|
49
66
|
}
|