mirror of
https://github.com/home-assistant/core.git
synced 2026-01-03 14:25:28 +01:00
Compare commits
547 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88bc3033d3 | ||
|
|
21de636e5b | ||
|
|
87b5faa244 | ||
|
|
c2f4293c6a | ||
|
|
4c72f3c48b | ||
|
|
cb613984df | ||
|
|
4978a1681e | ||
|
|
2303e1684e | ||
|
|
3135257c0d | ||
|
|
b20b811cb9 | ||
|
|
a778cd117f | ||
|
|
31b88197eb | ||
|
|
81c252f917 | ||
|
|
f5a0b5ab98 | ||
|
|
a382ba731d | ||
|
|
cca8d4c951 | ||
|
|
932080656d | ||
|
|
d5bdfdb0b3 | ||
|
|
d9806f759b | ||
|
|
e6debe09e8 | ||
|
|
c5dad82211 | ||
|
|
ec9ccf6402 | ||
|
|
a268aab2ec | ||
|
|
996e0a6389 | ||
|
|
e877983533 | ||
|
|
73675d5a48 | ||
|
|
43f85f7053 | ||
|
|
ed28482311 | ||
|
|
0f09c02875 | ||
|
|
97b93bcf7b | ||
|
|
b05062e9d9 | ||
|
|
6f2dd21516 | ||
|
|
eda2290d47 | ||
|
|
238c4247d9 | ||
|
|
4fe9f966ad | ||
|
|
26a534a67c | ||
|
|
aa546b5a1f | ||
|
|
9e140d27bf | ||
|
|
e6cbdf0645 | ||
|
|
1c889cfcc3 | ||
|
|
45bbe75d29 | ||
|
|
4a45510c88 | ||
|
|
070320a24a | ||
|
|
1ef3e32d4a | ||
|
|
c9ade6ee85 | ||
|
|
78217fa9b0 | ||
|
|
f3bb9e870e | ||
|
|
732110b4c3 | ||
|
|
ab2be6df48 | ||
|
|
e4b2aab1e9 | ||
|
|
3749321fa5 | ||
|
|
63fda29eaf | ||
|
|
0ebd12fa6c | ||
|
|
14f912500e | ||
|
|
651b0d3506 | ||
|
|
626f8a8b09 | ||
|
|
51eb6c7b4e | ||
|
|
2c10327945 | ||
|
|
d1349d4919 | ||
|
|
0f4c2ccd1e | ||
|
|
f6811a85b6 | ||
|
|
fbfa3d1a18 | ||
|
|
8a026bf214 | ||
|
|
519315f9c8 | ||
|
|
2482816a11 | ||
|
|
b87eb9d79e | ||
|
|
9b3a3fc1ac | ||
|
|
9066609d23 | ||
|
|
27e6c6665f | ||
|
|
0b68da2f88 | ||
|
|
01ee92177f | ||
|
|
33c9afd6e0 | ||
|
|
28f9c7c2cd | ||
|
|
51773f338e | ||
|
|
822b6328e1 | ||
|
|
e9f79c3d06 | ||
|
|
be78265631 | ||
|
|
4d4cd2d752 | ||
|
|
efa48848a5 | ||
|
|
9cff1dd4ba | ||
|
|
42e691c194 | ||
|
|
7bae76843c | ||
|
|
5c2f997394 | ||
|
|
e739fd8a31 | ||
|
|
aa472d4f10 | ||
|
|
3b9db88065 | ||
|
|
344e839bec | ||
|
|
e119deafe5 | ||
|
|
dc6fd780a9 | ||
|
|
29187795a8 | ||
|
|
ab73b725e1 | ||
|
|
c4400be62a | ||
|
|
a34524febe | ||
|
|
beb86426e4 | ||
|
|
03fc81a434 | ||
|
|
5a5c97acb3 | ||
|
|
90d3f517d8 | ||
|
|
f3c9327ccf | ||
|
|
f0268688be | ||
|
|
095a0d19d1 | ||
|
|
4e9d0ebc63 | ||
|
|
6626e5c4a4 | ||
|
|
db4c06c8fe | ||
|
|
d3f1ee4a89 | ||
|
|
0ccbf61aea | ||
|
|
a50bcdff1a | ||
|
|
f190b698c6 | ||
|
|
619ea3ff98 | ||
|
|
dd5fc0a1da | ||
|
|
ff93cdb0bc | ||
|
|
814e610b1d | ||
|
|
a4bb35142c | ||
|
|
47220d71a1 | ||
|
|
04fc951048 | ||
|
|
7255fbdf3a | ||
|
|
65bc7a6fbd | ||
|
|
3e9376c418 | ||
|
|
6e0186fd56 | ||
|
|
3732d75633 | ||
|
|
2ada0ecfd9 | ||
|
|
3d9f4bf2aa | ||
|
|
ce86fe47e3 | ||
|
|
d44269981b | ||
|
|
fc13e37d8d | ||
|
|
b588c1fe1c | ||
|
|
6743ef10ab | ||
|
|
a1c3a38428 | ||
|
|
492c3b24de | ||
|
|
1eba90d2a1 | ||
|
|
a8a2daeac5 | ||
|
|
dc5b8fd8c4 | ||
|
|
7143f4e621 | ||
|
|
bfda923999 | ||
|
|
e8b67fc19f | ||
|
|
c595cf016f | ||
|
|
d027965304 | ||
|
|
f20195ba75 | ||
|
|
197303b63e | ||
|
|
2f7b4ed7f0 | ||
|
|
02745be44d | ||
|
|
616c7628d7 | ||
|
|
954bd4e13b | ||
|
|
48e44f4b5b | ||
|
|
b7b4a6dcc8 | ||
|
|
8f70c16863 | ||
|
|
2aa7bdb1d5 | ||
|
|
111f882d78 | ||
|
|
b437b87655 | ||
|
|
2b3c31cdb0 | ||
|
|
8b38b82e73 | ||
|
|
d9712027e8 | ||
|
|
caa3b123ae | ||
|
|
4102e24481 | ||
|
|
3f29e91367 | ||
|
|
3a3957aeed | ||
|
|
e4a21011a3 | ||
|
|
07e04e5b84 | ||
|
|
df5b17d139 | ||
|
|
e3d29ad26a | ||
|
|
e2a57add2c | ||
|
|
e59776377b | ||
|
|
b2482d8205 | ||
|
|
dc133fe9f2 | ||
|
|
3fcbc36abe | ||
|
|
bd352b9950 | ||
|
|
bf4fb36bb1 | ||
|
|
ac502980a2 | ||
|
|
d9a44f2a78 | ||
|
|
d0e88d9628 | ||
|
|
a2877c4ea0 | ||
|
|
94be43e3e1 | ||
|
|
c637bad1eb | ||
|
|
565f513b77 | ||
|
|
4c4317fb37 | ||
|
|
998b5f6d19 | ||
|
|
6b7a5cfcad | ||
|
|
e764d9461a | ||
|
|
09692143d0 | ||
|
|
0f8575f939 | ||
|
|
2435456248 | ||
|
|
73099caede | ||
|
|
966fd1034d | ||
|
|
ddd63c615f | ||
|
|
7bd5e60767 | ||
|
|
67008e0947 | ||
|
|
9f99e173de | ||
|
|
7dd3fc7ca7 | ||
|
|
fd3bea177b | ||
|
|
be26fc896d | ||
|
|
9057da01bd | ||
|
|
d09cf8dd17 | ||
|
|
03573781c7 | ||
|
|
54949cff5a | ||
|
|
1518a80069 | ||
|
|
cece6454e4 | ||
|
|
5b24b271cc | ||
|
|
5115dfada2 | ||
|
|
7e06d03b45 | ||
|
|
1ff299875b | ||
|
|
cf3a8b60ff | ||
|
|
27d598fff8 | ||
|
|
49995c2120 | ||
|
|
4cc90c437f | ||
|
|
c0f83b4164 | ||
|
|
4500760b52 | ||
|
|
620f23d433 | ||
|
|
4562bdc69f | ||
|
|
dfb45c03e4 | ||
|
|
f452409cfa | ||
|
|
fb820975b5 | ||
|
|
3be8178035 | ||
|
|
fe4a2b5b31 | ||
|
|
df8589c36a | ||
|
|
b0f317743b | ||
|
|
99eda385d1 | ||
|
|
e3cfcbad69 | ||
|
|
98c3c02daa | ||
|
|
2d2c6cf4a1 | ||
|
|
9d3eaada27 | ||
|
|
baaeaab61d | ||
|
|
921efbdfef | ||
|
|
bc46e48d23 | ||
|
|
bdea222196 | ||
|
|
5ad252bd3b | ||
|
|
1768c2b447 | ||
|
|
d1fa341a78 | ||
|
|
8b5aff63ae | ||
|
|
c544845e29 | ||
|
|
d55693762e | ||
|
|
7ce18146d4 | ||
|
|
834d8940a8 | ||
|
|
933076560b | ||
|
|
d1ebe2cbac | ||
|
|
d2fea76fd7 | ||
|
|
463c4ae5c9 | ||
|
|
600070af3a | ||
|
|
9ce8f4737d | ||
|
|
3f9e6a7064 | ||
|
|
0ab9b006f0 | ||
|
|
0b77a89a2f | ||
|
|
4d410bf5b9 | ||
|
|
1afbc22ad5 | ||
|
|
6cdc5a5c2d | ||
|
|
7e855d5b48 | ||
|
|
2b86fc3841 | ||
|
|
3b5ed7a20f | ||
|
|
ce7f678b9b | ||
|
|
425b9851fc | ||
|
|
72ef9670e6 | ||
|
|
4e7cfc923d | ||
|
|
9251860201 | ||
|
|
847711ddc9 | ||
|
|
33b8dbe73a | ||
|
|
df598544d6 | ||
|
|
816364bfd9 | ||
|
|
7d111c2b4e | ||
|
|
30c8c689d8 | ||
|
|
017f34770b | ||
|
|
f881a3af82 | ||
|
|
6f0b853547 | ||
|
|
9696a8b8a9 | ||
|
|
219ca336a9 | ||
|
|
26a79dff99 | ||
|
|
0023da778a | ||
|
|
84053103f0 | ||
|
|
bc17adda8d | ||
|
|
2155a861cd | ||
|
|
f1b84962ed | ||
|
|
9125e49628 | ||
|
|
8c5763624c | ||
|
|
481439d387 | ||
|
|
ad9ec2190c | ||
|
|
9cab597bc4 | ||
|
|
9c92880b5a | ||
|
|
ea592a003b | ||
|
|
451241b481 | ||
|
|
c91512d55d | ||
|
|
d34fe106e4 | ||
|
|
66267474dc | ||
|
|
1a6c79d5e2 | ||
|
|
a49686879d | ||
|
|
f7d9031486 | ||
|
|
b39b66ef65 | ||
|
|
4c23ccad98 | ||
|
|
4509caefde | ||
|
|
5cf936c777 | ||
|
|
91a2c73a2c | ||
|
|
90da9120e8 | ||
|
|
da672c6593 | ||
|
|
2de65af3fa | ||
|
|
dc606b40ac | ||
|
|
8973852a2e | ||
|
|
2b6b922e3f | ||
|
|
539d24dd60 | ||
|
|
9203ae201f | ||
|
|
3a6a246746 | ||
|
|
6c574a4eb4 | ||
|
|
f7a6027466 | ||
|
|
05808afe75 | ||
|
|
06f2aa93a4 | ||
|
|
46efc0eafb | ||
|
|
383813bfe6 | ||
|
|
1130ccb325 | ||
|
|
93f84a5cd1 | ||
|
|
7d0f847f83 | ||
|
|
656d39e3ec | ||
|
|
7b19428279 | ||
|
|
f3786e2f2b | ||
|
|
b44ff38f5a | ||
|
|
eb573c2701 | ||
|
|
f6ae054e9f | ||
|
|
b7607ff472 | ||
|
|
c115c89afd | ||
|
|
12c18d63fd | ||
|
|
ab7fda4286 | ||
|
|
cdc4dc3f11 | ||
|
|
d60934c028 | ||
|
|
9c09a98c9e | ||
|
|
03ec3ac16e | ||
|
|
c5de32e7b1 | ||
|
|
dc62cb6a88 | ||
|
|
3736120c6a | ||
|
|
f4b2573c4b | ||
|
|
801401e9cb | ||
|
|
e404afc0d0 | ||
|
|
3c8c6688be | ||
|
|
882f5ed079 | ||
|
|
161c368c9d | ||
|
|
3a386e627e | ||
|
|
1faf2f49d0 | ||
|
|
f1f3074612 | ||
|
|
81d2ec9618 | ||
|
|
4d3790e2d4 | ||
|
|
50ba3d0427 | ||
|
|
bf0a50cdb2 | ||
|
|
c20e0b985a | ||
|
|
02f207ea8e | ||
|
|
c2579d1d8a | ||
|
|
faeb6295b6 | ||
|
|
62b2b23d0b | ||
|
|
127c55e0c1 | ||
|
|
22af9707ad | ||
|
|
67780dfb4e | ||
|
|
136b1e1f6c | ||
|
|
d692251e62 | ||
|
|
8db8a58763 | ||
|
|
8a6235fdac | ||
|
|
d037359bda | ||
|
|
6bbc663d0b | ||
|
|
d1950cd75c | ||
|
|
561ff33641 | ||
|
|
888345e4ff | ||
|
|
6fad9e1a0a | ||
|
|
f1a00cc0f9 | ||
|
|
4d1d22070c | ||
|
|
7b7720d0ea | ||
|
|
b6854a82cf | ||
|
|
fe9800e784 | ||
|
|
d795410b27 | ||
|
|
80442e655d | ||
|
|
6b46ed850b | ||
|
|
d1c8d39107 | ||
|
|
d89c56829c | ||
|
|
2702c75fb0 | ||
|
|
00b8d57cd0 | ||
|
|
1e69848af4 | ||
|
|
5dfaec5967 | ||
|
|
9cbb26bee2 | ||
|
|
69df620ad6 | ||
|
|
e8ed56ca52 | ||
|
|
0d98f9783f | ||
|
|
b5b03f5b7f | ||
|
|
55f9db6992 | ||
|
|
277f37423e | ||
|
|
c3c92232da | ||
|
|
4cb408f8f9 | ||
|
|
868820c424 | ||
|
|
861d58f58f | ||
|
|
49ecca9cb9 | ||
|
|
788f7988e7 | ||
|
|
0425c8195f | ||
|
|
de2892caa8 | ||
|
|
e538320901 | ||
|
|
a55c2514d1 | ||
|
|
88d0aa14ee | ||
|
|
fd991bd1a4 | ||
|
|
8f249f9149 | ||
|
|
203a6fd349 | ||
|
|
5df02f3a78 | ||
|
|
d049b521b2 | ||
|
|
1ebdc2e2c2 | ||
|
|
d8993af548 | ||
|
|
4a559cd4df | ||
|
|
16154ab445 | ||
|
|
9f7443ba97 | ||
|
|
852d67b95c | ||
|
|
44d7c3584d | ||
|
|
898b699311 | ||
|
|
ace1ae85dd | ||
|
|
13421b326b | ||
|
|
5f7f7777a0 | ||
|
|
5def64156f | ||
|
|
326010629c | ||
|
|
3a4b3a2f81 | ||
|
|
f601e9f774 | ||
|
|
c66ec87b69 | ||
|
|
81cad8cd52 | ||
|
|
5a762c74f4 | ||
|
|
21583d25e2 | ||
|
|
b5e40669c9 | ||
|
|
8137b0bb9e | ||
|
|
987b5cd905 | ||
|
|
cfd1563bc8 | ||
|
|
24914aade5 | ||
|
|
33dcb071da | ||
|
|
876e2a0a11 | ||
|
|
33d607bb22 | ||
|
|
a014c2be59 | ||
|
|
9db9a81793 | ||
|
|
d16d14b648 | ||
|
|
faf7ae29b1 | ||
|
|
6a78ad8ab6 | ||
|
|
c99d140651 | ||
|
|
ca0e5a75ec | ||
|
|
d5fad33599 | ||
|
|
ee3631e93e | ||
|
|
55d1d3d8ae | ||
|
|
1e95719436 | ||
|
|
706810bbce | ||
|
|
c7df4cf092 | ||
|
|
e59240fa00 | ||
|
|
222c4ea6f3 | ||
|
|
49bab574b9 | ||
|
|
5f76628665 | ||
|
|
32f2221b22 | ||
|
|
542f024356 | ||
|
|
a9672b0d52 | ||
|
|
f3b20d138e | ||
|
|
d24ccbd1e6 | ||
|
|
d45f25ce2c | ||
|
|
16159cc3d0 | ||
|
|
e0f63132e8 | ||
|
|
968f98706e | ||
|
|
d177e1324c | ||
|
|
d4c34c6b02 | ||
|
|
03ab152c82 | ||
|
|
1715a2070b | ||
|
|
ff84c01d41 | ||
|
|
850556d6c3 | ||
|
|
a611fb1664 | ||
|
|
06f3e8137a | ||
|
|
c366fa00d8 | ||
|
|
180689fb04 | ||
|
|
9912e0fc48 | ||
|
|
58b7905276 | ||
|
|
a6bcb515f9 | ||
|
|
fb1da53568 | ||
|
|
59393ab085 | ||
|
|
e6cd04d711 | ||
|
|
65a225da75 | ||
|
|
208f1a4a47 | ||
|
|
3de21d3fda | ||
|
|
574823fcbb | ||
|
|
a1477fa156 | ||
|
|
b8cc547fa3 | ||
|
|
d13b2ca6ef | ||
|
|
3bb5caabe2 | ||
|
|
c76a61ad16 | ||
|
|
ca17d4395a | ||
|
|
e8dfc326d3 | ||
|
|
3d75e1c299 | ||
|
|
5b4cc20ce4 | ||
|
|
a94a24f6f8 | ||
|
|
208ea6eae4 | ||
|
|
e581d41ded | ||
|
|
aa4a3d8b96 | ||
|
|
ef6b0b8e0b | ||
|
|
2733919cd8 | ||
|
|
7f76210549 | ||
|
|
a8b4467763 | ||
|
|
cfa03a408e | ||
|
|
94ab5dca7f | ||
|
|
207a050dba | ||
|
|
b1faad0a50 | ||
|
|
154b401d0a | ||
|
|
f84317e325 | ||
|
|
e0d534c3fb | ||
|
|
3880a70965 | ||
|
|
cd04661101 | ||
|
|
29b64d56be | ||
|
|
c812176e94 | ||
|
|
79d3f533a9 | ||
|
|
7455d950b1 | ||
|
|
a40c5bf70e | ||
|
|
0cf71d5bcb | ||
|
|
ff9a33ba36 | ||
|
|
b9d108284b | ||
|
|
07b5b68a51 | ||
|
|
a3c8439ce2 | ||
|
|
ec625f02fc | ||
|
|
1fe67fb1b0 | ||
|
|
a05031c22e | ||
|
|
ce05af2720 | ||
|
|
e90011fd88 | ||
|
|
5c4dc3a54f | ||
|
|
5506569c3a | ||
|
|
9c11602674 | ||
|
|
0e5aa5801a | ||
|
|
74cdf7c347 | ||
|
|
38ea43b678 | ||
|
|
3553d26f6b | ||
|
|
c2eec16721 | ||
|
|
6458abca2e | ||
|
|
acf5b04231 | ||
|
|
bada9b5e0b | ||
|
|
fee3468b7a | ||
|
|
e2d3c27e85 | ||
|
|
a24da611c5 | ||
|
|
ca143f8a35 | ||
|
|
47f60e6cf2 | ||
|
|
384a9625c9 | ||
|
|
fcccf133ba | ||
|
|
9e765fb05d | ||
|
|
c9671f8205 | ||
|
|
ec57db78b5 | ||
|
|
57ef8c271e | ||
|
|
495524ecc0 | ||
|
|
da807b20a0 | ||
|
|
198dc2b7a9 | ||
|
|
3f997aefc1 | ||
|
|
aec8ad2188 | ||
|
|
f19bbaec08 | ||
|
|
44c2a83105 | ||
|
|
47d24759f2 | ||
|
|
7429b9d87e | ||
|
|
25e1639050 | ||
|
|
3e2dae62c0 | ||
|
|
9e7d7354ed | ||
|
|
5f930debd4 | ||
|
|
74794102c8 | ||
|
|
c63a37d0ad | ||
|
|
d7b61f7ff6 | ||
|
|
632b2042e4 | ||
|
|
e20c2aa113 | ||
|
|
c9971673da | ||
|
|
511e35e8fd | ||
|
|
7151c4bcd7 |
743
.coveragerc
743
.coveragerc
@@ -10,484 +10,33 @@ omit =
|
||||
homeassistant/helpers/signal.py
|
||||
|
||||
# omit pieces of code that rely on external devices being present
|
||||
homeassistant/components/abode.py
|
||||
homeassistant/components/*/abode.py
|
||||
|
||||
homeassistant/components/ads/__init__.py
|
||||
homeassistant/components/*/ads.py
|
||||
|
||||
homeassistant/components/alarmdecoder.py
|
||||
homeassistant/components/*/alarmdecoder.py
|
||||
|
||||
homeassistant/components/ambient_station/__init__.py
|
||||
homeassistant/components/ambient_station/sensor.py
|
||||
|
||||
homeassistant/components/amcrest.py
|
||||
homeassistant/components/*/amcrest.py
|
||||
|
||||
homeassistant/components/apcupsd.py
|
||||
homeassistant/components/*/apcupsd.py
|
||||
|
||||
homeassistant/components/apple_tv.py
|
||||
homeassistant/components/*/apple_tv.py
|
||||
|
||||
homeassistant/components/aqualogic.py
|
||||
homeassistant/components/*/aqualogic.py
|
||||
|
||||
homeassistant/components/arduino.py
|
||||
homeassistant/components/*/arduino.py
|
||||
|
||||
homeassistant/components/bmw_connected_drive/*.py
|
||||
homeassistant/components/*/bmw_connected_drive.py
|
||||
|
||||
homeassistant/components/android_ip_webcam.py
|
||||
homeassistant/components/*/android_ip_webcam.py
|
||||
|
||||
homeassistant/components/arlo.py
|
||||
homeassistant/components/*/arlo.py
|
||||
|
||||
homeassistant/components/asterisk_mbox.py
|
||||
homeassistant/components/*/asterisk_mbox.py
|
||||
homeassistant/components/*/asterisk_cdr.py
|
||||
|
||||
homeassistant/components/august.py
|
||||
homeassistant/components/*/august.py
|
||||
|
||||
homeassistant/components/axis.py
|
||||
homeassistant/components/*/axis.py
|
||||
|
||||
homeassistant/components/bbb_gpio.py
|
||||
homeassistant/components/*/bbb_gpio.py
|
||||
|
||||
homeassistant/components/blink/*
|
||||
homeassistant/components/*/blink.py
|
||||
|
||||
homeassistant/components/bloomsky.py
|
||||
homeassistant/components/*/bloomsky.py
|
||||
|
||||
homeassistant/components/coinbase.py
|
||||
homeassistant/components/sensor/coinbase.py
|
||||
|
||||
homeassistant/components/cast/*
|
||||
homeassistant/components/*/cast.py
|
||||
|
||||
homeassistant/components/cloudflare.py
|
||||
|
||||
homeassistant/components/comfoconnect.py
|
||||
homeassistant/components/*/comfoconnect.py
|
||||
|
||||
homeassistant/components/daikin/__init__.py
|
||||
homeassistant/components/daikin/const.py
|
||||
homeassistant/components/*/daikin.py
|
||||
|
||||
homeassistant/components/digital_ocean.py
|
||||
homeassistant/components/*/digital_ocean.py
|
||||
|
||||
homeassistant/components/danfoss_air/*
|
||||
|
||||
homeassistant/components/dominos.py
|
||||
|
||||
homeassistant/components/doorbird.py
|
||||
homeassistant/components/*/doorbird.py
|
||||
|
||||
homeassistant/components/dovado/*
|
||||
|
||||
homeassistant/components/dweet.py
|
||||
homeassistant/components/*/dweet.py
|
||||
|
||||
homeassistant/components/eight_sleep.py
|
||||
homeassistant/components/*/eight_sleep.py
|
||||
|
||||
homeassistant/components/ecoal_boiler.py
|
||||
homeassistant/components/*/ecoal_boiler.py
|
||||
|
||||
homeassistant/components/ecobee.py
|
||||
homeassistant/components/*/ecobee.py
|
||||
|
||||
homeassistant/components/edp_redy.py
|
||||
homeassistant/components/*/edp_redy.py
|
||||
|
||||
homeassistant/components/egardia.py
|
||||
homeassistant/components/*/egardia.py
|
||||
|
||||
homeassistant/components/elkm1/*
|
||||
homeassistant/components/*/elkm1.py
|
||||
|
||||
homeassistant/components/enocean.py
|
||||
homeassistant/components/*/enocean.py
|
||||
|
||||
homeassistant/components/envisalink/__init__.py
|
||||
homeassistant/components/*/envisalink.py
|
||||
|
||||
homeassistant/components/evohome.py
|
||||
homeassistant/components/*/evohome.py
|
||||
|
||||
homeassistant/components/freebox.py
|
||||
homeassistant/components/*/freebox.py
|
||||
|
||||
homeassistant/components/fritzbox.py
|
||||
homeassistant/components/*/fritzbox.py
|
||||
|
||||
homeassistant/components/ecovacs.py
|
||||
homeassistant/components/*/ecovacs.py
|
||||
|
||||
homeassistant/components/esphome/__init__.py
|
||||
homeassistant/components/esphome/binary_sensor.py
|
||||
homeassistant/components/esphome/cover.py
|
||||
homeassistant/components/esphome/fan.py
|
||||
homeassistant/components/esphome/light.py
|
||||
homeassistant/components/esphome/sensor.py
|
||||
homeassistant/components/esphome/switch.py
|
||||
|
||||
homeassistant/components/eufy.py
|
||||
homeassistant/components/*/eufy.py
|
||||
|
||||
homeassistant/components/fibaro/__init__.py
|
||||
homeassistant/components/*/fibaro.py
|
||||
|
||||
homeassistant/components/gc100.py
|
||||
homeassistant/components/*/gc100.py
|
||||
|
||||
homeassistant/components/google.py
|
||||
homeassistant/components/*/google.py
|
||||
|
||||
homeassistant/components/greeneye_monitor.py
|
||||
homeassistant/components/sensor/greeneye_monitor.py
|
||||
|
||||
homeassistant/components/habitica/*
|
||||
homeassistant/components/*/habitica.py
|
||||
|
||||
homeassistant/components/hangouts/__init__.py
|
||||
homeassistant/components/hangouts/const.py
|
||||
homeassistant/components/hangouts/hangouts_bot.py
|
||||
homeassistant/components/hangouts/hangups_utils.py
|
||||
homeassistant/components/hangouts/intents.py
|
||||
homeassistant/components/*/hangouts.py
|
||||
|
||||
homeassistant/components/hdmi_cec.py
|
||||
homeassistant/components/*/hdmi_cec.py
|
||||
|
||||
homeassistant/components/hive.py
|
||||
homeassistant/components/*/hive.py
|
||||
|
||||
homeassistant/components/hlk_sw16.py
|
||||
homeassistant/components/*/hlk_sw16.py
|
||||
|
||||
homeassistant/components/homekit_controller/*
|
||||
|
||||
homeassistant/components/homematic/__init__.py
|
||||
homeassistant/components/*/homematic.py
|
||||
|
||||
homeassistant/components/homematicip_cloud/hap.py
|
||||
homeassistant/components/homematicip_cloud/device.py
|
||||
homeassistant/components/*/homematicip_cloud.py
|
||||
|
||||
homeassistant/components/homeworks.py
|
||||
homeassistant/components/*/homeworks.py
|
||||
|
||||
homeassistant/components/huawei_lte.py
|
||||
homeassistant/components/*/huawei_lte.py
|
||||
|
||||
homeassistant/components/hydrawise.py
|
||||
homeassistant/components/*/hydrawise.py
|
||||
|
||||
homeassistant/components/ihc/*
|
||||
homeassistant/components/*/ihc.py
|
||||
|
||||
homeassistant/components/insteon/*
|
||||
homeassistant/components/*/insteon.py
|
||||
|
||||
homeassistant/components/insteon_local.py
|
||||
|
||||
homeassistant/components/insteon_plm.py
|
||||
|
||||
homeassistant/components/ios.py
|
||||
homeassistant/components/*/ios.py
|
||||
|
||||
homeassistant/components/iota.py
|
||||
homeassistant/components/*/iota.py
|
||||
|
||||
homeassistant/components/isy994.py
|
||||
homeassistant/components/*/isy994.py
|
||||
|
||||
homeassistant/components/joaoapps_join.py
|
||||
homeassistant/components/*/joaoapps_join.py
|
||||
|
||||
homeassistant/components/juicenet.py
|
||||
homeassistant/components/*/juicenet.py
|
||||
|
||||
homeassistant/components/kira.py
|
||||
homeassistant/components/*/kira.py
|
||||
|
||||
homeassistant/components/knx.py
|
||||
homeassistant/components/*/knx.py
|
||||
|
||||
homeassistant/components/konnected.py
|
||||
homeassistant/components/*/konnected.py
|
||||
|
||||
homeassistant/components/lametric.py
|
||||
homeassistant/components/*/lametric.py
|
||||
|
||||
homeassistant/components/lcn.py
|
||||
homeassistant/components/*/lcn.py
|
||||
|
||||
homeassistant/components/linode.py
|
||||
homeassistant/components/*/linode.py
|
||||
|
||||
homeassistant/components/lightwave.py
|
||||
homeassistant/components/*/lightwave.py
|
||||
|
||||
homeassistant/components/logi_circle.py
|
||||
homeassistant/components/*/logi_circle.py
|
||||
|
||||
homeassistant/components/lupusec.py
|
||||
homeassistant/components/*/lupusec.py
|
||||
|
||||
homeassistant/components/lutron.py
|
||||
homeassistant/components/*/lutron.py
|
||||
|
||||
homeassistant/components/lutron_caseta.py
|
||||
homeassistant/components/*/lutron_caseta.py
|
||||
|
||||
homeassistant/components/mailgun/notify.py
|
||||
|
||||
homeassistant/components/matrix.py
|
||||
homeassistant/components/*/matrix.py
|
||||
|
||||
homeassistant/components/maxcube.py
|
||||
homeassistant/components/*/maxcube.py
|
||||
|
||||
homeassistant/components/mochad.py
|
||||
homeassistant/components/*/mochad.py
|
||||
|
||||
homeassistant/components/modbus.py
|
||||
homeassistant/components/*/modbus.py
|
||||
|
||||
homeassistant/components/mychevy.py
|
||||
homeassistant/components/*/mychevy.py
|
||||
|
||||
homeassistant/components/mysensors/*
|
||||
homeassistant/components/*/mysensors.py
|
||||
|
||||
homeassistant/components/neato.py
|
||||
homeassistant/components/*/neato.py
|
||||
|
||||
homeassistant/components/nest/__init__.py
|
||||
homeassistant/components/*/nest.py
|
||||
|
||||
homeassistant/components/netatmo.py
|
||||
homeassistant/components/*/netatmo.py
|
||||
|
||||
homeassistant/components/netgear_lte.py
|
||||
homeassistant/components/*/netgear_lte.py
|
||||
|
||||
homeassistant/components/octoprint.py
|
||||
homeassistant/components/*/octoprint.py
|
||||
|
||||
homeassistant/components/opencv.py
|
||||
homeassistant/components/*/opencv.py
|
||||
|
||||
homeassistant/components/opentherm_gw/*
|
||||
homeassistant/components/*/opentherm_gw.py
|
||||
|
||||
homeassistant/components/openuv/__init__.py
|
||||
homeassistant/components/openuv/binary_sensor.py
|
||||
homeassistant/components/openuv/sensor.py
|
||||
|
||||
homeassistant/components/plum_lightpad.py
|
||||
homeassistant/components/*/plum_lightpad.py
|
||||
|
||||
homeassistant/components/pilight.py
|
||||
homeassistant/components/*/pilight.py
|
||||
|
||||
homeassistant/components/point/__init__.py
|
||||
homeassistant/components/point/const.py
|
||||
homeassistant/components/*/point.py
|
||||
|
||||
homeassistant/components/switch/qwikswitch.py
|
||||
homeassistant/components/light/qwikswitch.py
|
||||
|
||||
homeassistant/components/rachio.py
|
||||
homeassistant/components/*/rachio.py
|
||||
|
||||
homeassistant/components/raincloud.py
|
||||
homeassistant/components/*/raincloud.py
|
||||
|
||||
homeassistant/components/rainmachine/__init__.py
|
||||
homeassistant/components/rainmachine/binary_sensor.py
|
||||
homeassistant/components/rainmachine/sensor.py
|
||||
homeassistant/components/rainmachine/switch.py
|
||||
|
||||
homeassistant/components/raspihats.py
|
||||
homeassistant/components/*/raspihats.py
|
||||
|
||||
homeassistant/components/*/raspyrfm.py
|
||||
|
||||
homeassistant/components/rfxtrx.py
|
||||
homeassistant/components/*/rfxtrx.py
|
||||
|
||||
homeassistant/components/roku.py
|
||||
homeassistant/components/*/roku.py
|
||||
|
||||
homeassistant/components/rpi_gpio.py
|
||||
homeassistant/components/*/rpi_gpio.py
|
||||
|
||||
homeassistant/components/rpi_pfio.py
|
||||
homeassistant/components/*/rpi_pfio.py
|
||||
|
||||
homeassistant/components/sabnzbd.py
|
||||
homeassistant/components/*/sabnzbd.py
|
||||
|
||||
homeassistant/components/satel_integra.py
|
||||
homeassistant/components/*/satel_integra.py
|
||||
|
||||
homeassistant/components/scsgate.py
|
||||
homeassistant/components/*/scsgate.py
|
||||
|
||||
homeassistant/components/sense.py
|
||||
homeassistant/components/*/sense.py
|
||||
|
||||
homeassistant/components/simplisafe/__init__.py
|
||||
homeassistant/components/simplisafe/alarm_control_panel.py
|
||||
|
||||
homeassistant/components/sisyphus.py
|
||||
homeassistant/components/*/sisyphus.py
|
||||
|
||||
homeassistant/components/skybell.py
|
||||
homeassistant/components/*/skybell.py
|
||||
|
||||
homeassistant/components/smappee.py
|
||||
homeassistant/components/*/smappee.py
|
||||
|
||||
homeassistant/components/sonos/__init__.py
|
||||
homeassistant/components/*/sonos.py
|
||||
|
||||
homeassistant/components/tado.py
|
||||
homeassistant/components/*/tado.py
|
||||
|
||||
homeassistant/components/tahoma.py
|
||||
homeassistant/components/*/tahoma.py
|
||||
|
||||
homeassistant/components/tellduslive/__init__.py
|
||||
homeassistant/components/tellduslive/entry.py
|
||||
homeassistant/components/*/tellduslive.py
|
||||
|
||||
homeassistant/components/tellstick.py
|
||||
homeassistant/components/*/tellstick.py
|
||||
|
||||
homeassistant/components/tesla.py
|
||||
homeassistant/components/*/tesla.py
|
||||
|
||||
homeassistant/components/thethingsnetwork.py
|
||||
homeassistant/components/*/thethingsnetwork.py
|
||||
|
||||
homeassistant/components/*/thinkingcleaner.py
|
||||
|
||||
homeassistant/components/tibber/*
|
||||
homeassistant/components/*/tibber.py
|
||||
|
||||
homeassistant/components/toon.py
|
||||
homeassistant/components/*/toon.py
|
||||
|
||||
homeassistant/components/tplink_lte.py
|
||||
homeassistant/components/*/tplink_lte.py
|
||||
|
||||
homeassistant/components/tradfri.py
|
||||
homeassistant/components/*/tradfri.py
|
||||
|
||||
homeassistant/components/transmission.py
|
||||
homeassistant/components/*/transmission.py
|
||||
|
||||
homeassistant/components/notify/twilio_sms.py
|
||||
homeassistant/components/notify/twilio_call.py
|
||||
|
||||
homeassistant/components/upcloud.py
|
||||
homeassistant/components/*/upcloud.py
|
||||
|
||||
homeassistant/components/usps.py
|
||||
homeassistant/components/*/usps.py
|
||||
|
||||
homeassistant/components/velbus.py
|
||||
homeassistant/components/*/velbus.py
|
||||
|
||||
homeassistant/components/velux.py
|
||||
homeassistant/components/*/velux.py
|
||||
|
||||
homeassistant/components/vera.py
|
||||
homeassistant/components/*/vera.py
|
||||
|
||||
homeassistant/components/verisure.py
|
||||
homeassistant/components/*/verisure.py
|
||||
|
||||
homeassistant/components/volvooncall.py
|
||||
homeassistant/components/*/volvooncall.py
|
||||
|
||||
homeassistant/components/waterfurnace.py
|
||||
homeassistant/components/*/waterfurnace.py
|
||||
|
||||
homeassistant/components/*/webostv.py
|
||||
|
||||
homeassistant/components/w800rf32.py
|
||||
homeassistant/components/*/w800rf32.py
|
||||
|
||||
homeassistant/components/wemo.py
|
||||
homeassistant/components/*/wemo.py
|
||||
|
||||
homeassistant/components/wink/*
|
||||
homeassistant/components/*/wink.py
|
||||
|
||||
homeassistant/components/wirelesstag.py
|
||||
homeassistant/components/*/wirelesstag.py
|
||||
|
||||
homeassistant/components/xiaomi_aqara.py
|
||||
homeassistant/components/*/xiaomi_aqara.py
|
||||
|
||||
homeassistant/components/*/xiaomi_miio.py
|
||||
|
||||
homeassistant/components/zabbix.py
|
||||
homeassistant/components/*/zabbix.py
|
||||
|
||||
homeassistant/components/zha/__init__.py
|
||||
homeassistant/components/zha/binary_sensor.py
|
||||
homeassistant/components/zha/const.py
|
||||
homeassistant/components/zha/event.py
|
||||
homeassistant/components/zha/fan.py
|
||||
homeassistant/components/zha/light.py
|
||||
homeassistant/components/zha/sensor.py
|
||||
homeassistant/components/zha/switch.py
|
||||
homeassistant/components/zha/api.py
|
||||
homeassistant/components/zha/entity.py
|
||||
homeassistant/components/zha/device_entity.py
|
||||
homeassistant/components/zha/core/helpers.py
|
||||
homeassistant/components/zha/core/const.py
|
||||
homeassistant/components/zha/core/device.py
|
||||
homeassistant/components/zha/core/listeners.py
|
||||
homeassistant/components/zha/core/gateway.py
|
||||
homeassistant/components/*/zha.py
|
||||
|
||||
homeassistant/components/zigbee.py
|
||||
homeassistant/components/*/zigbee.py
|
||||
|
||||
homeassistant/components/zoneminder/*
|
||||
|
||||
homeassistant/components/tuya.py
|
||||
homeassistant/components/*/tuya.py
|
||||
|
||||
homeassistant/components/spider.py
|
||||
homeassistant/components/*/spider.py
|
||||
|
||||
homeassistant/components/air_quality/opensensemap.py
|
||||
homeassistant/components/abode/*
|
||||
homeassistant/components/ads/*
|
||||
homeassistant/components/air_quality/nilu.py
|
||||
homeassistant/components/air_quality/norway_air.py
|
||||
homeassistant/components/air_quality/opensensemap.py
|
||||
homeassistant/components/alarm_control_panel/alarmdotcom.py
|
||||
homeassistant/components/alarm_control_panel/canary.py
|
||||
homeassistant/components/alarm_control_panel/concord232.py
|
||||
homeassistant/components/alarm_control_panel/ialarm.py
|
||||
homeassistant/components/alarm_control_panel/ifttt.py
|
||||
homeassistant/components/alarm_control_panel/manual_mqtt.py
|
||||
homeassistant/components/alarm_control_panel/nx584.py
|
||||
homeassistant/components/alarm_control_panel/totalconnect.py
|
||||
homeassistant/components/alarm_control_panel/yale_smart_alarm.py
|
||||
homeassistant/components/apiai.py
|
||||
homeassistant/components/alarmdecoder/*
|
||||
homeassistant/components/ambient_station/*
|
||||
homeassistant/components/amcrest/*
|
||||
homeassistant/components/android_ip_webcam/*
|
||||
homeassistant/components/apcupsd/*
|
||||
homeassistant/components/apiai/*
|
||||
homeassistant/components/apple_tv/*
|
||||
homeassistant/components/aqualogic/*
|
||||
homeassistant/components/arduino/*
|
||||
homeassistant/components/arlo/*
|
||||
homeassistant/components/asterisk_mbox/*
|
||||
homeassistant/components/august/*
|
||||
homeassistant/components/axis/*
|
||||
homeassistant/components/bbb_gpio/*
|
||||
homeassistant/components/binary_sensor/arest.py
|
||||
homeassistant/components/binary_sensor/concord232.py
|
||||
homeassistant/components/binary_sensor/flic.py
|
||||
@@ -498,7 +47,10 @@ omit =
|
||||
homeassistant/components/binary_sensor/rest.py
|
||||
homeassistant/components/binary_sensor/tapsaff.py
|
||||
homeassistant/components/binary_sensor/uptimerobot.py
|
||||
homeassistant/components/browser.py
|
||||
homeassistant/components/blink/*
|
||||
homeassistant/components/bloomsky/*
|
||||
homeassistant/components/bmw_connected_drive/*
|
||||
homeassistant/components/browser/*
|
||||
homeassistant/components/calendar/caldav.py
|
||||
homeassistant/components/calendar/todoist.py
|
||||
homeassistant/components/camera/bloomsky.py
|
||||
@@ -515,6 +67,8 @@ omit =
|
||||
homeassistant/components/camera/xeoma.py
|
||||
homeassistant/components/camera/xiaomi.py
|
||||
homeassistant/components/camera/yi.py
|
||||
homeassistant/components/cast/*
|
||||
homeassistant/components/climate/coolmaster.py
|
||||
homeassistant/components/climate/ephember.py
|
||||
homeassistant/components/climate/eq3btsmart.py
|
||||
homeassistant/components/climate/flexit.py
|
||||
@@ -530,6 +84,9 @@ omit =
|
||||
homeassistant/components/climate/touchline.py
|
||||
homeassistant/components/climate/venstar.py
|
||||
homeassistant/components/climate/zhong_hong.py
|
||||
homeassistant/components/cloudflare/*
|
||||
homeassistant/components/coinbase/*
|
||||
homeassistant/components/comfoconnect/*
|
||||
homeassistant/components/cover/aladdin_connect.py
|
||||
homeassistant/components/cover/brunt.py
|
||||
homeassistant/components/cover/garadget.py
|
||||
@@ -540,6 +97,8 @@ omit =
|
||||
homeassistant/components/cover/opengarage.py
|
||||
homeassistant/components/cover/rpi_gpio.py
|
||||
homeassistant/components/cover/scsgate.py
|
||||
homeassistant/components/daikin/*
|
||||
homeassistant/components/danfoss_air/*
|
||||
homeassistant/components/device_tracker/actiontec.py
|
||||
homeassistant/components/device_tracker/aruba.py
|
||||
homeassistant/components/device_tracker/asuswrt.py
|
||||
@@ -553,7 +112,6 @@ omit =
|
||||
homeassistant/components/device_tracker/ddwrt.py
|
||||
homeassistant/components/device_tracker/fritz.py
|
||||
homeassistant/components/device_tracker/google_maps.py
|
||||
homeassistant/components/device_tracker/googlehome.py
|
||||
homeassistant/components/device_tracker/hitron_coda.py
|
||||
homeassistant/components/device_tracker/huawei_router.py
|
||||
homeassistant/components/device_tracker/icloud.py
|
||||
@@ -578,24 +136,87 @@ omit =
|
||||
homeassistant/components/device_tracker/tplink.py
|
||||
homeassistant/components/device_tracker/traccar.py
|
||||
homeassistant/components/device_tracker/trackr.py
|
||||
homeassistant/components/device_tracker/ubee.py
|
||||
homeassistant/components/device_tracker/ubus.py
|
||||
homeassistant/components/downloader.py
|
||||
homeassistant/components/emoncms_history.py
|
||||
homeassistant/components/digital_ocean/*
|
||||
homeassistant/components/dominos/*
|
||||
homeassistant/components/doorbird/*
|
||||
homeassistant/components/dovado/*
|
||||
homeassistant/components/downloader/*
|
||||
homeassistant/components/dweet/*
|
||||
homeassistant/components/ebusd/*
|
||||
homeassistant/components/ecoal_boiler/*
|
||||
homeassistant/components/ecobee/*
|
||||
homeassistant/components/ecovacs/*
|
||||
homeassistant/components/edp_redy/*
|
||||
homeassistant/components/egardia/*
|
||||
homeassistant/components/eight_sleep/*
|
||||
homeassistant/components/elkm1/*
|
||||
homeassistant/components/emoncms_history/*
|
||||
homeassistant/components/emulated_hue/upnp.py
|
||||
homeassistant/components/fan/mqtt.py
|
||||
homeassistant/components/enocean/*
|
||||
homeassistant/components/envisalink/*
|
||||
homeassistant/components/esphome/__init__.py
|
||||
homeassistant/components/esphome/binary_sensor.py
|
||||
homeassistant/components/esphome/cover.py
|
||||
homeassistant/components/esphome/fan.py
|
||||
homeassistant/components/esphome/light.py
|
||||
homeassistant/components/esphome/sensor.py
|
||||
homeassistant/components/esphome/switch.py
|
||||
homeassistant/components/eufy/*
|
||||
homeassistant/components/evohome/*
|
||||
homeassistant/components/fan/wemo.py
|
||||
homeassistant/components/folder_watcher.py
|
||||
homeassistant/components/foursquare.py
|
||||
homeassistant/components/goalfeed.py
|
||||
homeassistant/components/idteck_prox.py
|
||||
homeassistant/components/ifttt.py
|
||||
homeassistant/components/fastdotcom/*
|
||||
homeassistant/components/fibaro/*
|
||||
homeassistant/components/folder_watcher/*
|
||||
homeassistant/components/foursquare/*
|
||||
homeassistant/components/freebox/*
|
||||
homeassistant/components/fritzbox/*
|
||||
homeassistant/components/gc100/*
|
||||
homeassistant/components/goalfeed/*
|
||||
homeassistant/components/google/*
|
||||
homeassistant/components/googlehome/*
|
||||
homeassistant/components/greeneye_monitor/*
|
||||
homeassistant/components/habitica/*
|
||||
homeassistant/components/hangouts/__init__.py
|
||||
homeassistant/components/hangouts/*
|
||||
homeassistant/components/hangouts/const.py
|
||||
homeassistant/components/hangouts/hangouts_bot.py
|
||||
homeassistant/components/hangouts/hangups_utils.py
|
||||
homeassistant/components/hdmi_cec/*
|
||||
homeassistant/components/hive/*
|
||||
homeassistant/components/hlk_sw16/*
|
||||
homeassistant/components/homekit_controller/*
|
||||
homeassistant/components/homematic/*
|
||||
homeassistant/components/homematicip_cloud/*
|
||||
homeassistant/components/homeworks/*
|
||||
homeassistant/components/huawei_lte/*
|
||||
homeassistant/components/hydrawise/*
|
||||
homeassistant/components/idteck_prox/*
|
||||
homeassistant/components/ifttt/*
|
||||
homeassistant/components/ihc/*
|
||||
homeassistant/components/image_processing/dlib_face_detect.py
|
||||
homeassistant/components/image_processing/dlib_face_identify.py
|
||||
homeassistant/components/image_processing/qrcode.py
|
||||
homeassistant/components/image_processing/seven_segments.py
|
||||
homeassistant/components/image_processing/tensorflow.py
|
||||
homeassistant/components/image_processing/qrcode.py
|
||||
homeassistant/components/keyboard_remote.py
|
||||
homeassistant/components/keyboard.py
|
||||
homeassistant/components/insteon_local/*
|
||||
homeassistant/components/insteon_plm/*
|
||||
homeassistant/components/insteon/*
|
||||
homeassistant/components/ios/*
|
||||
homeassistant/components/iota/*
|
||||
homeassistant/components/iperf3/*
|
||||
homeassistant/components/isy994/*
|
||||
homeassistant/components/joaoapps_join/*
|
||||
homeassistant/components/juicenet/*
|
||||
homeassistant/components/keyboard_remote/*
|
||||
homeassistant/components/keyboard/*
|
||||
homeassistant/components/kira/*
|
||||
homeassistant/components/knx/*
|
||||
homeassistant/components/konnected/*
|
||||
homeassistant/components/lametric/*
|
||||
homeassistant/components/lcn/*
|
||||
homeassistant/components/lifx/*
|
||||
homeassistant/components/light/avion.py
|
||||
homeassistant/components/light/blinksticklight.py
|
||||
homeassistant/components/light/blinkt.py
|
||||
@@ -609,7 +230,6 @@ omit =
|
||||
homeassistant/components/light/hyperion.py
|
||||
homeassistant/components/light/iglo.py
|
||||
homeassistant/components/light/lifx_legacy.py
|
||||
homeassistant/components/light/lifx.py
|
||||
homeassistant/components/light/limitlessled.py
|
||||
homeassistant/components/light/lw12wifi.py
|
||||
homeassistant/components/light/mystrom.py
|
||||
@@ -627,14 +247,25 @@ omit =
|
||||
homeassistant/components/light/yeelight.py
|
||||
homeassistant/components/light/yeelightsunflower.py
|
||||
homeassistant/components/light/zengge.py
|
||||
homeassistant/components/lirc.py
|
||||
homeassistant/components/lightwave/*
|
||||
homeassistant/components/linode/*
|
||||
homeassistant/components/lirc/*
|
||||
homeassistant/components/lock/kiwi.py
|
||||
homeassistant/components/lock/lockitron.py
|
||||
homeassistant/components/lock/nello.py
|
||||
homeassistant/components/lock/nuki.py
|
||||
homeassistant/components/lock/sesame.py
|
||||
homeassistant/components/map.py
|
||||
homeassistant/components/media_extractor.py
|
||||
homeassistant/components/logi_circle/*
|
||||
homeassistant/components/luftdaten/*
|
||||
homeassistant/components/lupusec/*
|
||||
homeassistant/components/lutron_caseta/*
|
||||
homeassistant/components/lutron/*
|
||||
homeassistant/components/mailbox/asterisk_cdr.py
|
||||
homeassistant/components/mailgun/notify.py
|
||||
homeassistant/components/map/*
|
||||
homeassistant/components/matrix/*
|
||||
homeassistant/components/maxcube/*
|
||||
homeassistant/components/media_extractor/*
|
||||
homeassistant/components/media_player/anthemav.py
|
||||
homeassistant/components/media_player/aquostv.py
|
||||
homeassistant/components/media_player/bluesound.py
|
||||
@@ -688,14 +319,25 @@ omit =
|
||||
homeassistant/components/media_player/yamaha_musiccast.py
|
||||
homeassistant/components/media_player/yamaha.py
|
||||
homeassistant/components/media_player/ziggo_mediabox_xl.py
|
||||
homeassistant/components/mycroft.py
|
||||
homeassistant/components/meteo_france/*
|
||||
homeassistant/components/mobile_app/*
|
||||
homeassistant/components/mochad/*
|
||||
homeassistant/components/modbus/*
|
||||
homeassistant/components/mychevy/*
|
||||
homeassistant/components/mycroft/*
|
||||
homeassistant/components/mysensors/*
|
||||
homeassistant/components/neato/*
|
||||
homeassistant/components/nest/*
|
||||
homeassistant/components/netatmo/*
|
||||
homeassistant/components/netgear_lte/*
|
||||
homeassistant/components/nissan_leaf/*
|
||||
homeassistant/components/notify/aws_lambda.py
|
||||
homeassistant/components/notify/aws_sns.py
|
||||
homeassistant/components/notify/aws_sqs.py
|
||||
homeassistant/components/notify/ciscospark.py
|
||||
homeassistant/components/notify/clickatell.py
|
||||
homeassistant/components/notify/clicksend.py
|
||||
homeassistant/components/notify/clicksend_tts.py
|
||||
homeassistant/components/notify/clicksend.py
|
||||
homeassistant/components/notify/discord.py
|
||||
homeassistant/components/notify/flock.py
|
||||
homeassistant/components/notify/free_mobile.py
|
||||
@@ -726,17 +368,49 @@ omit =
|
||||
homeassistant/components/notify/syslog.py
|
||||
homeassistant/components/notify/telegram.py
|
||||
homeassistant/components/notify/telstra.py
|
||||
homeassistant/components/notify/twilio_call.py
|
||||
homeassistant/components/notify/twilio_sms.py
|
||||
homeassistant/components/notify/twitter.py
|
||||
homeassistant/components/notify/xmpp.py
|
||||
homeassistant/components/nuimo_controller.py
|
||||
homeassistant/components/prometheus.py
|
||||
homeassistant/components/rainbird.py
|
||||
homeassistant/components/nuimo_controller/*
|
||||
homeassistant/components/octoprint/*
|
||||
homeassistant/components/opencv/*
|
||||
homeassistant/components/opentherm_gw/*
|
||||
homeassistant/components/openuv/__init__.py
|
||||
homeassistant/components/openuv/binary_sensor.py
|
||||
homeassistant/components/openuv/sensor.py
|
||||
homeassistant/components/owlet/*
|
||||
homeassistant/components/pilight/*
|
||||
homeassistant/components/plum_lightpad/*
|
||||
homeassistant/components/point/*
|
||||
homeassistant/components/prometheus/*
|
||||
homeassistant/components/ps4/__init__.py
|
||||
homeassistant/components/ps4/media_player.py
|
||||
homeassistant/components/qwikswitch/*
|
||||
homeassistant/components/rachio/*
|
||||
homeassistant/components/rainbird/*
|
||||
homeassistant/components/raincloud/*
|
||||
homeassistant/components/rainmachine/__init__.py
|
||||
homeassistant/components/rainmachine/binary_sensor.py
|
||||
homeassistant/components/rainmachine/sensor.py
|
||||
homeassistant/components/rainmachine/switch.py
|
||||
homeassistant/components/raspihats/*
|
||||
homeassistant/components/raspyrfm/*
|
||||
homeassistant/components/reddit/*
|
||||
homeassistant/components/remember_the_milk/__init__.py
|
||||
homeassistant/components/remote/harmony.py
|
||||
homeassistant/components/remote/itach.py
|
||||
homeassistant/components/route53.py
|
||||
homeassistant/components/rfxtrx/*
|
||||
homeassistant/components/roku/*
|
||||
homeassistant/components/route53/*
|
||||
homeassistant/components/rpi_gpio/*
|
||||
homeassistant/components/rpi_pfio/*
|
||||
homeassistant/components/sabnzbd/*
|
||||
homeassistant/components/satel_integra/*
|
||||
homeassistant/components/scene/hunterdouglas_powerview.py
|
||||
homeassistant/components/scene/lifx_cloud.py
|
||||
homeassistant/components/scsgate/*
|
||||
homeassistant/components/sense/*
|
||||
homeassistant/components/sensor/aftership.py
|
||||
homeassistant/components/sensor/airvisual.py
|
||||
homeassistant/components/sensor/alpha_vantage.py
|
||||
@@ -754,6 +428,7 @@ omit =
|
||||
homeassistant/components/sensor/buienradar.py
|
||||
homeassistant/components/sensor/cert_expiry.py
|
||||
homeassistant/components/sensor/citybikes.py
|
||||
homeassistant/components/sensor/coinbase.py
|
||||
homeassistant/components/sensor/comed_hourly_pricing.py
|
||||
homeassistant/components/sensor/cpuspeed.py
|
||||
homeassistant/components/sensor/crimereports.py
|
||||
@@ -776,7 +451,6 @@ omit =
|
||||
homeassistant/components/sensor/enphase_envoy.py
|
||||
homeassistant/components/sensor/envirophat.py
|
||||
homeassistant/components/sensor/etherscan.py
|
||||
homeassistant/components/sensor/fastdotcom.py
|
||||
homeassistant/components/sensor/fedex.py
|
||||
homeassistant/components/sensor/filesize.py
|
||||
homeassistant/components/sensor/fints.py
|
||||
@@ -789,22 +463,22 @@ omit =
|
||||
homeassistant/components/sensor/fritzbox_netmonitor.py
|
||||
homeassistant/components/sensor/gearbest.py
|
||||
homeassistant/components/sensor/geizhals.py
|
||||
homeassistant/components/sensor/github.py
|
||||
homeassistant/components/sensor/gitlab_ci.py
|
||||
homeassistant/components/sensor/gitter.py
|
||||
homeassistant/components/sensor/glances.py
|
||||
homeassistant/components/sensor/google_travel_time.py
|
||||
homeassistant/components/sensor/gpsd.py
|
||||
homeassistant/components/sensor/greeneye_monitor.py
|
||||
homeassistant/components/sensor/gtfs.py
|
||||
homeassistant/components/sensor/gtt.py
|
||||
homeassistant/components/sensor/haveibeenpwned.py
|
||||
homeassistant/components/sensor/hp_ilo.py
|
||||
homeassistant/components/sensor/htu21d.py
|
||||
homeassistant/components/sensor/upnp.py
|
||||
homeassistant/components/sensor/iliad_italy.py
|
||||
homeassistant/components/sensor/imap_email_content.py
|
||||
homeassistant/components/sensor/imap.py
|
||||
homeassistant/components/sensor/influxdb.py
|
||||
homeassistant/components/sensor/iperf3.py
|
||||
homeassistant/components/sensor/irish_rail_transport.py
|
||||
homeassistant/components/sensor/kwb.py
|
||||
homeassistant/components/sensor/lacrosse.py
|
||||
@@ -814,10 +488,8 @@ omit =
|
||||
homeassistant/components/sensor/linux_battery.py
|
||||
homeassistant/components/sensor/london_underground.py
|
||||
homeassistant/components/sensor/loopenergy.py
|
||||
homeassistant/components/sensor/luftdaten.py
|
||||
homeassistant/components/sensor/lyft.py
|
||||
homeassistant/components/sensor/magicseaweed.py
|
||||
homeassistant/components/sensor/meteo_france.py
|
||||
homeassistant/components/sensor/metoffice.py
|
||||
homeassistant/components/sensor/miflora.py
|
||||
homeassistant/components/sensor/mitemp_bt.py
|
||||
@@ -827,8 +499,8 @@ omit =
|
||||
homeassistant/components/sensor/mvglive.py
|
||||
homeassistant/components/sensor/nederlandse_spoorwegen.py
|
||||
homeassistant/components/sensor/netatmo_public.py
|
||||
homeassistant/components/sensor/netdata.py
|
||||
homeassistant/components/sensor/netdata_public.py
|
||||
homeassistant/components/sensor/netdata.py
|
||||
homeassistant/components/sensor/neurio_energy.py
|
||||
homeassistant/components/sensor/nmbs.py
|
||||
homeassistant/components/sensor/noaa_tides.py
|
||||
@@ -856,6 +528,7 @@ omit =
|
||||
homeassistant/components/sensor/radarr.py
|
||||
homeassistant/components/sensor/rainbird.py
|
||||
homeassistant/components/sensor/recollect_waste.py
|
||||
homeassistant/components/sensor/rejseplanen.py
|
||||
homeassistant/components/sensor/ripple.py
|
||||
homeassistant/components/sensor/rova.py
|
||||
homeassistant/components/sensor/rtorrent.py
|
||||
@@ -865,8 +538,8 @@ omit =
|
||||
homeassistant/components/sensor/serial_pm.py
|
||||
homeassistant/components/sensor/serial.py
|
||||
homeassistant/components/sensor/seventeentrack.py
|
||||
homeassistant/components/sensor/sht31.py
|
||||
homeassistant/components/sensor/shodan.py
|
||||
homeassistant/components/sensor/sht31.py
|
||||
homeassistant/components/sensor/sigfox.py
|
||||
homeassistant/components/sensor/simulated.py
|
||||
homeassistant/components/sensor/skybeacon.py
|
||||
@@ -876,8 +549,8 @@ omit =
|
||||
homeassistant/components/sensor/socialblade.py
|
||||
homeassistant/components/sensor/solaredge.py
|
||||
homeassistant/components/sensor/sonarr.py
|
||||
homeassistant/components/sensor/speedtest.py
|
||||
homeassistant/components/sensor/spotcrime.py
|
||||
homeassistant/components/sensor/srp_energy.py
|
||||
homeassistant/components/sensor/starlingbank.py
|
||||
homeassistant/components/sensor/steam_online.py
|
||||
homeassistant/components/sensor/supervisord.py
|
||||
@@ -885,7 +558,6 @@ omit =
|
||||
homeassistant/components/sensor/swiss_public_transport.py
|
||||
homeassistant/components/sensor/syncthru.py
|
||||
homeassistant/components/sensor/synologydsm.py
|
||||
homeassistant/components/sensor/srp_energy.py
|
||||
homeassistant/components/sensor/systemmonitor.py
|
||||
homeassistant/components/sensor/sytadin.py
|
||||
homeassistant/components/sensor/tank_utility.py
|
||||
@@ -912,8 +584,16 @@ omit =
|
||||
homeassistant/components/sensor/xbox_live.py
|
||||
homeassistant/components/sensor/zamg.py
|
||||
homeassistant/components/sensor/zestimate.py
|
||||
homeassistant/components/shiftr.py
|
||||
homeassistant/components/spc.py
|
||||
homeassistant/components/shiftr/*
|
||||
homeassistant/components/simplisafe/__init__.py
|
||||
homeassistant/components/simplisafe/alarm_control_panel.py
|
||||
homeassistant/components/sisyphus/*
|
||||
homeassistant/components/skybell/*
|
||||
homeassistant/components/smappee/*
|
||||
homeassistant/components/sonos/*
|
||||
homeassistant/components/spc/*
|
||||
homeassistant/components/speedtestdotnet/*
|
||||
homeassistant/components/spider/*
|
||||
homeassistant/components/switch/acer_projector.py
|
||||
homeassistant/components/switch/anel_pwrctrl.py
|
||||
homeassistant/components/switch/arest.py
|
||||
@@ -932,25 +612,48 @@ omit =
|
||||
homeassistant/components/switch/pencom.py
|
||||
homeassistant/components/switch/pulseaudio_loopback.py
|
||||
homeassistant/components/switch/rainbird.py
|
||||
homeassistant/components/switch/rest.py
|
||||
homeassistant/components/switch/recswitch.py
|
||||
homeassistant/components/switch/rest.py
|
||||
homeassistant/components/switch/rpi_rf.py
|
||||
homeassistant/components/switch/snmp.py
|
||||
homeassistant/components/switch/sony_projector.py
|
||||
homeassistant/components/switch/switchbot.py
|
||||
homeassistant/components/switch/switchmate.py
|
||||
homeassistant/components/switch/telnet.py
|
||||
homeassistant/components/switch/tplink.py
|
||||
homeassistant/components/switch/vesync.py
|
||||
homeassistant/components/tado/*
|
||||
homeassistant/components/tahoma/*
|
||||
homeassistant/components/telegram_bot/*
|
||||
homeassistant/components/thingspeak.py
|
||||
homeassistant/components/tellduslive/*
|
||||
homeassistant/components/tellstick/*
|
||||
homeassistant/components/tesla/*
|
||||
homeassistant/components/thethingsnetwork/*
|
||||
homeassistant/components/thingspeak/*
|
||||
homeassistant/components/thinkingcleaner/*
|
||||
homeassistant/components/tibber/*
|
||||
homeassistant/components/toon/*
|
||||
homeassistant/components/tplink_lte/*
|
||||
homeassistant/components/tradfri/*
|
||||
homeassistant/components/transmission/*
|
||||
homeassistant/components/tts/amazon_polly.py
|
||||
homeassistant/components/tts/baidu.py
|
||||
homeassistant/components/tts/microsoft.py
|
||||
homeassistant/components/tts/picotts.py
|
||||
homeassistant/components/vacuum/mqtt.py
|
||||
homeassistant/components/tuya/*
|
||||
homeassistant/components/upcloud/*
|
||||
homeassistant/components/upnp/*
|
||||
homeassistant/components/usps/*
|
||||
homeassistant/components/vacuum/roomba.py
|
||||
homeassistant/components/velbus/*
|
||||
homeassistant/components/velux/*
|
||||
homeassistant/components/vera/*
|
||||
homeassistant/components/verisure/*
|
||||
homeassistant/components/volvooncall/*
|
||||
homeassistant/components/w800rf32/*
|
||||
homeassistant/components/water_heater/econet.py
|
||||
homeassistant/components/watson_iot.py
|
||||
homeassistant/components/waterfurnace/*
|
||||
homeassistant/components/watson_iot/*
|
||||
homeassistant/components/weather/bom.py
|
||||
homeassistant/components/weather/buienradar.py
|
||||
homeassistant/components/weather/darksky.py
|
||||
@@ -958,7 +661,29 @@ omit =
|
||||
homeassistant/components/weather/metoffice.py
|
||||
homeassistant/components/weather/openweathermap.py
|
||||
homeassistant/components/weather/zamg.py
|
||||
homeassistant/components/zeroconf.py
|
||||
homeassistant/components/webostv/*
|
||||
homeassistant/components/wemo/*
|
||||
homeassistant/components/wink/*
|
||||
homeassistant/components/wirelesstag/*
|
||||
homeassistant/components/xiaomi_aqara/*
|
||||
homeassistant/components/xiaomi_miio/*
|
||||
homeassistant/components/xs1/*
|
||||
homeassistant/components/zabbix/*
|
||||
homeassistant/components/zeroconf/*
|
||||
homeassistant/components/zha/__init__.py
|
||||
homeassistant/components/zha/api.py
|
||||
homeassistant/components/zha/const.py
|
||||
homeassistant/components/zha/core/channels/*
|
||||
homeassistant/components/zha/core/const.py
|
||||
homeassistant/components/zha/core/device.py
|
||||
homeassistant/components/zha/core/gateway.py
|
||||
homeassistant/components/zha/core/helpers.py
|
||||
homeassistant/components/zha/device_entity.py
|
||||
homeassistant/components/zha/entity.py
|
||||
homeassistant/components/zha/light.py
|
||||
homeassistant/components/zha/sensor.py
|
||||
homeassistant/components/zigbee/*
|
||||
homeassistant/components/zoneminder/*
|
||||
homeassistant/components/zwave/util.py
|
||||
|
||||
[report]
|
||||
@@ -972,4 +697,4 @@ exclude_lines =
|
||||
|
||||
# Don't complain if tests don't hit defensive assertion code:
|
||||
raise AssertionError
|
||||
raise NotImplementedError
|
||||
raise NotImplementedError
|
||||
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@@ -2,6 +2,7 @@
|
||||
- If you need additional help with this template please refer to https://www.home-assistant.io/help/reporting_issues/
|
||||
- Make sure you are running the latest version of Home Assistant before reporting an issue: https://github.com/home-assistant/home-assistant/releases
|
||||
- Frontend issues should be submitted to the home-assistant-polymer repository: https://github.com/home-assistant/home-assistant-polymer/issues
|
||||
- iOS issues should be submitted to the home-assistant-iOS repository: https://github.com/home-assistant/home-assistant-iOS/issues
|
||||
- Do not report issues for components if you are using custom components: files in <config-dir>/custom_components
|
||||
- This is for bugs only. Feature and enhancement requests should go in our community forum: https://community.home-assistant.io/c/feature-requests
|
||||
- Provide as many details as possible. Paste logs, configuration sample and code into the backticks. Do not delete any text from this template!
|
||||
|
||||
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@@ -8,6 +8,7 @@ about: Create a report to help us improve
|
||||
- If you need additional help with this template please refer to https://www.home-assistant.io/help/reporting_issues/
|
||||
- Make sure you are running the latest version of Home Assistant before reporting an issue: https://github.com/home-assistant/home-assistant/releases
|
||||
- Frontend issues should be submitted to the home-assistant-polymer repository: https://github.com/home-assistant/home-assistant-polymer/issues
|
||||
- iOS issues should be submitted to the home-assistant-iOS repository: https://github.com/home-assistant/home-assistant-iOS/issues
|
||||
- Do not report issues for components if you are using custom components: files in <config-dir>/custom_components
|
||||
- This is for bugs only. Feature and enhancement requests should go in our community forum: https://community.home-assistant.io/c/feature-requests
|
||||
- Provide as many details as possible. Paste logs, configuration sample and code into the backticks. Do not delete any text from this template!
|
||||
|
||||
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -27,5 +27,5 @@ If the code communicates with devices, web services, or third-party tools:
|
||||
If the code does not interact with devices:
|
||||
- [ ] Tests have been added to verify that the new code works.
|
||||
|
||||
[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L14
|
||||
[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L54
|
||||
[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard/__init__.py#L14
|
||||
[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard/__init__.py#L23
|
||||
|
||||
@@ -34,7 +34,7 @@ cache:
|
||||
- $HOME/.cache/pip
|
||||
install: pip install -U tox coveralls
|
||||
language: python
|
||||
script: travis_wait 30 tox --develop
|
||||
script: travis_wait 40 tox --develop
|
||||
services:
|
||||
- docker
|
||||
before_deploy:
|
||||
|
||||
158
CODEOWNERS
158
CODEOWNERS
@@ -7,34 +7,34 @@ setup.py @home-assistant/core
|
||||
homeassistant/*.py @home-assistant/core
|
||||
homeassistant/helpers/* @home-assistant/core
|
||||
homeassistant/util/* @home-assistant/core
|
||||
homeassistant/components/api.py @home-assistant/core
|
||||
homeassistant/components/api/* @home-assistant/core
|
||||
homeassistant/components/auth/* @home-assistant/core
|
||||
homeassistant/components/automation/* @home-assistant/core
|
||||
homeassistant/components/cloud/* @home-assistant/core
|
||||
homeassistant/components/config/* @home-assistant/core
|
||||
homeassistant/components/configurator.py @home-assistant/core
|
||||
homeassistant/components/configurator/* @home-assistant/core
|
||||
homeassistant/components/conversation/* @home-assistant/core
|
||||
homeassistant/components/frontend/* @home-assistant/core
|
||||
homeassistant/components/group/* @home-assistant/core
|
||||
homeassistant/components/history.py @home-assistant/core
|
||||
homeassistant/components/history/* @home-assistant/core
|
||||
homeassistant/components/http/* @home-assistant/core
|
||||
homeassistant/components/input_*.py @home-assistant/core
|
||||
homeassistant/components/introduction.py @home-assistant/core
|
||||
homeassistant/components/logger.py @home-assistant/core
|
||||
homeassistant/components/introduction/* @home-assistant/core
|
||||
homeassistant/components/logger/* @home-assistant/core
|
||||
homeassistant/components/lovelace/* @home-assistant/core
|
||||
homeassistant/components/mqtt/* @home-assistant/core
|
||||
homeassistant/components/panel_custom.py @home-assistant/core
|
||||
homeassistant/components/panel_iframe.py @home-assistant/core
|
||||
homeassistant/components/panel_custom/* @home-assistant/core
|
||||
homeassistant/components/panel_iframe/* @home-assistant/core
|
||||
homeassistant/components/onboarding/* @home-assistant/core
|
||||
homeassistant/components/persistent_notification/* @home-assistant/core
|
||||
homeassistant/components/scene/__init__.py @home-assistant/core
|
||||
homeassistant/components/scene/hass.py @home-assistant/core
|
||||
homeassistant/components/script.py @home-assistant/core
|
||||
homeassistant/components/shell_command.py @home-assistant/core
|
||||
homeassistant/components/sun.py @home-assistant/core
|
||||
homeassistant/components/updater.py @home-assistant/core
|
||||
homeassistant/components/scene/homeassistant.py @home-assistant/core
|
||||
homeassistant/components/script/* @home-assistant/core
|
||||
homeassistant/components/shell_command/* @home-assistant/core
|
||||
homeassistant/components/sun/* @home-assistant/core
|
||||
homeassistant/components/updater/* @home-assistant/core
|
||||
homeassistant/components/weblink/* @home-assistant/core
|
||||
homeassistant/components/websocket_api.py @home-assistant/core
|
||||
homeassistant/components/websocket_api/* @home-assistant/core
|
||||
homeassistant/components/zone/* @home-assistant/core
|
||||
|
||||
# Home Assistant Developer Teams
|
||||
@@ -47,12 +47,12 @@ homeassistant/components/*/zwave.py @home-assistant/z-wave
|
||||
homeassistant/components/hassio/* @home-assistant/hassio
|
||||
|
||||
# Individual platforms
|
||||
homeassistant/components/alarm_control_panel/egardia.py @jeroenterheerdt
|
||||
homeassistant/components/alarm_control_panel/manual_mqtt.py @colinodell
|
||||
homeassistant/components/binary_sensor/hikvision.py @mezz64
|
||||
homeassistant/components/binary_sensor/threshold.py @fabaff
|
||||
homeassistant/components/binary_sensor/uptimerobot.py @ludeeus
|
||||
homeassistant/components/camera/yi.py @bachya
|
||||
homeassistant/components/climate/coolmaster.py @OnFreund
|
||||
homeassistant/components/climate/ephember.py @ttroy50
|
||||
homeassistant/components/climate/eq3btsmart.py @rytilahti
|
||||
homeassistant/components/climate/mill.py @danielhiversen
|
||||
@@ -62,16 +62,13 @@ homeassistant/components/cover/group.py @cdce8p
|
||||
homeassistant/components/cover/template.py @PhracturedBlue
|
||||
homeassistant/components/device_tracker/asuswrt.py @kennedyshead
|
||||
homeassistant/components/device_tracker/automatic.py @armills
|
||||
homeassistant/components/device_tracker/googlehome.py @ludeeus
|
||||
homeassistant/components/device_tracker/huawei_router.py @abmantis
|
||||
homeassistant/components/device_tracker/quantum_gateway.py @cisasteelersfan
|
||||
homeassistant/components/device_tracker/tile.py @bachya
|
||||
homeassistant/components/device_tracker/traccar.py @ludeeus
|
||||
homeassistant/components/device_tracker/bt_smarthub.py @jxwolstenholme
|
||||
homeassistant/components/history_graph.py @andrey-git
|
||||
homeassistant/components/influx.py @fabaff
|
||||
homeassistant/components/device_tracker/synology_srm.py @aerialls
|
||||
homeassistant/components/light/lifx_legacy.py @amelchio
|
||||
homeassistant/components/light/tplink.py @rytilahti
|
||||
homeassistant/components/light/yeelight.py @rytilahti
|
||||
homeassistant/components/light/yeelightsunflower.py @lindsaymarkward
|
||||
homeassistant/components/lock/nello.py @pschmitt
|
||||
@@ -82,20 +79,15 @@ homeassistant/components/media_player/liveboxplaytv.py @pschmitt
|
||||
homeassistant/components/media_player/mediaroom.py @dgomes
|
||||
homeassistant/components/media_player/monoprice.py @etsinko
|
||||
homeassistant/components/media_player/mpd.py @fabaff
|
||||
homeassistant/components/media_player/sonos.py @amelchio
|
||||
homeassistant/components/media_player/xiaomi_tv.py @fattdev
|
||||
homeassistant/components/media_player/yamaha_musiccast.py @jalmeroth
|
||||
homeassistant/components/no_ip.py @fabaff
|
||||
homeassistant/components/notify/file.py @fabaff
|
||||
homeassistant/components/notify/flock.py @fabaff
|
||||
homeassistant/components/notify/instapush.py @fabaff
|
||||
homeassistant/components/notify/mastodon.py @fabaff
|
||||
homeassistant/components/notify/smtp.py @fabaff
|
||||
homeassistant/components/notify/syslog.py @fabaff
|
||||
homeassistant/components/notify/xmpp.py @fabaff
|
||||
homeassistant/components/notify/yessssms.py @flowolf
|
||||
homeassistant/components/plant.py @ChristianKuehnel
|
||||
homeassistant/components/remote/harmony.py @ehendrix23
|
||||
homeassistant/components/scene/lifx_cloud.py @amelchio
|
||||
homeassistant/components/sensor/airvisual.py @bachya
|
||||
homeassistant/components/sensor/alpha_vantage.py @fabaff
|
||||
@@ -106,11 +98,12 @@ homeassistant/components/sensor/darksky.py @fabaff
|
||||
homeassistant/components/sensor/file.py @fabaff
|
||||
homeassistant/components/sensor/filter.py @dgomes
|
||||
homeassistant/components/sensor/fixer.py @fabaff
|
||||
homeassistant/components/sensor/flunearyou.py.py @bachya
|
||||
homeassistant/components/sensor/flunearyou.py @bachya
|
||||
homeassistant/components/sensor/gearbest.py @HerrHofrat
|
||||
homeassistant/components/sensor/gitter.py @fabaff
|
||||
homeassistant/components/sensor/glances.py @fabaff
|
||||
homeassistant/components/sensor/gpsd.py @fabaff
|
||||
homeassistant/components/sensor/integration.py @dgomes
|
||||
homeassistant/components/sensor/irish_rail_transport.py @ttroy50
|
||||
homeassistant/components/sensor/jewish_calendar.py @tsvi
|
||||
homeassistant/components/sensor/launch_library.py @ludeeus
|
||||
@@ -135,140 +128,131 @@ homeassistant/components/sensor/statistics.py @fabaff
|
||||
homeassistant/components/sensor/swiss*.py @fabaff
|
||||
homeassistant/components/sensor/sytadin.py @gautric
|
||||
homeassistant/components/sensor/tautulli.py @ludeeus
|
||||
homeassistant/components/sensor/time_data.py @fabaff
|
||||
homeassistant/components/sensor/time_date.py @fabaff
|
||||
homeassistant/components/sensor/version.py @fabaff
|
||||
homeassistant/components/sensor/waqi.py @andrey-git
|
||||
homeassistant/components/sensor/worldclock.py @fabaff
|
||||
homeassistant/components/shiftr.py @fabaff
|
||||
homeassistant/components/spaceapi.py @fabaff
|
||||
homeassistant/components/switch/switchbot.py @danielhiversen
|
||||
homeassistant/components/switch/switchmate.py @danielhiversen
|
||||
homeassistant/components/switch/tplink.py @rytilahti
|
||||
homeassistant/components/vacuum/roomba.py @pschmitt
|
||||
homeassistant/components/weather/__init__.py @fabaff
|
||||
homeassistant/components/weather/darksky.py @fabaff
|
||||
homeassistant/components/weather/demo.py @fabaff
|
||||
homeassistant/components/weather/met.py @danielhiversen
|
||||
homeassistant/components/weather/openweathermap.py @fabaff
|
||||
homeassistant/components/xiaomi_aqara.py @danielhiversen @syssi
|
||||
|
||||
# A
|
||||
homeassistant/components/ambient_station/* @bachya
|
||||
homeassistant/components/arduino.py @fabaff
|
||||
homeassistant/components/*/arduino.py @fabaff
|
||||
homeassistant/components/arduino/* @fabaff
|
||||
homeassistant/components/axis/* @kane610
|
||||
homeassistant/components/*/arest.py @fabaff
|
||||
homeassistant/components/*/axis.py @kane610
|
||||
|
||||
# B
|
||||
homeassistant/components/blink/* @fronzbot
|
||||
homeassistant/components/*/blink.py @fronzbot
|
||||
homeassistant/components/bmw_connected_drive.py @ChristianKuehnel
|
||||
homeassistant/components/*/bmw_connected_drive.py @ChristianKuehnel
|
||||
homeassistant/components/bmw_connected_drive/* @ChristianKuehnel
|
||||
homeassistant/components/*/broadlink.py @danielhiversen
|
||||
|
||||
# C
|
||||
homeassistant/components/cloudflare.py @ludeeus
|
||||
homeassistant/components/cloudflare/* @ludeeus
|
||||
homeassistant/components/counter/* @fabaff
|
||||
|
||||
# D
|
||||
homeassistant/components/daikin.py @fredrike @rofrantz
|
||||
homeassistant/components/*/daikin.py @fredrike @rofrantz
|
||||
homeassistant/components/*/deconz.py @kane610
|
||||
homeassistant/components/digital_ocean.py @fabaff
|
||||
homeassistant/components/*/digital_ocean.py @fabaff
|
||||
homeassistant/components/dweet.py @fabaff
|
||||
homeassistant/components/*/dweet.py @fabaff
|
||||
homeassistant/components/daikin/* @fredrike @rofrantz
|
||||
homeassistant/components/deconz/* @kane610
|
||||
homeassistant/components/digital_ocean/* @fabaff
|
||||
homeassistant/components/dweet/* @fabaff
|
||||
|
||||
# E
|
||||
homeassistant/components/ecovacs.py @OverloadUT
|
||||
homeassistant/components/*/ecovacs.py @OverloadUT
|
||||
homeassistant/components/*/edp_redy.py @abmantis
|
||||
homeassistant/components/edp_redy.py @abmantis
|
||||
homeassistant/components/eight_sleep.py @mezz64
|
||||
homeassistant/components/*/eight_sleep.py @mezz64
|
||||
homeassistant/components/ecovacs/* @OverloadUT
|
||||
homeassistant/components/edp_redy/* @abmantis
|
||||
homeassistant/components/eight_sleep/* @mezz64
|
||||
homeassistant/components/egardia/* @jeroenterheerdt
|
||||
homeassistant/components/esphome/*.py @OttoWinter
|
||||
|
||||
# F
|
||||
homeassistant/components/freebox/*.py @snoof85
|
||||
|
||||
# G
|
||||
homeassistant/components/googlehome/* @ludeeus
|
||||
|
||||
# H
|
||||
homeassistant/components/hive.py @Rendili @KJonline
|
||||
homeassistant/components/*/hive.py @Rendili @KJonline
|
||||
homeassistant/components/harmony/* @ehendrix23
|
||||
homeassistant/components/history_graph/* @andrey-git
|
||||
homeassistant/components/hive/* @Rendili @KJonline
|
||||
homeassistant/components/homekit/* @cdce8p
|
||||
homeassistant/components/huawei_lte.py @scop
|
||||
homeassistant/components/*/huawei_lte.py @scop
|
||||
homeassistant/components/huawei_lte/* @scop
|
||||
|
||||
# I
|
||||
homeassistant/components/influx/* @fabaff
|
||||
homeassistant/components/ipma/* @dgomes
|
||||
|
||||
# K
|
||||
homeassistant/components/knx.py @Julius2342
|
||||
homeassistant/components/*/knx.py @Julius2342
|
||||
homeassistant/components/konnected.py @heythisisnate
|
||||
homeassistant/components/*/konnected.py @heythisisnate
|
||||
homeassistant/components/knx/* @Julius2342
|
||||
homeassistant/components/konnected/* @heythisisnate
|
||||
|
||||
# L
|
||||
homeassistant/components/lifx.py @amelchio
|
||||
homeassistant/components/*/lifx.py @amelchio
|
||||
homeassistant/components/lifx/* @amelchio
|
||||
homeassistant/components/luftdaten/* @fabaff
|
||||
homeassistant/components/*/luftdaten.py @fabaff
|
||||
|
||||
# M
|
||||
homeassistant/components/matrix.py @tinloaf
|
||||
homeassistant/components/*/matrix.py @tinloaf
|
||||
homeassistant/components/melissa.py @kennedyshead
|
||||
homeassistant/components/matrix/* @tinloaf
|
||||
homeassistant/components/melissa/* @kennedyshead
|
||||
homeassistant/components/*/melissa.py @kennedyshead
|
||||
homeassistant/components/*/mystrom.py @fabaff
|
||||
|
||||
# N
|
||||
homeassistant/components/ness_alarm.py @nickw444
|
||||
homeassistant/components/ness_alarm/* @nickw444
|
||||
homeassistant/components/*/ness_alarm.py @nickw444
|
||||
homeassistant/components/nissan_leaf/* @filcole
|
||||
homeassistant/components/no_ip/* @fabaff
|
||||
|
||||
# O
|
||||
homeassistant/components/openuv/* @bachya
|
||||
|
||||
# P
|
||||
homeassistant/components/plant/* @ChristianKuehnel
|
||||
homeassistant/components/point/* @fredrike
|
||||
homeassistant/components/*/point.py @fredrike
|
||||
|
||||
# Q
|
||||
homeassistant/components/qwikswitch.py @kellerza
|
||||
homeassistant/components/*/qwikswitch.py @kellerza
|
||||
homeassistant/components/qwikswitch/* @kellerza
|
||||
|
||||
# R
|
||||
homeassistant/components/rainmachine/* @bachya
|
||||
homeassistant/components/rfxtrx/* @danielhiversen
|
||||
homeassistant/components/*/random.py @fabaff
|
||||
homeassistant/components/*/rfxtrx.py @danielhiversen
|
||||
|
||||
# S
|
||||
homeassistant/components/shiftr/* @fabaff
|
||||
homeassistant/components/simplisafe/* @bachya
|
||||
homeassistant/components/smartthings/* @andrewsayre
|
||||
homeassistant/components/sonos/* @amelchio
|
||||
homeassistant/components/spaceapi/* @fabaff
|
||||
homeassistant/components/spider/* @peternijssen
|
||||
|
||||
# T
|
||||
homeassistant/components/tahoma.py @philklei
|
||||
homeassistant/components/*/tahoma.py @philklei
|
||||
homeassistant/components/tahoma/* @philklei
|
||||
homeassistant/components/tellduslive/*.py @fredrike
|
||||
homeassistant/components/*/tellduslive.py @fredrike
|
||||
homeassistant/components/tesla.py @zabuldon
|
||||
homeassistant/components/*/tesla.py @zabuldon
|
||||
homeassistant/components/thethingsnetwork.py @fabaff
|
||||
homeassistant/components/*/thethingsnetwork.py @fabaff
|
||||
homeassistant/components/tesla/* @zabuldon
|
||||
homeassistant/components/thethingsnetwork/* @fabaff
|
||||
homeassistant/components/tibber/* @danielhiversen
|
||||
homeassistant/components/*/tibber.py @danielhiversen
|
||||
homeassistant/components/tplink/* @rytilahti
|
||||
homeassistant/components/tradfri/* @ggravlingen
|
||||
homeassistant/components/*/tradfri.py @ggravlingen
|
||||
homeassistant/components/toon/* @frenck
|
||||
|
||||
# U
|
||||
homeassistant/components/unifi.py @kane610
|
||||
homeassistant/components/switch/unifi.py @kane610
|
||||
homeassistant/components/upcloud.py @scop
|
||||
homeassistant/components/*/upcloud.py @scop
|
||||
homeassistant/components/unifi/* @kane610
|
||||
homeassistant/components/upcloud/* @scop
|
||||
homeassistant/components/utility_meter/* @dgomes
|
||||
|
||||
# V
|
||||
homeassistant/components/velux.py @Julius2342
|
||||
homeassistant/components/*/velux.py @Julius2342
|
||||
homeassistant/components/velux/* @Julius2342
|
||||
|
||||
# W
|
||||
homeassistant/components/wemo.py @sqldiablo
|
||||
homeassistant/components/*/wemo.py @sqldiablo
|
||||
homeassistant/components/wemo/* @sqldiablo
|
||||
|
||||
# X
|
||||
homeassistant/components/*/xiaomi_aqara.py @danielhiversen @syssi
|
||||
homeassistant/components/*/xiaomi_miio.py @rytilahti @syssi
|
||||
homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi
|
||||
homeassistant/components/xiaomi_miio/* @rytilahti @syssi
|
||||
|
||||
# Z
|
||||
homeassistant/components/zoneminder/* @rohankapoorcom
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# When updating this file, please also update virtualization/Docker/Dockerfile.dev
|
||||
# This way, the development image and the production image are kept in sync.
|
||||
|
||||
FROM python:3.6
|
||||
FROM python:3.7
|
||||
LABEL maintainer="Paulus Schoutsen <Paulus@PaulusSchoutsen.nl>"
|
||||
|
||||
# Uncomment any of the following lines to disable the installation.
|
||||
@@ -27,7 +27,7 @@ COPY requirements_all.txt requirements_all.txt
|
||||
# Uninstall enum34 because some dependencies install it but breaks Python 3.4+.
|
||||
# See PR #8103 for more info.
|
||||
RUN pip3 install --no-cache-dir -r requirements_all.txt && \
|
||||
pip3 install --no-cache-dir mysqlclient psycopg2 uvloop cchardet cython tensorflow
|
||||
pip3 install --no-cache-dir mysqlclient psycopg2 uvloop==0.11.3 cchardet cython tensorflow
|
||||
|
||||
# Copy source
|
||||
COPY . .
|
||||
|
||||
@@ -4,6 +4,23 @@ homeassistant.helpers package
|
||||
Submodules
|
||||
----------
|
||||
|
||||
homeassistant.helpers.aiohttp_client module
|
||||
-------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.aiohttp_client
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
homeassistant.helpers.area_registry module
|
||||
------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.area_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.condition module
|
||||
--------------------------------------
|
||||
|
||||
@@ -12,6 +29,14 @@ homeassistant.helpers.condition module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.config_entry_flow module
|
||||
----------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.config_entry_flow
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.config_validation module
|
||||
----------------------------------------------
|
||||
|
||||
@@ -20,6 +45,30 @@ homeassistant.helpers.config_validation module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.data_entry_flow module
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.data_entry_flow
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.deprecation module
|
||||
----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.depracation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.device_registry module
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.device_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.discovery module
|
||||
--------------------------------------
|
||||
|
||||
@@ -28,6 +77,14 @@ homeassistant.helpers.discovery module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.dispatcher module
|
||||
---------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.dispatcher
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity module
|
||||
-----------------------------------
|
||||
|
||||
@@ -44,6 +101,38 @@ homeassistant.helpers.entity_component module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_platform module
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_platform
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_registry module
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_values module
|
||||
------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_values
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entityfilter module
|
||||
-----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entityfilter
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.event module
|
||||
----------------------------------
|
||||
|
||||
@@ -52,10 +141,26 @@ homeassistant.helpers.event module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.event_decorators module
|
||||
---------------------------------------------
|
||||
homeassistant.helpers.icon module
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.event_decorators
|
||||
.. automodule:: homeassistant.helpers.icon
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.intent module
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.intent
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.json module
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.json
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
@@ -68,6 +173,22 @@ homeassistant.helpers.location module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.logging module
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.logging
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.restore_state module
|
||||
------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.restore_state
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.script module
|
||||
-----------------------------------
|
||||
|
||||
@@ -84,6 +205,14 @@ homeassistant.helpers.service module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.signal module
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.signal
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.state module
|
||||
----------------------------------
|
||||
|
||||
@@ -92,6 +221,38 @@ homeassistant.helpers.state module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.storage module
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.storage
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.sun module
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.sun
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.system_info module
|
||||
----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.system_info
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.temperature module
|
||||
----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.temperature
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.template module
|
||||
-------------------------------------
|
||||
|
||||
@@ -100,6 +261,14 @@ homeassistant.helpers.template module
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.translation module
|
||||
-----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.translation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.typing module
|
||||
-----------------------------------
|
||||
|
||||
|
||||
@@ -170,8 +170,7 @@ class AuthManager:
|
||||
user = await self.async_get_user_by_credentials(credentials)
|
||||
if user is None:
|
||||
raise ValueError('Unable to find the user.')
|
||||
else:
|
||||
return user
|
||||
return user
|
||||
|
||||
auth_provider = self._async_get_auth_provider(credentials)
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
Sending HOTP through notify service
|
||||
"""
|
||||
import asyncio
|
||||
import logging
|
||||
from collections import OrderedDict
|
||||
from typing import Any, Dict, Optional, List
|
||||
@@ -90,6 +91,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
|
||||
self._include = config.get(CONF_INCLUDE, [])
|
||||
self._exclude = config.get(CONF_EXCLUDE, [])
|
||||
self._message_template = config[CONF_MESSAGE]
|
||||
self._init_lock = asyncio.Lock()
|
||||
|
||||
@property
|
||||
def input_schema(self) -> vol.Schema:
|
||||
@@ -98,15 +100,19 @@ class NotifyAuthModule(MultiFactorAuthModule):
|
||||
|
||||
async def _async_load(self) -> None:
|
||||
"""Load stored data."""
|
||||
data = await self._user_store.async_load()
|
||||
async with self._init_lock:
|
||||
if self._user_settings is not None:
|
||||
return
|
||||
|
||||
if data is None:
|
||||
data = {STORAGE_USERS: {}}
|
||||
data = await self._user_store.async_load()
|
||||
|
||||
self._user_settings = {
|
||||
user_id: NotifySetting(**setting)
|
||||
for user_id, setting in data.get(STORAGE_USERS, {}).items()
|
||||
}
|
||||
if data is None:
|
||||
data = {STORAGE_USERS: {}}
|
||||
|
||||
self._user_settings = {
|
||||
user_id: NotifySetting(**setting)
|
||||
for user_id, setting in data.get(STORAGE_USERS, {}).items()
|
||||
}
|
||||
|
||||
async def _async_save(self) -> None:
|
||||
"""Save data."""
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""Time-based One Time Password auth module."""
|
||||
import asyncio
|
||||
import logging
|
||||
from io import BytesIO
|
||||
from typing import Any, Dict, Optional, Tuple # noqa: F401
|
||||
@@ -68,6 +69,7 @@ class TotpAuthModule(MultiFactorAuthModule):
|
||||
self._users = None # type: Optional[Dict[str, str]]
|
||||
self._user_store = hass.helpers.storage.Store(
|
||||
STORAGE_VERSION, STORAGE_KEY, private=True)
|
||||
self._init_lock = asyncio.Lock()
|
||||
|
||||
@property
|
||||
def input_schema(self) -> vol.Schema:
|
||||
@@ -76,12 +78,16 @@ class TotpAuthModule(MultiFactorAuthModule):
|
||||
|
||||
async def _async_load(self) -> None:
|
||||
"""Load stored data."""
|
||||
data = await self._user_store.async_load()
|
||||
async with self._init_lock:
|
||||
if self._users is not None:
|
||||
return
|
||||
|
||||
if data is None:
|
||||
data = {STORAGE_USERS: {}}
|
||||
data = await self._user_store.async_load()
|
||||
|
||||
self._users = data.get(STORAGE_USERS, {})
|
||||
if data is None:
|
||||
data = {STORAGE_USERS: {}}
|
||||
|
||||
self._users = data.get(STORAGE_USERS, {})
|
||||
|
||||
async def _async_save(self) -> None:
|
||||
"""Save data."""
|
||||
|
||||
164
homeassistant/auth/providers/command_line.py
Normal file
164
homeassistant/auth/providers/command_line.py
Normal file
@@ -0,0 +1,164 @@
|
||||
"""Auth provider that validates credentials via an external command."""
|
||||
|
||||
from typing import Any, Dict, Optional, cast
|
||||
|
||||
import asyncio.subprocess
|
||||
import collections
|
||||
import logging
|
||||
import os
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
|
||||
CONF_COMMAND = "command"
|
||||
CONF_ARGS = "args"
|
||||
CONF_META = "meta"
|
||||
|
||||
CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend({
|
||||
vol.Required(CONF_COMMAND): vol.All(
|
||||
str,
|
||||
os.path.normpath,
|
||||
msg="must be an absolute path"
|
||||
),
|
||||
vol.Optional(CONF_ARGS, default=None): vol.Any(vol.DefaultTo(list), [str]),
|
||||
vol.Optional(CONF_META, default=False): bool,
|
||||
}, extra=vol.PREVENT_EXTRA)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class InvalidAuthError(HomeAssistantError):
|
||||
"""Raised when authentication with given credentials fails."""
|
||||
|
||||
|
||||
@AUTH_PROVIDERS.register("command_line")
|
||||
class CommandLineAuthProvider(AuthProvider):
|
||||
"""Auth provider validating credentials by calling a command."""
|
||||
|
||||
DEFAULT_TITLE = "Command Line Authentication"
|
||||
|
||||
# which keys to accept from a program's stdout
|
||||
ALLOWED_META_KEYS = ("name",)
|
||||
|
||||
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||||
"""Extend parent's __init__.
|
||||
|
||||
Adds self._user_meta dictionary to hold the user-specific
|
||||
attributes provided by external programs.
|
||||
"""
|
||||
super().__init__(*args, **kwargs)
|
||||
self._user_meta = {} # type: Dict[str, Dict[str, Any]]
|
||||
|
||||
async def async_login_flow(self, context: Optional[dict]) -> LoginFlow:
|
||||
"""Return a flow to login."""
|
||||
return CommandLineLoginFlow(self)
|
||||
|
||||
async def async_validate_login(self, username: str, password: str) -> None:
|
||||
"""Validate a username and password."""
|
||||
env = {
|
||||
"username": username,
|
||||
"password": password,
|
||||
}
|
||||
try:
|
||||
# pylint: disable=no-member
|
||||
process = await asyncio.subprocess.create_subprocess_exec(
|
||||
self.config[CONF_COMMAND], *self.config[CONF_ARGS],
|
||||
env=env,
|
||||
stdout=asyncio.subprocess.PIPE
|
||||
if self.config[CONF_META] else None,
|
||||
)
|
||||
stdout, _ = (await process.communicate())
|
||||
except OSError as err:
|
||||
# happens when command doesn't exist or permission is denied
|
||||
_LOGGER.error("Error while authenticating %r: %s",
|
||||
username, err)
|
||||
raise InvalidAuthError
|
||||
|
||||
if process.returncode != 0:
|
||||
_LOGGER.error("User %r failed to authenticate, command exited "
|
||||
"with code %d.",
|
||||
username, process.returncode)
|
||||
raise InvalidAuthError
|
||||
|
||||
if self.config[CONF_META]:
|
||||
meta = {} # type: Dict[str, str]
|
||||
for _line in stdout.splitlines():
|
||||
try:
|
||||
line = _line.decode().lstrip()
|
||||
if line.startswith("#"):
|
||||
continue
|
||||
key, value = line.split("=", 1)
|
||||
except ValueError:
|
||||
# malformed line
|
||||
continue
|
||||
key = key.strip()
|
||||
value = value.strip()
|
||||
if key in self.ALLOWED_META_KEYS:
|
||||
meta[key] = value
|
||||
self._user_meta[username] = meta
|
||||
|
||||
async def async_get_or_create_credentials(
|
||||
self, flow_result: Dict[str, str]
|
||||
) -> Credentials:
|
||||
"""Get credentials based on the flow result."""
|
||||
username = flow_result["username"]
|
||||
for credential in await self.async_credentials():
|
||||
if credential.data["username"] == username:
|
||||
return credential
|
||||
|
||||
# Create new credentials.
|
||||
return self.async_create_credentials({
|
||||
"username": username,
|
||||
})
|
||||
|
||||
async def async_user_meta_for_credentials(
|
||||
self, credentials: Credentials
|
||||
) -> UserMeta:
|
||||
"""Return extra user metadata for credentials.
|
||||
|
||||
Currently, only name is supported.
|
||||
"""
|
||||
meta = self._user_meta.get(credentials.data["username"], {})
|
||||
return UserMeta(
|
||||
name=meta.get("name"),
|
||||
is_active=True,
|
||||
)
|
||||
|
||||
|
||||
class CommandLineLoginFlow(LoginFlow):
|
||||
"""Handler for the login flow."""
|
||||
|
||||
async def async_step_init(
|
||||
self, user_input: Optional[Dict[str, str]] = None
|
||||
) -> Dict[str, Any]:
|
||||
"""Handle the step of the form."""
|
||||
errors = {}
|
||||
|
||||
if user_input is not None:
|
||||
user_input["username"] = user_input["username"].strip()
|
||||
try:
|
||||
await cast(CommandLineAuthProvider, self._auth_provider) \
|
||||
.async_validate_login(
|
||||
user_input["username"], user_input["password"]
|
||||
)
|
||||
except InvalidAuthError:
|
||||
errors["base"] = "invalid_auth"
|
||||
|
||||
if not errors:
|
||||
user_input.pop("password")
|
||||
return await self.async_finish(user_input)
|
||||
|
||||
schema = collections.OrderedDict() # type: Dict[str, type]
|
||||
schema["username"] = str
|
||||
schema["password"] = str
|
||||
|
||||
return self.async_show_form(
|
||||
step_id="init",
|
||||
data_schema=vol.Schema(schema),
|
||||
errors=errors,
|
||||
)
|
||||
@@ -1,4 +1,5 @@
|
||||
"""Home Assistant auth provider."""
|
||||
import asyncio
|
||||
import base64
|
||||
from collections import OrderedDict
|
||||
import logging
|
||||
@@ -204,15 +205,21 @@ class HassAuthProvider(AuthProvider):
|
||||
|
||||
DEFAULT_TITLE = 'Home Assistant Local'
|
||||
|
||||
data = None
|
||||
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||||
"""Initialize an Home Assistant auth provider."""
|
||||
super().__init__(*args, **kwargs)
|
||||
self.data = None # type: Optional[Data]
|
||||
self._init_lock = asyncio.Lock()
|
||||
|
||||
async def async_initialize(self) -> None:
|
||||
"""Initialize the auth provider."""
|
||||
if self.data is not None:
|
||||
return
|
||||
async with self._init_lock:
|
||||
if self.data is not None:
|
||||
return
|
||||
|
||||
self.data = Data(self.hass)
|
||||
await self.data.async_load()
|
||||
data = Data(self.hass)
|
||||
await data.async_load()
|
||||
self.data = data
|
||||
|
||||
async def async_login_flow(
|
||||
self, context: Optional[Dict]) -> LoginFlow:
|
||||
|
||||
@@ -3,18 +3,23 @@
|
||||
It shows list of users if access from trusted network.
|
||||
Abort login flow if not access from trusted network.
|
||||
"""
|
||||
from typing import Any, Dict, Optional, cast
|
||||
from ipaddress import ip_network, IPv4Address, IPv6Address, IPv4Network,\
|
||||
IPv6Network
|
||||
from typing import Any, Dict, List, Optional, Union, cast
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.http import HomeAssistantHTTP # noqa: F401
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
IPAddress = Union[IPv4Address, IPv6Address]
|
||||
IPNetwork = Union[IPv4Network, IPv6Network]
|
||||
|
||||
CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend({
|
||||
vol.Required('trusted_networks'): vol.All(cv.ensure_list, [ip_network])
|
||||
}, extra=vol.PREVENT_EXTRA)
|
||||
|
||||
|
||||
@@ -35,6 +40,11 @@ class TrustedNetworksAuthProvider(AuthProvider):
|
||||
|
||||
DEFAULT_TITLE = 'Trusted Networks'
|
||||
|
||||
@property
|
||||
def trusted_networks(self) -> List[IPNetwork]:
|
||||
"""Return trusted networks."""
|
||||
return cast(List[IPNetwork], self.config['trusted_networks'])
|
||||
|
||||
@property
|
||||
def support_mfa(self) -> bool:
|
||||
"""Trusted Networks auth provider does not support MFA."""
|
||||
@@ -49,7 +59,7 @@ class TrustedNetworksAuthProvider(AuthProvider):
|
||||
if not user.system_generated and user.is_active}
|
||||
|
||||
return TrustedNetworksLoginFlow(
|
||||
self, cast(str, context.get('ip_address')), available_users)
|
||||
self, cast(IPAddress, context.get('ip_address')), available_users)
|
||||
|
||||
async def async_get_or_create_credentials(
|
||||
self, flow_result: Dict[str, str]) -> Credentials:
|
||||
@@ -80,19 +90,17 @@ class TrustedNetworksAuthProvider(AuthProvider):
|
||||
raise NotImplementedError
|
||||
|
||||
@callback
|
||||
def async_validate_access(self, ip_address: str) -> None:
|
||||
def async_validate_access(self, ip_addr: IPAddress) -> None:
|
||||
"""Make sure the access from trusted networks.
|
||||
|
||||
Raise InvalidAuthError if not.
|
||||
Raise InvalidAuthError if trusted_networks is not configured.
|
||||
"""
|
||||
hass_http = getattr(self.hass, 'http', None) # type: HomeAssistantHTTP
|
||||
|
||||
if not hass_http or not hass_http.trusted_networks:
|
||||
if not self.trusted_networks:
|
||||
raise InvalidAuthError('trusted_networks is not configured')
|
||||
|
||||
if not any(ip_address in trusted_network for trusted_network
|
||||
in hass_http.trusted_networks):
|
||||
if not any(ip_addr in trusted_network for trusted_network
|
||||
in self.trusted_networks):
|
||||
raise InvalidAuthError('Not in trusted_networks')
|
||||
|
||||
|
||||
@@ -100,12 +108,12 @@ class TrustedNetworksLoginFlow(LoginFlow):
|
||||
"""Handler for the login flow."""
|
||||
|
||||
def __init__(self, auth_provider: TrustedNetworksAuthProvider,
|
||||
ip_address: str, available_users: Dict[str, Optional[str]]) \
|
||||
-> None:
|
||||
ip_addr: IPAddress,
|
||||
available_users: Dict[str, Optional[str]]) -> None:
|
||||
"""Initialize the login flow."""
|
||||
super().__init__(auth_provider)
|
||||
self._available_users = available_users
|
||||
self._ip_address = ip_address
|
||||
self._ip_address = ip_addr
|
||||
|
||||
async def async_step_init(
|
||||
self, user_input: Optional[Dict[str, str]] = None) \
|
||||
|
||||
@@ -10,7 +10,8 @@ from typing import Any, Optional, Dict
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant import (
|
||||
core, config as conf_util, config_entries, components as core_components)
|
||||
core, config as conf_util, config_entries, components as core_components,
|
||||
loader)
|
||||
from homeassistant.components import persistent_notification
|
||||
from homeassistant.const import EVENT_HOMEASSISTANT_CLOSE
|
||||
from homeassistant.setup import async_setup_component
|
||||
@@ -84,14 +85,18 @@ async def async_from_config_dict(config: Dict[str, Any],
|
||||
async_enable_logging(hass, verbose, log_rotate_days, log_file,
|
||||
log_no_color)
|
||||
|
||||
hass.config.skip_pip = skip_pip
|
||||
if skip_pip:
|
||||
_LOGGER.warning("Skipping pip installation of required modules. "
|
||||
"This may cause issues")
|
||||
|
||||
core_config = config.get(core.DOMAIN, {})
|
||||
has_api_password = bool((config.get('http') or {}).get('api_password'))
|
||||
has_trusted_networks = bool((config.get('http') or {})
|
||||
.get('trusted_networks'))
|
||||
has_api_password = bool(config.get('http', {}).get('api_password'))
|
||||
trusted_networks = config.get('http', {}).get('trusted_networks')
|
||||
|
||||
try:
|
||||
await conf_util.async_process_ha_core_config(
|
||||
hass, core_config, has_api_password, has_trusted_networks)
|
||||
hass, core_config, has_api_password, trusted_networks)
|
||||
except vol.Invalid as config_err:
|
||||
conf_util.async_log_exception(
|
||||
config_err, 'homeassistant', core_config, hass)
|
||||
@@ -104,11 +109,6 @@ async def async_from_config_dict(config: Dict[str, Any],
|
||||
await hass.async_add_executor_job(
|
||||
conf_util.process_ha_config_upgrade, hass)
|
||||
|
||||
hass.config.skip_pip = skip_pip
|
||||
if skip_pip:
|
||||
_LOGGER.warning("Skipping pip installation of required modules. "
|
||||
"This may cause issues")
|
||||
|
||||
# Make a copy because we are mutating it.
|
||||
config = OrderedDict(config)
|
||||
|
||||
@@ -124,6 +124,15 @@ async def async_from_config_dict(config: Dict[str, Any],
|
||||
if key != core.DOMAIN)
|
||||
components.update(hass.config_entries.async_domains())
|
||||
|
||||
# Resolve all dependencies of all components.
|
||||
for component in list(components):
|
||||
try:
|
||||
components.update(loader.component_dependencies(hass, component))
|
||||
except loader.LoaderError:
|
||||
# Ignore it, or we'll break startup
|
||||
# It will be properly handled during setup.
|
||||
pass
|
||||
|
||||
# setup components
|
||||
res = await core_components.async_setup(hass, config)
|
||||
if not res:
|
||||
@@ -182,6 +191,23 @@ async def async_from_config_dict(config: Dict[str, Any],
|
||||
'\n\n'.join(msg), "Config Warning", "config_warning"
|
||||
)
|
||||
|
||||
# TEMP: warn users of invalid extra keys
|
||||
# Remove after 0.92
|
||||
if cv.INVALID_EXTRA_KEYS_FOUND:
|
||||
msg = []
|
||||
msg.append(
|
||||
"Your configuration contains extra keys "
|
||||
"that the platform does not support (but were silently "
|
||||
"accepted before 0.88). Please find and remove the following."
|
||||
"This will become a breaking change."
|
||||
)
|
||||
msg.append('\n'.join('- {}'.format(it)
|
||||
for it in cv.INVALID_EXTRA_KEYS_FOUND))
|
||||
|
||||
hass.components.persistent_notification.async_create(
|
||||
'\n\n'.join(msg), "Config Warning", "config_warning"
|
||||
)
|
||||
|
||||
return hass
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides basic support for Abode Home Security system.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/abode/
|
||||
"""
|
||||
"""Support for Abode Home Security system."""
|
||||
import logging
|
||||
from functools import partial
|
||||
from requests.exceptions import HTTPError, ConnectTimeout
|
||||
@@ -22,7 +17,8 @@ REQUIREMENTS = ['abodepy==0.15.0']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CONF_ATTRIBUTION = "Data provided by goabode.com"
|
||||
ATTRIBUTION = "Data provided by goabode.com"
|
||||
|
||||
CONF_POLLING = 'polling'
|
||||
|
||||
DOMAIN = 'abode'
|
||||
@@ -285,7 +281,7 @@ class AbodeDevice(Entity):
|
||||
def device_state_attributes(self):
|
||||
"""Return the state attributes."""
|
||||
return {
|
||||
ATTR_ATTRIBUTION: CONF_ATTRIBUTION,
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
'device_id': self._device.device_id,
|
||||
'battery_low': self._device.battery_low,
|
||||
'no_response': self._device.no_response,
|
||||
@@ -332,7 +328,7 @@ class AbodeAutomation(Entity):
|
||||
def device_state_attributes(self):
|
||||
"""Return the state attributes."""
|
||||
return {
|
||||
ATTR_ATTRIBUTION: CONF_ATTRIBUTION,
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
'automation_id': self._automation.automation_id,
|
||||
'type': self._automation.type,
|
||||
'sub_type': self._automation.sub_type
|
||||
@@ -1,13 +1,8 @@
|
||||
"""
|
||||
This component provides HA alarm_control_panel support for Abode System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarm_control_panel.abode/
|
||||
"""
|
||||
"""Support for Abode Security System alarm control panels."""
|
||||
import logging
|
||||
|
||||
import homeassistant.components.alarm_control_panel as alarm
|
||||
from homeassistant.components.abode import CONF_ATTRIBUTION, AbodeDevice
|
||||
from homeassistant.components.abode import ATTRIBUTION, AbodeDevice
|
||||
from homeassistant.components.abode import DOMAIN as ABODE_DOMAIN
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME,
|
||||
@@ -57,11 +52,6 @@ class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanel):
|
||||
state = None
|
||||
return state
|
||||
|
||||
@property
|
||||
def code_format(self):
|
||||
"""Return one or more digits/characters."""
|
||||
return alarm.FORMAT_NUMBER
|
||||
|
||||
def alarm_disarm(self, code=None):
|
||||
"""Send disarm command."""
|
||||
self._device.set_standby()
|
||||
@@ -83,7 +73,7 @@ class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanel):
|
||||
def device_state_attributes(self):
|
||||
"""Return the state attributes."""
|
||||
return {
|
||||
ATTR_ATTRIBUTION: CONF_ATTRIBUTION,
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
'device_id': self._device.device_id,
|
||||
'battery_backup': self._device.battery,
|
||||
'cellular_backup': self._device.is_cellular,
|
||||
@@ -1,20 +1,14 @@
|
||||
"""
|
||||
This component provides HA binary_sensor support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.abode/
|
||||
"""
|
||||
"""Support for Abode Security System binary sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.abode import (AbodeDevice, AbodeAutomation,
|
||||
DOMAIN as ABODE_DOMAIN)
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DEPENDENCIES = ['abode']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
"""Set up a sensor for an Abode device."""
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides HA camera support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/camera.abode/
|
||||
"""
|
||||
"""Support for Abode Security System cameras."""
|
||||
import logging
|
||||
|
||||
from datetime import timedelta
|
||||
@@ -13,7 +8,6 @@ from homeassistant.components.abode import AbodeDevice, DOMAIN as ABODE_DOMAIN
|
||||
from homeassistant.components.camera import Camera
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
|
||||
DEPENDENCIES = ['abode']
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=90)
|
||||
@@ -1,15 +1,9 @@
|
||||
"""
|
||||
This component provides HA cover support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/cover.abode/
|
||||
"""
|
||||
"""Support for Abode Security System covers."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.abode import AbodeDevice, DOMAIN as ABODE_DOMAIN
|
||||
from homeassistant.components.cover import CoverDevice
|
||||
|
||||
|
||||
DEPENDENCIES = ['abode']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides HA light support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/light.abode/
|
||||
"""
|
||||
"""Support for Abode Security System lights."""
|
||||
import logging
|
||||
from math import ceil
|
||||
from homeassistant.components.abode import AbodeDevice, DOMAIN as ABODE_DOMAIN
|
||||
@@ -1,15 +1,9 @@
|
||||
"""
|
||||
This component provides HA lock support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/lock.abode/
|
||||
"""
|
||||
"""Support for Abode Security System locks."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.abode import AbodeDevice, DOMAIN as ABODE_DOMAIN
|
||||
from homeassistant.components.lock import LockDevice
|
||||
|
||||
|
||||
DEPENDENCIES = ['abode']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Abode Security System sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.abode/
|
||||
"""
|
||||
"""Support for Abode Security System sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.abode import AbodeDevice, DOMAIN as ABODE_DOMAIN
|
||||
13
homeassistant/components/abode/services.yaml
Normal file
13
homeassistant/components/abode/services.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
capture_image:
|
||||
description: Request a new image capture from a camera device.
|
||||
fields:
|
||||
entity_id: {description: Entity id of the camera to request an image., example: camera.downstairs_motion_camera}
|
||||
change_setting:
|
||||
description: Change an Abode system setting.
|
||||
fields:
|
||||
setting: {description: Setting to change., example: beeper_mute}
|
||||
value: {description: Value of the setting., example: '1'}
|
||||
trigger_quick_action:
|
||||
description: Trigger an Abode quick action.
|
||||
fields:
|
||||
entity_id: {description: Entity id of the quick action to trigger., example: binary_sensor.home_quick_action}
|
||||
@@ -1,20 +1,14 @@
|
||||
"""
|
||||
This component provides HA switch support for Abode Security System.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.abode/
|
||||
"""
|
||||
"""Support for Abode Security System switches."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.abode import (AbodeDevice, AbodeAutomation,
|
||||
DOMAIN as ABODE_DOMAIN)
|
||||
from homeassistant.components.switch import SwitchDevice
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DEPENDENCIES = ['abode']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
"""Set up Abode switch devices."""
|
||||
@@ -1,38 +1,37 @@
|
||||
"""
|
||||
Support for Automation Device Specification (ADS).
|
||||
|
||||
For more details about this component, please refer to the documentation.
|
||||
https://home-assistant.io/components/ads/
|
||||
"""
|
||||
"""Support for Automation Device Specification (ADS)."""
|
||||
import threading
|
||||
import struct
|
||||
import logging
|
||||
import ctypes
|
||||
from collections import namedtuple
|
||||
|
||||
import voluptuous as vol
|
||||
from homeassistant.const import CONF_DEVICE, CONF_PORT, CONF_IP_ADDRESS, \
|
||||
EVENT_HOMEASSISTANT_STOP
|
||||
|
||||
from homeassistant.const import (
|
||||
CONF_DEVICE, CONF_IP_ADDRESS, CONF_PORT, EVENT_HOMEASSISTANT_STOP)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
REQUIREMENTS = ['pyads==2.2.6']
|
||||
REQUIREMENTS = ['pyads==3.0.7']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DATA_ADS = 'data_ads'
|
||||
|
||||
# Supported Types
|
||||
ADSTYPE_INT = 'int'
|
||||
ADSTYPE_UINT = 'uint'
|
||||
ADSTYPE_BYTE = 'byte'
|
||||
ADSTYPE_BOOL = 'bool'
|
||||
ADSTYPE_BYTE = 'byte'
|
||||
ADSTYPE_DINT = 'dint'
|
||||
ADSTYPE_INT = 'int'
|
||||
ADSTYPE_UDINT = 'udint'
|
||||
ADSTYPE_UINT = 'uint'
|
||||
|
||||
DOMAIN = 'ads'
|
||||
|
||||
CONF_ADS_FACTOR = 'factor'
|
||||
CONF_ADS_TYPE = 'adstype'
|
||||
CONF_ADS_VALUE = 'value'
|
||||
CONF_ADS_VAR = 'adsvar'
|
||||
CONF_ADS_VAR_BRIGHTNESS = 'adsvar_brightness'
|
||||
CONF_ADS_TYPE = 'adstype'
|
||||
CONF_ADS_FACTOR = 'factor'
|
||||
CONF_ADS_VALUE = 'value'
|
||||
|
||||
DOMAIN = 'ads'
|
||||
|
||||
SERVICE_WRITE_DATA_BY_NAME = 'write_data_by_name'
|
||||
|
||||
@@ -46,7 +45,8 @@ CONFIG_SCHEMA = vol.Schema({
|
||||
|
||||
SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema({
|
||||
vol.Required(CONF_ADS_TYPE):
|
||||
vol.In([ADSTYPE_INT, ADSTYPE_UINT, ADSTYPE_BYTE, ADSTYPE_BOOL]),
|
||||
vol.In([ADSTYPE_INT, ADSTYPE_UINT, ADSTYPE_BYTE, ADSTYPE_BOOL,
|
||||
ADSTYPE_DINT, ADSTYPE_UDINT]),
|
||||
vol.Required(CONF_ADS_VALUE): vol.Coerce(int),
|
||||
vol.Required(CONF_ADS_VAR): cv.string,
|
||||
})
|
||||
@@ -66,21 +66,26 @@ def setup(hass, config):
|
||||
AdsHub.ADS_TYPEMAP = {
|
||||
ADSTYPE_BOOL: pyads.PLCTYPE_BOOL,
|
||||
ADSTYPE_BYTE: pyads.PLCTYPE_BYTE,
|
||||
ADSTYPE_DINT: pyads.PLCTYPE_DINT,
|
||||
ADSTYPE_INT: pyads.PLCTYPE_INT,
|
||||
ADSTYPE_UDINT: pyads.PLCTYPE_UDINT,
|
||||
ADSTYPE_UINT: pyads.PLCTYPE_UINT,
|
||||
}
|
||||
|
||||
AdsHub.ADSError = pyads.ADSError
|
||||
AdsHub.PLCTYPE_BOOL = pyads.PLCTYPE_BOOL
|
||||
AdsHub.PLCTYPE_BYTE = pyads.PLCTYPE_BYTE
|
||||
AdsHub.PLCTYPE_DINT = pyads.PLCTYPE_DINT
|
||||
AdsHub.PLCTYPE_INT = pyads.PLCTYPE_INT
|
||||
AdsHub.PLCTYPE_UDINT = pyads.PLCTYPE_UDINT
|
||||
AdsHub.PLCTYPE_UINT = pyads.PLCTYPE_UINT
|
||||
AdsHub.ADSError = pyads.ADSError
|
||||
|
||||
try:
|
||||
ads = AdsHub(client)
|
||||
except pyads.pyads.ADSError:
|
||||
except pyads.ADSError:
|
||||
_LOGGER.error(
|
||||
"Could not connect to ADS host (netid=%s, port=%s)", net_id, port)
|
||||
"Could not connect to ADS host (netid=%s, ip=%s, port=%s)",
|
||||
net_id, ip_address, port)
|
||||
return False
|
||||
|
||||
hass.data[DATA_ADS] = ads
|
||||
@@ -166,14 +171,13 @@ class AdsHub:
|
||||
hnotify, huser = self._client.add_device_notification(
|
||||
name, attr, self._device_notification_callback)
|
||||
hnotify = int(hnotify)
|
||||
self._notification_items[hnotify] = NotificationItem(
|
||||
hnotify, huser, name, plc_datatype, callback)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Added device notification %d for variable %s", hnotify, name)
|
||||
|
||||
self._notification_items[hnotify] = NotificationItem(
|
||||
hnotify, huser, name, plc_datatype, callback)
|
||||
|
||||
def _device_notification_callback(self, addr, notification, huser):
|
||||
def _device_notification_callback(self, notification, name):
|
||||
"""Handle device notifications."""
|
||||
contents = notification.contents
|
||||
|
||||
@@ -182,9 +186,10 @@ class AdsHub:
|
||||
data = contents.data
|
||||
|
||||
try:
|
||||
notification_item = self._notification_items[hnotify]
|
||||
with self._lock:
|
||||
notification_item = self._notification_items[hnotify]
|
||||
except KeyError:
|
||||
_LOGGER.debug("Unknown device notification handle: %d", hnotify)
|
||||
_LOGGER.error("Unknown device notification handle: %d", hnotify)
|
||||
return
|
||||
|
||||
# Parse data to desired datatype
|
||||
@@ -196,6 +201,10 @@ class AdsHub:
|
||||
value = struct.unpack('<B', bytearray(data)[:1])[0]
|
||||
elif notification_item.plc_datatype == self.PLCTYPE_UINT:
|
||||
value = struct.unpack('<H', bytearray(data)[:2])[0]
|
||||
elif notification_item.plc_datatype == self.PLCTYPE_DINT:
|
||||
value = struct.unpack('<i', bytearray(data)[:4])[0]
|
||||
elif notification_item.plc_datatype == self.PLCTYPE_UDINT:
|
||||
value = struct.unpack('<I', bytearray(data)[:4])[0]
|
||||
else:
|
||||
value = bytearray(data)
|
||||
_LOGGER.warning("No callback available for this datatype")
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ADS binary sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation.
|
||||
https://home-assistant.io/components/binary_sensor.ads/
|
||||
"""
|
||||
"""Support for ADS binary sensors."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -44,6 +39,7 @@ class AdsBinarySensor(BinarySensorDevice):
|
||||
def __init__(self, ads_hub, name, ads_var, device_class):
|
||||
"""Initialize ADS binary sensor."""
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self._state = False
|
||||
self._device_class = device_class or 'moving'
|
||||
self._ads_hub = ads_hub
|
||||
@@ -66,6 +62,11 @@ class AdsBinarySensor(BinarySensorDevice):
|
||||
"""Return the default name of the binary sensor."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the device class."""
|
||||
@@ -1,10 +1,4 @@
|
||||
"""
|
||||
Support for ADS light sources.
|
||||
|
||||
For more details about this platform, please refer to the documentation.
|
||||
https://home-assistant.io/components/light.ads/
|
||||
|
||||
"""
|
||||
"""Support for ADS light sources."""
|
||||
import logging
|
||||
import voluptuous as vol
|
||||
from homeassistant.components.light import Light, ATTR_BRIGHTNESS, \
|
||||
@@ -46,6 +40,7 @@ class AdsLight(Light):
|
||||
self._on_state = False
|
||||
self._brightness = None
|
||||
self._name = name
|
||||
self._unique_id = ads_var_enable
|
||||
self.ads_var_enable = ads_var_enable
|
||||
self.ads_var_brightness = ads_var_brightness
|
||||
|
||||
@@ -79,6 +74,11 @@ class AdsLight(Light):
|
||||
"""Return the name of the device if any."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def brightness(self):
|
||||
"""Return the brightness of the light (0..255)."""
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ADS sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation.
|
||||
https://home-assistant.io/components/sensor.ads/
|
||||
"""
|
||||
"""Support for ADS sensors."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -25,7 +20,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Required(CONF_ADS_VAR): cv.string,
|
||||
vol.Optional(CONF_ADS_FACTOR): cv.positive_int,
|
||||
vol.Optional(CONF_ADS_TYPE, default=ads.ADSTYPE_INT):
|
||||
vol.In([ads.ADSTYPE_INT, ads.ADSTYPE_UINT, ads.ADSTYPE_BYTE]),
|
||||
vol.In([ads.ADSTYPE_INT, ads.ADSTYPE_UINT, ads.ADSTYPE_BYTE,
|
||||
ads.ADSTYPE_DINT, ads.ADSTYPE_UDINT]),
|
||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||
vol.Optional(CONF_UNIT_OF_MEASUREMENT, default=''): cv.string,
|
||||
})
|
||||
@@ -55,6 +51,7 @@ class AdsSensor(Entity):
|
||||
"""Initialize AdsSensor entity."""
|
||||
self._ads_hub = ads_hub
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self._value = None
|
||||
self._unit_of_measurement = unit_of_measurement
|
||||
self.ads_var = ads_var
|
||||
@@ -84,6 +81,11 @@ class AdsSensor(Entity):
|
||||
"""Return the name of the entity."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the device."""
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ADS switch platform.
|
||||
|
||||
For more details about this platform, please refer to the documentation.
|
||||
https://home-assistant.io/components/switch.ads/
|
||||
"""
|
||||
"""Support for ADS switch platform."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -37,20 +32,21 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
|
||||
|
||||
class AdsSwitch(ToggleEntity):
|
||||
"""Representation of an Ads switch device."""
|
||||
"""Representation of an ADS switch device."""
|
||||
|
||||
def __init__(self, ads_hub, name, ads_var):
|
||||
"""Initialize the AdsSwitch entity."""
|
||||
self._ads_hub = ads_hub
|
||||
self._on_state = False
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self.ads_var = ads_var
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register device notification."""
|
||||
def update(name, value):
|
||||
"""Handle device notification."""
|
||||
_LOGGER.debug('Variable %s changed its value to %d', name, value)
|
||||
_LOGGER.debug("Variable %s changed its value to %d", name, value)
|
||||
self._on_state = value
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
@@ -68,6 +64,11 @@ class AdsSwitch(ToggleEntity):
|
||||
"""Return the name of the entity."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state to HA."""
|
||||
@@ -8,7 +8,8 @@ from datetime import timedelta
|
||||
import logging
|
||||
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
|
||||
from homeassistant.helpers.config_validation import ( # noqa
|
||||
PLATFORM_SCHEMA, PLATFORM_SCHEMA_BASE)
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
140
homeassistant/components/air_quality/norway_air.py
Normal file
140
homeassistant/components/air_quality/norway_air.py
Normal file
@@ -0,0 +1,140 @@
|
||||
"""
|
||||
Sensor for checking the air quality forecast around Norway.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/air_quality.norway_air/
|
||||
"""
|
||||
import logging
|
||||
|
||||
from datetime import timedelta
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.air_quality import (
|
||||
PLATFORM_SCHEMA, AirQualityEntity)
|
||||
from homeassistant.const import (CONF_LATITUDE, CONF_LONGITUDE,
|
||||
CONF_NAME)
|
||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||
|
||||
|
||||
REQUIREMENTS = ['pyMetno==0.4.6']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
ATTRIBUTION = "Air quality from " \
|
||||
"https://luftkvalitet.miljostatus.no/, " \
|
||||
"delivered by the Norwegian Meteorological Institute."
|
||||
# https://api.met.no/license_data.html
|
||||
|
||||
CONF_FORECAST = 'forecast'
|
||||
|
||||
DEFAULT_FORECAST = 0
|
||||
DEFAULT_NAME = 'Air quality Norway'
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_FORECAST, default=DEFAULT_FORECAST): vol.Coerce(int),
|
||||
vol.Optional(CONF_LATITUDE): cv.latitude,
|
||||
vol.Optional(CONF_LONGITUDE): cv.longitude,
|
||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||
})
|
||||
|
||||
SCAN_INTERVAL = timedelta(minutes=5)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
"""Set up the air_quality norway sensor."""
|
||||
forecast = config.get(CONF_FORECAST)
|
||||
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
||||
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
||||
name = config.get(CONF_NAME)
|
||||
|
||||
if None in (latitude, longitude):
|
||||
_LOGGER.error("Latitude or longitude not set in Home Assistant config")
|
||||
return
|
||||
|
||||
coordinates = {
|
||||
'lat': str(latitude),
|
||||
'lon': str(longitude),
|
||||
}
|
||||
|
||||
async_add_entities([AirSensor(name, coordinates,
|
||||
forecast, async_get_clientsession(hass),
|
||||
)],
|
||||
True)
|
||||
|
||||
|
||||
def round_state(func):
|
||||
"""Round state."""
|
||||
def _decorator(self):
|
||||
res = func(self)
|
||||
if isinstance(res, float):
|
||||
return round(res, 2)
|
||||
return res
|
||||
return _decorator
|
||||
|
||||
|
||||
class AirSensor(AirQualityEntity):
|
||||
"""Representation of an Yr.no sensor."""
|
||||
|
||||
def __init__(self, name, coordinates, forecast, session):
|
||||
"""Initialize the sensor."""
|
||||
import metno
|
||||
self._name = name
|
||||
self._api = metno.AirQualityData(coordinates, forecast, session)
|
||||
|
||||
@property
|
||||
def attribution(self) -> str:
|
||||
"""Return the attribution."""
|
||||
return ATTRIBUTION
|
||||
|
||||
@property
|
||||
def device_state_attributes(self) -> dict:
|
||||
"""Return other details about the sensor state."""
|
||||
return {'level': self._api.data.get('level'),
|
||||
'location': self._api.data.get('location'),
|
||||
}
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""Return the name of the sensor."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
@round_state
|
||||
def air_quality_index(self):
|
||||
"""Return the Air Quality Index (AQI)."""
|
||||
return self._api.data.get('aqi')
|
||||
|
||||
@property
|
||||
@round_state
|
||||
def nitrogen_dioxide(self):
|
||||
"""Return the NO2 (nitrogen dioxide) level."""
|
||||
return self._api.data.get('no2_concentration')
|
||||
|
||||
@property
|
||||
@round_state
|
||||
def ozone(self):
|
||||
"""Return the O3 (ozone) level."""
|
||||
return self._api.data.get('o3_concentration')
|
||||
|
||||
@property
|
||||
@round_state
|
||||
def particulate_matter_2_5(self):
|
||||
"""Return the particulate matter 2.5 level."""
|
||||
return self._api.data.get('pm25_concentration')
|
||||
|
||||
@property
|
||||
@round_state
|
||||
def particulate_matter_10(self):
|
||||
"""Return the particulate matter 10 level."""
|
||||
return self._api.data.get('pm10_concentration')
|
||||
|
||||
@property
|
||||
def unit_of_measurement(self):
|
||||
"""Return the unit of measurement of this entity, if any."""
|
||||
return self._api.units.get('pm25_concentration')
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update the sensor."""
|
||||
await self._api.update()
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for openSenseMap Air Quality data.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/air_quality/opensensemap/
|
||||
"""
|
||||
"""Support for openSenseMap Air Quality data."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
@@ -16,7 +11,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
REQUIREMENTS = ['opensensemap-api==0.1.3']
|
||||
REQUIREMENTS = ['opensensemap-api==0.1.4']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ from homeassistant.const import (
|
||||
SERVICE_ALARM_DISARM, SERVICE_ALARM_ARM_HOME, SERVICE_ALARM_ARM_AWAY,
|
||||
SERVICE_ALARM_ARM_NIGHT, SERVICE_ALARM_ARM_CUSTOM_BYPASS)
|
||||
from homeassistant.helpers.config_validation import ( # noqa
|
||||
PLATFORM_SCHEMA_BASE, PLATFORM_SCHEMA_2 as PLATFORM_SCHEMA)
|
||||
PLATFORM_SCHEMA, PLATFORM_SCHEMA_BASE)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AlarmDecoder devices.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarmdecoder/
|
||||
"""
|
||||
"""Support for AlarmDecoder devices."""
|
||||
import logging
|
||||
|
||||
from datetime import timedelta
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AlarmDecoder-based alarm control panels (Honeywell/DSC).
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarm_control_panel.alarmdecoder/
|
||||
"""
|
||||
"""Support for AlarmDecoder-based alarm control panels (Honeywell/DSC)."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AlarmDecoder zone states- represented as binary sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.alarmdecoder/
|
||||
"""
|
||||
"""Support for AlarmDecoder zone states- represented as binary sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AlarmDecoder Sensors (Shows Panel Display).
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.alarmdecoder/
|
||||
"""
|
||||
"""Support for AlarmDecoder sensors (Shows Panel Display)."""
|
||||
import logging
|
||||
|
||||
from homeassistant.helpers.entity import Entity
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for repeating alerts when conditions are met.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/alert/
|
||||
"""
|
||||
"""Support for repeating alerts when conditions are met."""
|
||||
import asyncio
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
12
homeassistant/components/alert/services.yaml
Normal file
12
homeassistant/components/alert/services.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
toggle:
|
||||
description: Toggle alert's notifications.
|
||||
fields:
|
||||
entity_id: {description: Name of the alert to toggle., example: alert.garage_door_open}
|
||||
turn_off:
|
||||
description: Silence alert's notifications.
|
||||
fields:
|
||||
entity_id: {description: Name of the alert to silence., example: alert.garage_door_open}
|
||||
turn_on:
|
||||
description: Reset alert's notifications.
|
||||
fields:
|
||||
entity_id: {description: Name of the alert to reset., example: alert.garage_door_open}
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Alexa skill service end point.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/alexa/
|
||||
"""
|
||||
"""Support for Alexa skill service end point."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -57,7 +52,7 @@ CONFIG_SCHEMA = vol.Schema({
|
||||
|
||||
|
||||
async def async_setup(hass, config):
|
||||
"""Activate Alexa component."""
|
||||
"""Activate the Alexa component."""
|
||||
config = config.get(DOMAIN, {})
|
||||
flash_briefings_config = config.get(CONF_FLASH_BRIEFINGS)
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
"""Support for Alexa skill auth."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Alexa skill service end point.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/alexa/
|
||||
"""
|
||||
"""Support for Alexa skill service end point."""
|
||||
import copy
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Alexa skill service end point.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/alexa/
|
||||
"""
|
||||
"""Support for Alexa skill service end point."""
|
||||
import enum
|
||||
import logging
|
||||
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
"""Support for alexa Smart Home Skill API.
|
||||
|
||||
API documentation:
|
||||
https://developer.amazon.com/docs/smarthome/understand-the-smart-home-skill-api.html
|
||||
https://developer.amazon.com/docs/device-apis/message-guide.html
|
||||
"""
|
||||
|
||||
"""Support for alexa Smart Home Skill API."""
|
||||
import asyncio
|
||||
from collections import OrderedDict
|
||||
from datetime import datetime
|
||||
@@ -17,8 +11,9 @@ import aiohttp
|
||||
import async_timeout
|
||||
|
||||
from homeassistant.components import (
|
||||
alert, automation, binary_sensor, climate, cover, fan, group, http,
|
||||
alert, automation, binary_sensor, cover, fan, group, http,
|
||||
input_boolean, light, lock, media_player, scene, script, sensor, switch)
|
||||
from homeassistant.components.climate import const as climate
|
||||
from homeassistant.helpers import aiohttp_client
|
||||
from homeassistant.helpers.event import async_track_state_change
|
||||
from homeassistant.const import (
|
||||
@@ -27,9 +22,9 @@ from homeassistant.const import (
|
||||
CONF_NAME, SERVICE_LOCK, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE,
|
||||
SERVICE_MEDIA_PLAY, SERVICE_MEDIA_PREVIOUS_TRACK, SERVICE_MEDIA_STOP,
|
||||
SERVICE_SET_COVER_POSITION, SERVICE_TURN_OFF, SERVICE_TURN_ON,
|
||||
SERVICE_UNLOCK, SERVICE_VOLUME_SET, STATE_LOCKED, STATE_ON,
|
||||
STATE_UNAVAILABLE, STATE_UNLOCKED, TEMP_CELSIUS, TEMP_FAHRENHEIT,
|
||||
MATCH_ALL)
|
||||
SERVICE_UNLOCK, SERVICE_VOLUME_DOWN, SERVICE_VOLUME_UP, SERVICE_VOLUME_SET,
|
||||
SERVICE_VOLUME_MUTE, STATE_LOCKED, STATE_ON, STATE_OFF, STATE_UNAVAILABLE,
|
||||
STATE_UNLOCKED, TEMP_CELSIUS, TEMP_FAHRENHEIT, MATCH_ALL)
|
||||
import homeassistant.core as ha
|
||||
import homeassistant.util.color as color_util
|
||||
from homeassistant.util.decorator import Registry
|
||||
@@ -63,10 +58,11 @@ API_THERMOSTAT_MODES = OrderedDict([
|
||||
(climate.STATE_COOL, 'COOL'),
|
||||
(climate.STATE_AUTO, 'AUTO'),
|
||||
(climate.STATE_ECO, 'ECO'),
|
||||
(climate.STATE_OFF, 'OFF'),
|
||||
(climate.STATE_MANUAL, 'AUTO'),
|
||||
(STATE_OFF, 'OFF'),
|
||||
(climate.STATE_IDLE, 'OFF'),
|
||||
(climate.STATE_FAN_ONLY, 'OFF'),
|
||||
(climate.STATE_DRY, 'OFF')
|
||||
(climate.STATE_DRY, 'OFF'),
|
||||
])
|
||||
|
||||
SMART_HOME_HTTP_ENDPOINT = '/api/alexa/smart_home'
|
||||
@@ -770,7 +766,7 @@ class _AlexaThermostatController(_AlexaInterface):
|
||||
|
||||
unit = self.hass.config.units.temperature_unit
|
||||
if name == 'targetSetpoint':
|
||||
temp = self.entity.attributes.get(climate.ATTR_TEMPERATURE)
|
||||
temp = self.entity.attributes.get(ATTR_TEMPERATURE)
|
||||
elif name == 'lowerSetpoint':
|
||||
temp = self.entity.attributes.get(climate.ATTR_TARGET_TEMP_LOW)
|
||||
elif name == 'upperSetpoint':
|
||||
@@ -883,7 +879,7 @@ class _LockCapabilities(_AlexaEntity):
|
||||
_AlexaEndpointHealth(self.hass, self.entity)]
|
||||
|
||||
|
||||
@ENTITY_ADAPTERS.register(media_player.DOMAIN)
|
||||
@ENTITY_ADAPTERS.register(media_player.const.DOMAIN)
|
||||
class _MediaPlayerCapabilities(_AlexaEntity):
|
||||
def default_display_categories(self):
|
||||
return [_DisplayCategory.TV]
|
||||
@@ -893,19 +889,19 @@ class _MediaPlayerCapabilities(_AlexaEntity):
|
||||
yield _AlexaEndpointHealth(self.hass, self.entity)
|
||||
|
||||
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||
if supported & media_player.SUPPORT_VOLUME_SET:
|
||||
if supported & media_player.const.SUPPORT_VOLUME_SET:
|
||||
yield _AlexaSpeaker(self.entity)
|
||||
|
||||
step_volume_features = (media_player.SUPPORT_VOLUME_MUTE |
|
||||
media_player.SUPPORT_VOLUME_STEP)
|
||||
step_volume_features = (media_player.const.SUPPORT_VOLUME_MUTE |
|
||||
media_player.const.SUPPORT_VOLUME_STEP)
|
||||
if supported & step_volume_features:
|
||||
yield _AlexaStepSpeaker(self.entity)
|
||||
|
||||
playback_features = (media_player.SUPPORT_PLAY |
|
||||
media_player.SUPPORT_PAUSE |
|
||||
media_player.SUPPORT_STOP |
|
||||
media_player.SUPPORT_NEXT_TRACK |
|
||||
media_player.SUPPORT_PREVIOUS_TRACK)
|
||||
playback_features = (media_player.const.SUPPORT_PLAY |
|
||||
media_player.const.SUPPORT_PAUSE |
|
||||
media_player.const.SUPPORT_STOP |
|
||||
media_player.const.SUPPORT_NEXT_TRACK |
|
||||
media_player.const.SUPPORT_PREVIOUS_TRACK)
|
||||
if supported & playback_features:
|
||||
yield _AlexaPlaybackController(self.entity)
|
||||
|
||||
@@ -1792,7 +1788,7 @@ async def async_api_set_volume(hass, config, directive, context):
|
||||
|
||||
data = {
|
||||
ATTR_ENTITY_ID: entity.entity_id,
|
||||
media_player.ATTR_MEDIA_VOLUME_LEVEL: volume,
|
||||
media_player.const.ATTR_MEDIA_VOLUME_LEVEL: volume,
|
||||
}
|
||||
|
||||
await hass.services.async_call(
|
||||
@@ -1809,7 +1805,8 @@ async def async_api_select_input(hass, config, directive, context):
|
||||
entity = directive.entity
|
||||
|
||||
# attempt to map the ALL UPPERCASE payload name to a source
|
||||
source_list = entity.attributes[media_player.ATTR_INPUT_SOURCE_LIST] or []
|
||||
source_list = entity.attributes[
|
||||
media_player.const.ATTR_INPUT_SOURCE_LIST] or []
|
||||
for source in source_list:
|
||||
# response will always be space separated, so format the source in the
|
||||
# most likely way to find a match
|
||||
@@ -1824,7 +1821,7 @@ async def async_api_select_input(hass, config, directive, context):
|
||||
|
||||
data = {
|
||||
ATTR_ENTITY_ID: entity.entity_id,
|
||||
media_player.ATTR_INPUT_SOURCE: media_input,
|
||||
media_player.const.ATTR_INPUT_SOURCE: media_input,
|
||||
}
|
||||
|
||||
await hass.services.async_call(
|
||||
@@ -1840,7 +1837,8 @@ async def async_api_adjust_volume(hass, config, directive, context):
|
||||
volume_delta = int(directive.payload['volume'])
|
||||
|
||||
entity = directive.entity
|
||||
current_level = entity.attributes.get(media_player.ATTR_MEDIA_VOLUME_LEVEL)
|
||||
current_level = entity.attributes.get(
|
||||
media_player.const.ATTR_MEDIA_VOLUME_LEVEL)
|
||||
|
||||
# read current state
|
||||
try:
|
||||
@@ -1852,11 +1850,11 @@ async def async_api_adjust_volume(hass, config, directive, context):
|
||||
|
||||
data = {
|
||||
ATTR_ENTITY_ID: entity.entity_id,
|
||||
media_player.ATTR_MEDIA_VOLUME_LEVEL: volume,
|
||||
media_player.const.ATTR_MEDIA_VOLUME_LEVEL: volume,
|
||||
}
|
||||
|
||||
await hass.services.async_call(
|
||||
entity.domain, media_player.SERVICE_VOLUME_SET,
|
||||
entity.domain, SERVICE_VOLUME_SET,
|
||||
data, blocking=False, context=context)
|
||||
|
||||
return directive.response()
|
||||
@@ -1878,11 +1876,11 @@ async def async_api_adjust_volume_step(hass, config, directive, context):
|
||||
|
||||
if volume_step > 0:
|
||||
await hass.services.async_call(
|
||||
entity.domain, media_player.SERVICE_VOLUME_UP,
|
||||
entity.domain, SERVICE_VOLUME_UP,
|
||||
data, blocking=False, context=context)
|
||||
elif volume_step < 0:
|
||||
await hass.services.async_call(
|
||||
entity.domain, media_player.SERVICE_VOLUME_DOWN,
|
||||
entity.domain, SERVICE_VOLUME_DOWN,
|
||||
data, blocking=False, context=context)
|
||||
|
||||
return directive.response()
|
||||
@@ -1897,11 +1895,11 @@ async def async_api_set_mute(hass, config, directive, context):
|
||||
|
||||
data = {
|
||||
ATTR_ENTITY_ID: entity.entity_id,
|
||||
media_player.ATTR_MEDIA_VOLUME_MUTED: mute,
|
||||
media_player.const.ATTR_MEDIA_VOLUME_MUTED: mute,
|
||||
}
|
||||
|
||||
await hass.services.async_call(
|
||||
entity.domain, media_player.SERVICE_VOLUME_MUTE,
|
||||
entity.domain, SERVICE_VOLUME_MUTE,
|
||||
data, blocking=False, context=context)
|
||||
|
||||
return directive.response()
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Applikationsn\u00f8gle og/eller API n\u00f8gle er allerede registreret",
|
||||
"invalid_key": "Ugyldig API n\u00f8gle og/eller applikationsn\u00f8gle",
|
||||
"no_devices": "Ingen enheder fundet i konto"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API n\u00f8gle",
|
||||
"app_key": "Applikationsn\u00f8gle"
|
||||
},
|
||||
"title": "Udfyld dine oplysninger"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Anwendungsschl\u00fcssel und / oder API-Schl\u00fcssel bereits registriert",
|
||||
"invalid_key": "Ung\u00fcltiger API Key und / oder Anwendungsschl\u00fcssel",
|
||||
"no_devices": "Keine Ger\u00e4te im Konto gefunden"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API Key",
|
||||
"app_key": "Anwendungsschl\u00fcssel"
|
||||
},
|
||||
"title": "Gib deine Informationen ein"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Clave de aplicaci\u00f3n y/o clave de API ya registrada",
|
||||
"invalid_key": "Clave de API y/o clave de aplicaci\u00f3n no v\u00e1lida",
|
||||
"no_devices": "No se han encontrado dispositivos en la cuenta."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "Clave API",
|
||||
"app_key": "Clave de aplicaci\u00f3n"
|
||||
},
|
||||
"title": "Completa tu informaci\u00f3n"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Completa tu informaci\u00f3n"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Cl\u00e9 d'application et / ou cl\u00e9 API d\u00e9j\u00e0 enregistr\u00e9e",
|
||||
"invalid_key": "Cl\u00e9 d'API et / ou cl\u00e9 d'application non valide",
|
||||
"no_devices": "Aucun appareil trouv\u00e9 dans le compte"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "Cl\u00e9 d'API",
|
||||
"app_key": "Cl\u00e9 d'application"
|
||||
},
|
||||
"title": "Veuillez saisir vos informations"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"no_devices": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05d4\u05ea\u05e7\u05df \u05d1\u05d7\u05e9\u05d1\u05d5\u05df"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "\u05de\u05e4\u05ea\u05d7 API"
|
||||
},
|
||||
"title": "\u05de\u05dc\u05d0 \u05d0\u05ea \u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05dc\u05da"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Alkalmaz\u00e1s kulcsot \u00e9s/vagy az API kulcsot m\u00e1r regisztr\u00e1lt\u00e1k",
|
||||
"invalid_key": "\u00c9rv\u00e9nytelen API kulcs \u00e9s / vagy alkalmaz\u00e1skulcs",
|
||||
"no_devices": "Nincs a fi\u00f3kodban tal\u00e1lhat\u00f3 eszk\u00f6z"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API kulcs",
|
||||
"app_key": "Alkalmaz\u00e1skulcs"
|
||||
},
|
||||
"title": "T\u00f6ltsd ki az adataid"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "API Key e/o Application Key gi\u00e0 registrata",
|
||||
"invalid_key": "API Key e/o Application Key non valida",
|
||||
"no_devices": "Nessun dispositivo trovato nell'account"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API Key",
|
||||
"app_key": "Application Key"
|
||||
},
|
||||
"title": "Inserisci i tuoi dati"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
"api_key": "API \ud0a4",
|
||||
"app_key": "Application \ud0a4"
|
||||
},
|
||||
"title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc138\uc694"
|
||||
"title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Applicatiesleutel en/of API-sleutel al geregistreerd",
|
||||
"invalid_key": "Ongeldige API-sleutel en/of applicatiesleutel",
|
||||
"no_devices": "Geen apparaten gevonden in account"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API-sleutel",
|
||||
"app_key": "Applicatiesleutel"
|
||||
},
|
||||
"title": "Vul uw gegevens in"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Programn\u00f8kkel og/eller API-n\u00f8kkel er allerede registrert",
|
||||
"invalid_key": "Ugyldig API-n\u00f8kkel og/eller programn\u00f8kkel",
|
||||
"no_devices": "Ingen enheter funnet i kontoen"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API-n\u00f8kkel",
|
||||
"app_key": "Applikasjonsn\u00f8kkel"
|
||||
},
|
||||
"title": "Fyll ut informasjonen din"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Klucz aplikacji i/lub klucz API ju\u017c jest zarejestrowany",
|
||||
"invalid_key": "Nieprawid\u0142owy klucz API i/lub klucz aplikacji",
|
||||
"no_devices": "Nie znaleziono urz\u0105dze\u0144 na koncie"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "Klucz API",
|
||||
"app_key": "Klucz aplikacji"
|
||||
},
|
||||
"title": "Wprowad\u017a swoje dane"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Chave de aplica\u00e7\u00e3o e/ou chave de API j\u00e1 registradas.",
|
||||
"invalid_key": "Chave de API e/ou chave de aplica\u00e7\u00e3o inv\u00e1lidas",
|
||||
"no_devices": "Nenhum dispositivo encontrado na conta"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "Chave de API",
|
||||
"app_key": "Chave de aplica\u00e7\u00e3o"
|
||||
},
|
||||
"title": "Preencha as suas informa\u00e7\u00f5es"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Aplikacijski klju\u010d in / ali klju\u010d API je \u017ee registriran",
|
||||
"invalid_key": "Neveljaven klju\u010d API in / ali klju\u010d aplikacije",
|
||||
"no_devices": "V ra\u010dunu ni najdene nobene naprave"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API Klju\u010d",
|
||||
"app_key": "Klju\u010d aplikacije"
|
||||
},
|
||||
"title": "Izpolnite svoje podatke"
|
||||
}
|
||||
},
|
||||
"title": "Ambient PWS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Applikationsnyckel och/eller API-nyckel \u00e4r redan registrerade",
|
||||
"invalid_key": "Ogiltigt API-nyckel och/eller applikationsnyckel",
|
||||
"no_devices": "Inga enheter hittades i kontot"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API-nyckel",
|
||||
"app_key": "Applikationsnyckel"
|
||||
},
|
||||
"title": "Fyll i dina uppgifter"
|
||||
}
|
||||
},
|
||||
"title": "Ambient Weather PWS (Personal Weather Station)"
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Ambient Weather Station Service.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/ambient_station/
|
||||
"""
|
||||
"""Support for Ambient Weather Station Service."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -12,62 +7,217 @@ from homeassistant.config_entries import SOURCE_IMPORT
|
||||
from homeassistant.const import (
|
||||
ATTR_NAME, ATTR_LOCATION, CONF_API_KEY, CONF_MONITORED_CONDITIONS,
|
||||
EVENT_HOMEASSISTANT_STOP)
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.exceptions import ConfigEntryNotReady
|
||||
from homeassistant.helpers import aiohttp_client, config_validation as cv
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
||||
from homeassistant.helpers.dispatcher import (
|
||||
async_dispatcher_connect, async_dispatcher_send)
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.helpers.event import async_call_later
|
||||
|
||||
from .config_flow import configured_instances
|
||||
from .const import (
|
||||
ATTR_LAST_DATA, CONF_APP_KEY, DATA_CLIENT, DOMAIN, TOPIC_UPDATE)
|
||||
ATTR_LAST_DATA, CONF_APP_KEY, DATA_CLIENT, DOMAIN, TOPIC_UPDATE,
|
||||
TYPE_BINARY_SENSOR, TYPE_SENSOR)
|
||||
|
||||
REQUIREMENTS = ['aioambient==0.1.3']
|
||||
|
||||
REQUIREMENTS = ['aioambient==0.1.0']
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DEFAULT_SOCKET_MIN_RETRY = 15
|
||||
DATA_CONFIG = 'config'
|
||||
|
||||
DEFAULT_SOCKET_MIN_RETRY = 15
|
||||
DEFAULT_WATCHDOG_SECONDS = 5 * 60
|
||||
|
||||
TYPE_24HOURRAININ = '24hourrainin'
|
||||
TYPE_BAROMABSIN = 'baromabsin'
|
||||
TYPE_BAROMRELIN = 'baromrelin'
|
||||
TYPE_BATT1 = 'batt1'
|
||||
TYPE_BATT10 = 'batt10'
|
||||
TYPE_BATT2 = 'batt2'
|
||||
TYPE_BATT3 = 'batt3'
|
||||
TYPE_BATT4 = 'batt4'
|
||||
TYPE_BATT5 = 'batt5'
|
||||
TYPE_BATT6 = 'batt6'
|
||||
TYPE_BATT7 = 'batt7'
|
||||
TYPE_BATT8 = 'batt8'
|
||||
TYPE_BATT9 = 'batt9'
|
||||
TYPE_BATTOUT = 'battout'
|
||||
TYPE_CO2 = 'co2'
|
||||
TYPE_DAILYRAININ = 'dailyrainin'
|
||||
TYPE_DEWPOINT = 'dewPoint'
|
||||
TYPE_EVENTRAININ = 'eventrainin'
|
||||
TYPE_FEELSLIKE = 'feelsLike'
|
||||
TYPE_HOURLYRAININ = 'hourlyrainin'
|
||||
TYPE_HUMIDITY = 'humidity'
|
||||
TYPE_HUMIDITY1 = 'humidity1'
|
||||
TYPE_HUMIDITY10 = 'humidity10'
|
||||
TYPE_HUMIDITY2 = 'humidity2'
|
||||
TYPE_HUMIDITY3 = 'humidity3'
|
||||
TYPE_HUMIDITY4 = 'humidity4'
|
||||
TYPE_HUMIDITY5 = 'humidity5'
|
||||
TYPE_HUMIDITY6 = 'humidity6'
|
||||
TYPE_HUMIDITY7 = 'humidity7'
|
||||
TYPE_HUMIDITY8 = 'humidity8'
|
||||
TYPE_HUMIDITY9 = 'humidity9'
|
||||
TYPE_HUMIDITYIN = 'humidityin'
|
||||
TYPE_LASTRAIN = 'lastRain'
|
||||
TYPE_MAXDAILYGUST = 'maxdailygust'
|
||||
TYPE_MONTHLYRAININ = 'monthlyrainin'
|
||||
TYPE_RELAY1 = 'relay1'
|
||||
TYPE_RELAY10 = 'relay10'
|
||||
TYPE_RELAY2 = 'relay2'
|
||||
TYPE_RELAY3 = 'relay3'
|
||||
TYPE_RELAY4 = 'relay4'
|
||||
TYPE_RELAY5 = 'relay5'
|
||||
TYPE_RELAY6 = 'relay6'
|
||||
TYPE_RELAY7 = 'relay7'
|
||||
TYPE_RELAY8 = 'relay8'
|
||||
TYPE_RELAY9 = 'relay9'
|
||||
TYPE_SOILHUM1 = 'soilhum1'
|
||||
TYPE_SOILHUM10 = 'soilhum10'
|
||||
TYPE_SOILHUM2 = 'soilhum2'
|
||||
TYPE_SOILHUM3 = 'soilhum3'
|
||||
TYPE_SOILHUM4 = 'soilhum4'
|
||||
TYPE_SOILHUM5 = 'soilhum5'
|
||||
TYPE_SOILHUM6 = 'soilhum6'
|
||||
TYPE_SOILHUM7 = 'soilhum7'
|
||||
TYPE_SOILHUM8 = 'soilhum8'
|
||||
TYPE_SOILHUM9 = 'soilhum9'
|
||||
TYPE_SOILTEMP1F = 'soiltemp1f'
|
||||
TYPE_SOILTEMP10F = 'soiltemp10f'
|
||||
TYPE_SOILTEMP2F = 'soiltemp2f'
|
||||
TYPE_SOILTEMP3F = 'soiltemp3f'
|
||||
TYPE_SOILTEMP4F = 'soiltemp4f'
|
||||
TYPE_SOILTEMP5F = 'soiltemp5f'
|
||||
TYPE_SOILTEMP6F = 'soiltemp6f'
|
||||
TYPE_SOILTEMP7F = 'soiltemp7f'
|
||||
TYPE_SOILTEMP8F = 'soiltemp8f'
|
||||
TYPE_SOILTEMP9F = 'soiltemp9f'
|
||||
TYPE_SOLARRADIATION = 'solarradiation'
|
||||
TYPE_TEMP10F = 'temp10f'
|
||||
TYPE_TEMP1F = 'temp1f'
|
||||
TYPE_TEMP2F = 'temp2f'
|
||||
TYPE_TEMP3F = 'temp3f'
|
||||
TYPE_TEMP4F = 'temp4f'
|
||||
TYPE_TEMP5F = 'temp5f'
|
||||
TYPE_TEMP6F = 'temp6f'
|
||||
TYPE_TEMP7F = 'temp7f'
|
||||
TYPE_TEMP8F = 'temp8f'
|
||||
TYPE_TEMP9F = 'temp9f'
|
||||
TYPE_TEMPF = 'tempf'
|
||||
TYPE_TEMPINF = 'tempinf'
|
||||
TYPE_TOTALRAININ = 'totalrainin'
|
||||
TYPE_UV = 'uv'
|
||||
TYPE_WEEKLYRAININ = 'weeklyrainin'
|
||||
TYPE_WINDDIR = 'winddir'
|
||||
TYPE_WINDDIR_AVG10M = 'winddir_avg10m'
|
||||
TYPE_WINDDIR_AVG2M = 'winddir_avg2m'
|
||||
TYPE_WINDGUSTDIR = 'windgustdir'
|
||||
TYPE_WINDGUSTMPH = 'windgustmph'
|
||||
TYPE_WINDSPDMPH_AVG10M = 'windspdmph_avg10m'
|
||||
TYPE_WINDSPDMPH_AVG2M = 'windspdmph_avg2m'
|
||||
TYPE_WINDSPEEDMPH = 'windspeedmph'
|
||||
TYPE_YEARLYRAININ = 'yearlyrainin'
|
||||
SENSOR_TYPES = {
|
||||
'24hourrainin': ('24 Hr Rain', 'in'),
|
||||
'baromabsin': ('Abs Pressure', 'inHg'),
|
||||
'baromrelin': ('Rel Pressure', 'inHg'),
|
||||
'battout': ('Battery', ''),
|
||||
'co2': ('co2', 'ppm'),
|
||||
'dailyrainin': ('Daily Rain', 'in'),
|
||||
'dewPoint': ('Dew Point', '°F'),
|
||||
'eventrainin': ('Event Rain', 'in'),
|
||||
'feelsLike': ('Feels Like', '°F'),
|
||||
'hourlyrainin': ('Hourly Rain Rate', 'in/hr'),
|
||||
'humidity': ('Humidity', '%'),
|
||||
'humidityin': ('Humidity In', '%'),
|
||||
'lastRain': ('Last Rain', ''),
|
||||
'maxdailygust': ('Max Gust', 'mph'),
|
||||
'monthlyrainin': ('Monthly Rain', 'in'),
|
||||
'solarradiation': ('Solar Rad', 'W/m^2'),
|
||||
'tempf': ('Temp', '°F'),
|
||||
'tempinf': ('Inside Temp', '°F'),
|
||||
'totalrainin': ('Lifetime Rain', 'in'),
|
||||
'uv': ('uv', 'Index'),
|
||||
'weeklyrainin': ('Weekly Rain', 'in'),
|
||||
'winddir': ('Wind Dir', '°'),
|
||||
'winddir_avg10m': ('Wind Dir Avg 10m', '°'),
|
||||
'winddir_avg2m': ('Wind Dir Avg 2m', 'mph'),
|
||||
'windgustdir': ('Gust Dir', '°'),
|
||||
'windgustmph': ('Wind Gust', 'mph'),
|
||||
'windspdmph_avg10m': ('Wind Avg 10m', 'mph'),
|
||||
'windspdmph_avg2m': ('Wind Avg 2m', 'mph'),
|
||||
'windspeedmph': ('Wind Speed', 'mph'),
|
||||
'yearlyrainin': ('Yearly Rain', 'in'),
|
||||
TYPE_24HOURRAININ: ('24 Hr Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_BAROMABSIN: ('Abs Pressure', 'inHg', TYPE_SENSOR, None),
|
||||
TYPE_BAROMRELIN: ('Rel Pressure', 'inHg', TYPE_SENSOR, None),
|
||||
TYPE_BATT10: ('Battery 10', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT1: ('Battery 1', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT2: ('Battery 2', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT3: ('Battery 3', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT4: ('Battery 4', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT5: ('Battery 5', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT6: ('Battery 6', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT7: ('Battery 7', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT8: ('Battery 8', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATT9: ('Battery 9', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_BATTOUT: ('Battery', None, TYPE_BINARY_SENSOR, 'battery'),
|
||||
TYPE_CO2: ('co2', 'ppm', TYPE_SENSOR, None),
|
||||
TYPE_DAILYRAININ: ('Daily Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_DEWPOINT: ('Dew Point', '°F', TYPE_SENSOR, None),
|
||||
TYPE_EVENTRAININ: ('Event Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_FEELSLIKE: ('Feels Like', '°F', TYPE_SENSOR, None),
|
||||
TYPE_HOURLYRAININ: ('Hourly Rain Rate', 'in/hr', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY10: ('Humidity 10', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY1: ('Humidity 1', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY2: ('Humidity 2', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY3: ('Humidity 3', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY4: ('Humidity 4', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY5: ('Humidity 5', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY6: ('Humidity 6', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY7: ('Humidity 7', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY8: ('Humidity 8', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY9: ('Humidity 9', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITY: ('Humidity', '%', TYPE_SENSOR, None),
|
||||
TYPE_HUMIDITYIN: ('Humidity In', '%', TYPE_SENSOR, None),
|
||||
TYPE_LASTRAIN: ('Last Rain', None, TYPE_SENSOR, None),
|
||||
TYPE_MAXDAILYGUST: ('Max Gust', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_MONTHLYRAININ: ('Monthly Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_RELAY10: ('Relay 10', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY1: ('Relay 1', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY2: ('Relay 2', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY3: ('Relay 3', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY4: ('Relay 4', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY5: ('Relay 5', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY6: ('Relay 6', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY7: ('Relay 7', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY8: ('Relay 8', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_RELAY9: ('Relay 9', None, TYPE_BINARY_SENSOR, 'connectivity'),
|
||||
TYPE_SOILHUM10: ('Soil Humidity 10', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM1: ('Soil Humidity 1', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM2: ('Soil Humidity 2', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM3: ('Soil Humidity 3', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM4: ('Soil Humidity 4', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM5: ('Soil Humidity 5', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM6: ('Soil Humidity 6', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM7: ('Soil Humidity 7', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM8: ('Soil Humidity 8', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILHUM9: ('Soil Humidity 9', '%', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP10F: ('Soil Temp 10', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP1F: ('Soil Temp 1', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP2F: ('Soil Temp 2', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP3F: ('Soil Temp 3', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP4F: ('Soil Temp 4', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP5F: ('Soil Temp 5', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP6F: ('Soil Temp 6', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP7F: ('Soil Temp 7', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP8F: ('Soil Temp 8', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOILTEMP9F: ('Soil Temp 9', '°F', TYPE_SENSOR, None),
|
||||
TYPE_SOLARRADIATION: ('Solar Rad', 'W/m^2', TYPE_SENSOR, None),
|
||||
TYPE_TEMP10F: ('Temp 10', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP1F: ('Temp 1', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP2F: ('Temp 2', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP3F: ('Temp 3', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP4F: ('Temp 4', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP5F: ('Temp 5', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP6F: ('Temp 6', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP7F: ('Temp 7', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP8F: ('Temp 8', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMP9F: ('Temp 9', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMPF: ('Temp', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TEMPINF: ('Inside Temp', '°F', TYPE_SENSOR, None),
|
||||
TYPE_TOTALRAININ: ('Lifetime Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_UV: ('uv', 'Index', TYPE_SENSOR, None),
|
||||
TYPE_WEEKLYRAININ: ('Weekly Rain', 'in', TYPE_SENSOR, None),
|
||||
TYPE_WINDDIR: ('Wind Dir', '°', TYPE_SENSOR, None),
|
||||
TYPE_WINDDIR_AVG10M: ('Wind Dir Avg 10m', '°', TYPE_SENSOR, None),
|
||||
TYPE_WINDDIR_AVG2M: ('Wind Dir Avg 2m', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_WINDGUSTDIR: ('Gust Dir', '°', TYPE_SENSOR, None),
|
||||
TYPE_WINDGUSTMPH: ('Wind Gust', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_WINDSPDMPH_AVG10M: ('Wind Avg 10m', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_WINDSPDMPH_AVG2M: ('Wind Avg 2m', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_WINDSPEEDMPH: ('Wind Speed', 'mph', TYPE_SENSOR, None),
|
||||
TYPE_YEARLYRAININ: ('Yearly Rain', 'in', TYPE_SENSOR, None),
|
||||
}
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema({
|
||||
DOMAIN:
|
||||
vol.Schema({
|
||||
vol.Required(CONF_APP_KEY):
|
||||
cv.string,
|
||||
vol.Required(CONF_API_KEY):
|
||||
cv.string,
|
||||
vol.Optional(
|
||||
CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES)):
|
||||
vol.Required(CONF_APP_KEY): cv.string,
|
||||
vol.Required(CONF_API_KEY): cv.string,
|
||||
vol.Optional(CONF_MONITORED_CONDITIONS):
|
||||
vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]),
|
||||
})
|
||||
}, extra=vol.ALLOW_EXTRA)
|
||||
@@ -83,12 +233,20 @@ async def async_setup(hass, config):
|
||||
|
||||
conf = config[DOMAIN]
|
||||
|
||||
# Store config for use during entry setup:
|
||||
hass.data[DOMAIN][DATA_CONFIG] = conf
|
||||
|
||||
if conf[CONF_APP_KEY] in configured_instances(hass):
|
||||
return True
|
||||
|
||||
hass.async_create_task(
|
||||
hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={'source': SOURCE_IMPORT}, data=conf))
|
||||
DOMAIN,
|
||||
context={'source': SOURCE_IMPORT},
|
||||
data={
|
||||
CONF_API_KEY: conf[CONF_API_KEY],
|
||||
CONF_APP_KEY: conf[CONF_APP_KEY]
|
||||
}))
|
||||
|
||||
return True
|
||||
|
||||
@@ -96,22 +254,21 @@ async def async_setup(hass, config):
|
||||
async def async_setup_entry(hass, config_entry):
|
||||
"""Set up the Ambient PWS as config entry."""
|
||||
from aioambient import Client
|
||||
from aioambient.errors import WebsocketConnectionError
|
||||
from aioambient.errors import WebsocketError
|
||||
|
||||
session = aiohttp_client.async_get_clientsession(hass)
|
||||
|
||||
try:
|
||||
ambient = AmbientStation(
|
||||
hass,
|
||||
config_entry,
|
||||
hass, config_entry,
|
||||
Client(
|
||||
config_entry.data[CONF_API_KEY],
|
||||
config_entry.data[CONF_APP_KEY], session),
|
||||
config_entry.data.get(
|
||||
CONF_MONITORED_CONDITIONS, list(SENSOR_TYPES)))
|
||||
hass.data[DOMAIN].get(DATA_CONFIG, {}).get(
|
||||
CONF_MONITORED_CONDITIONS, []))
|
||||
hass.loop.create_task(ambient.ws_connect())
|
||||
hass.data[DOMAIN][DATA_CLIENT][config_entry.entry_id] = ambient
|
||||
except WebsocketConnectionError as err:
|
||||
except WebsocketError as err:
|
||||
_LOGGER.error('Config entry failed: %s', err)
|
||||
raise ConfigEntryNotReady
|
||||
|
||||
@@ -126,8 +283,9 @@ async def async_unload_entry(hass, config_entry):
|
||||
ambient = hass.data[DOMAIN][DATA_CLIENT].pop(config_entry.entry_id)
|
||||
hass.async_create_task(ambient.ws_disconnect())
|
||||
|
||||
await hass.config_entries.async_forward_entry_unload(
|
||||
config_entry, 'sensor')
|
||||
for component in ('binary_sensor', 'sensor'):
|
||||
await hass.config_entries.async_forward_entry_unload(
|
||||
config_entry, component)
|
||||
|
||||
return True
|
||||
|
||||
@@ -139,6 +297,7 @@ class AmbientStation:
|
||||
"""Initialize."""
|
||||
self._config_entry = config_entry
|
||||
self._hass = hass
|
||||
self._watchdog_listener = None
|
||||
self._ws_reconnect_delay = DEFAULT_SOCKET_MIN_RETRY
|
||||
self.client = client
|
||||
self.monitored_conditions = monitored_conditions
|
||||
@@ -148,9 +307,18 @@ class AmbientStation:
|
||||
"""Register handlers and connect to the websocket."""
|
||||
from aioambient.errors import WebsocketError
|
||||
|
||||
async def _ws_reconnect(event_time):
|
||||
"""Forcibly disconnect from and reconnect to the websocket."""
|
||||
_LOGGER.debug('Watchdog expired; forcing socket reconnection')
|
||||
await self.client.websocket.disconnect()
|
||||
await self.client.websocket.connect()
|
||||
|
||||
def on_connect():
|
||||
"""Define a handler to fire when the websocket is connected."""
|
||||
_LOGGER.info('Connected to websocket')
|
||||
_LOGGER.debug('Watchdog starting')
|
||||
self._watchdog_listener = async_call_later(
|
||||
self._hass, DEFAULT_WATCHDOG_SECONDS, _ws_reconnect)
|
||||
|
||||
def on_data(data):
|
||||
"""Define a handler to fire when the data is received."""
|
||||
@@ -160,6 +328,11 @@ class AmbientStation:
|
||||
self.stations[mac_address][ATTR_LAST_DATA] = data
|
||||
async_dispatcher_send(self._hass, TOPIC_UPDATE)
|
||||
|
||||
_LOGGER.debug('Resetting watchdog')
|
||||
self._watchdog_listener()
|
||||
self._watchdog_listener = async_call_later(
|
||||
self._hass, DEFAULT_WATCHDOG_SECONDS, _ws_reconnect)
|
||||
|
||||
def on_disconnect():
|
||||
"""Define a handler to fire when the websocket is disconnected."""
|
||||
_LOGGER.info('Disconnected from websocket')
|
||||
@@ -172,15 +345,27 @@ class AmbientStation:
|
||||
|
||||
_LOGGER.debug('New station subscription: %s', data)
|
||||
|
||||
# If the user hasn't specified monitored conditions, use only
|
||||
# those that their station supports (and which are defined
|
||||
# here):
|
||||
if not self.monitored_conditions:
|
||||
self.monitored_conditions = [
|
||||
k for k in station['lastData'].keys()
|
||||
if k in SENSOR_TYPES
|
||||
]
|
||||
|
||||
self.stations[station['macAddress']] = {
|
||||
ATTR_LAST_DATA: station['lastData'],
|
||||
ATTR_LOCATION: station['info']['location'],
|
||||
ATTR_NAME: station['info']['name'],
|
||||
ATTR_LOCATION: station.get('info', {}).get('location'),
|
||||
ATTR_NAME:
|
||||
station.get('info', {}).get(
|
||||
'name', station['macAddress']),
|
||||
}
|
||||
|
||||
for component in ('binary_sensor', 'sensor'):
|
||||
self._hass.async_create_task(
|
||||
self._hass.config_entries.async_forward_entry_setup(
|
||||
self._config_entry, 'sensor'))
|
||||
self._config_entry, component))
|
||||
|
||||
self._ws_reconnect_delay = DEFAULT_SOCKET_MIN_RETRY
|
||||
|
||||
@@ -194,8 +379,7 @@ class AmbientStation:
|
||||
except WebsocketError as err:
|
||||
_LOGGER.error("Error with the websocket connection: %s", err)
|
||||
|
||||
self._ws_reconnect_delay = min(
|
||||
2 * self._ws_reconnect_delay, 480)
|
||||
self._ws_reconnect_delay = min(2 * self._ws_reconnect_delay, 480)
|
||||
|
||||
async_call_later(
|
||||
self._hass, self._ws_reconnect_delay, self.ws_connect)
|
||||
@@ -203,3 +387,60 @@ class AmbientStation:
|
||||
async def ws_disconnect(self):
|
||||
"""Disconnect from the websocket."""
|
||||
await self.client.websocket.disconnect()
|
||||
|
||||
|
||||
class AmbientWeatherEntity(Entity):
|
||||
"""Define a base Ambient PWS entity."""
|
||||
|
||||
def __init__(
|
||||
self, ambient, mac_address, station_name, sensor_type,
|
||||
sensor_name):
|
||||
"""Initialize the sensor."""
|
||||
self._ambient = ambient
|
||||
self._async_unsub_dispatcher_connect = None
|
||||
self._mac_address = mac_address
|
||||
self._sensor_name = sensor_name
|
||||
self._sensor_type = sensor_type
|
||||
self._state = None
|
||||
self._station_name = station_name
|
||||
|
||||
@property
|
||||
def device_info(self):
|
||||
"""Return device registry information for this entity."""
|
||||
return {
|
||||
'identifiers': {
|
||||
(DOMAIN, self._mac_address)
|
||||
},
|
||||
'name': self._station_name,
|
||||
'manufacturer': 'Ambient Weather',
|
||||
}
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the sensor."""
|
||||
return '{0}_{1}'.format(self._station_name, self._sensor_name)
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Disable polling."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return a unique, unchanging string that represents this sensor."""
|
||||
return '{0}_{1}'.format(self._mac_address, self._sensor_name)
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register callbacks."""
|
||||
@callback
|
||||
def update():
|
||||
"""Update the state."""
|
||||
self.async_schedule_update_ha_state(True)
|
||||
|
||||
self._async_unsub_dispatcher_connect = async_dispatcher_connect(
|
||||
self.hass, TOPIC_UPDATE, update)
|
||||
|
||||
async def async_will_remove_from_hass(self):
|
||||
"""Disconnect dispatcher listener when removed."""
|
||||
if self._async_unsub_dispatcher_connect:
|
||||
self._async_unsub_dispatcher_connect()
|
||||
|
||||
72
homeassistant/components/ambient_station/binary_sensor.py
Normal file
72
homeassistant/components/ambient_station/binary_sensor.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""Support for Ambient Weather Station binary sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.ambient_station import (
|
||||
SENSOR_TYPES, TYPE_BATT1, TYPE_BATT10, TYPE_BATT2, TYPE_BATT3, TYPE_BATT4,
|
||||
TYPE_BATT5, TYPE_BATT6, TYPE_BATT7, TYPE_BATT8, TYPE_BATT9, TYPE_BATTOUT,
|
||||
AmbientWeatherEntity)
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
from homeassistant.const import ATTR_NAME
|
||||
|
||||
from .const import ATTR_LAST_DATA, DATA_CLIENT, DOMAIN, TYPE_BINARY_SENSOR
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DEPENDENCIES = ['ambient_station']
|
||||
|
||||
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up Ambient PWS binary sensors based on the old way."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, entry, async_add_entities):
|
||||
"""Set up Ambient PWS binary sensors based on a config entry."""
|
||||
ambient = hass.data[DOMAIN][DATA_CLIENT][entry.entry_id]
|
||||
|
||||
binary_sensor_list = []
|
||||
for mac_address, station in ambient.stations.items():
|
||||
for condition in ambient.monitored_conditions:
|
||||
name, _, kind, device_class = SENSOR_TYPES[condition]
|
||||
if kind == TYPE_BINARY_SENSOR:
|
||||
binary_sensor_list.append(
|
||||
AmbientWeatherBinarySensor(
|
||||
ambient, mac_address, station[ATTR_NAME], condition,
|
||||
name, device_class))
|
||||
|
||||
async_add_entities(binary_sensor_list, True)
|
||||
|
||||
|
||||
class AmbientWeatherBinarySensor(AmbientWeatherEntity, BinarySensorDevice):
|
||||
"""Define an Ambient binary sensor."""
|
||||
|
||||
def __init__(
|
||||
self, ambient, mac_address, station_name, sensor_type, sensor_name,
|
||||
device_class):
|
||||
"""Initialize the sensor."""
|
||||
super().__init__(
|
||||
ambient, mac_address, station_name, sensor_type, sensor_name)
|
||||
|
||||
self._device_class = device_class
|
||||
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the device class."""
|
||||
return self._device_class
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return the status of the sensor."""
|
||||
if self._sensor_type in (TYPE_BATT1, TYPE_BATT10, TYPE_BATT2,
|
||||
TYPE_BATT3, TYPE_BATT4, TYPE_BATT5,
|
||||
TYPE_BATT6, TYPE_BATT7, TYPE_BATT8,
|
||||
TYPE_BATT9, TYPE_BATTOUT):
|
||||
return self._state == 0
|
||||
|
||||
return self._state == 1
|
||||
|
||||
async def async_update(self):
|
||||
"""Fetch new state data for the entity."""
|
||||
self._state = self._ambient.stations[
|
||||
self._mac_address][ATTR_LAST_DATA].get(self._sensor_type)
|
||||
@@ -1,5 +1,4 @@
|
||||
"""Config flow to configure the Ambient PWS component."""
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant import config_entries
|
||||
|
||||
@@ -8,3 +8,6 @@ CONF_APP_KEY = 'app_key'
|
||||
DATA_CLIENT = 'data_client'
|
||||
|
||||
TOPIC_UPDATE = 'update'
|
||||
|
||||
TYPE_BINARY_SENSOR = 'binary_sensor'
|
||||
TYPE_SENSOR = 'sensor'
|
||||
|
||||
@@ -1,71 +1,52 @@
|
||||
"""
|
||||
Support for Ambient Weather Station Service.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.ambient_station/
|
||||
"""
|
||||
"""Support for Ambient Weather Station sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.ambient_station import SENSOR_TYPES
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.components.ambient_station import (
|
||||
SENSOR_TYPES, AmbientWeatherEntity)
|
||||
from homeassistant.const import ATTR_NAME
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
|
||||
from .const import ATTR_LAST_DATA, DATA_CLIENT, DOMAIN, TOPIC_UPDATE
|
||||
from .const import ATTR_LAST_DATA, DATA_CLIENT, DOMAIN, TYPE_SENSOR
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DEPENDENCIES = ['ambient_station']
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up an Ambient PWS sensor based on existing config."""
|
||||
"""Set up Ambient PWS sensors based on existing config."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, entry, async_add_entities):
|
||||
"""Set up an Ambient PWS sensor based on a config entry."""
|
||||
"""Set up Ambient PWS sensors based on a config entry."""
|
||||
ambient = hass.data[DOMAIN][DATA_CLIENT][entry.entry_id]
|
||||
|
||||
sensor_list = []
|
||||
for mac_address, station in ambient.stations.items():
|
||||
for condition in ambient.monitored_conditions:
|
||||
name, unit = SENSOR_TYPES[condition]
|
||||
sensor_list.append(
|
||||
AmbientWeatherSensor(
|
||||
ambient, mac_address, station[ATTR_NAME], condition, name,
|
||||
unit))
|
||||
name, unit, kind, _ = SENSOR_TYPES[condition]
|
||||
if kind == TYPE_SENSOR:
|
||||
sensor_list.append(
|
||||
AmbientWeatherSensor(
|
||||
ambient, mac_address, station[ATTR_NAME], condition,
|
||||
name, unit))
|
||||
|
||||
async_add_entities(sensor_list, True)
|
||||
|
||||
|
||||
class AmbientWeatherSensor(Entity):
|
||||
class AmbientWeatherSensor(AmbientWeatherEntity):
|
||||
"""Define an Ambient sensor."""
|
||||
|
||||
def __init__(
|
||||
self, ambient, mac_address, station_name, sensor_type, sensor_name,
|
||||
unit):
|
||||
"""Initialize the sensor."""
|
||||
self._ambient = ambient
|
||||
self._async_unsub_dispatcher_connect = None
|
||||
self._mac_address = mac_address
|
||||
self._sensor_name = sensor_name
|
||||
self._sensor_type = sensor_type
|
||||
self._state = None
|
||||
self._station_name = station_name
|
||||
super().__init__(
|
||||
ambient, mac_address, station_name, sensor_type, sensor_name)
|
||||
|
||||
self._unit = unit
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the sensor."""
|
||||
return '{0}_{1}'.format(self._station_name, self._sensor_name)
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Disable polling."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the sensor."""
|
||||
@@ -76,26 +57,6 @@ class AmbientWeatherSensor(Entity):
|
||||
"""Return the unit of measurement."""
|
||||
return self._unit
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return a unique, unchanging string that represents this sensor."""
|
||||
return '{0}_{1}'.format(self._mac_address, self._sensor_name)
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register callbacks."""
|
||||
@callback
|
||||
def update():
|
||||
"""Update the state."""
|
||||
self.async_schedule_update_ha_state(True)
|
||||
|
||||
self._async_unsub_dispatcher_connect = async_dispatcher_connect(
|
||||
self.hass, TOPIC_UPDATE, update)
|
||||
|
||||
async def async_will_remove_from_hass(self):
|
||||
"""Disconnect dispatcher listener when removed."""
|
||||
if self._async_unsub_dispatcher_connect:
|
||||
self._async_unsub_dispatcher_connect()
|
||||
|
||||
async def async_update(self):
|
||||
"""Fetch new state data for the sensor."""
|
||||
self._state = self._ambient.stations[
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides basic support for Amcrest IP cameras.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/amcrest/
|
||||
"""
|
||||
"""Support for Amcrest IP cameras."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides basic support for Amcrest IP cameras.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/camera.amcrest/
|
||||
"""
|
||||
"""Support for Amcrest IP cameras."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.amcrest import (
|
||||
@@ -82,7 +77,7 @@ class AmcrestCam(Camera):
|
||||
try:
|
||||
return await async_aiohttp_proxy_stream(
|
||||
self.hass, request, stream,
|
||||
'multipart/x-mixed-replace;boundary=ffserver')
|
||||
self._ffmpeg.ffmpeg_stream_content_type)
|
||||
finally:
|
||||
await stream.close()
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides HA sensor support for Amcrest IP cameras.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.amcrest/
|
||||
"""
|
||||
"""Suppoort for Amcrest IP camera sensors."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
@@ -18,8 +13,8 @@ _LOGGER = logging.getLogger(__name__)
|
||||
SCAN_INTERVAL = timedelta(seconds=10)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up a sensor for an Amcrest IP Camera."""
|
||||
if discovery_info is None:
|
||||
return
|
||||
@@ -45,8 +40,8 @@ class AmcrestSensor(Entity):
|
||||
self._attrs = {}
|
||||
self._camera = camera
|
||||
self._sensor_type = sensor_type
|
||||
self._name = '{0}_{1}'.format(name,
|
||||
SENSORS.get(self._sensor_type)[0])
|
||||
self._name = '{0}_{1}'.format(
|
||||
name, SENSORS.get(self._sensor_type)[0])
|
||||
self._icon = 'mdi:{}'.format(SENSORS.get(self._sensor_type)[2])
|
||||
self._state = None
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for toggling Amcrest IP camera settings.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.amcrest/
|
||||
"""
|
||||
"""Support for toggling Amcrest IP camera settings."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.amcrest import DATA_AMCREST, SWITCHES
|
||||
@@ -16,8 +11,8 @@ _LOGGER = logging.getLogger(__name__)
|
||||
DEPENDENCIES = ['amcrest']
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the IP Amcrest camera switch platform."""
|
||||
if discovery_info is None:
|
||||
return
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for IP Webcam, an Android app that acts as a full-featured webcam.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/android_ip_webcam/
|
||||
"""
|
||||
"""Support for Android IP Webcam."""
|
||||
import asyncio
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for IP Webcam binary sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.android_ip_webcam/
|
||||
"""
|
||||
"""Support for Android IP Webcam binary sensors."""
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
from homeassistant.components.android_ip_webcam import (
|
||||
KEY_MAP, DATA_IP_WEBCAM, AndroidIPCamEntity, CONF_HOST, CONF_NAME)
|
||||
@@ -11,8 +6,8 @@ from homeassistant.components.android_ip_webcam import (
|
||||
DEPENDENCIES = ['android_ip_webcam']
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the IP Webcam binary sensors."""
|
||||
if discovery_info is None:
|
||||
return
|
||||
@@ -1,10 +1,4 @@
|
||||
"""
|
||||
Support for IP Webcam sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.android_ip_webcam/
|
||||
"""
|
||||
|
||||
"""Support for Android IP Webcam sensors."""
|
||||
from homeassistant.components.android_ip_webcam import (
|
||||
KEY_MAP, ICON_MAP, DATA_IP_WEBCAM, AndroidIPCamEntity, CONF_HOST,
|
||||
CONF_NAME, CONF_SENSORS)
|
||||
@@ -13,8 +7,8 @@ from homeassistant.helpers.icon import icon_for_battery_level
|
||||
DEPENDENCIES = ['android_ip_webcam']
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the IP Webcam Sensor."""
|
||||
if discovery_info is None:
|
||||
return
|
||||
@@ -1,10 +1,4 @@
|
||||
"""
|
||||
Support for IP Webcam settings.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.android_ip_webcam/
|
||||
"""
|
||||
|
||||
"""Support for Android IP Webcam settings."""
|
||||
from homeassistant.components.switch import SwitchDevice
|
||||
from homeassistant.components.android_ip_webcam import (
|
||||
KEY_MAP, ICON_MAP, DATA_IP_WEBCAM, AndroidIPCamEntity, CONF_HOST,
|
||||
@@ -13,8 +7,8 @@ from homeassistant.components.android_ip_webcam import (
|
||||
DEPENDENCIES = ['android_ip_webcam']
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the IP Webcam switch platform."""
|
||||
if discovery_info is None:
|
||||
return
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for status output of APCUPSd via its Network Information Server (NIS).
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/apcupsd/
|
||||
"""
|
||||
"""Support for APCUPSd via its Network Information Server (NIS)."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for tracking the online status of a UPS.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.apcupsd/
|
||||
"""
|
||||
"""Support for tracking the online status of a UPS."""
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.binary_sensor import (
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Provides a sensor to track various status aspects of a UPS.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.apcupsd/
|
||||
"""
|
||||
"""Support for APCUPSd sensors."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Rest API for Home Assistant.
|
||||
|
||||
For more details about the RESTful API, please refer to the documentation at
|
||||
https://developers.home-assistant.io/docs/en/external_api_rest.html
|
||||
"""
|
||||
"""Rest API for Home Assistant."""
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Apple TV.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/apple_tv/
|
||||
"""
|
||||
"""Support for Apple TV."""
|
||||
import asyncio
|
||||
import logging
|
||||
from typing import Sequence, TypeVar, Union
|
||||
@@ -1,18 +1,13 @@
|
||||
"""
|
||||
Support for Apple TV.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/media_player.apple_tv/
|
||||
"""
|
||||
"""Support for Apple TV media player."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.apple_tv import (
|
||||
ATTR_ATV, ATTR_POWER, DATA_APPLE_TV, DATA_ENTITIES)
|
||||
from homeassistant.components.media_player import (
|
||||
from homeassistant.components.media_player import MediaPlayerDevice
|
||||
from homeassistant.components.media_player.const import (
|
||||
MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, SUPPORT_NEXT_TRACK,
|
||||
SUPPORT_PAUSE, SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK,
|
||||
SUPPORT_SEEK, SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_TURN_ON,
|
||||
MediaPlayerDevice)
|
||||
SUPPORT_SEEK, SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_TURN_ON)
|
||||
from homeassistant.const import (
|
||||
CONF_HOST, CONF_NAME, EVENT_HOMEASSISTANT_STOP, STATE_IDLE, STATE_OFF,
|
||||
STATE_PAUSED, STATE_PLAYING, STATE_STANDBY)
|
||||
@@ -1,21 +1,14 @@
|
||||
"""
|
||||
Remote control support for Apple TV.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/remote.apple_tv/
|
||||
"""
|
||||
|
||||
"""Remote control support for Apple TV."""
|
||||
from homeassistant.components.apple_tv import (
|
||||
ATTR_ATV, ATTR_POWER, DATA_APPLE_TV)
|
||||
from homeassistant.components import remote
|
||||
from homeassistant.const import (CONF_NAME, CONF_HOST)
|
||||
|
||||
|
||||
DEPENDENCIES = ['apple_tv']
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the Apple TV remote platform."""
|
||||
if not discovery_info:
|
||||
return
|
||||
5
homeassistant/components/apple_tv/services.yaml
Normal file
5
homeassistant/components/apple_tv/services.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
apple_tv_authenticate:
|
||||
description: Start AirPlay device authentication.
|
||||
fields:
|
||||
entity_id: {description: Name(s) of entities to authenticate with., example: media_player.apple_tv}
|
||||
apple_tv_scan: {description: Scan for Apple TV devices.}
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AquaLogic component.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/aqualogic/
|
||||
"""
|
||||
"""Support for AquaLogic devices."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
import time
|
||||
@@ -20,15 +15,15 @@ REQUIREMENTS = ["aqualogic==1.0"]
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DOMAIN = "aqualogic"
|
||||
UPDATE_TOPIC = DOMAIN + "_update"
|
||||
CONF_UNIT = "unit"
|
||||
DOMAIN = 'aqualogic'
|
||||
UPDATE_TOPIC = DOMAIN + '_update'
|
||||
CONF_UNIT = 'unit'
|
||||
RECONNECT_INTERVAL = timedelta(seconds=10)
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema({
|
||||
DOMAIN: vol.Schema({
|
||||
vol.Required(CONF_HOST): cv.string,
|
||||
vol.Required(CONF_PORT): cv.port
|
||||
vol.Required(CONF_PORT): cv.port,
|
||||
}),
|
||||
}, extra=vol.ALLOW_EXTRA)
|
||||
|
||||
@@ -39,10 +34,8 @@ def setup(hass, config):
|
||||
port = config[DOMAIN][CONF_PORT]
|
||||
processor = AquaLogicProcessor(hass, host, port)
|
||||
hass.data[DOMAIN] = processor
|
||||
hass.bus.listen_once(EVENT_HOMEASSISTANT_START,
|
||||
processor.start_listen)
|
||||
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP,
|
||||
processor.shutdown)
|
||||
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, processor.start_listen)
|
||||
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, processor.shutdown)
|
||||
_LOGGER.debug("AquaLogicProcessor %s:%i initialized", host, port)
|
||||
return True
|
||||
|
||||
@@ -85,8 +78,7 @@ class AquaLogicProcessor(threading.Thread):
|
||||
if self._shutdown:
|
||||
return
|
||||
|
||||
_LOGGER.error("Connection to %s:%d lost",
|
||||
self._host, self._port)
|
||||
_LOGGER.error("Connection to %s:%d lost", self._host, self._port)
|
||||
time.sleep(RECONNECT_INTERVAL.seconds)
|
||||
|
||||
@property
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AquaLogic sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.aqualogic/
|
||||
"""
|
||||
"""Support for AquaLogic sensors."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -46,8 +41,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
})
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the sensor platform."""
|
||||
sensors = []
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AquaLogic switches.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.aqualogic/
|
||||
"""
|
||||
"""Support for AquaLogic switches."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -37,8 +32,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
})
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities,
|
||||
discovery_info=None):
|
||||
async def async_setup_platform(
|
||||
hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the switch platform."""
|
||||
switches = []
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Arduino boards running with the Firmata firmware.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/arduino/
|
||||
"""
|
||||
"""Support for Arduino boards running with the Firmata firmware."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -1,11 +1,4 @@
|
||||
"""
|
||||
Support for getting information from Arduino pins.
|
||||
|
||||
Only analog pins are supported.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.arduino/
|
||||
"""
|
||||
"""Support for getting information from Arduino pins."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -1,11 +1,4 @@
|
||||
"""
|
||||
Support for switching Arduino pins on and off.
|
||||
|
||||
So far only digital pins are supported.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.arduino/
|
||||
"""
|
||||
"""Support for switching Arduino pins on and off."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides support for Netgear Arlo IP cameras.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/arlo/
|
||||
"""
|
||||
"""Support for Netgear Arlo IP cameras."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -20,7 +15,7 @@ REQUIREMENTS = ['pyarlo==0.2.3']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CONF_ATTRIBUTION = "Data provided by arlo.netgear.com"
|
||||
ATTRIBUTION = "Data provided by arlo.netgear.com"
|
||||
|
||||
DATA_ARLO = 'data_arlo'
|
||||
DEFAULT_BRAND = 'Netgear Arlo'
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Arlo Alarm Control Panels.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarm_control_panel.arlo/
|
||||
"""
|
||||
"""Support for Arlo Alarm Control Panels."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -14,7 +9,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.components.alarm_control_panel import (
|
||||
AlarmControlPanel, PLATFORM_SCHEMA)
|
||||
from homeassistant.components.arlo import (
|
||||
DATA_ARLO, CONF_ATTRIBUTION, SIGNAL_UPDATE_ARLO)
|
||||
DATA_ARLO, ATTRIBUTION, SIGNAL_UPDATE_ARLO)
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME,
|
||||
STATE_ALARM_DISARMED, STATE_ALARM_ARMED_NIGHT)
|
||||
@@ -122,7 +117,7 @@ class ArloBaseStation(AlarmControlPanel):
|
||||
def device_state_attributes(self):
|
||||
"""Return the state attributes."""
|
||||
return {
|
||||
ATTR_ATTRIBUTION: CONF_ATTRIBUTION,
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
'device_id': self._base_station.device_id
|
||||
}
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Netgear Arlo IP cameras.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/camera.arlo/
|
||||
"""
|
||||
"""Support for Netgear Arlo IP cameras."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -104,7 +99,7 @@ class ArloCam(Camera):
|
||||
try:
|
||||
return await async_aiohttp_proxy_stream(
|
||||
self.hass, request, stream,
|
||||
'multipart/x-mixed-replace;boundary=ffserver')
|
||||
self._ffmpeg.ffmpeg_stream_content_type)
|
||||
finally:
|
||||
await stream.close()
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
This component provides HA sensor for Netgear Arlo IP cameras.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.arlo/
|
||||
"""
|
||||
"""Sensor support for Netgear Arlo IP cameras."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -11,7 +6,7 @@ import voluptuous as vol
|
||||
from homeassistant.core import callback
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.arlo import (
|
||||
CONF_ATTRIBUTION, DEFAULT_BRAND, DATA_ARLO, SIGNAL_UPDATE_ARLO)
|
||||
ATTRIBUTION, DEFAULT_BRAND, DATA_ARLO, SIGNAL_UPDATE_ARLO)
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION, CONF_MONITORED_CONDITIONS, TEMP_CELSIUS,
|
||||
@@ -182,7 +177,7 @@ class ArloSensor(Entity):
|
||||
"""Return the device state attributes."""
|
||||
attrs = {}
|
||||
|
||||
attrs[ATTR_ATTRIBUTION] = CONF_ATTRIBUTION
|
||||
attrs[ATTR_ATTRIBUTION] = ATTRIBUTION
|
||||
attrs['brand'] = DEFAULT_BRAND
|
||||
|
||||
if self._sensor_type != 'total_cameras':
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Asterisk Voicemail interface.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/asterisk_mbox/
|
||||
"""
|
||||
"""Support for Asterisk Voicemail interface."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -78,9 +73,8 @@ class AsteriskData:
|
||||
@callback
|
||||
def handle_data(self, command, msg):
|
||||
"""Handle changes to the mailbox."""
|
||||
from asterisk_mbox.commands import (CMD_MESSAGE_LIST,
|
||||
CMD_MESSAGE_CDR_AVAILABLE,
|
||||
CMD_MESSAGE_CDR)
|
||||
from asterisk_mbox.commands import (
|
||||
CMD_MESSAGE_LIST, CMD_MESSAGE_CDR_AVAILABLE, CMD_MESSAGE_CDR)
|
||||
|
||||
if command == CMD_MESSAGE_LIST:
|
||||
_LOGGER.debug("AsteriskVM sent updated message list: Len %d",
|
||||
@@ -89,8 +83,8 @@ class AsteriskData:
|
||||
self.messages = sorted(
|
||||
msg, key=lambda item: item['info']['origtime'], reverse=True)
|
||||
if not isinstance(old_messages, list):
|
||||
async_dispatcher_send(self.hass, SIGNAL_DISCOVER_PLATFORM,
|
||||
DOMAIN)
|
||||
async_dispatcher_send(
|
||||
self.hass, SIGNAL_DISCOVER_PLATFORM, DOMAIN)
|
||||
async_dispatcher_send(self.hass, SIGNAL_MESSAGE_UPDATE,
|
||||
self.messages)
|
||||
elif command == CMD_MESSAGE_CDR:
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Asterisk Voicemail interface.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/mailbox.asteriskvm/
|
||||
"""
|
||||
"""Support for the Asterisk Voicemail interface."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.asterisk_mbox import DOMAIN as ASTERISK_DOMAIN
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ASUSWRT devices.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/asuswrt/
|
||||
"""
|
||||
"""Support for ASUSWRT devices."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -18,15 +13,16 @@ REQUIREMENTS = ['aioasuswrt==1.1.20']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CONF_PUB_KEY = 'pub_key'
|
||||
CONF_REQUIRE_IP = 'require_ip'
|
||||
CONF_SENSORS = 'sensors'
|
||||
CONF_SSH_KEY = 'ssh_key'
|
||||
|
||||
DOMAIN = "asuswrt"
|
||||
DATA_ASUSWRT = DOMAIN
|
||||
|
||||
CONF_PUB_KEY = 'pub_key'
|
||||
CONF_SSH_KEY = 'ssh_key'
|
||||
CONF_REQUIRE_IP = 'require_ip'
|
||||
DEFAULT_SSH_PORT = 22
|
||||
|
||||
SECRET_GROUP = 'Password or SSH Key'
|
||||
CONF_SENSORS = 'sensors'
|
||||
SENSOR_TYPES = ['upload_speed', 'download_speed', 'download', 'upload']
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema({
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for August devices.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/august/
|
||||
"""
|
||||
"""Support for August devices."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for August binary sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.august/
|
||||
"""
|
||||
"""Support for August binary sensors."""
|
||||
import logging
|
||||
from datetime import timedelta, datetime
|
||||
|
||||
@@ -144,6 +139,13 @@ class AugustDoorBinarySensor(BinarySensorDevice):
|
||||
from august.lock import LockDoorStatus
|
||||
self._state = self._state == LockDoorStatus.OPEN
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Get the unique of the door open binary sensor."""
|
||||
return '{:s}_{:s}'.format(self._door.device_id,
|
||||
SENSOR_TYPES_DOOR[self._sensor_type][0]
|
||||
.lower())
|
||||
|
||||
|
||||
class AugustDoorbellBinarySensor(BinarySensorDevice):
|
||||
"""Representation of an August binary sensor."""
|
||||
@@ -181,4 +183,11 @@ class AugustDoorbellBinarySensor(BinarySensorDevice):
|
||||
"""Get the latest state of the sensor."""
|
||||
state_provider = SENSOR_TYPES_DOORBELL[self._sensor_type][2]
|
||||
self._state = state_provider(self._data, self._doorbell)
|
||||
self._available = self._state is not None
|
||||
self._available = self._doorbell.is_online
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Get the unique id of the doorbell sensor."""
|
||||
return '{:s}_{:s}'.format(self._doorbell.device_id,
|
||||
SENSOR_TYPES_DOORBELL[self._sensor_type][0]
|
||||
.lower())
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for August camera.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/camera.august/
|
||||
"""
|
||||
"""Support for August camera."""
|
||||
from datetime import timedelta
|
||||
|
||||
import requests
|
||||
@@ -74,3 +69,8 @@ class AugustCamera(Camera):
|
||||
timeout=self._timeout).content
|
||||
|
||||
return self._image_content
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Get the unique id of the camera."""
|
||||
return '{:s}_camera'.format(self._doorbell.device_id)
|
||||
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for August lock.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/lock.august/
|
||||
"""
|
||||
"""Support for August lock."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -95,3 +90,8 @@ class AugustLock(LockDevice):
|
||||
return {
|
||||
ATTR_BATTERY_LEVEL: self._lock_detail.battery_level,
|
||||
}
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Get the unique id of the lock."""
|
||||
return '{:s}_lock'.format(self._lock.device_id)
|
||||
35
homeassistant/components/auth/.translations/da.json
Normal file
35
homeassistant/components/auth/.translations/da.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"mfa_setup": {
|
||||
"notify": {
|
||||
"abort": {
|
||||
"no_available_service": "Ingen underretningstjenester til r\u00e5dighed."
|
||||
},
|
||||
"error": {
|
||||
"invalid_code": "Ugyldig kode, pr\u00f8v venligst igen."
|
||||
},
|
||||
"step": {
|
||||
"init": {
|
||||
"description": "V\u00e6lg venligst en af meddelelsestjenesterne:",
|
||||
"title": "Ops\u00e6t engangsadgangskode, der er leveret af besked komponenten"
|
||||
},
|
||||
"setup": {
|
||||
"description": "En engangsadgangskode er blevet sendt via **notify.{notify_service}**. Indtast den venligst nedenunder:",
|
||||
"title": "Bekr\u00e6ft ops\u00e6tningen"
|
||||
}
|
||||
},
|
||||
"title": "Advis\u00e9r engangskodeord"
|
||||
},
|
||||
"totp": {
|
||||
"error": {
|
||||
"invalid_code": "Ugyldig kode, pr\u00f8v venligst igen. Hvis du konsekvent f\u00e5r denne fejl skal du s\u00f8rge for at uret p\u00e5 dit Home Assistant system er g\u00e5r n\u00f8jagtigt."
|
||||
},
|
||||
"step": {
|
||||
"init": {
|
||||
"description": "Hvis du vil aktivere tofaktorautentificering ved hj\u00e6lp af tidsbaserede engangskoder skal du scanne QR-koden med din autentificeringsapp. Hvis du ikke har en anbefaler vi enten [Google Authenticator] (https://support.google.com/accounts/answer/1066447) eller [Authy] (https://authy.com/). \n\n {qr_code} \n \nN\u00e5r du har scannet koden skal du indtaste den sekscifrede kode fra din app for at bekr\u00e6fte ops\u00e6tningen. Hvis du har problemer med at scanne QR-koden skal du lave en manuel ops\u00e6tning med kode **`{code}`**.",
|
||||
"title": "Konfigurer to-faktors godkendelse ved hj\u00e6lp af TOTP"
|
||||
}
|
||||
},
|
||||
"title": "TOTP"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,27 @@
|
||||
{
|
||||
"mfa_setup": {
|
||||
"notify": {
|
||||
"abort": {
|
||||
"no_available_service": "No hay servicios de notificaci\u00f3n disponibles."
|
||||
},
|
||||
"error": {
|
||||
"invalid_code": "C\u00f3digo inv\u00e1lido, por favor int\u00e9ntelo de nuevo."
|
||||
},
|
||||
"step": {
|
||||
"init": {
|
||||
"description": "Por favor seleccione uno de los servicios de notificaci\u00f3n:",
|
||||
"title": "Configure la contrase\u00f1a de un solo uso entregada por el componente de notificaci\u00f3n"
|
||||
},
|
||||
"setup": {
|
||||
"description": "Se ha enviado una contrase\u00f1a \u00fanica a trav\u00e9s de **notify.{notify_service}**. Por favor ingr\u00e9selo a continuaci\u00f3n:",
|
||||
"title": "Verificar la configuracion"
|
||||
}
|
||||
}
|
||||
},
|
||||
"totp": {
|
||||
"step": {
|
||||
"init": {
|
||||
"description": "Para activar la autenticaci\u00f3n de dos factores utilizando contrase\u00f1as de un solo uso basadas en el tiempo, escanee el c\u00f3digo QR con su aplicaci\u00f3n de autenticaci\u00f3n. Si no tiene uno, le recomendamos [Autenticador de Google] (https://support.google.com/accounts/answer/1066447) o [Authy] (https://authy.com/). \n\n {qr_code} \n \n Despu\u00e9s de escanear el c\u00f3digo, ingrese el c\u00f3digo de seis d\u00edgitos de su aplicaci\u00f3n para verificar la configuraci\u00f3n. Si tiene problemas para escanear el c\u00f3digo QR, realice una configuraci\u00f3n manual con el c\u00f3digo ** ` {code} ` **.",
|
||||
"title": "Configurar la autenticaci\u00f3n de dos factores mediante TOTP"
|
||||
}
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user