mirror of
https://github.com/home-assistant/core.git
synced 2025-09-19 18:09:48 +00:00
Compare commits
2456 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3b147bcbf7 | ||
![]() |
ca81c6e684 | ||
![]() |
e62ba49979 | ||
![]() |
6ea20090a4 | ||
![]() |
c43b7d10d8 | ||
![]() |
430fa24acd | ||
![]() |
d51b2ad675 | ||
![]() |
b8fbe758d8 | ||
![]() |
61476f4f2c | ||
![]() |
cab60bcd0c | ||
![]() |
c0394232f3 | ||
![]() |
a5d9e89d08 | ||
![]() |
f43b26f250 | ||
![]() |
58b32bbeff | ||
![]() |
6d0a465390 | ||
![]() |
a5d334bbf7 | ||
![]() |
a77fd4892e | ||
![]() |
2d68b37dd5 | ||
![]() |
4de3871a78 | ||
![]() |
9c755d8fd4 | ||
![]() |
1e5f0a5136 | ||
![]() |
897433ecba | ||
![]() |
89625010e5 | ||
![]() |
7391aa2d7e | ||
![]() |
0e7e0086cd | ||
![]() |
6f8380b442 | ||
![]() |
e60a6cfa19 | ||
![]() |
ff6d415c67 | ||
![]() |
d3629d9f32 | ||
![]() |
61e2ce5faf | ||
![]() |
9007d37de1 | ||
![]() |
9e832aaaa6 | ||
![]() |
5dc93aeeb1 | ||
![]() |
45d63e22d5 | ||
![]() |
6edef444a7 | ||
![]() |
6f1f9bdd45 | ||
![]() |
1d075a7dd0 | ||
![]() |
e78449904b | ||
![]() |
f30ff31439 | ||
![]() |
9dda44ffdd | ||
![]() |
39fd7ca5d3 | ||
![]() |
ca07ae5b1e | ||
![]() |
cc8430ebed | ||
![]() |
a3b3ff52fc | ||
![]() |
a102728997 | ||
![]() |
fbe7ec7b11 | ||
![]() |
b2310d6341 | ||
![]() |
fdd0becd5f | ||
![]() |
425e6b2b1f | ||
![]() |
f58e5a2185 | ||
![]() |
2fb6bb2a92 | ||
![]() |
35e9b52e2e | ||
![]() |
1e52dd5945 | ||
![]() |
bf92b3099d | ||
![]() |
16f094d4d3 | ||
![]() |
1b2bb87566 | ||
![]() |
e6258ec009 | ||
![]() |
e90d29ea36 | ||
![]() |
da4c08de12 | ||
![]() |
0d874902cc | ||
![]() |
f4f01cb23a | ||
![]() |
21f8d0a80c | ||
![]() |
32cd58e03d | ||
![]() |
0dad2f8e41 | ||
![]() |
56c834b8a4 | ||
![]() |
0213f43f10 | ||
![]() |
4b3f9ecc2d | ||
![]() |
9f830964ef | ||
![]() |
a745134128 | ||
![]() |
774c892ee6 | ||
![]() |
60ae85564e | ||
![]() |
f6540e3002 | ||
![]() |
4ed7a7f2e0 | ||
![]() |
b5df2ba853 | ||
![]() |
17f3332c89 | ||
![]() |
239dfaba4b | ||
![]() |
beee1298c5 | ||
![]() |
245482d802 | ||
![]() |
30efef3085 | ||
![]() |
af67bb0df3 | ||
![]() |
b73531b2fc | ||
![]() |
7be3a4cd37 | ||
![]() |
0ae86b022d | ||
![]() |
f75bda7551 | ||
![]() |
e65995eb87 | ||
![]() |
1fa16eefc9 | ||
![]() |
2e5161997f | ||
![]() |
70910ecc61 | ||
![]() |
7a9b2a2234 | ||
![]() |
1f7e3946e8 | ||
![]() |
75b508e872 | ||
![]() |
7bc87eef6f | ||
![]() |
8812b60f2e | ||
![]() |
21a1186efe | ||
![]() |
95bcceddf7 | ||
![]() |
3743aaf70f | ||
![]() |
e52adbb942 | ||
![]() |
4497e98ea2 | ||
![]() |
74f0262e82 | ||
![]() |
a6b5d73f1c | ||
![]() |
00ac7a7d70 | ||
![]() |
18dfb02355 | ||
![]() |
93a844b1d5 | ||
![]() |
81701f7e4c | ||
![]() |
2366b5f6ca | ||
![]() |
1b7dd6c603 | ||
![]() |
c788946430 | ||
![]() |
3da136b034 | ||
![]() |
164e970ba0 | ||
![]() |
b77f2670a7 | ||
![]() |
aead5bada8 | ||
![]() |
00b3efec89 | ||
![]() |
56142ba085 | ||
![]() |
f30c636fb7 | ||
![]() |
84e4ef510e | ||
![]() |
2ce7561343 | ||
![]() |
e3adbc336d | ||
![]() |
4dc4f84b37 | ||
![]() |
ae78fb857e | ||
![]() |
f53ae12bb6 | ||
![]() |
1d5d56faf8 | ||
![]() |
2516b9474d | ||
![]() |
6be0bcceff | ||
![]() |
03f7fe483b | ||
![]() |
e5e7c9fa25 | ||
![]() |
32f25a8484 | ||
![]() |
20d7c84b22 | ||
![]() |
a6eb776768 | ||
![]() |
096e7cceed | ||
![]() |
fee0d8dbdd | ||
![]() |
f6d9e6b6c5 | ||
![]() |
fb8cbc2e93 | ||
![]() |
3fb80712be | ||
![]() |
91018034b6 | ||
![]() |
7dff5e79d1 | ||
![]() |
481d3295a6 | ||
![]() |
8c270e6fc7 | ||
![]() |
2c42e2aa79 | ||
![]() |
02002ac3b9 | ||
![]() |
733f1e1101 | ||
![]() |
588f2cd920 | ||
![]() |
b8f9ff76b3 | ||
![]() |
1609e33030 | ||
![]() |
e38522c612 | ||
![]() |
4e54dfa874 | ||
![]() |
f3a8196fb5 | ||
![]() |
68d2a1107e | ||
![]() |
350726d938 | ||
![]() |
8140c033fa | ||
![]() |
f26cbbdef9 | ||
![]() |
7705eb7941 | ||
![]() |
af9832d468 | ||
![]() |
f042c6f8d5 | ||
![]() |
656c901f7b | ||
![]() |
30e302a8a3 | ||
![]() |
7edf0460cc | ||
![]() |
295963f8e8 | ||
![]() |
966df6a411 | ||
![]() |
4501471b8c | ||
![]() |
52b045ed30 | ||
![]() |
f396f1cb18 | ||
![]() |
614be5c1bb | ||
![]() |
043d36f7c6 | ||
![]() |
d6f0c26e7f | ||
![]() |
e019280d94 | ||
![]() |
71a81c443f | ||
![]() |
e6148d223a | ||
![]() |
9eb0415234 | ||
![]() |
f9fda7d616 | ||
![]() |
408b41ea02 | ||
![]() |
f0b2d50e41 | ||
![]() |
eb3097506f | ||
![]() |
32bc94bdd6 | ||
![]() |
2f3ab15268 | ||
![]() |
ebeab7f44c | ||
![]() |
59932545ab | ||
![]() |
f6341ed3de | ||
![]() |
3018e8ff47 | ||
![]() |
fbbb29a6ec | ||
![]() |
6211a2bb98 | ||
![]() |
fdfe88566b | ||
![]() |
f091e0412f | ||
![]() |
9e7185c676 | ||
![]() |
8d1f8055dd | ||
![]() |
3e23a3a860 | ||
![]() |
0173c61fee | ||
![]() |
8356ea2616 | ||
![]() |
d66123cc37 | ||
![]() |
40e866a5bb | ||
![]() |
52b16bf5aa | ||
![]() |
4cac0443e2 | ||
![]() |
e0a035ce35 | ||
![]() |
be388a4797 | ||
![]() |
aa97be71a8 | ||
![]() |
78783555ea | ||
![]() |
6879105b14 | ||
![]() |
834acd85d3 | ||
![]() |
56316b1f6e | ||
![]() |
52fe1328f6 | ||
![]() |
43256ebd83 | ||
![]() |
3b3e062a35 | ||
![]() |
c0756948da | ||
![]() |
3e05fc1c11 | ||
![]() |
1b2f4fa19f | ||
![]() |
8498ca37cd | ||
![]() |
378c432f6d | ||
![]() |
06f06427b6 | ||
![]() |
cde414e1df | ||
![]() |
0700d38d1f | ||
![]() |
f5be9ef7fb | ||
![]() |
891f13eefe | ||
![]() |
d1b0ab736d | ||
![]() |
54eb740ff6 | ||
![]() |
787edf9417 | ||
![]() |
9e233070a0 | ||
![]() |
378bd8438b | ||
![]() |
15ed086ed2 | ||
![]() |
3435281bd1 | ||
![]() |
51c35ab9a8 | ||
![]() |
ecd7ec385d | ||
![]() |
81b159f424 | ||
![]() |
3df2cb6b78 | ||
![]() |
8a6158116a | ||
![]() |
6fcf5472a5 | ||
![]() |
5a0f21cbe3 | ||
![]() |
2db6246244 | ||
![]() |
fb6fb42f85 | ||
![]() |
c66106ee98 | ||
![]() |
d55846c33a | ||
![]() |
284fd46ea8 | ||
![]() |
992484fbe6 | ||
![]() |
834b0e6cf0 | ||
![]() |
925fa25ac7 | ||
![]() |
fb6eedb4c2 | ||
![]() |
881c501cef | ||
![]() |
4212fd8999 | ||
![]() |
b3aacfeb90 | ||
![]() |
8da948e909 | ||
![]() |
a02bb893ef | ||
![]() |
cc5377747f | ||
![]() |
454e63b69e | ||
![]() |
94da129ef8 | ||
![]() |
4467409e5c | ||
![]() |
b78d156f0e | ||
![]() |
7e0560c7dc | ||
![]() |
5a7e0b84ff | ||
![]() |
9e41ee49cb | ||
![]() |
7d0b50cadb | ||
![]() |
5092971452 | ||
![]() |
12de3f1e47 | ||
![]() |
28eeed1db3 | ||
![]() |
118ba10442 | ||
![]() |
41f3fb291a | ||
![]() |
fb2e120563 | ||
![]() |
150b376cf9 | ||
![]() |
645c673720 | ||
![]() |
da0ddc84ab | ||
![]() |
9987978d1a | ||
![]() |
a2bea2cab8 | ||
![]() |
9f58e5d6ea | ||
![]() |
e3894d212c | ||
![]() |
989dd32258 | ||
![]() |
0dd151c1c3 | ||
![]() |
ca1319e1ef | ||
![]() |
1093e25a30 | ||
![]() |
14e0dde055 | ||
![]() |
967b02073e | ||
![]() |
6037f7364f | ||
![]() |
658c48b237 | ||
![]() |
83a79a434c | ||
![]() |
ed3e16123e | ||
![]() |
a5b4f43ea5 | ||
![]() |
111050bea9 | ||
![]() |
57ab30d534 | ||
![]() |
0823ee4385 | ||
![]() |
baa9184b33 | ||
![]() |
699d6ad658 | ||
![]() |
5483de7e25 | ||
![]() |
f9e037a823 | ||
![]() |
c0eb399d54 | ||
![]() |
37205f9f61 | ||
![]() |
274cf23269 | ||
![]() |
d093b5f5e8 | ||
![]() |
3a3328dc13 | ||
![]() |
0e68ace3dd | ||
![]() |
d1e7ade6db | ||
![]() |
76d2658101 | ||
![]() |
8ab91eb6bb | ||
![]() |
9e87a662d5 | ||
![]() |
4e5c74d293 | ||
![]() |
d31eb9f352 | ||
![]() |
bb96584d6e | ||
![]() |
774f0f9b67 | ||
![]() |
64fc7103be | ||
![]() |
080f9725dc | ||
![]() |
bf1b78f621 | ||
![]() |
6b5cd74771 | ||
![]() |
60c5ef5b34 | ||
![]() |
1e81d14822 | ||
![]() |
00c6f3cb85 | ||
![]() |
08a74ff686 | ||
![]() |
eee1ca9211 | ||
![]() |
0d474e1183 | ||
![]() |
d407b8e215 | ||
![]() |
9e4904cb21 | ||
![]() |
24c382d689 | ||
![]() |
7233048fea | ||
![]() |
24e9a638d5 | ||
![]() |
d3e99f13dd | ||
![]() |
4f2195101c | ||
![]() |
44e243039c | ||
![]() |
1cfd69d484 | ||
![]() |
a3b3924e21 | ||
![]() |
8d429d7676 | ||
![]() |
05b3c1f17d | ||
![]() |
8b4bd95fc5 | ||
![]() |
6f99bac557 | ||
![]() |
6246382983 | ||
![]() |
29f17956bf | ||
![]() |
6e0e58f6cc | ||
![]() |
46fb73ea76 | ||
![]() |
08b24afc2d | ||
![]() |
f7f8de41e2 | ||
![]() |
8d2086d076 | ||
![]() |
41c55e695e | ||
![]() |
c9be201ee2 | ||
![]() |
ba9892e1f1 | ||
![]() |
481ea0aa5b | ||
![]() |
557f5763df | ||
![]() |
cb2a9dfebf | ||
![]() |
b2cd6707b6 | ||
![]() |
6a4d9d3a73 | ||
![]() |
472fe7a0fa | ||
![]() |
1ee1a43fb9 | ||
![]() |
0f56fc75b3 | ||
![]() |
84cbcb4d16 | ||
![]() |
f1d5fcac75 | ||
![]() |
97250d8225 | ||
![]() |
8b6b8f1994 | ||
![]() |
2d393b8f8b | ||
![]() |
6d79898926 | ||
![]() |
2509518950 | ||
![]() |
67680bcfa8 | ||
![]() |
431a3a6b44 | ||
![]() |
fce9697591 | ||
![]() |
3801d5adf4 | ||
![]() |
c85a7934ed | ||
![]() |
e970177eeb | ||
![]() |
2c439af165 | ||
![]() |
370e2ffa5a | ||
![]() |
f41623ca64 | ||
![]() |
201ea2557e | ||
![]() |
1efea50654 | ||
![]() |
d411ae2503 | ||
![]() |
e5b6fbf374 | ||
![]() |
af75a4bc85 | ||
![]() |
10d5ce24f6 | ||
![]() |
1008ab20ba | ||
![]() |
2f2146c989 | ||
![]() |
9bb8b2bc00 | ||
![]() |
8af9585f12 | ||
![]() |
9097912469 | ||
![]() |
151f60658c | ||
![]() |
db6449c3fb | ||
![]() |
4602d7370c | ||
![]() |
119566f280 | ||
![]() |
c8d9b83b24 | ||
![]() |
3f9dbe6845 | ||
![]() |
f5b790054a | ||
![]() |
114d48ed8b | ||
![]() |
4550968316 | ||
![]() |
03642d9029 | ||
![]() |
bea7aae8cd | ||
![]() |
30e803d70b | ||
![]() |
e799b08215 | ||
![]() |
74fd57e23a | ||
![]() |
ad5db47618 | ||
![]() |
8bc77f0421 | ||
![]() |
45c997ea04 | ||
![]() |
f49a392188 | ||
![]() |
e78378d90f | ||
![]() |
ee927fbc9e | ||
![]() |
13aae8b5ec | ||
![]() |
744ae82933 | ||
![]() |
04cb2e9fd5 | ||
![]() |
787faaa508 | ||
![]() |
2610415501 | ||
![]() |
4f79ec0c78 | ||
![]() |
9dfc00898b | ||
![]() |
67e7541016 | ||
![]() |
2c1b465215 | ||
![]() |
3cbd426c52 | ||
![]() |
a54d5f0bc4 | ||
![]() |
5b7a65c5ea | ||
![]() |
fb26dd3028 | ||
![]() |
aaea55efed | ||
![]() |
d91f9fc2f5 | ||
![]() |
3b93065568 | ||
![]() |
59a9ca71ce | ||
![]() |
11fcb2cc7f | ||
![]() |
7687ac8b91 | ||
![]() |
81dbdc6b9c | ||
![]() |
af105d2d61 | ||
![]() |
96ede54a1b | ||
![]() |
826433b680 | ||
![]() |
883b8f21ce | ||
![]() |
f21a058f31 | ||
![]() |
75f1e573e4 | ||
![]() |
f701b2245a | ||
![]() |
8852cd0def | ||
![]() |
61a1d8e99f | ||
![]() |
0f6e2850ab | ||
![]() |
f68a6ae3b2 | ||
![]() |
7127310f10 | ||
![]() |
55aa341dab | ||
![]() |
48402d49dc | ||
![]() |
34aed53dcd | ||
![]() |
704cfcf235 | ||
![]() |
55a1bf3832 | ||
![]() |
83480291ce | ||
![]() |
e796de6c59 | ||
![]() |
a958418ef1 | ||
![]() |
399173e3b3 | ||
![]() |
294c6a713f | ||
![]() |
29aa1463ef | ||
![]() |
3aeaf3bb96 | ||
![]() |
e8b55552a1 | ||
![]() |
1edaae34c5 | ||
![]() |
43b11f6b39 | ||
![]() |
e0704d73cc | ||
![]() |
9821047d75 | ||
![]() |
3275987f17 | ||
![]() |
c67f53dc43 | ||
![]() |
b373c202c9 | ||
![]() |
dc5ca461a9 | ||
![]() |
79495d9f3a | ||
![]() |
f584df46b7 | ||
![]() |
26415f6abd | ||
![]() |
d382b0ba42 | ||
![]() |
e1fd46d6db | ||
![]() |
0a90b01e77 | ||
![]() |
0c1acc51a4 | ||
![]() |
7ef352701c | ||
![]() |
25d6bc348c | ||
![]() |
8f8468f016 | ||
![]() |
f26cb83fd5 | ||
![]() |
7ee741d424 | ||
![]() |
ec3dc3dd16 | ||
![]() |
283cc5c8c3 | ||
![]() |
166d770ddd | ||
![]() |
ae76b5be5a | ||
![]() |
d225fc08fe | ||
![]() |
fa2e409abd | ||
![]() |
06efe3a2f6 | ||
![]() |
44f0728c60 | ||
![]() |
958a867c11 | ||
![]() |
06c8e53323 | ||
![]() |
df7d2b3aeb | ||
![]() |
a017c26234 | ||
![]() |
ab3157e661 | ||
![]() |
a0067a298a | ||
![]() |
1aa322f2f0 | ||
![]() |
7b3dc42673 | ||
![]() |
6a7bb7b149 | ||
![]() |
c6baf026a7 | ||
![]() |
a53c3d10fe | ||
![]() |
3635c4df50 | ||
![]() |
73f27c728c | ||
![]() |
6b95e98eeb | ||
![]() |
d405069406 | ||
![]() |
b22dfa119b | ||
![]() |
7e9507833b | ||
![]() |
74413e07d0 | ||
![]() |
611127a6bc | ||
![]() |
a8374cf423 | ||
![]() |
56657fa859 | ||
![]() |
cd1aa46404 | ||
![]() |
73ea34e417 | ||
![]() |
9ab6d08b97 | ||
![]() |
3718b25bd9 | ||
![]() |
d5486f883d | ||
![]() |
d6d3feb54e | ||
![]() |
9432054066 | ||
![]() |
202fd4197b | ||
![]() |
e91c32cb00 | ||
![]() |
af8b63fe31 | ||
![]() |
afe869bee9 | ||
![]() |
f55193c2da | ||
![]() |
9db2ad1fd7 | ||
![]() |
268430a61d | ||
![]() |
33361f8580 | ||
![]() |
0a1e397119 | ||
![]() |
d24e397a80 | ||
![]() |
24f4f53f16 | ||
![]() |
981d963554 | ||
![]() |
7ff30fe29d | ||
![]() |
ea666248ce | ||
![]() |
cad451d2b7 | ||
![]() |
da14e2927f | ||
![]() |
cf0e467150 | ||
![]() |
8c178adf4f | ||
![]() |
6499feffa3 | ||
![]() |
c4a8af06e0 | ||
![]() |
01dad31adc | ||
![]() |
111fc1fa8e | ||
![]() |
424e15c7a7 | ||
![]() |
881437c085 | ||
![]() |
e9e44dbd97 | ||
![]() |
ee602e40a6 | ||
![]() |
67b73bd74c | ||
![]() |
31dc2ad284 | ||
![]() |
61e41f0ddc | ||
![]() |
f4a4c6bea5 | ||
![]() |
6bbb713013 | ||
![]() |
83dff16e1e | ||
![]() |
7116c7404a | ||
![]() |
85dbf1ffad | ||
![]() |
9312d06fe4 | ||
![]() |
ec4ccb10ec | ||
![]() |
fa15bead94 | ||
![]() |
a1e1610a69 | ||
![]() |
64edf2fe33 | ||
![]() |
080827fb62 | ||
![]() |
56c235d4f2 | ||
![]() |
9ff9614d0b | ||
![]() |
c2f1d6aa19 | ||
![]() |
28bfc6ae76 | ||
![]() |
9902b648fb | ||
![]() |
bcdef4e500 | ||
![]() |
61a8618010 | ||
![]() |
89ae255de7 | ||
![]() |
3ae5735e12 | ||
![]() |
36675fe4fa | ||
![]() |
37af2170ec | ||
![]() |
2c02334c1f | ||
![]() |
fd4f8d92d2 | ||
![]() |
747f5fd62c | ||
![]() |
c3cef7227c | ||
![]() |
8ceef72853 | ||
![]() |
03954be12d | ||
![]() |
a9c43c6c62 | ||
![]() |
259a7e8490 | ||
![]() |
d813618d0d | ||
![]() |
ec2d378a19 | ||
![]() |
9d8b4de09c | ||
![]() |
6daec557b4 | ||
![]() |
ed970797be | ||
![]() |
1f7ab9091b | ||
![]() |
1dbfc66669 | ||
![]() |
1d537ad416 | ||
![]() |
ab8b94382e | ||
![]() |
f95a072877 | ||
![]() |
4e2737bfb7 | ||
![]() |
a73a1a4489 | ||
![]() |
d3ac3e48a3 | ||
![]() |
7d9c8fdfa0 | ||
![]() |
50b0e938e1 | ||
![]() |
6be9a45333 | ||
![]() |
4f07ccd350 | ||
![]() |
050e4afdc0 | ||
![]() |
52c1bc9c26 | ||
![]() |
1278f32306 | ||
![]() |
1f0f62de7f | ||
![]() |
8fff6462a1 | ||
![]() |
ac2172333c | ||
![]() |
9ba1a4a91a | ||
![]() |
aa390efd69 | ||
![]() |
4311b1ae65 | ||
![]() |
51e032a7ca | ||
![]() |
1b3c4ed4b3 | ||
![]() |
3f03848a07 | ||
![]() |
bc196a3c9f | ||
![]() |
cd72128a80 | ||
![]() |
4c4f726323 | ||
![]() |
37d1cdc4cb | ||
![]() |
d3511a3496 | ||
![]() |
353a014496 | ||
![]() |
e4832ee4d0 | ||
![]() |
c481a48e3a | ||
![]() |
6f1c45257a | ||
![]() |
e16e192b3c | ||
![]() |
217e280f8b | ||
![]() |
80a55360dc | ||
![]() |
98ac84349c | ||
![]() |
a007835293 | ||
![]() |
550aa6a0a5 | ||
![]() |
cf165cc35f | ||
![]() |
0eee152386 | ||
![]() |
71ae4b2623 | ||
![]() |
f4626375f3 | ||
![]() |
c0bc4bb550 | ||
![]() |
9795449d22 | ||
![]() |
98bac43228 | ||
![]() |
7e4b9adc3d | ||
![]() |
4571cf01e2 | ||
![]() |
1effd605a5 | ||
![]() |
30249d1428 | ||
![]() |
6ff572d1dd | ||
![]() |
b4f3415eb9 | ||
![]() |
ca591d591f | ||
![]() |
1de003487e | ||
![]() |
6da2904e12 | ||
![]() |
47b708974d | ||
![]() |
7fed328e1c | ||
![]() |
fc95744bb7 | ||
![]() |
b743f9b8f6 | ||
![]() |
bdd73b03b5 | ||
![]() |
910a0bc870 | ||
![]() |
1a1ef7680d | ||
![]() |
894b841a15 | ||
![]() |
bfea9863f1 | ||
![]() |
e9eaa6536d | ||
![]() |
c563652574 | ||
![]() |
c71ae090fc | ||
![]() |
73a55825af | ||
![]() |
3fc86988fa | ||
![]() |
d8eca8e303 | ||
![]() |
b7678f526c | ||
![]() |
572b81e7e0 | ||
![]() |
288574b8d1 | ||
![]() |
80887d757a | ||
![]() |
192b656635 | ||
![]() |
a0d2a3c6c5 | ||
![]() |
0fba9e44ed | ||
![]() |
4c27d6b9aa | ||
![]() |
4015a046d2 | ||
![]() |
93d109e524 | ||
![]() |
fae74f7ed7 | ||
![]() |
e5365779fe | ||
![]() |
3c44a1353a | ||
![]() |
db76b91ffa | ||
![]() |
96dba7b91f | ||
![]() |
463d949ee0 | ||
![]() |
ee74f95371 | ||
![]() |
bc600995c1 | ||
![]() |
58973d5265 | ||
![]() |
7e604bed7d | ||
![]() |
c3888330c1 | ||
![]() |
15f6e28a04 | ||
![]() |
3b4c3e6e17 | ||
![]() |
ff7d2ac681 | ||
![]() |
e8e7e66e2b | ||
![]() |
e00388eea0 | ||
![]() |
19d30f0a1b | ||
![]() |
27c25b6f44 | ||
![]() |
2aff913d9b | ||
![]() |
c2df4f56a3 | ||
![]() |
a3bcf69adf | ||
![]() |
fb35d382e1 | ||
![]() |
cfa74039bb | ||
![]() |
ccf6ce71cf | ||
![]() |
392cf57750 | ||
![]() |
6889816704 | ||
![]() |
dde6220ca5 | ||
![]() |
dead2fe576 | ||
![]() |
41014d73be | ||
![]() |
bc6603d8d7 | ||
![]() |
0b72587af2 | ||
![]() |
692e4f27c4 | ||
![]() |
8f37c843f5 | ||
![]() |
662c12715e | ||
![]() |
1639432463 | ||
![]() |
8c22858ae3 | ||
![]() |
5e2ba2eb77 | ||
![]() |
6cf20fc7fa | ||
![]() |
f7a97dae2d | ||
![]() |
d2b0031f55 | ||
![]() |
9b02ca96ba | ||
![]() |
a010577d6e | ||
![]() |
a634e62dfc | ||
![]() |
053f18d6ce | ||
![]() |
9993333bf9 | ||
![]() |
bb37f7bb75 | ||
![]() |
b2212ad445 | ||
![]() |
5f31b48f1d | ||
![]() |
e535133016 | ||
![]() |
0c3ffbe282 | ||
![]() |
f20b3515f2 | ||
![]() |
a40a5a754b | ||
![]() |
ecef0f6e93 | ||
![]() |
8fcd0e9a79 | ||
![]() |
765b45c81b | ||
![]() |
e4a53d3a08 | ||
![]() |
f14d34560e | ||
![]() |
90e811df20 | ||
![]() |
7c155731fc | ||
![]() |
6c84c126ea | ||
![]() |
078ce24e5a | ||
![]() |
656ef6566b | ||
![]() |
afb1b0cd3c | ||
![]() |
26fb1ce255 | ||
![]() |
4b67508330 | ||
![]() |
a037c1d788 | ||
![]() |
bfa8cb760f | ||
![]() |
8630a076a7 | ||
![]() |
52cee84c2c | ||
![]() |
3bf657284c | ||
![]() |
58520aa733 | ||
![]() |
7ef7d1dfd0 | ||
![]() |
4d7c8e254b | ||
![]() |
2c915af348 | ||
![]() |
2b733917a4 | ||
![]() |
353010712f | ||
![]() |
07a0bc4abe | ||
![]() |
f9b48844e6 | ||
![]() |
6053d02e44 | ||
![]() |
6ac33e5c7b | ||
![]() |
586566e6ab | ||
![]() |
5a46adfebf | ||
![]() |
9f20185cee | ||
![]() |
c9db21ffac | ||
![]() |
7b29a498c6 | ||
![]() |
1d41cf96ca | ||
![]() |
e33698b17d | ||
![]() |
8cacef47f3 | ||
![]() |
a5a69bdf71 | ||
![]() |
196bf2f3a0 | ||
![]() |
847196dbe8 | ||
![]() |
31996120dd | ||
![]() |
d913d35fc3 | ||
![]() |
8a78b65f0d | ||
![]() |
da368f0cb8 | ||
![]() |
d63ea198f2 | ||
![]() |
24a381456a | ||
![]() |
6678f8387f | ||
![]() |
09f7a09ce7 | ||
![]() |
e2e01f5020 | ||
![]() |
0e1450838e | ||
![]() |
a93088dafb | ||
![]() |
9bfcd04a4f | ||
![]() |
006419b96c | ||
![]() |
3f54533e72 | ||
![]() |
cc126761e1 | ||
![]() |
8fdf68c8d1 | ||
![]() |
6a8582750c | ||
![]() |
5b51f740df | ||
![]() |
881b35f9d6 | ||
![]() |
8f852bd656 | ||
![]() |
368d04b2a1 | ||
![]() |
6d83dafff2 | ||
![]() |
7da84dca76 | ||
![]() |
2a65da5db2 | ||
![]() |
8861c80068 | ||
![]() |
04b7d9e848 | ||
![]() |
235ab64066 | ||
![]() |
4544665749 | ||
![]() |
e1205409f3 | ||
![]() |
d9d5e06baf | ||
![]() |
d1da653e62 | ||
![]() |
bef8600972 | ||
![]() |
9d5a391916 | ||
![]() |
6f24fe3970 | ||
![]() |
1566d963a8 | ||
![]() |
01520a32d3 | ||
![]() |
b42134bbce | ||
![]() |
4bb319e658 | ||
![]() |
b8feaba5cb | ||
![]() |
3899c6ae27 | ||
![]() |
1e2c3cacf9 | ||
![]() |
3d9b6332c8 | ||
![]() |
1a6535ff8b | ||
![]() |
3fd14ca3cf | ||
![]() |
1c70435df6 | ||
![]() |
5393300086 | ||
![]() |
bb42ff93f4 | ||
![]() |
1e82813c3b | ||
![]() |
de26108b23 | ||
![]() |
36796ef649 | ||
![]() |
41469cec6c | ||
![]() |
ac771addc1 | ||
![]() |
5fa7d6f22a | ||
![]() |
8af946fba5 | ||
![]() |
8093da6a0c | ||
![]() |
0a7feba855 | ||
![]() |
6f84723fec | ||
![]() |
fbf5e320f7 | ||
![]() |
4731f7c721 | ||
![]() |
9f62b58929 | ||
![]() |
5fdc60e067 | ||
![]() |
8dbdf0b0e1 | ||
![]() |
fe9c85aaf1 | ||
![]() |
9de800ab6a | ||
![]() |
f530ea10af | ||
![]() |
64224f46ec | ||
![]() |
413545bd91 | ||
![]() |
f5af77d00c | ||
![]() |
4bc520c724 | ||
![]() |
8e5f46d5b5 | ||
![]() |
9fa0779c1f | ||
![]() |
c138a93454 | ||
![]() |
c6b96f7250 | ||
![]() |
4a8ecb82a8 | ||
![]() |
80f3cb7d79 | ||
![]() |
c4673ddee1 | ||
![]() |
ba3c3057da | ||
![]() |
297c360d04 | ||
![]() |
0b8a269b23 | ||
![]() |
a26fef38a2 | ||
![]() |
6b49bea6c4 | ||
![]() |
aeb789ddcc | ||
![]() |
ced6df158b | ||
![]() |
0d688faa56 | ||
![]() |
1e3b3ecbe6 | ||
![]() |
f9fe91ee74 | ||
![]() |
75f0fedd68 | ||
![]() |
658d338058 | ||
![]() |
f639a8fbaa | ||
![]() |
1b730b3055 | ||
![]() |
10e89bbc8c | ||
![]() |
f50714d7e9 | ||
![]() |
040b283a14 | ||
![]() |
1f9d6ba541 | ||
![]() |
1b739f9555 | ||
![]() |
3c2b57afaf | ||
![]() |
7143ed7ceb | ||
![]() |
0c14d4e067 | ||
![]() |
c8a52d4566 | ||
![]() |
3df329b8ec | ||
![]() |
56dc5298fc | ||
![]() |
15645ab0c9 | ||
![]() |
ce13fb8d73 | ||
![]() |
96c11bc6d7 | ||
![]() |
b585feb109 | ||
![]() |
123bef4f1e | ||
![]() |
0534153ae7 | ||
![]() |
89c04c94e0 | ||
![]() |
96bf8bc395 | ||
![]() |
5f5e8d81e1 | ||
![]() |
c798413971 | ||
![]() |
6729902010 | ||
![]() |
1b89fef888 | ||
![]() |
3715f821d7 | ||
![]() |
dc57d670d8 | ||
![]() |
c00af14ee2 | ||
![]() |
b383a5195f | ||
![]() |
4c5ea54df9 | ||
![]() |
030a399b09 | ||
![]() |
91f738127d | ||
![]() |
117efb5a04 | ||
![]() |
4dc39492a5 | ||
![]() |
4d6417295b | ||
![]() |
a0b0dc0aca | ||
![]() |
9266fc0cd7 | ||
![]() |
abe727fbbc | ||
![]() |
672db9cfe9 | ||
![]() |
8b46b5591f | ||
![]() |
e3b37c44d6 | ||
![]() |
718f3438ea | ||
![]() |
7073b0eb88 | ||
![]() |
4972b249bf | ||
![]() |
4a66eb0a69 | ||
![]() |
519c1fa2da | ||
![]() |
62f53b656d | ||
![]() |
7d506bc38b | ||
![]() |
e793ed9ab0 | ||
![]() |
5ffbf55170 | ||
![]() |
b128814acf | ||
![]() |
9c551ae85d | ||
![]() |
86bdba2ea2 | ||
![]() |
77d184ee25 | ||
![]() |
d0357ceecd | ||
![]() |
0fc2cce4dc | ||
![]() |
80a1084f2d | ||
![]() |
2eff988a5c | ||
![]() |
449e6841a7 | ||
![]() |
c1c90b8034 | ||
![]() |
008dddb17c | ||
![]() |
605b0ceb5f | ||
![]() |
669c89e8c0 | ||
![]() |
d6512c8a9f | ||
![]() |
74a198e37b | ||
![]() |
f505310f11 | ||
![]() |
626c01b4a0 | ||
![]() |
c785b791a2 | ||
![]() |
a6492cc7bb | ||
![]() |
5a8311e9d8 | ||
![]() |
0b3b589457 | ||
![]() |
e58b41ef23 | ||
![]() |
c7e300e5b1 | ||
![]() |
e2f591e5bc | ||
![]() |
d0062fc740 | ||
![]() |
3f29c234b8 | ||
![]() |
3348f4f6d1 | ||
![]() |
d883ee62f8 | ||
![]() |
c13b461737 | ||
![]() |
74cde3de6e | ||
![]() |
fb2e059346 | ||
![]() |
d65f2ac31a | ||
![]() |
53a42ccd5d | ||
![]() |
5e3747a058 | ||
![]() |
ec1109329b | ||
![]() |
d25aa1f183 | ||
![]() |
ef05aa2f39 | ||
![]() |
4fb36451c2 | ||
![]() |
955aa1de39 | ||
![]() |
7052cdded1 | ||
![]() |
669844e4dd | ||
![]() |
208a123c47 | ||
![]() |
f878fabd09 | ||
![]() |
3a3d448f17 | ||
![]() |
4149bd653d | ||
![]() |
a99135a09e | ||
![]() |
a4c1114c8e | ||
![]() |
9ebf5ea413 | ||
![]() |
290043aed6 | ||
![]() |
6b7be35f4a | ||
![]() |
260596d11b | ||
![]() |
fe0b537291 | ||
![]() |
8062bed53e | ||
![]() |
9ce5c65b14 | ||
![]() |
ff5f890e79 | ||
![]() |
103d352b1f | ||
![]() |
ed6aef2fd7 | ||
![]() |
4cd83e71dd | ||
![]() |
5d850c5b19 | ||
![]() |
95bc539bab | ||
![]() |
9e885112ec | ||
![]() |
d048233776 | ||
![]() |
498bec4a61 | ||
![]() |
d659807b6f | ||
![]() |
6112092949 | ||
![]() |
2c1e354537 | ||
![]() |
4cd2e09fb3 | ||
![]() |
120a96ff59 | ||
![]() |
6e3e383b3f | ||
![]() |
0e9b414c26 | ||
![]() |
ae8957ae12 | ||
![]() |
3d7488d188 | ||
![]() |
84a1afc785 | ||
![]() |
0d48d682dc | ||
![]() |
31553796da | ||
![]() |
130a577e67 | ||
![]() |
8b7ffcdaf1 | ||
![]() |
16199b7a52 | ||
![]() |
1ce662d699 | ||
![]() |
bfa0edaf92 | ||
![]() |
23700e4db8 | ||
![]() |
83d18c183b | ||
![]() |
856db4d122 | ||
![]() |
9aa02e35a7 | ||
![]() |
13e6479b6e | ||
![]() |
e18426051b | ||
![]() |
a4c830b5e4 | ||
![]() |
1d1aa06d05 | ||
![]() |
b4d6d238e5 | ||
![]() |
a5cc08c8b6 | ||
![]() |
22760a0bee | ||
![]() |
b27e05fc8d | ||
![]() |
a9f6dd698e | ||
![]() |
73af75cb41 | ||
![]() |
98bb400f3a | ||
![]() |
dc02c28891 | ||
![]() |
c963128306 | ||
![]() |
6dc49a44d9 | ||
![]() |
b3f429eefa | ||
![]() |
692e87f5cc | ||
![]() |
6740249bef | ||
![]() |
345cc244ed | ||
![]() |
7d58de1bda | ||
![]() |
e22742550c | ||
![]() |
5ed1f16f25 | ||
![]() |
8c70fb5463 | ||
![]() |
1587603c4c | ||
![]() |
453f7c7294 | ||
![]() |
6f92c19302 | ||
![]() |
4a2987e790 | ||
![]() |
5ec5df77cc | ||
![]() |
fbc53a886f | ||
![]() |
e88bfda2a8 | ||
![]() |
5675f16b61 | ||
![]() |
4d0a093ec4 | ||
![]() |
60a9de40aa | ||
![]() |
ed6b95f14a | ||
![]() |
ce114b81c3 | ||
![]() |
05374d7c85 | ||
![]() |
a84741392b | ||
![]() |
21029b1d7b | ||
![]() |
8257ea30c0 | ||
![]() |
a58c796641 | ||
![]() |
1fffa210e1 | ||
![]() |
0971c681af | ||
![]() |
10e698e0b2 | ||
![]() |
80cbc32c49 | ||
![]() |
0d1da9f5cb | ||
![]() |
f4f7c25f74 | ||
![]() |
d1ed67f44a | ||
![]() |
4efbe7135c | ||
![]() |
e642d95d0f | ||
![]() |
f400b77837 | ||
![]() |
fffc5a5fbb | ||
![]() |
8625e962ce | ||
![]() |
0a9ac91dec | ||
![]() |
5216477353 | ||
![]() |
24b25b8917 | ||
![]() |
2ac5862eda | ||
![]() |
30076d1843 | ||
![]() |
35e19eec18 | ||
![]() |
063193e6e5 | ||
![]() |
e95a04b6f6 | ||
![]() |
8c2858ebde | ||
![]() |
95cd0a2c68 | ||
![]() |
e233dd7cbe | ||
![]() |
6c89b6c5a2 | ||
![]() |
967fe89f6d | ||
![]() |
639cdf5eef | ||
![]() |
42b86d4b4e | ||
![]() |
4e62da9c8e | ||
![]() |
51db9bdfce | ||
![]() |
bf9418e51a | ||
![]() |
3b14d9f375 | ||
![]() |
4ea0754094 | ||
![]() |
049ced63b1 | ||
![]() |
2f362b44c4 | ||
![]() |
6e909ab3f1 | ||
![]() |
63347ebeb5 | ||
![]() |
075d3f6e32 | ||
![]() |
8dc57a3700 | ||
![]() |
d6e230e66b | ||
![]() |
b75aa7eb3a | ||
![]() |
b9aba30a6e | ||
![]() |
3033dbd86c | ||
![]() |
bb55606d29 | ||
![]() |
6387a50697 | ||
![]() |
80701c8f2a | ||
![]() |
2b26af89df | ||
![]() |
e7af759330 | ||
![]() |
ec61342ec3 | ||
![]() |
8a1fc8b8f0 | ||
![]() |
6b519499a7 | ||
![]() |
df6c7b97f5 | ||
![]() |
536b201472 | ||
![]() |
0d5486f772 | ||
![]() |
fa4fa30461 | ||
![]() |
5ad209c6fd | ||
![]() |
859935e8bc | ||
![]() |
b57da2f862 | ||
![]() |
0944d02262 | ||
![]() |
5580ee3fa1 | ||
![]() |
3f33fc6122 | ||
![]() |
fdfedd086b | ||
![]() |
0a4f3ec1ec | ||
![]() |
c130e81638 | ||
![]() |
f5aa89dd06 | ||
![]() |
3a18ef219b | ||
![]() |
b097a64010 | ||
![]() |
ef8eefc7a0 | ||
![]() |
4c6e10a988 | ||
![]() |
4bf15a07a3 | ||
![]() |
9b961632af | ||
![]() |
c1936f6fe4 | ||
![]() |
9064058a03 | ||
![]() |
b91cbb50c8 | ||
![]() |
8e5ccfcb8a | ||
![]() |
4f8663846b | ||
![]() |
4e6d415541 | ||
![]() |
b9fcb87d2c | ||
![]() |
1e3822bdd7 | ||
![]() |
332cbbd8b1 | ||
![]() |
5b2b86987b | ||
![]() |
7b00e94184 | ||
![]() |
5edf72c9ea | ||
![]() |
24d5e54eed | ||
![]() |
e6388e186c | ||
![]() |
cac750066a | ||
![]() |
77978a979b | ||
![]() |
769cf19052 | ||
![]() |
fc08c62a31 | ||
![]() |
37d1771400 | ||
![]() |
bcb47dab45 | ||
![]() |
b43b50b6d2 | ||
![]() |
c5298dc4dc | ||
![]() |
c837f185f7 | ||
![]() |
8814e1eadc | ||
![]() |
47aa0043bf | ||
![]() |
1a2a976be2 | ||
![]() |
320dc52bb3 | ||
![]() |
4e7b35355d | ||
![]() |
0fb5fbd85c | ||
![]() |
3a4db2fae7 | ||
![]() |
99bc911f7f | ||
![]() |
790b2d00c7 | ||
![]() |
0479e93de7 | ||
![]() |
83e05da0b3 | ||
![]() |
bc6e2a06e6 | ||
![]() |
33828ae514 | ||
![]() |
9ba0daa358 | ||
![]() |
9fbe6d60cb | ||
![]() |
e099d57bde | ||
![]() |
298d898627 | ||
![]() |
272c00e81b | ||
![]() |
bb2d8e3f7d | ||
![]() |
52ed9608e2 | ||
![]() |
fc23b4f83f | ||
![]() |
af153521dc | ||
![]() |
194cb8dbf5 | ||
![]() |
2ac5537495 | ||
![]() |
0280862780 | ||
![]() |
687a052d40 | ||
![]() |
f11d39f8eb | ||
![]() |
d8d75d882b | ||
![]() |
cd8f954a4d | ||
![]() |
30dbed3f98 | ||
![]() |
2620a95944 | ||
![]() |
a3061bda60 | ||
![]() |
5ed44297e6 | ||
![]() |
4031596aa7 | ||
![]() |
3c8ebf1844 | ||
![]() |
734ef5a7a9 | ||
![]() |
1c2618d99a | ||
![]() |
fd0375ac20 | ||
![]() |
609bf445f0 | ||
![]() |
e68cd339b9 | ||
![]() |
dedd1aec8c | ||
![]() |
b0a0871bed | ||
![]() |
4bfc7b9848 | ||
![]() |
72e97792bd | ||
![]() |
3f570245aa | ||
![]() |
5414e9d155 | ||
![]() |
bb14a083f0 | ||
![]() |
2c1a7a54cd | ||
![]() |
1ee299b079 | ||
![]() |
ae51331d49 | ||
![]() |
914aea9446 | ||
![]() |
41d2d1f309 | ||
![]() |
bad35577cb | ||
![]() |
3b9f48b51d | ||
![]() |
40e3d6f773 | ||
![]() |
d0c9a42b81 | ||
![]() |
33738cc83a | ||
![]() |
fccb13b762 | ||
![]() |
8a22a38353 | ||
![]() |
13116d8d3f | ||
![]() |
9892564ab5 | ||
![]() |
85624e8031 | ||
![]() |
a91b005822 | ||
![]() |
5d8dda4f68 | ||
![]() |
79b47157b8 | ||
![]() |
36585558a5 | ||
![]() |
ae42736235 | ||
![]() |
08af989658 | ||
![]() |
fdd090bae0 | ||
![]() |
5a9e543087 | ||
![]() |
e1e8d6a562 | ||
![]() |
4e50a402c7 | ||
![]() |
658ec309aa | ||
![]() |
c5a280c064 | ||
![]() |
0323b246bd | ||
![]() |
134dc45b77 | ||
![]() |
e4cda9ae0b | ||
![]() |
59fee12b45 | ||
![]() |
cf7b70dd8c | ||
![]() |
2e07902999 | ||
![]() |
9d6f3654ad | ||
![]() |
9159da6583 | ||
![]() |
39d38923b7 | ||
![]() |
05a0922dc0 | ||
![]() |
d6744fbc4e | ||
![]() |
b2753b7578 | ||
![]() |
e58ef36adc | ||
![]() |
169c4089ff | ||
![]() |
50a87bbe18 | ||
![]() |
a5c4508571 | ||
![]() |
f56797e413 | ||
![]() |
89450f405c | ||
![]() |
5e3102b2d6 | ||
![]() |
217b974cef | ||
![]() |
bb35d93fde | ||
![]() |
25f78dd1a9 | ||
![]() |
4ea42c2479 | ||
![]() |
482ff4061e | ||
![]() |
f32eaa2fdd | ||
![]() |
2113d65c06 | ||
![]() |
783672d305 | ||
![]() |
8add6c5f2e | ||
![]() |
85d2ba047b | ||
![]() |
3aa2ae1700 | ||
![]() |
edce497a0d | ||
![]() |
059e8722b6 | ||
![]() |
f23cc16660 | ||
![]() |
f72ba0c716 | ||
![]() |
4c5801ee8c | ||
![]() |
e3a3964911 | ||
![]() |
a2678b2aff | ||
![]() |
7f2921b0e6 | ||
![]() |
48d35a4550 | ||
![]() |
31b17e2b95 | ||
![]() |
e9dc404de1 | ||
![]() |
720d63f496 | ||
![]() |
e9b19e0465 | ||
![]() |
e74c4c5d99 | ||
![]() |
697833bc91 | ||
![]() |
d101d4449f | ||
![]() |
fdaaabf070 | ||
![]() |
d4ff214fce | ||
![]() |
b1bb2298e0 | ||
![]() |
868eb3c735 | ||
![]() |
70f8bfbd4f | ||
![]() |
83768be814 | ||
![]() |
ed0ee3100d | ||
![]() |
32aae7017e | ||
![]() |
63a843c19c | ||
![]() |
251808874f | ||
![]() |
9c23c4adf2 | ||
![]() |
8e3dfbd5c9 | ||
![]() |
834929a14e | ||
![]() |
fb3bb8220b | ||
![]() |
b41480ae46 | ||
![]() |
3911f24f75 | ||
![]() |
0fc92928a4 | ||
![]() |
6604680793 | ||
![]() |
ecdc1adf90 | ||
![]() |
de94afd090 | ||
![]() |
4ef04840e9 | ||
![]() |
3e7699b886 | ||
![]() |
d448ed9f6d | ||
![]() |
f229cf2796 | ||
![]() |
b3098c9f2c | ||
![]() |
27f35f86ad | ||
![]() |
0faca57e8b | ||
![]() |
84e1b3d07f | ||
![]() |
5def51835e | ||
![]() |
12f1a322a7 | ||
![]() |
488f26d55b | ||
![]() |
20a0557be7 | ||
![]() |
e58291015c | ||
![]() |
e6a27983d3 | ||
![]() |
939ca63cbc | ||
![]() |
04b5d6c697 | ||
![]() |
92fd3e3ad5 | ||
![]() |
eb0aed3653 | ||
![]() |
3a610edb78 | ||
![]() |
d236a19139 | ||
![]() |
0cb468d7b0 | ||
![]() |
80be3b74a9 | ||
![]() |
52818bdb89 | ||
![]() |
5baaa852dd | ||
![]() |
9804fbb527 | ||
![]() |
e0d6810134 | ||
![]() |
c3144eddbb | ||
![]() |
50714fbedf | ||
![]() |
c9de5b9fef | ||
![]() |
aae80dca1c | ||
![]() |
9e5de1a106 | ||
![]() |
5ea4ba6a2e | ||
![]() |
f5c7d23b0f | ||
![]() |
82a5c23c9c | ||
![]() |
952b21facc | ||
![]() |
9f64656603 | ||
![]() |
6d06cec0e0 | ||
![]() |
9836e78120 | ||
![]() |
f1d22db009 | ||
![]() |
24c87638e6 | ||
![]() |
36f7096f09 | ||
![]() |
9b65d83e28 | ||
![]() |
29e412a6c4 | ||
![]() |
a466ae0279 | ||
![]() |
628a148944 | ||
![]() |
41bef4b919 | ||
![]() |
0adb88156d | ||
![]() |
bdef54de0c | ||
![]() |
d16011b849 | ||
![]() |
9c7caaa142 | ||
![]() |
feb39c39a3 | ||
![]() |
0135b988ff | ||
![]() |
876195a8a8 | ||
![]() |
31cd0af47a | ||
![]() |
115aa2e49c | ||
![]() |
78e831b08e | ||
![]() |
ad8278c078 | ||
![]() |
0439d6964c | ||
![]() |
c16fae2c0b | ||
![]() |
58b5833d64 | ||
![]() |
575eb48feb | ||
![]() |
d851cb6f9e | ||
![]() |
87ca61ddd7 | ||
![]() |
d1e59b20c8 | ||
![]() |
dd0f0034f3 | ||
![]() |
be042f3d91 | ||
![]() |
33cbb398ad | ||
![]() |
b058742404 | ||
![]() |
3f32490ae6 | ||
![]() |
9e51a18845 | ||
![]() |
8fe17c0933 | ||
![]() |
fc01da8933 | ||
![]() |
039cc98278 | ||
![]() |
445fd15f76 | ||
![]() |
bfafa77016 | ||
![]() |
95a6a7502a | ||
![]() |
d6f317c0a9 | ||
![]() |
012c09ce00 | ||
![]() |
9c0799eb0a | ||
![]() |
09f3362cc6 | ||
![]() |
84a7115435 | ||
![]() |
8a5bce81c8 | ||
![]() |
a28545b69b | ||
![]() |
6dd496deb4 | ||
![]() |
820780996a | ||
![]() |
003658a3f0 | ||
![]() |
3db7e8f5e9 | ||
![]() |
3c86825e25 | ||
![]() |
2cb92c66ef | ||
![]() |
114390c95e | ||
![]() |
8f5a00a98b | ||
![]() |
a470a72ec5 | ||
![]() |
6b3260357f | ||
![]() |
c8cc8acc81 | ||
![]() |
b91a8f510c | ||
![]() |
1301a4fcc6 | ||
![]() |
4d57de335c | ||
![]() |
9fbb6d981a | ||
![]() |
c59bf0bff6 | ||
![]() |
5b32ee566c | ||
![]() |
c051ae0bfb | ||
![]() |
7685c76b9b | ||
![]() |
9d662d6114 | ||
![]() |
7c42f4b45b | ||
![]() |
327b5c3c94 | ||
![]() |
1fee400dcd | ||
![]() |
130571c478 | ||
![]() |
c58c10ab7c | ||
![]() |
7d68e88d31 | ||
![]() |
4b33578757 | ||
![]() |
914b49566a | ||
![]() |
7931a0b675 | ||
![]() |
b9eb831d29 | ||
![]() |
7bd98d1082 | ||
![]() |
a08e3d7352 | ||
![]() |
87164e2129 | ||
![]() |
ce041f131e | ||
![]() |
2fb36d3dea | ||
![]() |
4dd1c51186 | ||
![]() |
4c9c22bc3a | ||
![]() |
0cb9d0746a | ||
![]() |
856dd63680 | ||
![]() |
7b8dff2aa9 | ||
![]() |
0c796fc3c3 | ||
![]() |
01ef44fd68 | ||
![]() |
004af97699 | ||
![]() |
c2357d843b | ||
![]() |
a12cf7211d | ||
![]() |
3ed1738f76 | ||
![]() |
66d2f5f61d | ||
![]() |
899f6cf1a3 | ||
![]() |
99328bd4c1 | ||
![]() |
47e5142ddb | ||
![]() |
e28fd16c84 | ||
![]() |
302d5d66ab | ||
![]() |
807badea93 | ||
![]() |
d53c6be50a | ||
![]() |
19920e48ba | ||
![]() |
70fe5d3238 | ||
![]() |
f7015703bb | ||
![]() |
90de5652b9 | ||
![]() |
2d6599fdd2 | ||
![]() |
d9280330a6 | ||
![]() |
a4fc4bb281 | ||
![]() |
22e7ece315 | ||
![]() |
db0baab692 | ||
![]() |
f5d4878992 | ||
![]() |
27244e29c4 | ||
![]() |
0ed6a434f8 | ||
![]() |
4f1f4a1b4f | ||
![]() |
9049e090f9 | ||
![]() |
315d0064fe | ||
![]() |
12f273eb11 | ||
![]() |
38a6fffecb | ||
![]() |
454cc684e4 | ||
![]() |
8c1cdc0cf7 | ||
![]() |
1222aa8c56 | ||
![]() |
7f948594eb | ||
![]() |
bc3b7ed06b | ||
![]() |
e37443f10c | ||
![]() |
80c344d3a8 | ||
![]() |
897522a82d | ||
![]() |
080c702d4f | ||
![]() |
6cc75fc6f3 | ||
![]() |
6b6570e7ca | ||
![]() |
08f128e9c7 | ||
![]() |
c804f8f961 | ||
![]() |
f60125b5c9 | ||
![]() |
67c56c860d | ||
![]() |
29ec17d50d | ||
![]() |
5cb6d1b21f | ||
![]() |
3a28361beb | ||
![]() |
72f336a2dd | ||
![]() |
bb3fa6990a | ||
![]() |
96a6a44411 | ||
![]() |
9bcd4653e0 | ||
![]() |
4035fda659 | ||
![]() |
fbf1836997 | ||
![]() |
1ab1808307 | ||
![]() |
ee1cc3b3dd | ||
![]() |
de915e1bf0 | ||
![]() |
485761bbaf | ||
![]() |
23b92b2a56 | ||
![]() |
21816eeed4 | ||
![]() |
5cdaff5405 | ||
![]() |
c49e423c78 | ||
![]() |
1dea0c9e34 | ||
![]() |
14779ce3d0 | ||
![]() |
710680d604 | ||
![]() |
8b39957c56 | ||
![]() |
d58e6e924a | ||
![]() |
ca0fad2cbb | ||
![]() |
f9e06ca2fd | ||
![]() |
96961b9bcc | ||
![]() |
73de69896b | ||
![]() |
df74272ba6 | ||
![]() |
4bb670cdf7 | ||
![]() |
9b27e5b86c | ||
![]() |
c7cf1b820c | ||
![]() |
abfcc18004 | ||
![]() |
53012a548b | ||
![]() |
60e1789557 | ||
![]() |
991834f337 | ||
![]() |
d1b38c0c79 | ||
![]() |
f281069c8c | ||
![]() |
76debf4c88 | ||
![]() |
127d84edd1 | ||
![]() |
3f469eac28 | ||
![]() |
f81e608cc1 | ||
![]() |
c4a6f265e8 | ||
![]() |
e9b428781b | ||
![]() |
3df40c7a16 | ||
![]() |
16a7408f23 | ||
![]() |
41cd678f00 | ||
![]() |
2da3848f89 | ||
![]() |
3b0f29fe95 | ||
![]() |
eb47c2b148 | ||
![]() |
01d651c67d | ||
![]() |
27bd6ca1db | ||
![]() |
05daa817f5 | ||
![]() |
d62993c5af | ||
![]() |
04225ba802 | ||
![]() |
186799794d | ||
![]() |
ad58e607df | ||
![]() |
69b113c539 | ||
![]() |
3d10bb3647 | ||
![]() |
c7d61279bd | ||
![]() |
df85a50f3b | ||
![]() |
9cf3ff319e | ||
![]() |
b54c8641b4 | ||
![]() |
e4e4f78eb0 | ||
![]() |
b6cd6135c2 | ||
![]() |
776d8cfdc9 | ||
![]() |
c54135486e | ||
![]() |
4c5c34919d | ||
![]() |
0b4ca9ecac | ||
![]() |
bfa58f671a | ||
![]() |
9c1236b6de | ||
![]() |
38657c0055 | ||
![]() |
2261bb60e0 | ||
![]() |
2511f5edb4 | ||
![]() |
fa6b75f2c1 | ||
![]() |
a78fe25871 | ||
![]() |
642655b6d7 | ||
![]() |
c7b2c09a61 | ||
![]() |
0e71c29e00 | ||
![]() |
0fbb450838 | ||
![]() |
202522fbca | ||
![]() |
425a1814d9 | ||
![]() |
790881fa7b | ||
![]() |
69f790f6cc | ||
![]() |
852996700f | ||
![]() |
2cd55bbb87 | ||
![]() |
ea39d5b428 | ||
![]() |
f9e9a5e4cb | ||
![]() |
9228ed7c40 | ||
![]() |
6a11e6aa72 | ||
![]() |
ebb2722d03 | ||
![]() |
c5316dbc39 | ||
![]() |
c3d7ab6a7f | ||
![]() |
7128396f1a | ||
![]() |
6a67532a2d | ||
![]() |
cbf59fb33d | ||
![]() |
9df71ecae2 | ||
![]() |
791dc5809f | ||
![]() |
c399fe2837 | ||
![]() |
d0c7db548f | ||
![]() |
1790036767 | ||
![]() |
2abc9005cc | ||
![]() |
236a21c76e | ||
![]() |
942f654d92 | ||
![]() |
8c1a8b502d | ||
![]() |
6996ad3541 | ||
![]() |
8dea7f0f98 | ||
![]() |
d451e54e34 | ||
![]() |
e577f047f7 | ||
![]() |
076e0273a2 | ||
![]() |
39887c46c0 | ||
![]() |
81a482332d | ||
![]() |
6a1753d6db | ||
![]() |
cce3077df3 | ||
![]() |
e6eed4755f | ||
![]() |
3d25ed7994 | ||
![]() |
55559f3e30 | ||
![]() |
51ece97e0d | ||
![]() |
415176e350 | ||
![]() |
e0b82440ad | ||
![]() |
3d64405896 | ||
![]() |
b832749e3c | ||
![]() |
0a4979549d | ||
![]() |
b731ddabde | ||
![]() |
aeff27680b | ||
![]() |
ce5072fc91 | ||
![]() |
d2c1e5d45c | ||
![]() |
0d5de6a464 | ||
![]() |
fbd4cf1089 | ||
![]() |
e4e9cdce73 | ||
![]() |
a3b605bb7d | ||
![]() |
f355570f17 | ||
![]() |
73c373a0f2 | ||
![]() |
954813b478 | ||
![]() |
3b5da9c44a | ||
![]() |
8f5e8c72c6 | ||
![]() |
f5288db93c | ||
![]() |
d3f67c3841 | ||
![]() |
a38f3ac9c6 | ||
![]() |
57a3f7d5c8 | ||
![]() |
00dc721609 | ||
![]() |
b0d0060643 | ||
![]() |
c4794572d4 | ||
![]() |
94dec483e9 | ||
![]() |
c78773970b | ||
![]() |
663e2eaaff | ||
![]() |
ba34922b03 | ||
![]() |
6ad3b6426a | ||
![]() |
fa00808f6c | ||
![]() |
09ff0a5ac6 | ||
![]() |
74c0219d0c | ||
![]() |
b4bcd477f8 | ||
![]() |
cfe68d7e00 | ||
![]() |
a885670a9a | ||
![]() |
f5a1b32be0 | ||
![]() |
e510c4ea1d | ||
![]() |
d020486929 | ||
![]() |
700cecc8ef | ||
![]() |
ef4515ed70 | ||
![]() |
d752fe3033 | ||
![]() |
6de8072e8a | ||
![]() |
21cf6777bb | ||
![]() |
de0db1601b | ||
![]() |
94b6cbc571 | ||
![]() |
957a2e99fd | ||
![]() |
b759d50900 | ||
![]() |
cc9589cff2 | ||
![]() |
7f4baab3f6 | ||
![]() |
0cdc315038 | ||
![]() |
e360b1265f | ||
![]() |
256056430e | ||
![]() |
ccb0fd5e32 | ||
![]() |
d838a56c1d | ||
![]() |
ee657f3c2f | ||
![]() |
9d7799c0af | ||
![]() |
977f51a9e4 | ||
![]() |
e2adfc3979 | ||
![]() |
b4c95421d3 | ||
![]() |
23fb364076 | ||
![]() |
1ee8057662 | ||
![]() |
fb66a6cf81 | ||
![]() |
31c71989e9 | ||
![]() |
74d86dfff9 | ||
![]() |
6af30bc232 | ||
![]() |
8afe13e818 | ||
![]() |
d257fff9ce | ||
![]() |
c9415ab75d | ||
![]() |
b8434fdcfd | ||
![]() |
48aba426a9 | ||
![]() |
606d310ea3 | ||
![]() |
d9b52ef98c | ||
![]() |
f3717421c0 | ||
![]() |
c5f4872aea | ||
![]() |
27530be46f | ||
![]() |
ec3ffe309a | ||
![]() |
d5419b77f9 | ||
![]() |
1bb499aec2 | ||
![]() |
a857148560 | ||
![]() |
0aace1da55 | ||
![]() |
e2a9c652ab | ||
![]() |
33542f0e5e | ||
![]() |
fcf18aca34 | ||
![]() |
8def0326dd | ||
![]() |
dc911ecc5b | ||
![]() |
3b6bc9067f | ||
![]() |
9ba9b3339b | ||
![]() |
173966f459 | ||
![]() |
20fdcbadff | ||
![]() |
42688a6e4a | ||
![]() |
97cb8a3745 | ||
![]() |
b4fda5faab | ||
![]() |
ec8ea02273 | ||
![]() |
4e7b9eaed0 | ||
![]() |
98d2eadb76 | ||
![]() |
5bdb20098e | ||
![]() |
1846b45cb5 | ||
![]() |
19893b8f3c | ||
![]() |
76f455cea9 | ||
![]() |
2a92eb1962 | ||
![]() |
204ca3f3a6 | ||
![]() |
ed5cdb528c | ||
![]() |
ed464a75b2 | ||
![]() |
04722fdd63 | ||
![]() |
e9917c6a81 | ||
![]() |
009e4df6ef | ||
![]() |
086d1f432d | ||
![]() |
564fed7879 | ||
![]() |
a050d54847 | ||
![]() |
f6d1eb97a3 | ||
![]() |
e99184bf68 | ||
![]() |
957e5018f4 | ||
![]() |
f10076a4ad | ||
![]() |
1646aab36d | ||
![]() |
6885167fcc | ||
![]() |
c6ac2a5705 | ||
![]() |
b2d5de6a79 | ||
![]() |
dad11f8208 | ||
![]() |
28e9f1d0b8 | ||
![]() |
41440d4f1b | ||
![]() |
52926f1961 | ||
![]() |
d70ad369de | ||
![]() |
f874a9df13 | ||
![]() |
69ae469148 | ||
![]() |
4c0f73a2b9 | ||
![]() |
2773328134 | ||
![]() |
5ee20b61b3 | ||
![]() |
27200865ee | ||
![]() |
50ee0c6727 | ||
![]() |
f2a08c438b | ||
![]() |
94297e96cb | ||
![]() |
b2cce05405 | ||
![]() |
85e188db52 | ||
![]() |
10759b7ca6 | ||
![]() |
0158f29e4e | ||
![]() |
5586f40ab0 | ||
![]() |
cdf53aed93 | ||
![]() |
f422cdbfef | ||
![]() |
06a156c091 | ||
![]() |
ebc9d17558 | ||
![]() |
6c863a8948 | ||
![]() |
58ba6052e2 | ||
![]() |
a4ac5dc6b8 | ||
![]() |
24878f109c | ||
![]() |
dbd231b3a0 | ||
![]() |
270d97d789 | ||
![]() |
89c7629215 | ||
![]() |
8647ba3dd5 | ||
![]() |
f5550509d4 | ||
![]() |
bbe57d6673 | ||
![]() |
95de802fbd | ||
![]() |
3e634aaf5d | ||
![]() |
81e4e9e26b | ||
![]() |
12e1c695ca | ||
![]() |
7df4c1e676 | ||
![]() |
653e0078a4 | ||
![]() |
c6066d8b98 | ||
![]() |
c02d551cd5 | ||
![]() |
d9661b408b | ||
![]() |
c6b8d35c16 | ||
![]() |
43665466f5 | ||
![]() |
96cf20ad81 | ||
![]() |
72995f6ce6 | ||
![]() |
5573504508 | ||
![]() |
b829c46e18 | ||
![]() |
a2a3c50555 | ||
![]() |
f8d607bdf5 | ||
![]() |
0d1a389602 | ||
![]() |
af18c668d2 | ||
![]() |
4b6a2496c7 | ||
![]() |
12791a687b | ||
![]() |
c6ad57eb2b | ||
![]() |
9bb6bcad70 | ||
![]() |
bef1c00b49 | ||
![]() |
c880f09714 | ||
![]() |
46c306685d | ||
![]() |
c79e99318d | ||
![]() |
d8dcf17cb5 | ||
![]() |
4a7004b791 | ||
![]() |
88c1a630d8 | ||
![]() |
95bc97fb6a | ||
![]() |
e6f7cbe53e | ||
![]() |
6f5b59da15 | ||
![]() |
497674835b | ||
![]() |
f4f4c695d9 | ||
![]() |
c159ad52a4 | ||
![]() |
6c45c1969b | ||
![]() |
56b60577de | ||
![]() |
992d9273bb | ||
![]() |
73e25296ca | ||
![]() |
e04a208af0 | ||
![]() |
45c7c7a439 | ||
![]() |
a24e7832b5 | ||
![]() |
048068307d | ||
![]() |
518ca3afa7 | ||
![]() |
849d8c885d | ||
![]() |
d79d9e0bfb | ||
![]() |
c6fd8582a9 | ||
![]() |
025c1a39a7 | ||
![]() |
1a51590711 | ||
![]() |
49232332a1 | ||
![]() |
695ec0c219 | ||
![]() |
7aab0d0aa0 | ||
![]() |
cfe920079c | ||
![]() |
3dc629db08 | ||
![]() |
c3453be17b | ||
![]() |
c0c1d68858 | ||
![]() |
1d65670a71 | ||
![]() |
fd107f2b2e | ||
![]() |
2df189b58e | ||
![]() |
09e2be02d3 | ||
![]() |
f6780c1fa2 | ||
![]() |
a1a131334a | ||
![]() |
0416e5b0fc | ||
![]() |
3205afe74e | ||
![]() |
bd1e5fce27 | ||
![]() |
3ddd20159c | ||
![]() |
564c468c26 | ||
![]() |
bc635120fa | ||
![]() |
4130f2ff1a | ||
![]() |
b462c539eb | ||
![]() |
01bc1e4c66 | ||
![]() |
0e223662a9 | ||
![]() |
4989d1e7a9 | ||
![]() |
c9c41260b2 | ||
![]() |
be316af303 | ||
![]() |
9d213e70f0 | ||
![]() |
e26eebfc19 | ||
![]() |
98b6905738 | ||
![]() |
bbf99c61fa | ||
![]() |
655780447c | ||
![]() |
f220c73e8f | ||
![]() |
f8ffcd6caf | ||
![]() |
eef91f843d | ||
![]() |
b1b784484e | ||
![]() |
4f8200d15a | ||
![]() |
cae802f7ee | ||
![]() |
25b6740466 | ||
![]() |
078e907178 | ||
![]() |
e9647f8814 | ||
![]() |
841ce8ade9 | ||
![]() |
26b63e73ad | ||
![]() |
4191d9ca8d | ||
![]() |
32e04e1dce | ||
![]() |
2569c4ae37 | ||
![]() |
434b783b4c | ||
![]() |
d5ee34e504 | ||
![]() |
02d9ed5e36 | ||
![]() |
9587afc5ce | ||
![]() |
76aaf8b560 | ||
![]() |
8f608608ed | ||
![]() |
141fd1bffd | ||
![]() |
83b21651ce | ||
![]() |
9811d63d78 | ||
![]() |
9160d43a08 | ||
![]() |
bacc549576 | ||
![]() |
55ba956d3d | ||
![]() |
61cb0924db | ||
![]() |
1adcdad5a4 | ||
![]() |
372aa312e1 | ||
![]() |
9868161821 | ||
![]() |
8baba2e33d | ||
![]() |
5a24dbf599 | ||
![]() |
67498595e4 | ||
![]() |
040fd9c258 | ||
![]() |
ffaa0e572a | ||
![]() |
1804c6edc5 | ||
![]() |
9771826ed6 | ||
![]() |
b28bc1d6fb | ||
![]() |
3f2b6bfaa4 | ||
![]() |
19241f421b | ||
![]() |
d1aa0cea97 | ||
![]() |
d91dd68b31 | ||
![]() |
a9baa24fda | ||
![]() |
22225cea4d | ||
![]() |
9927f6c17d | ||
![]() |
64628c1f70 | ||
![]() |
6c9291c7a6 | ||
![]() |
a0a348a200 | ||
![]() |
d0ed9b32ac | ||
![]() |
e2e53be5ac | ||
![]() |
3c9d2b552e | ||
![]() |
8fbfb6bf8c | ||
![]() |
84d6a5369f | ||
![]() |
9f649ed345 | ||
![]() |
5c8a8a631c | ||
![]() |
6a02c6540e | ||
![]() |
c4c8a1ba2d | ||
![]() |
2bdf7fc8f5 | ||
![]() |
8908dba5b4 | ||
![]() |
d5efd0b352 | ||
![]() |
c0619944fa | ||
![]() |
bb46918d2e | ||
![]() |
1560d84cd7 | ||
![]() |
8da7f40736 | ||
![]() |
bea5d18c4a | ||
![]() |
6726c4c76b | ||
![]() |
9fbb345ce0 | ||
![]() |
93150f6f94 | ||
![]() |
f2b06d9abd | ||
![]() |
221db3a2dd | ||
![]() |
11b274989a | ||
![]() |
4ceddc6d35 | ||
![]() |
3aff90c0ac | ||
![]() |
453569a469 | ||
![]() |
db2f53dfc1 | ||
![]() |
82d8c9c2ca | ||
![]() |
869e71f455 | ||
![]() |
7ad139bb63 | ||
![]() |
96a28e59bc | ||
![]() |
aa9514b774 | ||
![]() |
5dbfa16e04 | ||
![]() |
bde453be47 | ||
![]() |
0ea91fbf2d | ||
![]() |
8ae0d891e4 | ||
![]() |
4bec14b0f6 | ||
![]() |
fbfbae8ad9 | ||
![]() |
39bf1b5f5d | ||
![]() |
7d90b1f9ec | ||
![]() |
93bb1a6816 | ||
![]() |
bbecd55c09 | ||
![]() |
c30dfac4ed | ||
![]() |
e4b26dc02b | ||
![]() |
11331ad26e | ||
![]() |
04bad4bc74 | ||
![]() |
e405398ca4 | ||
![]() |
ec008ddbe4 | ||
![]() |
2d5d40ce0e | ||
![]() |
4065c46046 | ||
![]() |
392cdf49e6 | ||
![]() |
12155cb66e | ||
![]() |
6126d05935 | ||
![]() |
364d1cff40 | ||
![]() |
e63bca4f32 | ||
![]() |
1322661ee0 | ||
![]() |
1c824f5ca7 | ||
![]() |
e5aa050def | ||
![]() |
fe34ea1865 | ||
![]() |
66aae61fd5 | ||
![]() |
0d30a6bcac | ||
![]() |
25ad933d2d | ||
![]() |
243e80459d | ||
![]() |
0e4920d6a1 | ||
![]() |
7b33e57e86 | ||
![]() |
5001dbdcfa | ||
![]() |
e1fece48e1 | ||
![]() |
430061a159 | ||
![]() |
8dc366c75b | ||
![]() |
103b917bb2 | ||
![]() |
26e674b4c3 | ||
![]() |
daed314585 | ||
![]() |
b847d55077 | ||
![]() |
5d5d053bce | ||
![]() |
4e107a2bcf | ||
![]() |
9c9e9bc92a | ||
![]() |
69991bf3a2 | ||
![]() |
3ecf5596ff | ||
![]() |
4cfd24a03a | ||
![]() |
665613e395 | ||
![]() |
f1a4e212cc | ||
![]() |
88376bf363 | ||
![]() |
9fd058aa33 | ||
![]() |
f6dd51a7fb | ||
![]() |
7ecd5b5e5a | ||
![]() |
ceb1528b50 | ||
![]() |
b6d94bcc96 | ||
![]() |
bdb3eb1683 | ||
![]() |
88441d5f68 | ||
![]() |
acc10c296e | ||
![]() |
d7a66e6e4c | ||
![]() |
fa1622fe8b | ||
![]() |
8ef8a314df | ||
![]() |
82fe409961 | ||
![]() |
b274fcba05 | ||
![]() |
d577868190 | ||
![]() |
ef21fd2536 | ||
![]() |
fdf0793fdd | ||
![]() |
12ae8b025f | ||
![]() |
59939004bf | ||
![]() |
a08df53dbc | ||
![]() |
8f05388bc5 | ||
![]() |
c80f284ca4 | ||
![]() |
2d2ab452ca | ||
![]() |
1681d36637 | ||
![]() |
004476a1f8 | ||
![]() |
ec61a86678 | ||
![]() |
1f13809c6d | ||
![]() |
9e882ef6b4 | ||
![]() |
5120181e0e | ||
![]() |
c72e230432 | ||
![]() |
0ff0ec7d3e | ||
![]() |
ff4d256893 | ||
![]() |
b8f03aa3be | ||
![]() |
975ee0ea7f | ||
![]() |
b7896c7b6f | ||
![]() |
fb9f561052 | ||
![]() |
8933540950 | ||
![]() |
5bc8ef962b | ||
![]() |
738b3363d9 | ||
![]() |
2a7aac6afc | ||
![]() |
33c6ee80ad | ||
![]() |
5eaafcfd7f | ||
![]() |
4e96ca9486 | ||
![]() |
555190990a | ||
![]() |
06231e7ac2 | ||
![]() |
5f1b0fb15c | ||
![]() |
b72c6c4424 | ||
![]() |
0849d42dc6 | ||
![]() |
4ea47333d8 | ||
![]() |
fe626f5669 | ||
![]() |
078a7e446d | ||
![]() |
a37260faa9 | ||
![]() |
c21650473a | ||
![]() |
9e01591cac | ||
![]() |
2da37778af | ||
![]() |
1c73ac5df8 | ||
![]() |
2cdd8ad15e | ||
![]() |
595567ad82 | ||
![]() |
c221fc5d22 | ||
![]() |
23d4445de3 | ||
![]() |
a27d8570c8 | ||
![]() |
4119ade2af | ||
![]() |
825ac36ee7 | ||
![]() |
9a388e2dd2 | ||
![]() |
c84590b18c | ||
![]() |
274508f8fd | ||
![]() |
915d23158d | ||
![]() |
4107fd9a25 | ||
![]() |
7a04f0c0df | ||
![]() |
a7c4abba98 | ||
![]() |
21ed87a773 | ||
![]() |
03fe7cb347 | ||
![]() |
33af72a54f | ||
![]() |
499838d5a7 | ||
![]() |
c1163283ff | ||
![]() |
d0c47dfee2 | ||
![]() |
42ce5e8b07 | ||
![]() |
a5960830d7 | ||
![]() |
f8a36499c1 | ||
![]() |
9e971495f7 | ||
![]() |
44e708f72b | ||
![]() |
78d5184186 | ||
![]() |
c47ed743f1 | ||
![]() |
f9571c9637 | ||
![]() |
c538d899a2 | ||
![]() |
c76f768a82 | ||
![]() |
6c6a5c50a5 | ||
![]() |
b0925e60d7 | ||
![]() |
db425f5432 | ||
![]() |
99c7608fb4 | ||
![]() |
afaa464142 | ||
![]() |
1f72de108c | ||
![]() |
72ccc83651 | ||
![]() |
6e7b5b71f5 | ||
![]() |
4881bc04d8 | ||
![]() |
5f4fc271d4 | ||
![]() |
db0008e62c | ||
![]() |
cc255da038 | ||
![]() |
cc346e57e6 | ||
![]() |
8a413b152d | ||
![]() |
87de5db535 | ||
![]() |
f5c01cc30d | ||
![]() |
807de1aeb3 | ||
![]() |
0088995b98 | ||
![]() |
d5db55354e | ||
![]() |
112a3f5e9f | ||
![]() |
1fde0d18ed | ||
![]() |
3203cba01f | ||
![]() |
c95a01ce3a | ||
![]() |
729116ff3a | ||
![]() |
a64d04da56 | ||
![]() |
d211a29cae | ||
![]() |
844eb6b8ef | ||
![]() |
5015993f30 | ||
![]() |
29e2201446 | ||
![]() |
12c396fb19 | ||
![]() |
970a80216d | ||
![]() |
f53812f261 | ||
![]() |
5ea5db32d2 | ||
![]() |
dc8c085872 | ||
![]() |
f971e16749 | ||
![]() |
04754b354c | ||
![]() |
66b7dfec53 | ||
![]() |
c4108fec4f | ||
![]() |
3dd5222ec7 | ||
![]() |
9a5dc848c9 | ||
![]() |
ea6417bea3 | ||
![]() |
e40dda3ce3 | ||
![]() |
f504ac8c65 | ||
![]() |
9dc63419c4 | ||
![]() |
3e4f7fddf2 | ||
![]() |
335473cb71 | ||
![]() |
6da01904c4 | ||
![]() |
1043712c54 | ||
![]() |
b927f40f00 | ||
![]() |
5edc45e9af | ||
![]() |
ccb05764b6 | ||
![]() |
71bafba9ec | ||
![]() |
cb5d00a07b | ||
![]() |
63f66785ad | ||
![]() |
752a4d7221 | ||
![]() |
193769c791 | ||
![]() |
3122182ab2 | ||
![]() |
c21c167f4e | ||
![]() |
5690313084 | ||
![]() |
aa00e56e1c | ||
![]() |
430f7bdfd4 | ||
![]() |
5b64052d69 | ||
![]() |
cc3559d54c | ||
![]() |
ee038999fc | ||
![]() |
fe9084bb3b | ||
![]() |
5822deda1d | ||
![]() |
6307f383a7 | ||
![]() |
8fade79a0a | ||
![]() |
ebc0ed1e22 | ||
![]() |
8a467bbf5c | ||
![]() |
b10d42e330 | ||
![]() |
2af1ba7492 | ||
![]() |
a56f7f5d75 | ||
![]() |
481f71107b | ||
![]() |
2e85e3662f | ||
![]() |
c382406735 | ||
![]() |
48c289fad3 | ||
![]() |
647595fd67 | ||
![]() |
1495df374b | ||
![]() |
ce8e0e5489 | ||
![]() |
94f8e634b2 | ||
![]() |
7c6b38d308 | ||
![]() |
bbca6e3ac2 | ||
![]() |
98eae305e2 | ||
![]() |
6ad74fba30 | ||
![]() |
9fd8ffdc44 | ||
![]() |
2a8e99d799 | ||
![]() |
ebd38395fb | ||
![]() |
f1d4a3cd6e | ||
![]() |
2c00a9ec68 | ||
![]() |
614842bcf2 | ||
![]() |
0a58853689 | ||
![]() |
b4f477f4de | ||
![]() |
23737e0225 | ||
![]() |
0bd01ba495 | ||
![]() |
08432c7c09 | ||
![]() |
b4caa4ab82 | ||
![]() |
829e0a7c42 | ||
![]() |
c35f9ee35f | ||
![]() |
a977f398ae | ||
![]() |
d92f48646a | ||
![]() |
6d77c15f28 | ||
![]() |
051e37eb49 | ||
![]() |
9a23a1c336 | ||
![]() |
1968a88336 | ||
![]() |
37f808f4d8 | ||
![]() |
e3b2a33962 | ||
![]() |
ab9a60f83f | ||
![]() |
a62bd97fa5 | ||
![]() |
3391fc660a | ||
![]() |
42809ad6a9 | ||
![]() |
dba87fd2e1 | ||
![]() |
c015f94fa2 | ||
![]() |
86e581b83d | ||
![]() |
c7c7a9ad06 | ||
![]() |
0e14c3f92a | ||
![]() |
df3e17a983 | ||
![]() |
9f181ac92e | ||
![]() |
138cee8069 | ||
![]() |
787aac7cf2 | ||
![]() |
ae3cf72fb2 | ||
![]() |
1c630738f7 | ||
![]() |
288ae8b1e7 | ||
![]() |
4ba2bd232c | ||
![]() |
b267d54db3 | ||
![]() |
bca93ca2ec | ||
![]() |
98c7ddc0cf | ||
![]() |
9fb289ad93 | ||
![]() |
69b096023a | ||
![]() |
ab41310847 | ||
![]() |
687b7fc8cb | ||
![]() |
89cd5d46cd | ||
![]() |
d9f146d076 | ||
![]() |
9fd6afc5fb | ||
![]() |
6db4e975e3 | ||
![]() |
e60ae77f1b | ||
![]() |
6b62328c0f | ||
![]() |
8e7a9521dc | ||
![]() |
b92b6c40b7 | ||
![]() |
c2161b1f5a | ||
![]() |
cd8c281cb6 | ||
![]() |
94675ca5a7 | ||
![]() |
21157f9dac | ||
![]() |
9324845aaa | ||
![]() |
9002955787 | ||
![]() |
2d4b038b48 | ||
![]() |
5203c72fca | ||
![]() |
5fcfdee6b5 | ||
![]() |
e915dd0d95 | ||
![]() |
b83f92e4a5 | ||
![]() |
a4ed1d69b8 | ||
![]() |
1f4296f688 | ||
![]() |
475c8ebae2 | ||
![]() |
4e9e9efa43 | ||
![]() |
8439e597ce | ||
![]() |
61bb24c423 | ||
![]() |
1a46294e6d | ||
![]() |
eb23846cfe | ||
![]() |
7966411274 | ||
![]() |
bf4c81aa5e | ||
![]() |
d91eddc4f0 | ||
![]() |
fb1fd19aae | ||
![]() |
c6343c9e88 | ||
![]() |
b964fcc5b1 | ||
![]() |
31cbdbf1dd | ||
![]() |
f8be1512b8 | ||
![]() |
5ff24ecf77 | ||
![]() |
fe5f30ba78 | ||
![]() |
5f0f5ca557 | ||
![]() |
1479e7353b | ||
![]() |
326c25a766 | ||
![]() |
f6b48dec94 | ||
![]() |
a4ae9a94ee | ||
![]() |
5731f528d2 | ||
![]() |
90c7d0e56a | ||
![]() |
d4c80f160c | ||
![]() |
aef808d2bf | ||
![]() |
3d5b007c6b | ||
![]() |
0c48b8ec52 | ||
![]() |
101ab5c3fa | ||
![]() |
cb63a9d7e1 | ||
![]() |
f25a3cbfcf | ||
![]() |
c7f684d3f4 | ||
![]() |
0a9ac7e655 | ||
![]() |
d1241147c8 | ||
![]() |
d6e99db38e | ||
![]() |
0996b717ce | ||
![]() |
fbe3d8dade | ||
![]() |
2779d4f66e | ||
![]() |
d736c5f648 | ||
![]() |
87b13ee732 | ||
![]() |
afbd966ba6 | ||
![]() |
8a28d5fbee | ||
![]() |
d88ca0f5cb | ||
![]() |
2aee366a1f | ||
![]() |
16f8ae1535 | ||
![]() |
d8ca2e9d71 | ||
![]() |
cd335bd434 | ||
![]() |
5e20817ea4 | ||
![]() |
adb3997547 | ||
![]() |
d796053d9f | ||
![]() |
35000848ed | ||
![]() |
4c690eace8 | ||
![]() |
60e7440ec1 | ||
![]() |
b4ccc0202a | ||
![]() |
5e973dd017 | ||
![]() |
bc14e93ae3 | ||
![]() |
2aad150419 | ||
![]() |
806b96ef73 | ||
![]() |
f170ac48d2 | ||
![]() |
0467ddb60c | ||
![]() |
b2870b6833 | ||
![]() |
f5a9bcdf6d | ||
![]() |
af2443fb10 | ||
![]() |
520e4296ba | ||
![]() |
4f089aba35 | ||
![]() |
2cf86a3554 | ||
![]() |
ea0bae2d1b | ||
![]() |
962c47b666 | ||
![]() |
c6d6bbf3e0 | ||
![]() |
08d662c0a5 | ||
![]() |
3f2c344e4f | ||
![]() |
fae8cd48c4 | ||
![]() |
31131e4ac6 | ||
![]() |
c27b94c0e5 | ||
![]() |
8789da36be | ||
![]() |
15e6278a2e | ||
![]() |
15ce738357 | ||
![]() |
376e3def1d | ||
![]() |
ec45e72bea | ||
![]() |
349e7b8cd1 | ||
![]() |
8f390d099a | ||
![]() |
fe942c40a0 | ||
![]() |
a48d426f18 | ||
![]() |
b4cec23add | ||
![]() |
4bcc669d19 | ||
![]() |
d7f45a47f5 | ||
![]() |
70e8c58254 | ||
![]() |
d2d9f09f13 | ||
![]() |
5961215e6e | ||
![]() |
a1f2b6d402 | ||
![]() |
fc04b3e31c | ||
![]() |
5f177fa42e | ||
![]() |
48fd95c7db | ||
![]() |
1208ab4c76 | ||
![]() |
e8348221d4 | ||
![]() |
4f11eec1a1 | ||
![]() |
87606bc12b | ||
![]() |
a89b4011ee | ||
![]() |
cfa689c3a6 | ||
![]() |
25b0631264 | ||
![]() |
a9a1c2b91d | ||
![]() |
decab3e15b | ||
![]() |
cfcacc2827 | ||
![]() |
3ce850234f | ||
![]() |
90e723e25e | ||
![]() |
7bfde2dd33 | ||
![]() |
b6c7976477 | ||
![]() |
aea7c1c0ce | ||
![]() |
0ac8b297cd | ||
![]() |
65dd7d998b | ||
![]() |
66a574eca4 | ||
![]() |
206547a5d8 | ||
![]() |
a9536e4ed1 | ||
![]() |
65bf0a30f0 | ||
![]() |
ef687a36ff | ||
![]() |
25f0b70966 | ||
![]() |
179a2eb187 | ||
![]() |
a39cac765e | ||
![]() |
fc95a3d088 | ||
![]() |
0954f7d3be | ||
![]() |
58eeea903f | ||
![]() |
97224df4fd | ||
![]() |
45b53c8e82 | ||
![]() |
bc53e9d0c8 | ||
![]() |
504ad6488c | ||
![]() |
caedc14b00 | ||
![]() |
f8d3ea20b6 | ||
![]() |
f2c56cff43 | ||
![]() |
d0f1e9fc01 | ||
![]() |
28c6837f00 | ||
![]() |
4435b3a5c9 | ||
![]() |
cffadf919a | ||
![]() |
bd54ff3c02 | ||
![]() |
b2071b81c1 | ||
![]() |
e96b5ef2b0 | ||
![]() |
4f56f4e7e9 | ||
![]() |
64166583b3 | ||
![]() |
a71d852f16 | ||
![]() |
1012215709 | ||
![]() |
2bdfa9928b | ||
![]() |
fadb6a3979 | ||
![]() |
9b5fa2e67c | ||
![]() |
9d3d35ad79 | ||
![]() |
899306c8ec | ||
![]() |
a80baf2e5f | ||
![]() |
48660585f1 | ||
![]() |
af73e54aee | ||
![]() |
abb78a0d13 | ||
![]() |
50f1b6c689 | ||
![]() |
d34caf50f1 | ||
![]() |
76aae0c23e | ||
![]() |
6999a712ef | ||
![]() |
c3f07347a1 | ||
![]() |
5032c5a04c | ||
![]() |
78657bfbaf | ||
![]() |
2c607c836f | ||
![]() |
11cdce3758 | ||
![]() |
68fd39e321 | ||
![]() |
b5587348f5 | ||
![]() |
265c390b65 | ||
![]() |
78b83c653a | ||
![]() |
3d2ff841d3 | ||
![]() |
bb37bc32e3 | ||
![]() |
d9edd42532 | ||
![]() |
9a0a889492 | ||
![]() |
9ba3abd1b7 | ||
![]() |
b7153ca207 | ||
![]() |
2e1d05560f | ||
![]() |
ac4d8ee07f | ||
![]() |
e99bb8f75e | ||
![]() |
438ee99175 | ||
![]() |
f8712b4d7f | ||
![]() |
a63e976496 | ||
![]() |
8ab04d5fc7 | ||
![]() |
e69cd271dd | ||
![]() |
005a1b2713 | ||
![]() |
925e26b061 | ||
![]() |
10247f6799 | ||
![]() |
1e398a8966 | ||
![]() |
7b86f0f926 | ||
![]() |
136f1f7fe9 | ||
![]() |
a43095b2b5 | ||
![]() |
11efb2c2eb | ||
![]() |
804b6bbc0e | ||
![]() |
ef20f0985a | ||
![]() |
fb0e20543e | ||
![]() |
ade60742d4 | ||
![]() |
16a80beb43 | ||
![]() |
83a9f4ddb8 | ||
![]() |
f5fb9fc580 | ||
![]() |
6e58a0c996 | ||
![]() |
fe749fc0f8 | ||
![]() |
e419689229 | ||
![]() |
bbe0cf3a0c | ||
![]() |
06c26f3ffc | ||
![]() |
aaad8eac0a | ||
![]() |
6a7b5657ac | ||
![]() |
f3ea44cd92 | ||
![]() |
5b85456759 | ||
![]() |
99c0559a0c | ||
![]() |
33c8cba30d | ||
![]() |
b7296c61bc | ||
![]() |
552fbda58b | ||
![]() |
9b72a55d60 | ||
![]() |
6004ef3279 | ||
![]() |
fadb9bdfb3 | ||
![]() |
40b676c06f | ||
![]() |
de1799d486 | ||
![]() |
60d7f730c3 | ||
![]() |
cb19827932 | ||
![]() |
fe00f3558e | ||
![]() |
e91bb1ab08 | ||
![]() |
381bf987d2 | ||
![]() |
7cbd55a817 | ||
![]() |
c01b7bbf28 | ||
![]() |
7e6bcb85b7 | ||
![]() |
cb2f42b336 | ||
![]() |
0973f1961d | ||
![]() |
4e40394972 | ||
![]() |
9b038bd10d | ||
![]() |
734e982822 | ||
![]() |
0768ae2dc8 | ||
![]() |
5fd9b474dc | ||
![]() |
ecf2e9c0ab | ||
![]() |
b904a2c5ad | ||
![]() |
314c3d0965 | ||
![]() |
5cbb6607a6 | ||
![]() |
31752d5736 | ||
![]() |
0d432f60e2 | ||
![]() |
67eeb8f258 | ||
![]() |
f71527d5db | ||
![]() |
1679ec3245 | ||
![]() |
a8dff2f2d0 | ||
![]() |
b8fa5367db | ||
![]() |
512ef2fce4 | ||
![]() |
4863face69 | ||
![]() |
15900094a1 | ||
![]() |
ad4a960ed2 | ||
![]() |
50affdf953 | ||
![]() |
6655b7db2c | ||
![]() |
c0e1b97119 | ||
![]() |
6cc947abbf | ||
![]() |
21d48218aa | ||
![]() |
557e585e56 | ||
![]() |
62b09580c4 | ||
![]() |
07b7d514ac | ||
![]() |
12f1a8f551 | ||
![]() |
1fb377e61e | ||
![]() |
f8d779e840 | ||
![]() |
44879b323e | ||
![]() |
c7d72f55e9 | ||
![]() |
07337badcd | ||
![]() |
6f24d2bb3b | ||
![]() |
083d34cdd9 | ||
![]() |
72a17d4c67 | ||
![]() |
bb6a617a6f | ||
![]() |
54361342ba | ||
![]() |
5c9f7484c2 | ||
![]() |
d200c2dca2 | ||
![]() |
82729bef70 | ||
![]() |
ec373d90c1 | ||
![]() |
b74711793e | ||
![]() |
abbf6595bb | ||
![]() |
631a819bd1 | ||
![]() |
70c4b4a4f0 | ||
![]() |
674860e00e | ||
![]() |
5854eef47b | ||
![]() |
226b2bc3d0 | ||
![]() |
89213a4ce8 | ||
![]() |
d133501735 | ||
![]() |
ff5b070f4b | ||
![]() |
bfe4a85e9d | ||
![]() |
e11c9d710c | ||
![]() |
89df821113 | ||
![]() |
ef92c5672d | ||
![]() |
d3750401c1 | ||
![]() |
ee24710524 | ||
![]() |
8ae43d2de3 | ||
![]() |
bda3aadbcf | ||
![]() |
4350467a00 | ||
![]() |
f8efc2adc6 | ||
![]() |
24c29f9227 | ||
![]() |
e700384cce | ||
![]() |
e1eab214ad | ||
![]() |
6d734a714e | ||
![]() |
3a9e3ce857 | ||
![]() |
1dfb67f0c5 | ||
![]() |
5592eb7709 | ||
![]() |
c00b058e53 | ||
![]() |
502f59977a | ||
![]() |
756c36171d | ||
![]() |
4dc6d36224 | ||
![]() |
79ac77a93d | ||
![]() |
a4ec4d5a18 | ||
![]() |
04ab20846a | ||
![]() |
5b96704c4a | ||
![]() |
a0f764cf6d | ||
![]() |
0e4331e922 | ||
![]() |
1e27a1f2b9 | ||
![]() |
0ef99934b7 | ||
![]() |
f88ead597a | ||
![]() |
f7a64019b6 | ||
![]() |
31dd69196c | ||
![]() |
335872b54d | ||
![]() |
549e8cf2c5 | ||
![]() |
30f4ee121a | ||
![]() |
c1d88dd7a4 | ||
![]() |
7887850505 | ||
![]() |
54342d2a4e | ||
![]() |
edcf476408 | ||
![]() |
72dee7dd21 | ||
![]() |
75f94b9147 | ||
![]() |
6ac7796fb7 | ||
![]() |
a9db2ead33 | ||
![]() |
7e862e4d92 | ||
![]() |
2747f08385 | ||
![]() |
868f88a4e0 | ||
![]() |
bb8f139716 | ||
![]() |
2baee4ac3e | ||
![]() |
7096826d1d | ||
![]() |
08cc9fd375 | ||
![]() |
475b43500a | ||
![]() |
d6654eaecb | ||
![]() |
7fee44b8c5 | ||
![]() |
d44bfa8e88 | ||
![]() |
f4341c1546 | ||
![]() |
da8a476142 | ||
![]() |
f2d6cc7329 | ||
![]() |
7ddce1d52b | ||
![]() |
d28f7ab120 | ||
![]() |
2c914e0c59 | ||
![]() |
38428308fc | ||
![]() |
5c8a9c2815 | ||
![]() |
3c4caaaefc | ||
![]() |
0656f0c62b | ||
![]() |
43c7b57d1e | ||
![]() |
9153729b21 | ||
![]() |
98cf3f4aa3 | ||
![]() |
6bfb2460f2 | ||
![]() |
9661efc312 | ||
![]() |
95295791bd | ||
![]() |
643b3a98ee | ||
![]() |
32a024c641 | ||
![]() |
67cf7c26da | ||
![]() |
63deec3275 | ||
![]() |
98ac8a217d | ||
![]() |
c96d4c978d | ||
![]() |
ec478ab848 | ||
![]() |
322d8c2dd5 | ||
![]() |
b61218f90e | ||
![]() |
8791a48328 | ||
![]() |
15bedd8f27 | ||
![]() |
fc09702cc3 | ||
![]() |
969322e14a | ||
![]() |
b1fcecd526 | ||
![]() |
d44de6dd2b | ||
![]() |
dd9ca70e96 | ||
![]() |
8c31afc31e | ||
![]() |
6a1501b59c | ||
![]() |
160c201be1 | ||
![]() |
1b21685651 |
110
.coveragerc
110
.coveragerc
@@ -5,9 +5,7 @@ omit =
|
||||
homeassistant/__main__.py
|
||||
homeassistant/helpers/signal.py
|
||||
homeassistant/helpers/typing.py
|
||||
homeassistant/monkey_patch.py
|
||||
homeassistant/scripts/*.py
|
||||
homeassistant/util/async.py
|
||||
|
||||
# omit pieces of code that rely on external devices being present
|
||||
homeassistant/components/abode/__init__.py
|
||||
@@ -33,7 +31,6 @@ omit =
|
||||
homeassistant/components/airly/const.py
|
||||
homeassistant/components/airvisual/sensor.py
|
||||
homeassistant/components/aladdin_connect/cover.py
|
||||
homeassistant/components/alarm_control_panel/manual_mqtt.py
|
||||
homeassistant/components/alarmdecoder/*
|
||||
homeassistant/components/alarmdotcom/alarm_control_panel.py
|
||||
homeassistant/components/alpha_vantage/sensor.py
|
||||
@@ -62,6 +59,7 @@ omit =
|
||||
homeassistant/components/asterisk_cdr/mailbox.py
|
||||
homeassistant/components/asterisk_mbox/*
|
||||
homeassistant/components/asuswrt/device_tracker.py
|
||||
homeassistant/components/aten_pe/*
|
||||
homeassistant/components/atome/*
|
||||
homeassistant/components/august/*
|
||||
homeassistant/components/aurora_abb_powerone/sensor.py
|
||||
@@ -69,6 +67,7 @@ omit =
|
||||
homeassistant/components/avea/light.py
|
||||
homeassistant/components/avion/light.py
|
||||
homeassistant/components/azure_event_hub/*
|
||||
homeassistant/components/azure_service_bus/*
|
||||
homeassistant/components/baidu/tts.py
|
||||
homeassistant/components/beewi_smartclim/sensor.py
|
||||
homeassistant/components/bbb_gpio/*
|
||||
@@ -82,9 +81,8 @@ omit =
|
||||
homeassistant/components/blinkt/light.py
|
||||
homeassistant/components/blockchain/sensor.py
|
||||
homeassistant/components/bloomsky/*
|
||||
homeassistant/components/bluesound/media_player.py
|
||||
homeassistant/components/bluetooth_le_tracker/device_tracker.py
|
||||
homeassistant/components/bluetooth_tracker/device_tracker.py
|
||||
homeassistant/components/bluesound/*
|
||||
homeassistant/components/bluetooth_tracker/*
|
||||
homeassistant/components/bme280/sensor.py
|
||||
homeassistant/components/bme680/sensor.py
|
||||
homeassistant/components/bmw_connected_drive/*
|
||||
@@ -92,8 +90,12 @@ omit =
|
||||
homeassistant/components/bom/sensor.py
|
||||
homeassistant/components/bom/weather.py
|
||||
homeassistant/components/braviatv/media_player.py
|
||||
homeassistant/components/broadlink/remote.py
|
||||
homeassistant/components/broadlink/sensor.py
|
||||
homeassistant/components/broadlink/switch.py
|
||||
homeassistant/components/brother/__init__.py
|
||||
homeassistant/components/brother/sensor.py
|
||||
homeassistant/components/brother/const.py
|
||||
homeassistant/components/brottsplatskartan/sensor.py
|
||||
homeassistant/components/browser/*
|
||||
homeassistant/components/brunt/cover.py
|
||||
@@ -108,11 +110,10 @@ omit =
|
||||
homeassistant/components/cast/*
|
||||
homeassistant/components/cert_expiry/sensor.py
|
||||
homeassistant/components/cert_expiry/helper.py
|
||||
homeassistant/components/channels/media_player.py
|
||||
homeassistant/components/channels/*
|
||||
homeassistant/components/cisco_ios/device_tracker.py
|
||||
homeassistant/components/cisco_mobility_express/device_tracker.py
|
||||
homeassistant/components/cisco_webex_teams/notify.py
|
||||
homeassistant/components/ciscospark/notify.py
|
||||
homeassistant/components/citybikes/sensor.py
|
||||
homeassistant/components/clementine/media_player.py
|
||||
homeassistant/components/clickatell/notify.py
|
||||
@@ -162,9 +163,9 @@ omit =
|
||||
homeassistant/components/doorbird/*
|
||||
homeassistant/components/dovado/*
|
||||
homeassistant/components/downloader/*
|
||||
homeassistant/components/dsmr_reader/*
|
||||
homeassistant/components/dte_energy_bridge/sensor.py
|
||||
homeassistant/components/dublin_bus_transport/sensor.py
|
||||
homeassistant/components/duke_energy/sensor.py
|
||||
homeassistant/components/dunehd/media_player.py
|
||||
homeassistant/components/dwd_weather_warnings/sensor.py
|
||||
homeassistant/components/dweet/*
|
||||
@@ -177,7 +178,7 @@ omit =
|
||||
homeassistant/components/ecobee/notify.py
|
||||
homeassistant/components/ecobee/sensor.py
|
||||
homeassistant/components/ecobee/weather.py
|
||||
homeassistant/components/econet/water_heater.py
|
||||
homeassistant/components/econet/*
|
||||
homeassistant/components/ecovacs/*
|
||||
homeassistant/components/eddystone_temperature/sensor.py
|
||||
homeassistant/components/edimax/switch.py
|
||||
@@ -198,6 +199,7 @@ omit =
|
||||
homeassistant/components/envirophat/sensor.py
|
||||
homeassistant/components/envisalink/*
|
||||
homeassistant/components/ephember/climate.py
|
||||
homeassistant/components/epson/const.py
|
||||
homeassistant/components/epson/media_player.py
|
||||
homeassistant/components/epsonworkforce/sensor.py
|
||||
homeassistant/components/eq3btsmart/climate.py
|
||||
@@ -228,6 +230,7 @@ omit =
|
||||
homeassistant/components/flexit/climate.py
|
||||
homeassistant/components/flic/binary_sensor.py
|
||||
homeassistant/components/flock/notify.py
|
||||
homeassistant/components/flume/*
|
||||
homeassistant/components/flunearyou/sensor.py
|
||||
homeassistant/components/flux_led/light.py
|
||||
homeassistant/components/folder/sensor.py
|
||||
@@ -244,15 +247,19 @@ omit =
|
||||
homeassistant/components/fritzbox/*
|
||||
homeassistant/components/fritzbox_callmonitor/sensor.py
|
||||
homeassistant/components/fritzbox_netmonitor/sensor.py
|
||||
homeassistant/components/fritzdect/switch.py
|
||||
homeassistant/components/fronius/sensor.py
|
||||
homeassistant/components/frontier_silicon/media_player.py
|
||||
homeassistant/components/futurenow/light.py
|
||||
homeassistant/components/garadget/cover.py
|
||||
homeassistant/components/garmin_connect/__init__.py
|
||||
homeassistant/components/garmin_connect/const.py
|
||||
homeassistant/components/garmin_connect/sensor.py
|
||||
homeassistant/components/gc100/*
|
||||
homeassistant/components/geniushub/*
|
||||
homeassistant/components/gearbest/sensor.py
|
||||
homeassistant/components/geizhals/sensor.py
|
||||
homeassistant/components/gios/__init__.py
|
||||
homeassistant/components/gios/air_quality.py
|
||||
homeassistant/components/github/sensor.py
|
||||
homeassistant/components/gitlab_ci/sensor.py
|
||||
homeassistant/components/gitter/sensor.py
|
||||
@@ -274,7 +281,6 @@ omit =
|
||||
homeassistant/components/growatt_server/sensor.py
|
||||
homeassistant/components/gstreamer/media_player.py
|
||||
homeassistant/components/gtfs/sensor.py
|
||||
homeassistant/components/gtt/sensor.py
|
||||
homeassistant/components/habitica/*
|
||||
homeassistant/components/hangouts/*
|
||||
homeassistant/components/hangouts/__init__.py
|
||||
@@ -282,12 +288,13 @@ omit =
|
||||
homeassistant/components/hangouts/hangouts_bot.py
|
||||
homeassistant/components/hangouts/hangups_utils.py
|
||||
homeassistant/components/harman_kardon_avr/media_player.py
|
||||
homeassistant/components/harmony/remote.py
|
||||
homeassistant/components/harmony/*
|
||||
homeassistant/components/haveibeenpwned/sensor.py
|
||||
homeassistant/components/hdmi_cec/*
|
||||
homeassistant/components/heatmiser/climate.py
|
||||
homeassistant/components/hikvision/binary_sensor.py
|
||||
homeassistant/components/hikvisioncam/switch.py
|
||||
homeassistant/components/hisense_aehw4a1/*
|
||||
homeassistant/components/hitron_coda/device_tracker.py
|
||||
homeassistant/components/hive/*
|
||||
homeassistant/components/hlk_sw16/*
|
||||
@@ -297,7 +304,6 @@ omit =
|
||||
homeassistant/components/homematic/notify.py
|
||||
homeassistant/components/homeworks/*
|
||||
homeassistant/components/honeywell/climate.py
|
||||
homeassistant/components/hook/switch.py
|
||||
homeassistant/components/horizon/media_player.py
|
||||
homeassistant/components/hp_ilo/sensor.py
|
||||
homeassistant/components/htu21d/sensor.py
|
||||
@@ -313,7 +319,10 @@ omit =
|
||||
homeassistant/components/iaqualink/light.py
|
||||
homeassistant/components/iaqualink/sensor.py
|
||||
homeassistant/components/iaqualink/switch.py
|
||||
homeassistant/components/icloud/__init__.py
|
||||
homeassistant/components/icloud/account.py
|
||||
homeassistant/components/icloud/device_tracker.py
|
||||
homeassistant/components/icloud/sensor.py
|
||||
homeassistant/components/izone/climate.py
|
||||
homeassistant/components/izone/discovery.py
|
||||
homeassistant/components/izone/__init__.py
|
||||
@@ -326,6 +335,7 @@ omit =
|
||||
homeassistant/components/influxdb/sensor.py
|
||||
homeassistant/components/insteon/*
|
||||
homeassistant/components/incomfort/*
|
||||
homeassistant/components/intesishome/*
|
||||
homeassistant/components/ios/*
|
||||
homeassistant/components/iota/*
|
||||
homeassistant/components/iperf3/*
|
||||
@@ -341,6 +351,7 @@ omit =
|
||||
homeassistant/components/kankun/switch.py
|
||||
homeassistant/components/keba/*
|
||||
homeassistant/components/keenetic_ndms2/device_tracker.py
|
||||
homeassistant/components/kef/*
|
||||
homeassistant/components/keyboard/*
|
||||
homeassistant/components/keyboard_remote/*
|
||||
homeassistant/components/kira/*
|
||||
@@ -374,7 +385,6 @@ omit =
|
||||
homeassistant/components/linode/*
|
||||
homeassistant/components/linux_battery/sensor.py
|
||||
homeassistant/components/lirc/*
|
||||
homeassistant/components/liveboxplaytv/media_player.py
|
||||
homeassistant/components/llamalab_automate/notify.py
|
||||
homeassistant/components/lockitron/lock.py
|
||||
homeassistant/components/logi_circle/__init__.py
|
||||
@@ -399,16 +409,28 @@ omit =
|
||||
homeassistant/components/mcp23017/*
|
||||
homeassistant/components/media_extractor/*
|
||||
homeassistant/components/mediaroom/media_player.py
|
||||
homeassistant/components/melcloud/__init__.py
|
||||
homeassistant/components/melcloud/climate.py
|
||||
homeassistant/components/melcloud/sensor.py
|
||||
homeassistant/components/message_bird/notify.py
|
||||
homeassistant/components/met/weather.py
|
||||
homeassistant/components/meteo_france/*
|
||||
homeassistant/components/meteo_france/__init__.py
|
||||
homeassistant/components/meteo_france/const.py
|
||||
homeassistant/components/meteo_france/sensor.py
|
||||
homeassistant/components/meteo_france/weather.py
|
||||
homeassistant/components/meteoalarm/*
|
||||
homeassistant/components/metoffice/sensor.py
|
||||
homeassistant/components/metoffice/weather.py
|
||||
homeassistant/components/microsoft/tts.py
|
||||
homeassistant/components/miflora/sensor.py
|
||||
homeassistant/components/mikrotik/*
|
||||
homeassistant/components/mikrotik/hub.py
|
||||
homeassistant/components/mikrotik/device_tracker.py
|
||||
homeassistant/components/mill/climate.py
|
||||
homeassistant/components/mill/const.py
|
||||
homeassistant/components/minecraft_server/__init__.py
|
||||
homeassistant/components/minecraft_server/binary_sensor.py
|
||||
homeassistant/components/minecraft_server/const.py
|
||||
homeassistant/components/minecraft_server/sensor.py
|
||||
homeassistant/components/minio/*
|
||||
homeassistant/components/mitemp_bt/sensor.py
|
||||
homeassistant/components/mjpeg/camera.py
|
||||
@@ -440,8 +462,13 @@ omit =
|
||||
homeassistant/components/nederlandse_spoorwegen/sensor.py
|
||||
homeassistant/components/nello/lock.py
|
||||
homeassistant/components/nest/*
|
||||
homeassistant/components/netatmo/*
|
||||
homeassistant/components/netatmo_public/sensor.py
|
||||
homeassistant/components/netatmo/__init__.py
|
||||
homeassistant/components/netatmo/binary_sensor.py
|
||||
homeassistant/components/netatmo/api.py
|
||||
homeassistant/components/netatmo/camera.py
|
||||
homeassistant/components/netatmo/climate.py
|
||||
homeassistant/components/netatmo/const.py
|
||||
homeassistant/components/netatmo/sensor.py
|
||||
homeassistant/components/netdata/sensor.py
|
||||
homeassistant/components/netgear/device_tracker.py
|
||||
homeassistant/components/netgear_lte/*
|
||||
@@ -489,16 +516,17 @@ omit =
|
||||
homeassistant/components/openuv/sensor.py
|
||||
homeassistant/components/openweathermap/sensor.py
|
||||
homeassistant/components/openweathermap/weather.py
|
||||
homeassistant/components/opnsense/*
|
||||
homeassistant/components/opple/light.py
|
||||
homeassistant/components/orangepi_gpio/*
|
||||
homeassistant/components/oru/*
|
||||
homeassistant/components/orvibo/switch.py
|
||||
homeassistant/components/osramlightify/light.py
|
||||
homeassistant/components/otp/sensor.py
|
||||
homeassistant/components/owlet/*
|
||||
homeassistant/components/panasonic_bluray/media_player.py
|
||||
homeassistant/components/panasonic_viera/media_player.py
|
||||
homeassistant/components/pandora/media_player.py
|
||||
homeassistant/components/pcal9535a/*
|
||||
homeassistant/components/pencom/switch.py
|
||||
homeassistant/components/philips_js/media_player.py
|
||||
homeassistant/components/pi_hole/sensor.py
|
||||
@@ -514,16 +542,15 @@ omit =
|
||||
homeassistant/components/plex/media_player.py
|
||||
homeassistant/components/plex/sensor.py
|
||||
homeassistant/components/plex/server.py
|
||||
homeassistant/components/plex/websockets.py
|
||||
homeassistant/components/plugwise/*
|
||||
homeassistant/components/plum_lightpad/*
|
||||
homeassistant/components/pocketcasts/sensor.py
|
||||
homeassistant/components/point/*
|
||||
homeassistant/components/postnl/sensor.py
|
||||
homeassistant/components/prezzibenzina/sensor.py
|
||||
homeassistant/components/proliphix/climate.py
|
||||
homeassistant/components/prometheus/*
|
||||
homeassistant/components/prowl/notify.py
|
||||
homeassistant/components/proxmoxve/*
|
||||
homeassistant/components/proxy/camera.py
|
||||
homeassistant/components/ptvsd/*
|
||||
homeassistant/components/pulseaudio_loopback/switch.py
|
||||
@@ -583,6 +610,7 @@ omit =
|
||||
homeassistant/components/russound_rnet/media_player.py
|
||||
homeassistant/components/sabnzbd/*
|
||||
homeassistant/components/saj/sensor.py
|
||||
homeassistant/components/salt/device_tracker.py
|
||||
homeassistant/components/satel_integra/*
|
||||
homeassistant/components/scrape/sensor.py
|
||||
homeassistant/components/scsgate/*
|
||||
@@ -592,6 +620,7 @@ omit =
|
||||
homeassistant/components/sensehat/light.py
|
||||
homeassistant/components/sensehat/sensor.py
|
||||
homeassistant/components/sensibo/climate.py
|
||||
homeassistant/components/sentry/__init__.py
|
||||
homeassistant/components/serial/sensor.py
|
||||
homeassistant/components/serial_pm/sensor.py
|
||||
homeassistant/components/sesame/lock.py
|
||||
@@ -604,6 +633,7 @@ omit =
|
||||
homeassistant/components/simplepush/notify.py
|
||||
homeassistant/components/simplisafe/__init__.py
|
||||
homeassistant/components/simplisafe/alarm_control_panel.py
|
||||
homeassistant/components/simplisafe/lock.py
|
||||
homeassistant/components/simulated/sensor.py
|
||||
homeassistant/components/sisyphus/*
|
||||
homeassistant/components/sky_hub/device_tracker.py
|
||||
@@ -616,6 +646,7 @@ omit =
|
||||
homeassistant/components/smappee/*
|
||||
homeassistant/components/smarty/*
|
||||
homeassistant/components/smarthab/*
|
||||
homeassistant/components/sms/*
|
||||
homeassistant/components/smtp/notify.py
|
||||
homeassistant/components/snapcast/media_player.py
|
||||
homeassistant/components/snmp/*
|
||||
@@ -631,21 +662,25 @@ omit =
|
||||
homeassistant/components/somfy/*
|
||||
homeassistant/components/somfy_mylink/*
|
||||
homeassistant/components/sonarr/sensor.py
|
||||
homeassistant/components/songpal/media_player.py
|
||||
homeassistant/components/songpal/*
|
||||
homeassistant/components/sonos/*
|
||||
homeassistant/components/sony_projector/switch.py
|
||||
homeassistant/components/spc/*
|
||||
homeassistant/components/speedtestdotnet/*
|
||||
homeassistant/components/spider/*
|
||||
homeassistant/components/spotcrime/sensor.py
|
||||
homeassistant/components/spotify/__init__.py
|
||||
homeassistant/components/spotify/media_player.py
|
||||
homeassistant/components/squeezebox/media_player.py
|
||||
homeassistant/components/squeezebox/*
|
||||
homeassistant/components/starline/*
|
||||
homeassistant/components/starlingbank/sensor.py
|
||||
homeassistant/components/steam_online/sensor.py
|
||||
homeassistant/components/stiebel_eltron/*
|
||||
homeassistant/components/stookalert/*
|
||||
homeassistant/components/streamlabswater/*
|
||||
homeassistant/components/suez_water/*
|
||||
homeassistant/components/supervisord/sensor.py
|
||||
homeassistant/components/surepetcare/*.py
|
||||
homeassistant/components/swiss_hydrological_data/sensor.py
|
||||
homeassistant/components/swiss_public_transport/sensor.py
|
||||
homeassistant/components/swisscom/device_tracker.py
|
||||
@@ -673,7 +708,14 @@ omit =
|
||||
homeassistant/components/telnet/switch.py
|
||||
homeassistant/components/temper/sensor.py
|
||||
homeassistant/components/tensorflow/image_processing.py
|
||||
homeassistant/components/tesla/*
|
||||
homeassistant/components/tesla/__init__.py
|
||||
homeassistant/components/tesla/binary_sensor.py
|
||||
homeassistant/components/tesla/climate.py
|
||||
homeassistant/components/tesla/const.py
|
||||
homeassistant/components/tesla/device_tracker.py
|
||||
homeassistant/components/tesla/lock.py
|
||||
homeassistant/components/tesla/sensor.py
|
||||
homeassistant/components/tesla/switch.py
|
||||
homeassistant/components/tfiac/climate.py
|
||||
homeassistant/components/thermoworks_smoke/sensor.py
|
||||
homeassistant/components/thethingsnetwork/*
|
||||
@@ -684,15 +726,15 @@ omit =
|
||||
homeassistant/components/tikteck/light.py
|
||||
homeassistant/components/tile/device_tracker.py
|
||||
homeassistant/components/time_date/sensor.py
|
||||
homeassistant/components/tmb/sensor.py
|
||||
homeassistant/components/todoist/calendar.py
|
||||
homeassistant/components/todoist/const.py
|
||||
homeassistant/components/tof/sensor.py
|
||||
homeassistant/components/tomato/device_tracker.py
|
||||
homeassistant/components/toon/*
|
||||
homeassistant/components/torque/sensor.py
|
||||
homeassistant/components/totalconnect/*
|
||||
homeassistant/components/touchline/climate.py
|
||||
homeassistant/components/tplink/device_tracker.py
|
||||
homeassistant/components/tplink/light.py
|
||||
homeassistant/components/tplink/switch.py
|
||||
homeassistant/components/tplink_lte/*
|
||||
homeassistant/components/traccar/device_tracker.py
|
||||
@@ -714,12 +756,11 @@ omit =
|
||||
homeassistant/components/twentemilieu/sensor.py
|
||||
homeassistant/components/twilio_call/notify.py
|
||||
homeassistant/components/twilio_sms/notify.py
|
||||
homeassistant/components/twitch/sensor.py
|
||||
homeassistant/components/twitter/notify.py
|
||||
homeassistant/components/ubee/device_tracker.py
|
||||
homeassistant/components/uber/sensor.py
|
||||
homeassistant/components/ubus/device_tracker.py
|
||||
homeassistant/components/ue_smart_radio/media_player.py
|
||||
homeassistant/components/unifiled/*
|
||||
homeassistant/components/upcloud/*
|
||||
homeassistant/components/upnp/*
|
||||
homeassistant/components/upc_connect/*
|
||||
@@ -732,20 +773,23 @@ omit =
|
||||
homeassistant/components/velbus/climate.py
|
||||
homeassistant/components/velbus/const.py
|
||||
homeassistant/components/velbus/cover.py
|
||||
homeassistant/components/velbus/light.py
|
||||
homeassistant/components/velbus/sensor.py
|
||||
homeassistant/components/velbus/switch.py
|
||||
homeassistant/components/velux/*
|
||||
homeassistant/components/venstar/climate.py
|
||||
homeassistant/components/vera/*
|
||||
homeassistant/components/verisure/*
|
||||
homeassistant/components/versasense/*
|
||||
homeassistant/components/vesync/__init__.py
|
||||
homeassistant/components/vesync/common.py
|
||||
homeassistant/components/vesync/const.py
|
||||
homeassistant/components/vesync/switch.py
|
||||
homeassistant/components/viaggiatreno/sensor.py
|
||||
homeassistant/components/vicare/*
|
||||
homeassistant/components/vilfo/__init__.py
|
||||
homeassistant/components/vilfo/sensor.py
|
||||
homeassistant/components/vilfo/const.py
|
||||
homeassistant/components/vivotek/camera.py
|
||||
homeassistant/components/vizio/media_player.py
|
||||
homeassistant/components/vlc/media_player.py
|
||||
homeassistant/components/vlc_telnet/media_player.py
|
||||
homeassistant/components/volkszaehler/sensor.py
|
||||
@@ -759,7 +803,6 @@ omit =
|
||||
homeassistant/components/waze_travel_time/sensor.py
|
||||
homeassistant/components/webostv/*
|
||||
homeassistant/components/wemo/*
|
||||
homeassistant/components/wemo/fan.py
|
||||
homeassistant/components/whois/sensor.py
|
||||
homeassistant/components/wink/*
|
||||
homeassistant/components/wirelesstag/*
|
||||
@@ -779,7 +822,6 @@ omit =
|
||||
homeassistant/components/xmpp/notify.py
|
||||
homeassistant/components/xs1/*
|
||||
homeassistant/components/yale_smart_alarm/alarm_control_panel.py
|
||||
homeassistant/components/yamaha/media_player.py
|
||||
homeassistant/components/yamaha_musiccast/media_player.py
|
||||
homeassistant/components/yandex_transport/*
|
||||
homeassistant/components/yeelight/*
|
||||
@@ -793,7 +835,6 @@ omit =
|
||||
homeassistant/components/zestimate/sensor.py
|
||||
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
|
||||
@@ -801,7 +842,6 @@ omit =
|
||||
homeassistant/components/zha/core/helpers.py
|
||||
homeassistant/components/zha/core/patches.py
|
||||
homeassistant/components/zha/core/registries.py
|
||||
homeassistant/components/zha/device_entity.py
|
||||
homeassistant/components/zha/entity.py
|
||||
homeassistant/components/zha/light.py
|
||||
homeassistant/components/zha/sensor.py
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// See https://aka.ms/vscode-remote/devcontainer.json for format details.
|
||||
{
|
||||
"name": "Home Assistant Dev",
|
||||
"context": "..",
|
||||
|
47
.github/ISSUE_TEMPLATE.md
vendored
47
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,47 +0,0 @@
|
||||
<!-- READ THIS FIRST:
|
||||
- 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 integrations if you are using custom integration: 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!
|
||||
-->
|
||||
|
||||
**Home Assistant release with the issue:**
|
||||
<!--
|
||||
- Frontend -> Developer tools -> Info
|
||||
- Or use this command: hass --version
|
||||
-->
|
||||
|
||||
|
||||
**Last working Home Assistant release (if known):**
|
||||
|
||||
|
||||
**Operating environment (Hass.io/Docker/Windows/etc.):**
|
||||
<!--
|
||||
Please provide details about your environment.
|
||||
-->
|
||||
|
||||
**Integration:**
|
||||
<!--
|
||||
Please add the link to the documentation at https://www.home-assistant.io/integrations/ of the integration in question.
|
||||
-->
|
||||
|
||||
|
||||
**Description of problem:**
|
||||
|
||||
|
||||
|
||||
**Problem-relevant `configuration.yaml` entries and (fill out even if it seems unimportant):**
|
||||
```yaml
|
||||
|
||||
```
|
||||
|
||||
**Traceback (if applicable):**
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
**Additional information:**
|
||||
|
53
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
Normal file
53
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
name: Report a bug with Home Assistant
|
||||
about: Report an issue with Home Assistant
|
||||
---
|
||||
<!-- READ THIS FIRST:
|
||||
- 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
|
||||
- Do not report issues for integrations if you are using custom components or integrations.
|
||||
- Provide as many details as possible. Paste logs, configuration samples and code into the backticks.
|
||||
DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed without comment.
|
||||
-->
|
||||
## The problem
|
||||
<!--
|
||||
Describe the issue you are experiencing here to communicate to the
|
||||
maintainers. Tell us what you were trying to do and what happened instead.
|
||||
-->
|
||||
|
||||
|
||||
## Environment
|
||||
<!--
|
||||
Provide details about the versions you are using, which helps us to reproduce
|
||||
and find the issue quicker. Version information is found in the
|
||||
Home Assistant frontend: Developer tools -> Info.
|
||||
-->
|
||||
|
||||
- Home Assistant release with the issue:
|
||||
- Last working Home Assistant release (if known):
|
||||
- Operating environment (Hass.io/Docker/Windows/etc.):
|
||||
- Integration causing this issue:
|
||||
- Link to integration documentation on our website:
|
||||
|
||||
## Problem-relevant `configuration.yaml`
|
||||
<!--
|
||||
An example configuration that caused the problem for you. Fill this out even
|
||||
if it seems unimportant to you. Please be sure to remove personal information
|
||||
like passwords, private URLs and other credentials.
|
||||
-->
|
||||
|
||||
```yaml
|
||||
|
||||
```
|
||||
|
||||
## Traceback/Error logs
|
||||
<!--
|
||||
If you come across any trace or error logs, please provide them.
|
||||
-->
|
||||
|
||||
```txt
|
||||
|
||||
```
|
||||
|
||||
## Additional information
|
||||
|
52
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
52
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@@ -1,52 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
<!-- READ THIS FIRST:
|
||||
- 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 integrations if you are using a custom integration: 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!
|
||||
-->
|
||||
|
||||
**Home Assistant release with the issue:**
|
||||
<!--
|
||||
- Frontend -> Developer tools -> Info
|
||||
- Or use this command: hass --version
|
||||
-->
|
||||
|
||||
|
||||
**Last working Home Assistant release (if known):**
|
||||
|
||||
|
||||
**Operating environment (Hass.io/Docker/Windows/etc.):**
|
||||
<!--
|
||||
Please provide details about your environment.
|
||||
-->
|
||||
|
||||
**Integration:**
|
||||
<!--
|
||||
Please add the link to the documentation at https://www.home-assistant.io/integrations/ of the integration in question.
|
||||
-->
|
||||
|
||||
|
||||
**Description of problem:**
|
||||
|
||||
|
||||
|
||||
**Problem-relevant `configuration.yaml` entries and (fill out even if it seems unimportant):**
|
||||
```yaml
|
||||
|
||||
```
|
||||
|
||||
**Traceback (if applicable):**
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
**Additional information:**
|
17
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
17
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Report a bug with the UI, Frontend or Lovelace
|
||||
url: https://github.com/home-assistant/home-assistant-polymer/issues
|
||||
about: This is the issue tracker for our backend. Please report issues with the UI in the frontend repository.
|
||||
- name: Report incorrect or missing information on our website
|
||||
url: https://github.com/home-assistant/home-assistant.io/issues
|
||||
about: Our documentation has its own issue tracker. Please report issues with the website there.
|
||||
- name: I have a question or need support
|
||||
url: https://www.home-assistant.io/help
|
||||
about: We use GitHub for tracking bugs, check our website for resources on getting help.
|
||||
- name: Feature Request
|
||||
url: https://community.home-assistant.io/c/feature-requests
|
||||
about: Please use our Community Forum for making feature requests.
|
||||
- name: I'm unsure where to go
|
||||
url: https://www.home-assistant.io/join-chat
|
||||
about: If you are unsure where to go, then joining our chat is recommended; Just ask!
|
112
.github/PULL_REQUEST_TEMPLATE.md
vendored
112
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,35 +1,109 @@
|
||||
## Breaking Change:
|
||||
|
||||
<!-- What is breaking and why we have to break it. Remove this section only if it was NOT a breaking change. -->
|
||||
|
||||
## Description:
|
||||
<!--
|
||||
You are amazing! Thanks for contributing to our project!
|
||||
Please, DO NOT DELETE ANY TEXT from this template! (unless instructed).
|
||||
-->
|
||||
## Breaking change
|
||||
<!--
|
||||
If your PR contains a breaking change for existing users, it is important
|
||||
to tell them what breaks, how to make it work again and why we did this.
|
||||
This piece of text is published with the release notes, so it helps if you
|
||||
write it towards our users, not us.
|
||||
Note: Remove this section if this PR is NOT a breaking change.
|
||||
-->
|
||||
|
||||
|
||||
**Related issue (if applicable):** fixes #<home-assistant issue number goes here>
|
||||
## Proposed change
|
||||
<!--
|
||||
Describe the big picture of your changes here to communicate to the
|
||||
maintainers why we should accept this pull request. If it fixes a bug
|
||||
or resolves a feature request, be sure to link to that issue in the
|
||||
additional information section.
|
||||
-->
|
||||
|
||||
**Pull request with documentation for [home-assistant.io](https://github.com/home-assistant/home-assistant.io) (if applicable):** home-assistant/home-assistant.io#<home-assistant.io PR number goes here>
|
||||
|
||||
## Example entry for `configuration.yaml` (if applicable):
|
||||
## Type of change
|
||||
<!--
|
||||
What type of change does your PR introduce to Home Assistant?
|
||||
NOTE: Please, check only 1! box!
|
||||
If your PR requires multiple boxes to be checked, you'll most likely need to
|
||||
split it into multiple PRs. This makes things easier and faster to code review.
|
||||
-->
|
||||
|
||||
- [ ] Dependency upgrade
|
||||
- [ ] Bugfix (non-breaking change which fixes an issue)
|
||||
- [ ] New integration (thank you!)
|
||||
- [ ] New feature (which adds functionality to an existing integration)
|
||||
- [ ] Breaking change (fix/feature causing existing functionality to break)
|
||||
- [ ] Code quality improvements to existing code or addition of tests
|
||||
|
||||
## Example entry for `configuration.yaml`:
|
||||
<!--
|
||||
Supplying a configuration snippet, makes it easier for a maintainer to test
|
||||
your PR. Furthermore, for new integrations, it gives an impression of how
|
||||
the configuration would look like.
|
||||
Note: Remove this section if this PR does not have an example entry.
|
||||
-->
|
||||
|
||||
```yaml
|
||||
# Example configuration.yaml
|
||||
|
||||
```
|
||||
|
||||
## Checklist:
|
||||
- [ ] The code change is tested and works locally.
|
||||
- [ ] Local tests pass with `tox`. **Your PR cannot be merged unless tests pass**
|
||||
- [ ] There is no commented out code in this PR.
|
||||
- [ ] I have followed the [development checklist][dev-checklist]
|
||||
## Additional information
|
||||
<!--
|
||||
Details are important, and help maintainers processing your PR.
|
||||
Please be sure to fill out additional details, if applicable.
|
||||
-->
|
||||
|
||||
- This PR fixes or closes issue: fixes #
|
||||
- This PR is related to issue:
|
||||
- Link to documentation pull request:
|
||||
|
||||
## Checklist
|
||||
<!--
|
||||
Put an `x` in the boxes that apply. You can also fill these out after
|
||||
creating the PR. If you're unsure about any of them, don't hesitate to ask.
|
||||
We're here to help! This is simply a reminder of what we are going to look
|
||||
for before merging your code.
|
||||
-->
|
||||
|
||||
- [ ] The code change is tested and works locally.
|
||||
- [ ] Local tests pass. **Your PR cannot be merged unless tests pass**
|
||||
- [ ] There is no commented out code in this PR.
|
||||
- [ ] I have followed the [development checklist][dev-checklist]
|
||||
- [ ] The code has been formatted using Black (`black --fast homeassistant tests`)
|
||||
- [ ] Tests have been added to verify that the new code works.
|
||||
|
||||
If user exposed functionality or configuration variables are added/changed:
|
||||
- [ ] Documentation added/updated in [home-assistant.io](https://github.com/home-assistant/home-assistant.io)
|
||||
|
||||
- [ ] Documentation added/updated for [www.home-assistant.io][docs-repository]
|
||||
|
||||
If the code communicates with devices, web services, or third-party tools:
|
||||
- [ ] [_The manifest file_][manifest-docs] has all fields filled out correctly. Update and include derived files by running `python3 -m script.hassfest`.
|
||||
- [ ] New or updated dependencies have been added to `requirements_all.txt` by running `python3 -m script.gen_requirements_all`.
|
||||
- [ ] Untested files have been added to `.coveragerc`.
|
||||
|
||||
If the code does not interact with devices:
|
||||
- [ ] Tests have been added to verify that the new code works.
|
||||
- [ ] The [manifest file][manifest-docs] has all fields filled out correctly.
|
||||
Updated and included derived files by running: `python3 -m script.hassfest`.
|
||||
- [ ] New or updated dependencies have been added to `requirements_all.txt`.
|
||||
Updated by running `python3 -m script.gen_requirements_all`.
|
||||
- [ ] Untested files have been added to `.coveragerc`.
|
||||
|
||||
The integration reached or maintains the following [Integration Quality Scale][quality-scale]:
|
||||
<!--
|
||||
The Integration Quality Scale scores an integration on the code quality
|
||||
and user experience. Each level of the quality scale consists of a list
|
||||
of requirements. We highly recommend getting your integration scored!
|
||||
-->
|
||||
|
||||
- [ ] No score or internal
|
||||
- [ ] 🥈 Silver
|
||||
- [ ] 🥇 Gold
|
||||
- [ ] 🏆 Platinum
|
||||
|
||||
<!--
|
||||
Thank you for contributing <3
|
||||
|
||||
Below, some useful links you could explore:
|
||||
-->
|
||||
[dev-checklist]: https://developers.home-assistant.io/docs/en/development_checklist.html
|
||||
[manifest-docs]: https://developers.home-assistant.io/docs/en/creating_integration_manifest.html
|
||||
[quality-scale]: https://developers.home-assistant.io/docs/en/next/integration_quality_scale_index.html
|
||||
[docs-repository]: https://github.com/home-assistant/home-assistant.io
|
||||
|
12
.github/stale.yml
vendored
12
.github/stale.yml
vendored
@@ -52,4 +52,14 @@ markComment: >
|
||||
limitPerRun: 30
|
||||
|
||||
# Limit to only `issues` or `pulls`
|
||||
only: issues
|
||||
# only: issues
|
||||
|
||||
# Handle pull requests a little bit faster and with an adjusted comment.
|
||||
pulls:
|
||||
daysUntilStale: 30
|
||||
markComment: >
|
||||
There hasn't been any activity on this pull request recently. This pull
|
||||
request has been automatically marked as stale because of that and will
|
||||
be closed if no further activity occurs within 7 days.
|
||||
|
||||
Thank you for your contributions.
|
||||
|
@@ -1,2 +0,0 @@
|
||||
python:
|
||||
enabled: true
|
@@ -1,31 +1,56 @@
|
||||
repos:
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 19.3b0
|
||||
rev: 19.10b0
|
||||
hooks:
|
||||
- id: black
|
||||
args:
|
||||
- --safe
|
||||
- --quiet
|
||||
files: ^((homeassistant|script|tests)/.+)?[^/]+\.py$
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: v1.16.0
|
||||
hooks:
|
||||
- id: codespell
|
||||
args:
|
||||
- --ignore-words-list=hass,alot,datas,dof,dur,farenheit,hist,iff,ines,ist,lightsensor,mut,nd,pres,referer,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing
|
||||
- --skip="./.*,*.json"
|
||||
- --quiet-level=2
|
||||
exclude_types: [json]
|
||||
- repo: https://gitlab.com/pycqa/flake8
|
||||
rev: 3.7.8
|
||||
rev: 3.7.9
|
||||
hooks:
|
||||
- id: flake8
|
||||
additional_dependencies:
|
||||
- flake8-docstrings==1.3.1
|
||||
- pydocstyle==4.0.0
|
||||
- flake8-docstrings==1.5.0
|
||||
- pydocstyle==5.0.2
|
||||
files: ^(homeassistant|script|tests)/.+\.py$
|
||||
# Using a local "system" mypy instead of the mypy hook, because its
|
||||
# results depend on what is installed. And the mypy hook runs in a
|
||||
# virtualenv of its own, meaning we'd need to install and maintain
|
||||
# another set of our dependencies there... no. Use the "system" one
|
||||
# and reuse the environment that is set up anyway already instead.
|
||||
- repo: https://github.com/PyCQA/bandit
|
||||
rev: 1.6.2
|
||||
hooks:
|
||||
- id: bandit
|
||||
args:
|
||||
- --quiet
|
||||
- --format=custom
|
||||
- --configfile=tests/bandit.yaml
|
||||
files: ^(homeassistant|script|tests)/.+\.py$
|
||||
- repo: https://github.com/pre-commit/mirrors-isort
|
||||
rev: v4.3.21
|
||||
hooks:
|
||||
- id: isort
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.4.0
|
||||
hooks:
|
||||
- id: check-json
|
||||
- repo: local
|
||||
hooks:
|
||||
# Run mypy through our wrapper script in order to get the possible
|
||||
# pyenv and/or virtualenv activated; it may not have been e.g. if
|
||||
# committing from a GUI tool that was not launched from an activated
|
||||
# shell.
|
||||
- id: mypy
|
||||
name: mypy
|
||||
entry: mypy
|
||||
language: system
|
||||
entry: script/run-in-env.sh mypy
|
||||
language: script
|
||||
types: [python]
|
||||
require_serial: true
|
||||
files: ^homeassistant/.+\.py$
|
||||
|
@@ -4,7 +4,7 @@ build:
|
||||
image: latest
|
||||
|
||||
python:
|
||||
version: 3.6
|
||||
version: 3.7
|
||||
setup_py_install: true
|
||||
|
||||
requirements_file: requirements_docs.txt
|
||||
|
18
.travis.yml
18
.travis.yml
@@ -1,9 +1,7 @@
|
||||
sudo: false
|
||||
dist: xenial
|
||||
dist: bionic
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "ppa:jonathonf/ffmpeg-4"
|
||||
packages:
|
||||
- libudev-dev
|
||||
- libavformat-dev
|
||||
@@ -16,15 +14,13 @@ addons:
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- python: "3.6.1"
|
||||
- python: "3.7.0"
|
||||
env: TOXENV=lint
|
||||
- python: "3.6.1"
|
||||
env: TOXENV=pylint PYLINT_ARGS=--jobs=0
|
||||
- python: "3.6.1"
|
||||
- python: "3.7.0"
|
||||
env: TOXENV=pylint PYLINT_ARGS=--jobs=0 TRAVIS_WAIT=30
|
||||
- python: "3.7.0"
|
||||
env: TOXENV=typing
|
||||
- python: "3.6.1"
|
||||
env: TOXENV=py36
|
||||
- python: "3.7"
|
||||
- python: "3.7.0"
|
||||
env: TOXENV=py37
|
||||
|
||||
cache:
|
||||
@@ -33,4 +29,4 @@ cache:
|
||||
- $HOME/.cache/pre-commit
|
||||
install: pip install -U tox
|
||||
language: python
|
||||
script: travis_wait 50 tox --develop
|
||||
script: ${TRAVIS_WAIT:+travis_wait $TRAVIS_WAIT} tox --develop
|
||||
|
2
.vscode/tasks.json
vendored
2
.vscode/tasks.json
vendored
@@ -33,7 +33,7 @@
|
||||
{
|
||||
"label": "Flake8",
|
||||
"type": "shell",
|
||||
"command": "flake8 homeassistant tests",
|
||||
"command": "pre-commit run flake8 --all-files",
|
||||
"group": {
|
||||
"kind": "test",
|
||||
"isDefault": true
|
||||
|
94
CODEOWNERS
94
CODEOWNERS
@@ -17,12 +17,13 @@ homeassistant/components/abode/* @shred86
|
||||
homeassistant/components/adguard/* @frenck
|
||||
homeassistant/components/airly/* @bieniu
|
||||
homeassistant/components/airvisual/* @bachya
|
||||
homeassistant/components/alarm_control_panel/* @colinodell
|
||||
homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy
|
||||
homeassistant/components/almond/* @gcampax @balloob
|
||||
homeassistant/components/alpha_vantage/* @fabaff
|
||||
homeassistant/components/amazon_polly/* @robbiet480
|
||||
homeassistant/components/ambiclimate/* @danielhiversen
|
||||
homeassistant/components/ambient_station/* @bachya
|
||||
homeassistant/components/amcrest/* @pnbruckner
|
||||
homeassistant/components/androidtv/* @JeffLIrion
|
||||
homeassistant/components/apache_kafka/* @bachya
|
||||
homeassistant/components/api/* @home-assistant/core
|
||||
@@ -32,7 +33,9 @@ homeassistant/components/arcam_fmj/* @elupus
|
||||
homeassistant/components/arduino/* @fabaff
|
||||
homeassistant/components/arest/* @fabaff
|
||||
homeassistant/components/asuswrt/* @kennedyshead
|
||||
homeassistant/components/aten_pe/* @mtdcr
|
||||
homeassistant/components/atome/* @baqs
|
||||
homeassistant/components/august/* @bdraco
|
||||
homeassistant/components/aurora_abb_powerone/* @davet2001
|
||||
homeassistant/components/auth/* @home-assistant/core
|
||||
homeassistant/components/automatic/* @armills
|
||||
@@ -42,13 +45,15 @@ homeassistant/components/awair/* @danielsjf
|
||||
homeassistant/components/aws/* @awarecan @robbiet480
|
||||
homeassistant/components/axis/* @kane610
|
||||
homeassistant/components/azure_event_hub/* @eavanvalkenburg
|
||||
homeassistant/components/azure_service_bus/* @hfurubotten
|
||||
homeassistant/components/beewi_smartclim/* @alemuro
|
||||
homeassistant/components/bitcoin/* @fabaff
|
||||
homeassistant/components/bizkaibus/* @UgaitzEtxebarria
|
||||
homeassistant/components/blink/* @fronzbot
|
||||
homeassistant/components/bmw_connected_drive/* @gerard33
|
||||
homeassistant/components/braviatv/* @robbiet480
|
||||
homeassistant/components/broadlink/* @danielhiversen
|
||||
homeassistant/components/broadlink/* @danielhiversen @felipediel
|
||||
homeassistant/components/brother/* @bieniu
|
||||
homeassistant/components/brunt/* @eavanvalkenburg
|
||||
homeassistant/components/bt_smarthub/* @jxwolstenholme
|
||||
homeassistant/components/buienradar/* @mjj4791 @ties
|
||||
@@ -56,9 +61,9 @@ homeassistant/components/cert_expiry/* @Cereal2nd @jjlawren
|
||||
homeassistant/components/cisco_ios/* @fbradyirl
|
||||
homeassistant/components/cisco_mobility_express/* @fbradyirl
|
||||
homeassistant/components/cisco_webex_teams/* @fbradyirl
|
||||
homeassistant/components/ciscospark/* @fbradyirl
|
||||
homeassistant/components/cloud/* @home-assistant/cloud
|
||||
homeassistant/components/cloudflare/* @ludeeus
|
||||
homeassistant/components/comfoconnect/* @michaelarnauts
|
||||
homeassistant/components/config/* @home-assistant/core
|
||||
homeassistant/components/configurator/* @home-assistant/core
|
||||
homeassistant/components/conversation/* @home-assistant/core
|
||||
@@ -72,19 +77,25 @@ homeassistant/components/darksky/* @fabaff
|
||||
homeassistant/components/deconz/* @kane610
|
||||
homeassistant/components/delijn/* @bollewolle
|
||||
homeassistant/components/demo/* @home-assistant/core
|
||||
homeassistant/components/derivative/* @afaucogney
|
||||
homeassistant/components/device_automation/* @home-assistant/core
|
||||
homeassistant/components/digital_ocean/* @fabaff
|
||||
homeassistant/components/discogs/* @thibmaek
|
||||
homeassistant/components/doorbird/* @oblogic7
|
||||
homeassistant/components/dsmr_reader/* @depl0y
|
||||
homeassistant/components/dweet/* @fabaff
|
||||
homeassistant/components/dynalite/* @ziv1234
|
||||
homeassistant/components/dyson/* @etheralm
|
||||
homeassistant/components/ecobee/* @marthoc
|
||||
homeassistant/components/ecovacs/* @OverloadUT
|
||||
homeassistant/components/egardia/* @jeroenterheerdt
|
||||
homeassistant/components/eight_sleep/* @mezz64
|
||||
homeassistant/components/elgato/* @frenck
|
||||
homeassistant/components/elv/* @majuss
|
||||
homeassistant/components/emby/* @mezz64
|
||||
homeassistant/components/enigma2/* @fbradyirl
|
||||
homeassistant/components/enocean/* @bdurrer
|
||||
homeassistant/components/entur_public_transport/* @hfurubotten
|
||||
homeassistant/components/environment_canada/* @michaeldavie
|
||||
homeassistant/components/ephember/* @ttroy50
|
||||
homeassistant/components/epsonworkforce/* @ThaStealth
|
||||
@@ -92,11 +103,13 @@ homeassistant/components/eq3btsmart/* @rytilahti
|
||||
homeassistant/components/esphome/* @OttoWinter
|
||||
homeassistant/components/essent/* @TheLastProject
|
||||
homeassistant/components/evohome/* @zxdavb
|
||||
homeassistant/components/fastdotcom/* @rohankapoorcom
|
||||
homeassistant/components/file/* @fabaff
|
||||
homeassistant/components/filter/* @dgomes
|
||||
homeassistant/components/fitbit/* @robbiet480
|
||||
homeassistant/components/fixer/* @fabaff
|
||||
homeassistant/components/flock/* @fabaff
|
||||
homeassistant/components/flume/* @ChrisMandich
|
||||
homeassistant/components/flunearyou/* @bachya
|
||||
homeassistant/components/fortigate/* @kifeo
|
||||
homeassistant/components/fortios/* @kimfrellsen
|
||||
@@ -105,10 +118,14 @@ homeassistant/components/foursquare/* @robbiet480
|
||||
homeassistant/components/freebox/* @snoof85
|
||||
homeassistant/components/fronius/* @nielstron
|
||||
homeassistant/components/frontend/* @home-assistant/frontend
|
||||
homeassistant/components/garmin_connect/* @cyberjunky
|
||||
homeassistant/components/gdacs/* @exxamalte
|
||||
homeassistant/components/gearbest/* @HerrHofrat
|
||||
homeassistant/components/geniushub/* @zxdavb
|
||||
homeassistant/components/geo_rss_events/* @exxamalte
|
||||
homeassistant/components/geonetnz_quakes/* @exxamalte
|
||||
homeassistant/components/geonetnz_volcano/* @exxamalte
|
||||
homeassistant/components/gios/* @bieniu
|
||||
homeassistant/components/gitter/* @fabaff
|
||||
homeassistant/components/glances/* @fabaff @engrbm87
|
||||
homeassistant/components/gntp/* @robbiet480
|
||||
@@ -117,15 +134,18 @@ homeassistant/components/google_cloud/* @lufton
|
||||
homeassistant/components/google_translate/* @awarecan
|
||||
homeassistant/components/google_travel_time/* @robbiet480
|
||||
homeassistant/components/gpsd/* @fabaff
|
||||
homeassistant/components/greeneye_monitor/* @jkeljo
|
||||
homeassistant/components/group/* @home-assistant/core
|
||||
homeassistant/components/growatt_server/* @indykoning
|
||||
homeassistant/components/gtfs/* @robbiet480
|
||||
homeassistant/components/harmony/* @ehendrix23
|
||||
homeassistant/components/hassio/* @home-assistant/hass-io
|
||||
homeassistant/components/heatmiser/* @andylockran
|
||||
homeassistant/components/heos/* @andrewsayre
|
||||
homeassistant/components/here_travel_time/* @eifinger
|
||||
homeassistant/components/hikvision/* @mezz64
|
||||
homeassistant/components/hikvisioncam/* @fbradyirl
|
||||
homeassistant/components/hisense_aehw4a1/* @bannhead
|
||||
homeassistant/components/history/* @home-assistant/core
|
||||
homeassistant/components/history_graph/* @andrey-git
|
||||
homeassistant/components/hive/* @Rendili @KJonline
|
||||
@@ -140,6 +160,7 @@ homeassistant/components/huawei_lte/* @scop
|
||||
homeassistant/components/huawei_router/* @abmantis
|
||||
homeassistant/components/hue/* @balloob
|
||||
homeassistant/components/iaqualink/* @flz
|
||||
homeassistant/components/icloud/* @Quentame
|
||||
homeassistant/components/ign_sismologia/* @exxamalte
|
||||
homeassistant/components/incomfort/* @zxdavb
|
||||
homeassistant/components/influxdb/* @fabaff
|
||||
@@ -149,43 +170,55 @@ homeassistant/components/input_number/* @home-assistant/core
|
||||
homeassistant/components/input_select/* @home-assistant/core
|
||||
homeassistant/components/input_text/* @home-assistant/core
|
||||
homeassistant/components/integration/* @dgomes
|
||||
homeassistant/components/intent/* @home-assistant/core
|
||||
homeassistant/components/intesishome/* @jnimmo
|
||||
homeassistant/components/ios/* @robbiet480
|
||||
homeassistant/components/ipma/* @dgomes
|
||||
homeassistant/components/iperf3/* @rohankapoorcom
|
||||
homeassistant/components/ipma/* @dgomes @abmantis
|
||||
homeassistant/components/iqvia/* @bachya
|
||||
homeassistant/components/irish_rail_transport/* @ttroy50
|
||||
homeassistant/components/izone/* @Swamp-Ig
|
||||
homeassistant/components/jewish_calendar/* @tsvi
|
||||
homeassistant/components/juicenet/* @jesserockz
|
||||
homeassistant/components/kaiterra/* @Michsior14
|
||||
homeassistant/components/keba/* @dannerph
|
||||
homeassistant/components/keenetic_ndms2/* @foxel
|
||||
homeassistant/components/kef/* @basnijholt
|
||||
homeassistant/components/keyboard_remote/* @bendavid
|
||||
homeassistant/components/knx/* @Julius2342
|
||||
homeassistant/components/kodi/* @armills
|
||||
homeassistant/components/konnected/* @heythisisnate
|
||||
homeassistant/components/konnected/* @heythisisnate @kit-klein
|
||||
homeassistant/components/lametric/* @robbiet480
|
||||
homeassistant/components/launch_library/* @ludeeus
|
||||
homeassistant/components/lcn/* @alengwenus
|
||||
homeassistant/components/life360/* @pnbruckner
|
||||
homeassistant/components/linky/* @Quentame
|
||||
homeassistant/components/linux_battery/* @fabaff
|
||||
homeassistant/components/liveboxplaytv/* @pschmitt
|
||||
homeassistant/components/local_ip/* @issacg
|
||||
homeassistant/components/logger/* @home-assistant/core
|
||||
homeassistant/components/logi_circle/* @evanjd
|
||||
homeassistant/components/lovelace/* @home-assistant/frontend
|
||||
homeassistant/components/luci/* @fbradyirl @mzdrale
|
||||
homeassistant/components/luftdaten/* @fabaff
|
||||
homeassistant/components/lupusec/* @majuss
|
||||
homeassistant/components/lutron/* @JonGilmore
|
||||
homeassistant/components/mastodon/* @fabaff
|
||||
homeassistant/components/matrix/* @tinloaf
|
||||
homeassistant/components/mcp23017/* @jardiamj
|
||||
homeassistant/components/mediaroom/* @dgomes
|
||||
homeassistant/components/melcloud/* @vilppuvuorinen
|
||||
homeassistant/components/melissa/* @kennedyshead
|
||||
homeassistant/components/met/* @danielhiversen
|
||||
homeassistant/components/meteo_france/* @victorcerutti @oncleben31
|
||||
homeassistant/components/meteo_france/* @victorcerutti @oncleben31 @Quentame
|
||||
homeassistant/components/meteoalarm/* @rolfberkenbosch
|
||||
homeassistant/components/miflora/* @danielhiversen @ChristianKuehnel
|
||||
homeassistant/components/mikrotik/* @engrbm87
|
||||
homeassistant/components/mill/* @danielhiversen
|
||||
homeassistant/components/min_max/* @fabaff
|
||||
homeassistant/components/minecraft_server/* @elmurato
|
||||
homeassistant/components/minio/* @tkislan
|
||||
homeassistant/components/mobile_app/* @robbiet480
|
||||
homeassistant/components/modbus/* @adamchengtkc
|
||||
homeassistant/components/monoprice/* @etsinko
|
||||
homeassistant/components/moon/* @fabaff
|
||||
homeassistant/components/mpd/* @fabaff
|
||||
@@ -194,11 +227,14 @@ homeassistant/components/msteams/* @peroyvind
|
||||
homeassistant/components/mysensors/* @MartinHjelmare
|
||||
homeassistant/components/mystrom/* @fabaff
|
||||
homeassistant/components/neato/* @dshokouhi @Santobert
|
||||
homeassistant/components/nederlandse_spoorwegen/* @YarmoM
|
||||
homeassistant/components/nello/* @pschmitt
|
||||
homeassistant/components/ness_alarm/* @nickw444
|
||||
homeassistant/components/nest/* @awarecan
|
||||
homeassistant/components/netatmo/* @cgtobi
|
||||
homeassistant/components/netdata/* @fabaff
|
||||
homeassistant/components/nextbus/* @vividboarder
|
||||
homeassistant/components/nilu/* @hfurubotten
|
||||
homeassistant/components/nissan_leaf/* @filcole
|
||||
homeassistant/components/nmbs/* @thibmaek
|
||||
homeassistant/components/no_ip/* @fabaff
|
||||
@@ -213,22 +249,26 @@ homeassistant/components/obihai/* @dshokouhi
|
||||
homeassistant/components/ohmconnect/* @robbiet480
|
||||
homeassistant/components/ombi/* @larssont
|
||||
homeassistant/components/onboarding/* @home-assistant/core
|
||||
homeassistant/components/onewire/* @garbled1
|
||||
homeassistant/components/opentherm_gw/* @mvn23
|
||||
homeassistant/components/openuv/* @bachya
|
||||
homeassistant/components/openweathermap/* @fabaff
|
||||
homeassistant/components/opnsense/* @mtreinish
|
||||
homeassistant/components/orangepi_gpio/* @pascallj
|
||||
homeassistant/components/oru/* @bvlaicu
|
||||
homeassistant/components/owlet/* @oblogic7
|
||||
homeassistant/components/panel_custom/* @home-assistant/frontend
|
||||
homeassistant/components/panel_iframe/* @home-assistant/frontend
|
||||
homeassistant/components/pcal9535a/* @Shulyaka
|
||||
homeassistant/components/persistent_notification/* @home-assistant/core
|
||||
homeassistant/components/philips_js/* @elupus
|
||||
homeassistant/components/pi_hole/* @fabaff @johnluetke
|
||||
homeassistant/components/pilight/* @trekky12
|
||||
homeassistant/components/plaato/* @JohNan
|
||||
homeassistant/components/plant/* @ChristianKuehnel
|
||||
homeassistant/components/plex/* @jjlawren
|
||||
homeassistant/components/plugwise/* @laetificat @CoMPaTech
|
||||
homeassistant/components/plugwise/* @laetificat @CoMPaTech @bouwew
|
||||
homeassistant/components/point/* @fredrike
|
||||
homeassistant/components/proxmoxve/* @k4ds3
|
||||
homeassistant/components/ps4/* @ktnrg45
|
||||
homeassistant/components/ptvsd/* @swamp-ig
|
||||
homeassistant/components/push/* @dgomes
|
||||
@@ -239,31 +279,41 @@ homeassistant/components/quantum_gateway/* @cisasteelersfan
|
||||
homeassistant/components/qwikswitch/* @kellerza
|
||||
homeassistant/components/rainbird/* @konikvranik
|
||||
homeassistant/components/raincloud/* @vanstinator
|
||||
homeassistant/components/rainforest_eagle/* @gtdiehl
|
||||
homeassistant/components/rainforest_eagle/* @gtdiehl @jcalbert
|
||||
homeassistant/components/rainmachine/* @bachya
|
||||
homeassistant/components/random/* @fabaff
|
||||
homeassistant/components/repetier/* @MTrab
|
||||
homeassistant/components/rfxtrx/* @danielhiversen
|
||||
homeassistant/components/ring/* @balloob
|
||||
homeassistant/components/rmvtransport/* @cgtobi
|
||||
homeassistant/components/roomba/* @pschmitt
|
||||
homeassistant/components/safe_mode/* @home-assistant/core
|
||||
homeassistant/components/saj/* @fredericvl
|
||||
homeassistant/components/salt/* @bjornorri
|
||||
homeassistant/components/samsungtv/* @escoand
|
||||
homeassistant/components/scene/* @home-assistant/core
|
||||
homeassistant/components/scrape/* @fabaff
|
||||
homeassistant/components/script/* @home-assistant/core
|
||||
homeassistant/components/search/* @home-assistant/core
|
||||
homeassistant/components/sense/* @kbickar
|
||||
homeassistant/components/sensibo/* @andrey-git
|
||||
homeassistant/components/sentry/* @dcramer
|
||||
homeassistant/components/serial/* @fabaff
|
||||
homeassistant/components/seventeentrack/* @bachya
|
||||
homeassistant/components/shell_command/* @home-assistant/core
|
||||
homeassistant/components/shiftr/* @fabaff
|
||||
homeassistant/components/shodan/* @fabaff
|
||||
homeassistant/components/sighthound/* @robmarkcole
|
||||
homeassistant/components/signal_messenger/* @bbernhard
|
||||
homeassistant/components/simplisafe/* @bachya
|
||||
homeassistant/components/sinch/* @bendikrb
|
||||
homeassistant/components/sisyphus/* @jkeljo
|
||||
homeassistant/components/slide/* @ualex73
|
||||
homeassistant/components/sma/* @kellerza
|
||||
homeassistant/components/smarthab/* @outadoc
|
||||
homeassistant/components/smartthings/* @andrewsayre
|
||||
homeassistant/components/smarty/* @z0mbieprocess
|
||||
homeassistant/components/sms/* @ocalvo
|
||||
homeassistant/components/smtp/* @fabaff
|
||||
homeassistant/components/solaredge_local/* @drobtravels @scheric
|
||||
homeassistant/components/solarlog/* @Ernst79
|
||||
@@ -272,14 +322,20 @@ homeassistant/components/soma/* @ratsept
|
||||
homeassistant/components/somfy/* @tetienne
|
||||
homeassistant/components/songpal/* @rytilahti
|
||||
homeassistant/components/spaceapi/* @fabaff
|
||||
homeassistant/components/speedtestdotnet/* @rohankapoorcom
|
||||
homeassistant/components/spider/* @peternijssen
|
||||
homeassistant/components/spotify/* @frenck
|
||||
homeassistant/components/sql/* @dgomes
|
||||
homeassistant/components/starline/* @anonym-tsk
|
||||
homeassistant/components/statistics/* @fabaff
|
||||
homeassistant/components/stiebel_eltron/* @fucm
|
||||
homeassistant/components/stookalert/* @fwestenberg
|
||||
homeassistant/components/stream/* @hunterjm
|
||||
homeassistant/components/stt/* @pvizeli
|
||||
homeassistant/components/suez_water/* @ooii
|
||||
homeassistant/components/sun/* @Swamp-Ig
|
||||
homeassistant/components/supla/* @mwegrzynek
|
||||
homeassistant/components/surepetcare/* @benleb
|
||||
homeassistant/components/swiss_hydrological_data/* @fabaff
|
||||
homeassistant/components/swiss_public_transport/* @fabaff
|
||||
homeassistant/components/switchbot/* @danielhiversen
|
||||
@@ -288,29 +344,34 @@ homeassistant/components/switchmate/* @danielhiversen
|
||||
homeassistant/components/syncthru/* @nielstron
|
||||
homeassistant/components/synology_srm/* @aerialls
|
||||
homeassistant/components/syslog/* @fabaff
|
||||
homeassistant/components/tado/* @michaelarnauts
|
||||
homeassistant/components/tahoma/* @philklei
|
||||
homeassistant/components/tautulli/* @ludeeus
|
||||
homeassistant/components/tellduslive/* @fredrike
|
||||
homeassistant/components/template/* @PhracturedBlue
|
||||
homeassistant/components/tesla/* @zabuldon
|
||||
homeassistant/components/template/* @PhracturedBlue @tetienne
|
||||
homeassistant/components/tesla/* @zabuldon @alandtse
|
||||
homeassistant/components/tfiac/* @fredrike @mellado
|
||||
homeassistant/components/thethingsnetwork/* @fabaff
|
||||
homeassistant/components/threshold/* @fabaff
|
||||
homeassistant/components/tibber/* @danielhiversen
|
||||
homeassistant/components/tile/* @bachya
|
||||
homeassistant/components/time_date/* @fabaff
|
||||
homeassistant/components/tmb/* @alemuro
|
||||
homeassistant/components/todoist/* @boralyl
|
||||
homeassistant/components/toon/* @frenck
|
||||
homeassistant/components/totalconnect/* @austinmroczek
|
||||
homeassistant/components/tplink/* @rytilahti
|
||||
homeassistant/components/traccar/* @ludeeus
|
||||
homeassistant/components/tradfri/* @ggravlingen
|
||||
homeassistant/components/trafikverket_train/* @endor-force
|
||||
homeassistant/components/transmission/* @engrbm87
|
||||
homeassistant/components/transmission/* @engrbm87 @JPHutchins
|
||||
homeassistant/components/tts/* @robbiet480
|
||||
homeassistant/components/twentemilieu/* @frenck
|
||||
homeassistant/components/twilio_call/* @robbiet480
|
||||
homeassistant/components/twilio_sms/* @robbiet480
|
||||
homeassistant/components/ubee/* @mzdrale
|
||||
homeassistant/components/unifi/* @kane610
|
||||
homeassistant/components/unifiled/* @florisvdk
|
||||
homeassistant/components/upc_connect/* @pvizeli
|
||||
homeassistant/components/upcloud/* @scop
|
||||
homeassistant/components/updater/* @home-assistant/core
|
||||
@@ -318,11 +379,13 @@ homeassistant/components/upnp/* @robbiet480
|
||||
homeassistant/components/uptimerobot/* @ludeeus
|
||||
homeassistant/components/usgs_earthquakes_feed/* @exxamalte
|
||||
homeassistant/components/utility_meter/* @dgomes
|
||||
homeassistant/components/velbus/* @cereal2nd
|
||||
homeassistant/components/velbus/* @Cereal2nd @brefra
|
||||
homeassistant/components/velux/* @Julius2342
|
||||
homeassistant/components/versasense/* @flamm3blemuff1n
|
||||
homeassistant/components/version/* @fabaff
|
||||
homeassistant/components/vesync/* @markperdue @webdjoe
|
||||
homeassistant/components/vicare/* @oischinger
|
||||
homeassistant/components/vilfo/* @ManneW
|
||||
homeassistant/components/vivotek/* @HarlemSquirrel
|
||||
homeassistant/components/vizio/* @raman325
|
||||
homeassistant/components/vlc_telnet/* @rodripf
|
||||
@@ -330,9 +393,12 @@ homeassistant/components/waqi/* @andrey-git
|
||||
homeassistant/components/watson_tts/* @rutkai
|
||||
homeassistant/components/weather/* @fabaff
|
||||
homeassistant/components/weblink/* @home-assistant/core
|
||||
homeassistant/components/webostv/* @bendavid
|
||||
homeassistant/components/websocket_api/* @home-assistant/core
|
||||
homeassistant/components/wemo/* @sqldiablo
|
||||
homeassistant/components/withings/* @vangorra
|
||||
homeassistant/components/wled/* @frenck
|
||||
homeassistant/components/workday/* @fabaff
|
||||
homeassistant/components/worldclock/* @fabaff
|
||||
homeassistant/components/wwlln/* @bachya
|
||||
homeassistant/components/xbox_live/* @MartinHjelmare
|
||||
|
@@ -4,7 +4,7 @@ Everybody is invited and welcome to contribute to Home Assistant. There is a lot
|
||||
|
||||
The process is straight-forward.
|
||||
|
||||
- Read [How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) by Kubernetes (but skip step 0)
|
||||
- Read [How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) by Kubernetes (but skip step 0 and 1)
|
||||
- Fork the Home Assistant [git repository](https://github.com/home-assistant/home-assistant).
|
||||
- Write the code for your device, notification service, sensor, or IoT thing.
|
||||
- Ensure tests work.
|
||||
@@ -12,3 +12,7 @@ The process is straight-forward.
|
||||
|
||||
Still interested? Then you should take a peek at the [developer documentation](https://developers.home-assistant.io/) to get more details.
|
||||
|
||||
## Feature suggestions
|
||||
|
||||
If you want to suggest a new feature for Home Assistant (e.g., new integrations), please open a thread in our [Community Forum: Feature Requests](https://community.home-assistant.io/c/feature-requests).
|
||||
We use [GitHub for tracking issues](https://github.com/home-assistant/home-assistant/issues), not for tracking feature requests.
|
@@ -24,9 +24,9 @@ RUN git clone --depth 1 https://github.com/home-assistant/hass-release \
|
||||
WORKDIR /workspaces
|
||||
|
||||
# Install Python dependencies from requirements
|
||||
COPY requirements_test.txt homeassistant/package_constraints.txt ./
|
||||
COPY requirements_test.txt requirements_test_pre_commit.txt homeassistant/package_constraints.txt ./
|
||||
RUN pip3 install -r requirements_test.txt -c package_constraints.txt \
|
||||
&& rm -f requirements_test.txt package_constraints.txt
|
||||
&& rm -f requirements_test.txt package_constraints.txt requirements_test_pre_commit.txt
|
||||
|
||||
# Set the default shell to bash instead of sh
|
||||
ENV SHELL /bin/bash
|
||||
|
@@ -1,14 +1,7 @@
|
||||
Home Assistant |Chat Status|
|
||||
=================================================================================
|
||||
|
||||
Home Assistant is a home automation platform running on Python 3. It is able to track and control all devices at home and offer a platform for automating control.
|
||||
|
||||
To get started:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
python3 -m pip install homeassistant
|
||||
hass --open-ui
|
||||
Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server.
|
||||
|
||||
Check out `home-assistant.io <https://home-assistant.io>`__ for `a
|
||||
demo <https://home-assistant.io/demo/>`__, `installation instructions <https://home-assistant.io/getting-started/>`__,
|
||||
|
@@ -14,8 +14,6 @@ pr:
|
||||
|
||||
resources:
|
||||
containers:
|
||||
- container: 36
|
||||
image: homeassistant/ci-azure:3.6
|
||||
- container: 37
|
||||
image: homeassistant/ci-azure:3.7
|
||||
repositories:
|
||||
@@ -25,7 +23,7 @@ resources:
|
||||
endpoint: 'home-assistant'
|
||||
variables:
|
||||
- name: PythonMain
|
||||
value: '36'
|
||||
value: '37'
|
||||
- group: codecov
|
||||
|
||||
stages:
|
||||
@@ -46,10 +44,26 @@ stages:
|
||||
. venv/bin/activate
|
||||
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
|
||||
pre-commit install-hooks
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run codespell --all-files
|
||||
displayName: 'Run codespell'
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run flake8 --all-files
|
||||
displayName: 'Run flake8'
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run bandit --all-files
|
||||
displayName: 'Run bandit'
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run isort --all-files --show-diff-on-failure
|
||||
displayName: 'Run isort'
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run check-json --all-files
|
||||
displayName: 'Run check-json'
|
||||
- job: 'Validate'
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
@@ -87,7 +101,7 @@ stages:
|
||||
pre-commit install-hooks
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run black --all-files
|
||||
pre-commit run black --all-files --show-diff-on-failure
|
||||
displayName: 'Check Black formatting'
|
||||
|
||||
- stage: 'Tests'
|
||||
@@ -100,8 +114,6 @@ stages:
|
||||
strategy:
|
||||
maxParallel: 3
|
||||
matrix:
|
||||
Python36:
|
||||
python.container: '36'
|
||||
Python37:
|
||||
python.container: '37'
|
||||
container: $[ variables['python.container'] ]
|
||||
@@ -127,7 +139,7 @@ stages:
|
||||
set -e
|
||||
|
||||
. venv/bin/activate
|
||||
pytest --timeout=9 --durations=10 -n 2 --dist loadfile -qq -o console_output_style=count -p no:sugar tests
|
||||
pytest --timeout=9 --durations=10 -n auto --dist=loadfile -qq -o console_output_style=count -p no:sugar tests
|
||||
script/check_dirty
|
||||
displayName: 'Run pytest for python $(python.container)'
|
||||
condition: and(succeeded(), ne(variables['python.container'], variables['PythonMain']))
|
||||
@@ -135,7 +147,7 @@ stages:
|
||||
set -e
|
||||
|
||||
. venv/bin/activate
|
||||
pytest --timeout=9 --durations=10 -n 2 --dist loadfile --cov homeassistant --cov-report html -qq -o console_output_style=count -p no:sugar tests
|
||||
pytest --timeout=9 --durations=10 -n auto --dist=loadfile --cov homeassistant --cov-report html -qq -o console_output_style=count -p no:sugar tests
|
||||
codecov --token $(codecovToken)
|
||||
script/check_dirty
|
||||
displayName: 'Run pytest for python $(python.container) / coverage'
|
||||
@@ -158,7 +170,7 @@ stages:
|
||||
python -m venv venv
|
||||
|
||||
. venv/bin/activate
|
||||
pip install -U pip setuptools
|
||||
pip install -U pip setuptools wheel
|
||||
pip install -r requirements_all.txt -c homeassistant/package_constraints.txt
|
||||
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
|
||||
- script: |
|
||||
|
@@ -14,7 +14,7 @@ schedules:
|
||||
always: true
|
||||
variables:
|
||||
- name: versionBuilder
|
||||
value: '6.3'
|
||||
value: '6.9'
|
||||
- group: docker
|
||||
- group: github
|
||||
- group: twine
|
||||
@@ -43,7 +43,7 @@ stages:
|
||||
release="$(Build.SourceBranchName)"
|
||||
created_by="$(curl -s https://api.github.com/repos/home-assistant/home-assistant/releases/tags/${release} | jq --raw-output '.author.login')"
|
||||
|
||||
if [[ "${created_by}" =~ ^(balloob|pvizeli|fabaff|robbiet480|bramkragten)$ ]]; then
|
||||
if [[ "${created_by}" =~ ^(balloob|pvizeli|fabaff|robbiet480|bramkragten|frenck)$ ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -94,7 +94,7 @@ stages:
|
||||
buildMachine: 'raspberrypi2,raspberrypi3,raspberrypi4,odroid-xu,tinker'
|
||||
aarch64:
|
||||
buildArch: 'aarch64'
|
||||
buildMachine: 'qemuarm-64,raspberrypi3-64,raspberrypi4-64,odroid-c2,orangepi-prime'
|
||||
buildMachine: 'qemuarm-64,raspberrypi3-64,raspberrypi4-64,odroid-c2,odroid-n2'
|
||||
steps:
|
||||
- template: templates/azp-step-ha-version.yaml@azure
|
||||
- script: |
|
||||
@@ -163,7 +163,7 @@ stages:
|
||||
|
||||
git commit -am "Bump Home Assistant $version"
|
||||
git push
|
||||
displayName: 'Update version files'
|
||||
displayName: "Update version files"
|
||||
- job: 'ReleaseDocker'
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
@@ -30,7 +30,7 @@ jobs:
|
||||
- template: templates/azp-job-wheels.yaml@azure
|
||||
parameters:
|
||||
builderVersion: '$(versionWheels)'
|
||||
builderApk: 'build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev'
|
||||
builderApk: 'build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev'
|
||||
builderPip: 'Cython;numpy'
|
||||
wheelsRequirement: 'requirements_wheels.txt'
|
||||
wheelsRequirementDiff: 'requirements_diff.txt'
|
||||
@@ -68,6 +68,7 @@ jobs:
|
||||
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
|
||||
sed -i "s|# py_noaa|py_noaa|g" ${requirement_file}
|
||||
sed -i "s|# bme680|bme680|g" ${requirement_file}
|
||||
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
|
||||
|
||||
if [[ "$(buildArch)" =~ arm ]]; then
|
||||
sed -i "s|# VL53L1X|VL53L1X|g" ${requirement_file}
|
||||
|
@@ -13,4 +13,7 @@ coverage:
|
||||
url: "secret:TgWDUM4Jw0w7wMJxuxNF/yhSOHglIo1fGwInJnRLEVPy2P2aLimkoK1mtKCowH5TFw+baUXVXT3eAqefbdvIuM8BjRR4aRji95C6CYyD0QHy4N8i7nn1SQkWDPpS8IthYTg07rUDF7s5guurkKv2RrgoCdnnqjAMSzHoExMOF7xUmblMdhBTWJgBpWEhASJy85w/xxjlsE1xoTkzeJu9Q67pTXtRcn+5kb5/vIzPSYg="
|
||||
comment:
|
||||
require_changes: yes
|
||||
branches: master
|
||||
layout: reach
|
||||
branches:
|
||||
- master
|
||||
- !dev
|
Binary file not shown.
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 108 KiB |
@@ -8,7 +8,6 @@ Loosely based on https://github.com/astropy/astropy/pull/347
|
||||
import os
|
||||
import warnings
|
||||
|
||||
|
||||
__licence__ = 'BSD (3 clause)'
|
||||
|
||||
|
||||
|
@@ -17,11 +17,11 @@
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
import sys
|
||||
import os
|
||||
import inspect
|
||||
import os
|
||||
import sys
|
||||
|
||||
from homeassistant.const import __version__, __short_version__
|
||||
from homeassistant.const import __short_version__, __version__
|
||||
|
||||
PROJECT_NAME = 'Home Assistant'
|
||||
PROJECT_PACKAGE_NAME = 'homeassistant'
|
||||
|
@@ -1,26 +1,20 @@
|
||||
"""Start Home Assistant."""
|
||||
import argparse
|
||||
import asyncio
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
from typing import List, Dict, Any, TYPE_CHECKING
|
||||
from typing import List
|
||||
|
||||
from homeassistant import monkey_patch
|
||||
from homeassistant.const import __version__, REQUIRED_PYTHON_VER, RESTART_EXIT_CODE
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from homeassistant import core
|
||||
from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __version__
|
||||
|
||||
|
||||
def set_loop() -> None:
|
||||
"""Attempt to use uvloop."""
|
||||
import asyncio
|
||||
"""Attempt to use different loop."""
|
||||
from asyncio.events import BaseDefaultEventLoopPolicy
|
||||
|
||||
policy = None
|
||||
|
||||
if sys.platform == "win32":
|
||||
if hasattr(asyncio, "WindowsProactorEventLoopPolicy"):
|
||||
# pylint: disable=no-member
|
||||
@@ -33,15 +27,7 @@ def set_loop() -> None:
|
||||
_loop_factory = asyncio.ProactorEventLoop
|
||||
|
||||
policy = ProactorPolicy()
|
||||
else:
|
||||
try:
|
||||
import uvloop
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
policy = uvloop.EventLoopPolicy()
|
||||
|
||||
if policy is not None:
|
||||
asyncio.set_event_loop_policy(policy)
|
||||
|
||||
|
||||
@@ -66,10 +52,8 @@ def ensure_config_path(config_dir: str) -> None:
|
||||
if not os.path.isdir(config_dir):
|
||||
if config_dir != config_util.get_default_config_dir():
|
||||
print(
|
||||
(
|
||||
"Fatal Error: Specified configuration directory does "
|
||||
"not exist {} "
|
||||
).format(config_dir)
|
||||
f"Fatal Error: Specified configuration directory {config_dir} "
|
||||
"does not exist"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
@@ -77,10 +61,8 @@ def ensure_config_path(config_dir: str) -> None:
|
||||
os.mkdir(config_dir)
|
||||
except OSError:
|
||||
print(
|
||||
(
|
||||
"Fatal Error: Unable to create default configuration "
|
||||
"directory {} "
|
||||
).format(config_dir)
|
||||
"Fatal Error: Unable to create default configuration "
|
||||
f"directory {config_dir}"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
@@ -89,27 +71,10 @@ def ensure_config_path(config_dir: str) -> None:
|
||||
try:
|
||||
os.mkdir(lib_dir)
|
||||
except OSError:
|
||||
print(
|
||||
("Fatal Error: Unable to create library " "directory {} ").format(
|
||||
lib_dir
|
||||
)
|
||||
)
|
||||
print(f"Fatal Error: Unable to create library directory {lib_dir}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
async def ensure_config_file(hass: "core.HomeAssistant", config_dir: str) -> str:
|
||||
"""Ensure configuration file exists."""
|
||||
import homeassistant.config as config_util
|
||||
|
||||
config_path = await config_util.async_ensure_config_exists(hass, config_dir)
|
||||
|
||||
if config_path is None:
|
||||
print("Error getting configuration path")
|
||||
sys.exit(1)
|
||||
|
||||
return config_path
|
||||
|
||||
|
||||
def get_arguments() -> argparse.Namespace:
|
||||
"""Get parsed passed in arguments."""
|
||||
import homeassistant.config as config_util
|
||||
@@ -126,7 +91,7 @@ def get_arguments() -> argparse.Namespace:
|
||||
help="Directory that contains the Home Assistant configuration",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--demo-mode", action="store_true", help="Start Home Assistant in demo mode"
|
||||
"--safe-mode", action="store_true", help="Start Home Assistant in safe mode"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--debug", action="store_true", help="Start Home Assistant in debug mode"
|
||||
@@ -158,7 +123,7 @@ def get_arguments() -> argparse.Namespace:
|
||||
"--log-file",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Log file to write to. If not set, CONFIG/home-assistant.log " "is used",
|
||||
help="Log file to write to. If not set, CONFIG/home-assistant.log is used",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--log-no-color", action="store_true", help="Disable color logs"
|
||||
@@ -227,7 +192,7 @@ def check_pid(pid_file: str) -> None:
|
||||
except OSError:
|
||||
# PID does not exist
|
||||
return
|
||||
print("Fatal Error: HomeAssistant is already running.")
|
||||
print("Fatal Error: Home Assistant is already running.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@@ -271,36 +236,21 @@ def cmdline() -> List[str]:
|
||||
|
||||
|
||||
async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int:
|
||||
"""Set up HASS and run."""
|
||||
# pylint: disable=redefined-outer-name
|
||||
from homeassistant import bootstrap, core
|
||||
"""Set up Home Assistant and run."""
|
||||
from homeassistant import bootstrap
|
||||
|
||||
hass = core.HomeAssistant()
|
||||
hass = await bootstrap.async_setup_hass(
|
||||
config_dir=config_dir,
|
||||
verbose=args.verbose,
|
||||
log_rotate_days=args.log_rotate_days,
|
||||
log_file=args.log_file,
|
||||
log_no_color=args.log_no_color,
|
||||
skip_pip=args.skip_pip,
|
||||
safe_mode=args.safe_mode,
|
||||
)
|
||||
|
||||
if args.demo_mode:
|
||||
config: Dict[str, Any] = {"frontend": {}, "demo": {}}
|
||||
bootstrap.async_from_config_dict(
|
||||
config,
|
||||
hass,
|
||||
config_dir=config_dir,
|
||||
verbose=args.verbose,
|
||||
skip_pip=args.skip_pip,
|
||||
log_rotate_days=args.log_rotate_days,
|
||||
log_file=args.log_file,
|
||||
log_no_color=args.log_no_color,
|
||||
)
|
||||
else:
|
||||
config_file = await ensure_config_file(hass, config_dir)
|
||||
print("Config directory:", config_dir)
|
||||
await bootstrap.async_from_config_file(
|
||||
config_file,
|
||||
hass,
|
||||
verbose=args.verbose,
|
||||
skip_pip=args.skip_pip,
|
||||
log_rotate_days=args.log_rotate_days,
|
||||
log_file=args.log_file,
|
||||
log_no_color=args.log_no_color,
|
||||
)
|
||||
if hass is None:
|
||||
return 1
|
||||
|
||||
if args.open_ui and hass.config.api is not None:
|
||||
import webbrowser
|
||||
@@ -356,11 +306,6 @@ def main() -> int:
|
||||
"""Start Home Assistant."""
|
||||
validate_python()
|
||||
|
||||
monkey_patch_needed = sys.version_info[:3] < (3, 6, 3)
|
||||
if monkey_patch_needed and os.environ.get("HASS_NO_MONKEY") != "1":
|
||||
monkey_patch.disable_c_asyncio()
|
||||
monkey_patch.patch_weakref_tasks()
|
||||
|
||||
set_loop()
|
||||
|
||||
# Run a simple daemon runner process on Windows to handle restarts
|
||||
@@ -383,7 +328,7 @@ def main() -> int:
|
||||
|
||||
return scripts.run(args.script)
|
||||
|
||||
config_dir = os.path.join(os.getcwd(), args.config)
|
||||
config_dir = os.path.abspath(os.path.join(os.getcwd(), args.config))
|
||||
ensure_config_path(config_dir)
|
||||
|
||||
# Daemon functions
|
||||
@@ -394,13 +339,11 @@ def main() -> int:
|
||||
if args.pid_file:
|
||||
write_pid(args.pid_file)
|
||||
|
||||
from homeassistant.util.async_ import asyncio_run
|
||||
|
||||
exit_code = asyncio_run(setup_and_run_hass(config_dir, args))
|
||||
exit_code = asyncio.run(setup_and_run_hass(config_dir, args))
|
||||
if exit_code == RESTART_EXIT_CODE and not args.runner:
|
||||
try_to_restart()
|
||||
|
||||
return exit_code # type: ignore
|
||||
return exit_code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@@ -1,21 +1,21 @@
|
||||
"""Provide an authentication layer for Home Assistant."""
|
||||
import asyncio
|
||||
import logging
|
||||
from collections import OrderedDict
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
from typing import Any, Dict, List, Optional, Tuple, cast
|
||||
|
||||
import jwt
|
||||
|
||||
from homeassistant import data_entry_flow
|
||||
from homeassistant.auth.const import ACCESS_TOKEN_EXPIRATION
|
||||
from homeassistant.core import callback, HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import auth_store, models
|
||||
from .const import GROUP_ID_ADMIN
|
||||
from .mfa_modules import auth_mfa_module_from_config, MultiFactorAuthModule
|
||||
from .providers import auth_provider_from_config, AuthProvider, LoginFlow
|
||||
from .mfa_modules import MultiFactorAuthModule, auth_mfa_module_from_config
|
||||
from .providers import AuthProvider, LoginFlow, auth_provider_from_config
|
||||
|
||||
EVENT_USER_ADDED = "user_added"
|
||||
EVENT_USER_REMOVED = "user_removed"
|
||||
@@ -67,6 +67,69 @@ async def auth_manager_from_config(
|
||||
return manager
|
||||
|
||||
|
||||
class AuthManagerFlowManager(data_entry_flow.FlowManager):
|
||||
"""Manage authentication flows."""
|
||||
|
||||
def __init__(self, hass: HomeAssistant, auth_manager: "AuthManager"):
|
||||
"""Init auth manager flows."""
|
||||
super().__init__(hass)
|
||||
self.auth_manager = auth_manager
|
||||
|
||||
async def async_create_flow(
|
||||
self,
|
||||
handler_key: Any,
|
||||
*,
|
||||
context: Optional[Dict[str, Any]] = None,
|
||||
data: Optional[Dict[str, Any]] = None,
|
||||
) -> data_entry_flow.FlowHandler:
|
||||
"""Create a login flow."""
|
||||
auth_provider = self.auth_manager.get_auth_provider(*handler_key)
|
||||
if not auth_provider:
|
||||
raise KeyError(f"Unknown auth provider {handler_key}")
|
||||
return await auth_provider.async_login_flow(context)
|
||||
|
||||
async def async_finish_flow(
|
||||
self, flow: data_entry_flow.FlowHandler, result: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""Return a user as result of login flow."""
|
||||
flow = cast(LoginFlow, flow)
|
||||
|
||||
if result["type"] != data_entry_flow.RESULT_TYPE_CREATE_ENTRY:
|
||||
return result
|
||||
|
||||
# we got final result
|
||||
if isinstance(result["data"], models.User):
|
||||
result["result"] = result["data"]
|
||||
return result
|
||||
|
||||
auth_provider = self.auth_manager.get_auth_provider(*result["handler"])
|
||||
if not auth_provider:
|
||||
raise KeyError(f"Unknown auth provider {result['handler']}")
|
||||
|
||||
credentials = await auth_provider.async_get_or_create_credentials(
|
||||
result["data"]
|
||||
)
|
||||
|
||||
if flow.context.get("credential_only"):
|
||||
result["result"] = credentials
|
||||
return result
|
||||
|
||||
# multi-factor module cannot enabled for new credential
|
||||
# which has not linked to a user yet
|
||||
if auth_provider.support_mfa and not credentials.is_new:
|
||||
user = await self.auth_manager.async_get_user_by_credentials(credentials)
|
||||
if user is not None:
|
||||
modules = await self.auth_manager.async_get_enabled_mfa(user)
|
||||
|
||||
if modules:
|
||||
flow.user = user
|
||||
flow.available_mfa_modules = modules
|
||||
return await flow.async_step_select_mfa_module()
|
||||
|
||||
result["result"] = await self.auth_manager.async_get_or_create_user(credentials)
|
||||
return result
|
||||
|
||||
|
||||
class AuthManager:
|
||||
"""Manage the authentication for Home Assistant."""
|
||||
|
||||
@@ -82,9 +145,7 @@ class AuthManager:
|
||||
self._store = store
|
||||
self._providers = providers
|
||||
self._mfa_modules = mfa_modules
|
||||
self.login_flow = data_entry_flow.FlowManager(
|
||||
hass, self._async_create_login_flow, self._async_finish_login_flow
|
||||
)
|
||||
self.login_flow = AuthManagerFlowManager(hass, self)
|
||||
|
||||
@property
|
||||
def auth_providers(self) -> List[AuthProvider]:
|
||||
@@ -240,7 +301,7 @@ class AuthManager:
|
||||
async def async_deactivate_user(self, user: models.User) -> None:
|
||||
"""Deactivate a user."""
|
||||
if user.is_owner:
|
||||
raise ValueError("Unable to deactive the owner")
|
||||
raise ValueError("Unable to deactivate the owner")
|
||||
await self._store.async_deactivate_user(user)
|
||||
|
||||
async def async_remove_credentials(self, credentials: models.Credentials) -> None:
|
||||
@@ -261,7 +322,7 @@ class AuthManager:
|
||||
"""Enable a multi-factor auth module for user."""
|
||||
if user.system_generated:
|
||||
raise ValueError(
|
||||
"System generated users cannot enable " "multi-factor auth module."
|
||||
"System generated users cannot enable multi-factor auth module."
|
||||
)
|
||||
|
||||
module = self.get_auth_mfa_module(mfa_module_id)
|
||||
@@ -276,7 +337,7 @@ class AuthManager:
|
||||
"""Disable a multi-factor auth module for user."""
|
||||
if user.system_generated:
|
||||
raise ValueError(
|
||||
"System generated users cannot disable " "multi-factor auth module."
|
||||
"System generated users cannot disable multi-factor auth module."
|
||||
)
|
||||
|
||||
module = self.get_auth_mfa_module(mfa_module_id)
|
||||
@@ -320,7 +381,7 @@ class AuthManager:
|
||||
|
||||
if user.system_generated != (token_type == models.TOKEN_TYPE_SYSTEM):
|
||||
raise ValueError(
|
||||
"System generated users can only have system type " "refresh tokens"
|
||||
"System generated users can only have system type refresh tokens"
|
||||
)
|
||||
|
||||
if token_type == models.TOKEN_TYPE_NORMAL and client_id is None:
|
||||
@@ -330,7 +391,7 @@ class AuthManager:
|
||||
token_type == models.TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN
|
||||
and client_name is None
|
||||
):
|
||||
raise ValueError("Client_name is required for long-lived access " "token")
|
||||
raise ValueError("Client_name is required for long-lived access token")
|
||||
|
||||
if token_type == models.TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN:
|
||||
for token in user.refresh_tokens.values():
|
||||
@@ -417,50 +478,6 @@ class AuthManager:
|
||||
|
||||
return refresh_token
|
||||
|
||||
async def _async_create_login_flow(
|
||||
self, handler: _ProviderKey, *, context: Optional[Dict], data: Optional[Any]
|
||||
) -> data_entry_flow.FlowHandler:
|
||||
"""Create a login flow."""
|
||||
auth_provider = self._providers[handler]
|
||||
|
||||
return await auth_provider.async_login_flow(context)
|
||||
|
||||
async def _async_finish_login_flow(
|
||||
self, flow: LoginFlow, result: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""Return a user as result of login flow."""
|
||||
if result["type"] != data_entry_flow.RESULT_TYPE_CREATE_ENTRY:
|
||||
return result
|
||||
|
||||
# we got final result
|
||||
if isinstance(result["data"], models.User):
|
||||
result["result"] = result["data"]
|
||||
return result
|
||||
|
||||
auth_provider = self._providers[result["handler"]]
|
||||
credentials = await auth_provider.async_get_or_create_credentials(
|
||||
result["data"]
|
||||
)
|
||||
|
||||
if flow.context.get("credential_only"):
|
||||
result["result"] = credentials
|
||||
return result
|
||||
|
||||
# multi-factor module cannot enabled for new credential
|
||||
# which has not linked to a user yet
|
||||
if auth_provider.support_mfa and not credentials.is_new:
|
||||
user = await self.async_get_user_by_credentials(credentials)
|
||||
if user is not None:
|
||||
modules = await self.async_get_enabled_mfa(user)
|
||||
|
||||
if modules:
|
||||
flow.user = user
|
||||
flow.available_mfa_modules = modules
|
||||
return await flow.async_step_select_mfa_module()
|
||||
|
||||
result["result"] = await self.async_get_or_create_user(credentials)
|
||||
return result
|
||||
|
||||
@callback
|
||||
def _async_get_auth_provider(
|
||||
self, credentials: models.Credentials
|
||||
|
@@ -11,7 +11,7 @@ from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import models
|
||||
from .const import GROUP_ID_ADMIN, GROUP_ID_USER, GROUP_ID_READ_ONLY
|
||||
from .const import GROUP_ID_ADMIN, GROUP_ID_READ_ONLY, GROUP_ID_USER
|
||||
from .permissions import PermissionLookup, system_policies
|
||||
from .permissions.types import PolicyType
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
"""Plugable auth modules for Home Assistant."""
|
||||
"""Pluggable auth modules for Home Assistant."""
|
||||
import importlib
|
||||
import logging
|
||||
import types
|
||||
@@ -7,7 +7,7 @@ from typing import Any, Dict, Optional
|
||||
import voluptuous as vol
|
||||
from voluptuous.humanize import humanize_error
|
||||
|
||||
from homeassistant import requirements, data_entry_flow
|
||||
from homeassistant import data_entry_flow, requirements
|
||||
from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
@@ -42,7 +42,7 @@ class MultiFactorAuthModule:
|
||||
self.config = config
|
||||
|
||||
@property
|
||||
def id(self) -> str: # pylint: disable=invalid-name
|
||||
def id(self) -> str:
|
||||
"""Return id of the auth module.
|
||||
|
||||
Default is same as type
|
||||
|
@@ -7,9 +7,9 @@ import voluptuous as vol
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from . import (
|
||||
MultiFactorAuthModule,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MULTI_FACTOR_AUTH_MODULE_SCHEMA,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MultiFactorAuthModule,
|
||||
SetupFlow,
|
||||
)
|
||||
|
||||
|
@@ -3,9 +3,9 @@
|
||||
Sending HOTP through notify service
|
||||
"""
|
||||
import asyncio
|
||||
import logging
|
||||
from collections import OrderedDict
|
||||
from typing import Any, Dict, Optional, List
|
||||
import logging
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
import attr
|
||||
import voluptuous as vol
|
||||
@@ -16,9 +16,9 @@ from homeassistant.exceptions import ServiceNotFound
|
||||
from homeassistant.helpers import config_validation as cv
|
||||
|
||||
from . import (
|
||||
MultiFactorAuthModule,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MULTI_FACTOR_AUTH_MODULE_SCHEMA,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MultiFactorAuthModule,
|
||||
SetupFlow,
|
||||
)
|
||||
|
||||
@@ -317,7 +317,7 @@ class NotifySetupFlow(SetupFlow):
|
||||
async def async_step_setup(
|
||||
self, user_input: Optional[Dict[str, str]] = None
|
||||
) -> Dict[str, Any]:
|
||||
"""Verify user can recevie one-time password."""
|
||||
"""Verify user can receive one-time password."""
|
||||
errors: Dict[str, str] = {}
|
||||
|
||||
hass = self._auth_module.hass
|
||||
|
@@ -1,7 +1,7 @@
|
||||
"""Time-based One Time Password auth module."""
|
||||
import asyncio
|
||||
import logging
|
||||
from io import BytesIO
|
||||
import logging
|
||||
from typing import Any, Dict, Optional, Tuple
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -10,9 +10,9 @@ from homeassistant.auth.models import User
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from . import (
|
||||
MultiFactorAuthModule,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MULTI_FACTOR_AUTH_MODULE_SCHEMA,
|
||||
MULTI_FACTOR_AUTH_MODULES,
|
||||
MultiFactorAuthModule,
|
||||
SetupFlow,
|
||||
)
|
||||
|
||||
@@ -215,7 +215,11 @@ class TotpSetupFlow(SetupFlow):
|
||||
|
||||
else:
|
||||
hass = self._auth_module.hass
|
||||
self._ota_secret, self._url, self._image = await hass.async_add_executor_job(
|
||||
(
|
||||
self._ota_secret,
|
||||
self._url,
|
||||
self._image,
|
||||
) = await hass.async_add_executor_job(
|
||||
_generate_secret_and_qr_code, # type: ignore
|
||||
str(self._user.name),
|
||||
)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
"""Auth models."""
|
||||
from datetime import datetime, timedelta
|
||||
import secrets
|
||||
from typing import Dict, List, NamedTuple, Optional
|
||||
import uuid
|
||||
|
||||
@@ -9,7 +10,6 @@ from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import permissions as perm_mdl
|
||||
from .const import GROUP_ID_ADMIN
|
||||
from .util import generate_secret
|
||||
|
||||
TOKEN_TYPE_NORMAL = "normal"
|
||||
TOKEN_TYPE_SYSTEM = "system"
|
||||
@@ -31,22 +31,28 @@ class User:
|
||||
"""A user."""
|
||||
|
||||
name = attr.ib(type=Optional[str])
|
||||
perm_lookup = attr.ib(type=perm_mdl.PermissionLookup, cmp=False)
|
||||
perm_lookup = attr.ib(type=perm_mdl.PermissionLookup, eq=False, order=False)
|
||||
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
|
||||
is_owner = attr.ib(type=bool, default=False)
|
||||
is_active = attr.ib(type=bool, default=False)
|
||||
system_generated = attr.ib(type=bool, default=False)
|
||||
|
||||
groups = attr.ib(type=List[Group], factory=list, cmp=False)
|
||||
groups = attr.ib(type=List[Group], factory=list, eq=False, order=False)
|
||||
|
||||
# List of credentials of a user.
|
||||
credentials = attr.ib(type=List["Credentials"], factory=list, cmp=False)
|
||||
credentials = attr.ib(type=List["Credentials"], factory=list, eq=False, order=False)
|
||||
|
||||
# Tokens associated with a user.
|
||||
refresh_tokens = attr.ib(type=Dict[str, "RefreshToken"], factory=dict, cmp=False)
|
||||
refresh_tokens = attr.ib(
|
||||
type=Dict[str, "RefreshToken"], factory=dict, eq=False, order=False
|
||||
)
|
||||
|
||||
_permissions = attr.ib(
|
||||
type=Optional[perm_mdl.PolicyPermissions], init=False, cmp=False, default=None
|
||||
type=Optional[perm_mdl.PolicyPermissions],
|
||||
init=False,
|
||||
eq=False,
|
||||
order=False,
|
||||
default=None,
|
||||
)
|
||||
|
||||
@property
|
||||
@@ -96,8 +102,8 @@ class RefreshToken:
|
||||
)
|
||||
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
|
||||
created_at = attr.ib(type=datetime, factory=dt_util.utcnow)
|
||||
token = attr.ib(type=str, factory=lambda: generate_secret(64))
|
||||
jwt_key = attr.ib(type=str, factory=lambda: generate_secret(64))
|
||||
token = attr.ib(type=str, factory=lambda: secrets.token_hex(64))
|
||||
jwt_key = attr.ib(type=str, factory=lambda: secrets.token_hex(64))
|
||||
|
||||
last_used_at = attr.ib(type=Optional[datetime], default=None)
|
||||
last_used_ip = attr.ib(type=Optional[str], default=None)
|
||||
|
@@ -1,29 +1,16 @@
|
||||
"""Permissions for Home Assistant."""
|
||||
import logging
|
||||
from typing import ( # noqa: F401
|
||||
cast,
|
||||
Any,
|
||||
Callable,
|
||||
Dict,
|
||||
List,
|
||||
Mapping,
|
||||
Optional,
|
||||
Set,
|
||||
Tuple,
|
||||
Union,
|
||||
TYPE_CHECKING,
|
||||
)
|
||||
from typing import Any, Callable, Optional
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from .const import CAT_ENTITIES
|
||||
from .entities import ENTITY_POLICY_SCHEMA, compile_entities
|
||||
from .merge import merge_policies # noqa: F401
|
||||
from .models import PermissionLookup
|
||||
from .types import PolicyType
|
||||
from .entities import ENTITY_POLICY_SCHEMA, compile_entities
|
||||
from .merge import merge_policies # noqa
|
||||
from .util import test_all
|
||||
|
||||
|
||||
POLICY_SCHEMA = vol.Schema({vol.Optional(CAT_ENTITIES): ENTITY_POLICY_SCHEMA})
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -70,15 +57,12 @@ class PolicyPermissions(AbstractPermissions):
|
||||
|
||||
def __eq__(self, other: Any) -> bool:
|
||||
"""Equals check."""
|
||||
# pylint: disable=protected-access
|
||||
return isinstance(other, PolicyPermissions) and other._policy == self._policy
|
||||
|
||||
|
||||
class _OwnerPermissions(AbstractPermissions):
|
||||
"""Owner permissions."""
|
||||
|
||||
# pylint: disable=no-self-use
|
||||
|
||||
def access_all_entities(self, key: str) -> bool:
|
||||
"""Check if we have a certain access to all entities."""
|
||||
return True
|
||||
|
@@ -4,11 +4,10 @@ from typing import Callable, Optional
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from .const import SUBCAT_ALL, POLICY_READ, POLICY_CONTROL, POLICY_EDIT
|
||||
from .const import POLICY_CONTROL, POLICY_EDIT, POLICY_READ, SUBCAT_ALL
|
||||
from .models import PermissionLookup
|
||||
from .types import CategoryType, SubCategoryDict, ValueType
|
||||
|
||||
from .util import SubCatLookupType, lookup_all, compile_policy
|
||||
from .util import SubCatLookupType, compile_policy, lookup_all
|
||||
|
||||
SINGLE_ENTITY_SCHEMA = vol.Any(
|
||||
True,
|
||||
|
@@ -1,7 +1,7 @@
|
||||
"""Merging of policies."""
|
||||
from typing import cast, Dict, List, Set
|
||||
from typing import Dict, List, Set, cast
|
||||
|
||||
from .types import PolicyType, CategoryType
|
||||
from .types import CategoryType, PolicyType
|
||||
|
||||
|
||||
def merge_policies(policies: List[PolicyType]) -> PolicyType:
|
||||
|
@@ -5,8 +5,8 @@ import attr
|
||||
|
||||
if TYPE_CHECKING:
|
||||
# pylint: disable=unused-import
|
||||
from homeassistant.helpers import entity_registry as ent_reg # noqa
|
||||
from homeassistant.helpers import device_registry as dev_reg # noqa
|
||||
from homeassistant.helpers import entity_registry as ent_reg # noqa: F401
|
||||
from homeassistant.helpers import device_registry as dev_reg # noqa: F401
|
||||
|
||||
|
||||
@attr.s(slots=True)
|
||||
|
@@ -1,5 +1,5 @@
|
||||
"""System policies."""
|
||||
from .const import CAT_ENTITIES, SUBCAT_ALL, POLICY_READ
|
||||
from .const import CAT_ENTITIES, POLICY_READ, SUBCAT_ALL
|
||||
|
||||
ADMIN_POLICY = {CAT_ENTITIES: True}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
"""Helpers to deal with permissions."""
|
||||
from functools import wraps
|
||||
|
||||
from typing import Callable, Dict, List, Optional, cast
|
||||
|
||||
from .const import SUBCAT_ALL
|
||||
@@ -21,8 +20,9 @@ def lookup_all(
|
||||
|
||||
def compile_policy(
|
||||
policy: CategoryType, subcategories: SubCatLookupType, perm_lookup: PermissionLookup
|
||||
) -> Callable[[str, str], bool]: # noqa
|
||||
) -> Callable[[str, str], bool]:
|
||||
"""Compile policy into a function that tests policy.
|
||||
|
||||
Subcategories are mapping key -> lookup function, ordered by highest
|
||||
priority first.
|
||||
"""
|
||||
@@ -80,7 +80,7 @@ def compile_policy(
|
||||
|
||||
def _gen_dict_test_func(
|
||||
perm_lookup: PermissionLookup, lookup_func: LookupFunc, lookup_dict: SubCategoryDict
|
||||
) -> Callable[[str, str], Optional[bool]]: # noqa
|
||||
) -> Callable[[str, str], Optional[bool]]:
|
||||
"""Generate a lookup function."""
|
||||
|
||||
def test_value(object_id: str, key: str) -> Optional[bool]:
|
||||
|
@@ -8,8 +8,8 @@ import voluptuous as vol
|
||||
from voluptuous.humanize import humanize_error
|
||||
|
||||
from homeassistant import data_entry_flow, requirements
|
||||
from homeassistant.core import callback, HomeAssistant
|
||||
from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.util import dt as dt_util
|
||||
from homeassistant.util.decorator import Registry
|
||||
@@ -48,7 +48,7 @@ class AuthProvider:
|
||||
self.config = config
|
||||
|
||||
@property
|
||||
def id(self) -> Optional[str]: # pylint: disable=invalid-name
|
||||
def id(self) -> Optional[str]:
|
||||
"""Return id of the auth provider.
|
||||
|
||||
Optional, can be None.
|
||||
|
@@ -1,20 +1,18 @@
|
||||
"""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
|
||||
from typing import Any, Dict, Optional, cast
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
|
||||
CONF_COMMAND = "command"
|
||||
CONF_ARGS = "args"
|
||||
CONF_META = "meta"
|
||||
@@ -78,7 +76,7 @@ class CommandLineAuthProvider(AuthProvider):
|
||||
|
||||
if process.returncode != 0:
|
||||
_LOGGER.error(
|
||||
"User %r failed to authenticate, command exited " "with code %d.",
|
||||
"User %r failed to authenticate, command exited with code %d.",
|
||||
username,
|
||||
process.returncode,
|
||||
)
|
||||
|
@@ -3,21 +3,18 @@ import asyncio
|
||||
import base64
|
||||
from collections import OrderedDict
|
||||
import logging
|
||||
|
||||
from typing import Any, Dict, List, Optional, Set, cast
|
||||
|
||||
import bcrypt
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import CONF_ID
|
||||
from homeassistant.core import callback, HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
|
||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
|
||||
STORAGE_VERSION = 1
|
||||
STORAGE_KEY = "auth_provider.homeassistant"
|
||||
|
||||
@@ -203,7 +200,7 @@ class Data:
|
||||
|
||||
@AUTH_PROVIDERS.register("homeassistant")
|
||||
class HassAuthProvider(AuthProvider):
|
||||
"""Auth provider based on a local storage of users in HASS config dir."""
|
||||
"""Auth provider based on a local storage of users in Home Assistant config dir."""
|
||||
|
||||
DEFAULT_TITLE = "Home Assistant Local"
|
||||
|
||||
|
@@ -5,13 +5,12 @@ from typing import Any, Dict, Optional, cast
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
|
||||
USER_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Required("username"): str,
|
||||
|
@@ -12,9 +12,9 @@ from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import AuthProvider, AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, LoginFlow
|
||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||
from .. import AuthManager
|
||||
from ..models import Credentials, UserMeta, User
|
||||
from ..models import Credentials, User, UserMeta
|
||||
|
||||
AUTH_PROVIDER_TYPE = "legacy_api_password"
|
||||
CONF_API_PASSWORD = "api_password"
|
||||
|
@@ -3,15 +3,16 @@
|
||||
It shows list of users if access from trusted network.
|
||||
Abort login flow if not access from trusted network.
|
||||
"""
|
||||
from ipaddress import ip_network, IPv4Address, IPv6Address, IPv4Network, IPv6Network
|
||||
from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network, ip_network
|
||||
from typing import Any, Dict, List, Optional, Union, cast
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
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
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||
from ..models import Credentials, UserMeta
|
||||
|
||||
IPAddress = Union[IPv4Address, IPv6Address]
|
||||
|
@@ -1,13 +0,0 @@
|
||||
"""Auth utils."""
|
||||
import binascii
|
||||
import os
|
||||
|
||||
|
||||
def generate_secret(entropy: int = 32) -> str:
|
||||
"""Generate a secret.
|
||||
|
||||
Backport of secrets.token_hex from Python 3.6
|
||||
|
||||
Event loop friendly.
|
||||
"""
|
||||
return binascii.hexlify(os.urandom(entropy)).decode("ascii")
|
@@ -1,22 +1,29 @@
|
||||
"""Provide methods to bootstrap a Home Assistant instance."""
|
||||
import asyncio
|
||||
import contextlib
|
||||
import logging
|
||||
import logging.handlers
|
||||
import os
|
||||
import sys
|
||||
from time import time
|
||||
from collections import OrderedDict
|
||||
from typing import Any, Optional, Dict, Set
|
||||
from time import monotonic
|
||||
from typing import Any, Dict, Optional, Set
|
||||
|
||||
from async_timeout import timeout
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant import core, config as conf_util, config_entries, loader
|
||||
from homeassistant.const import EVENT_HOMEASSISTANT_CLOSE
|
||||
from homeassistant.setup import async_setup_component
|
||||
from homeassistant import config as conf_util, config_entries, core, loader
|
||||
from homeassistant.components import http
|
||||
from homeassistant.const import (
|
||||
EVENT_HOMEASSISTANT_CLOSE,
|
||||
EVENT_HOMEASSISTANT_STOP,
|
||||
REQUIRED_NEXT_PYTHON_DATE,
|
||||
REQUIRED_NEXT_PYTHON_VER,
|
||||
)
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.setup import DATA_SETUP, async_setup_component
|
||||
from homeassistant.util.logging import AsyncHandler
|
||||
from homeassistant.util.package import async_get_user_site, is_virtual_env
|
||||
from homeassistant.util.yaml import clear_secret_cache
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -27,41 +34,132 @@ DATA_LOGGING = "logging"
|
||||
|
||||
DEBUGGER_INTEGRATIONS = {"ptvsd"}
|
||||
CORE_INTEGRATIONS = ("homeassistant", "persistent_notification")
|
||||
LOGGING_INTEGRATIONS = {"logger", "system_log"}
|
||||
LOGGING_INTEGRATIONS = {"logger", "system_log", "sentry"}
|
||||
STAGE_1_INTEGRATIONS = {
|
||||
# To record data
|
||||
"recorder",
|
||||
# To make sure we forward data to other instances
|
||||
"mqtt_eventstream",
|
||||
# To provide account link implementations
|
||||
"cloud",
|
||||
}
|
||||
|
||||
|
||||
async def async_setup_hass(
|
||||
*,
|
||||
config_dir: str,
|
||||
verbose: bool,
|
||||
log_rotate_days: int,
|
||||
log_file: str,
|
||||
log_no_color: bool,
|
||||
skip_pip: bool,
|
||||
safe_mode: bool,
|
||||
) -> Optional[core.HomeAssistant]:
|
||||
"""Set up Home Assistant."""
|
||||
hass = core.HomeAssistant()
|
||||
hass.config.config_dir = config_dir
|
||||
|
||||
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"
|
||||
)
|
||||
|
||||
if not await conf_util.async_ensure_config_exists(hass):
|
||||
_LOGGER.error("Error getting configuration path")
|
||||
return None
|
||||
|
||||
_LOGGER.info("Config directory: %s", config_dir)
|
||||
|
||||
config_dict = None
|
||||
basic_setup_success = False
|
||||
|
||||
if not safe_mode:
|
||||
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
|
||||
|
||||
try:
|
||||
config_dict = await conf_util.async_hass_config_yaml(hass)
|
||||
except HomeAssistantError as err:
|
||||
_LOGGER.error(
|
||||
"Failed to parse configuration.yaml: %s. Activating safe mode", err,
|
||||
)
|
||||
else:
|
||||
if not is_virtual_env():
|
||||
await async_mount_local_lib_path(config_dir)
|
||||
|
||||
basic_setup_success = (
|
||||
await async_from_config_dict(config_dict, hass) is not None
|
||||
)
|
||||
finally:
|
||||
clear_secret_cache()
|
||||
|
||||
if config_dict is None:
|
||||
safe_mode = True
|
||||
|
||||
elif not basic_setup_success:
|
||||
_LOGGER.warning("Unable to set up core integrations. Activating safe mode")
|
||||
safe_mode = True
|
||||
|
||||
elif (
|
||||
"frontend" in hass.data.get(DATA_SETUP, {})
|
||||
and "frontend" not in hass.config.components
|
||||
):
|
||||
_LOGGER.warning("Detected that frontend did not load. Activating safe mode")
|
||||
# Ask integrations to shut down. It's messy but we can't
|
||||
# do a clean stop without knowing what is broken
|
||||
hass.async_track_tasks()
|
||||
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP, {})
|
||||
with contextlib.suppress(asyncio.TimeoutError):
|
||||
async with timeout(10):
|
||||
await hass.async_block_till_done()
|
||||
|
||||
safe_mode = True
|
||||
hass = core.HomeAssistant()
|
||||
hass.config.config_dir = config_dir
|
||||
|
||||
if safe_mode:
|
||||
_LOGGER.info("Starting in safe mode")
|
||||
hass.config.safe_mode = True
|
||||
|
||||
http_conf = (await http.async_get_last_config(hass)) or {}
|
||||
|
||||
await async_from_config_dict(
|
||||
{"safe_mode": {}, "http": http_conf}, hass,
|
||||
)
|
||||
|
||||
return hass
|
||||
|
||||
|
||||
async def async_from_config_dict(
|
||||
config: Dict[str, Any],
|
||||
hass: core.HomeAssistant,
|
||||
config_dir: Optional[str] = None,
|
||||
enable_log: bool = True,
|
||||
verbose: bool = False,
|
||||
skip_pip: bool = False,
|
||||
log_rotate_days: Any = None,
|
||||
log_file: Any = None,
|
||||
log_no_color: bool = False,
|
||||
config: Dict[str, Any], hass: core.HomeAssistant
|
||||
) -> Optional[core.HomeAssistant]:
|
||||
"""Try to configure Home Assistant from a configuration dictionary.
|
||||
|
||||
Dynamically loads required components and its dependencies.
|
||||
This method is a coroutine.
|
||||
"""
|
||||
start = time()
|
||||
start = monotonic()
|
||||
|
||||
if enable_log:
|
||||
async_enable_logging(hass, verbose, log_rotate_days, log_file, log_no_color)
|
||||
hass.config_entries = config_entries.ConfigEntries(hass, config)
|
||||
await hass.config_entries.async_initialize()
|
||||
|
||||
hass.config.skip_pip = skip_pip
|
||||
if skip_pip:
|
||||
_LOGGER.warning(
|
||||
"Skipping pip installation of required modules. " "This may cause issues"
|
||||
# Set up core.
|
||||
_LOGGER.debug("Setting up %s", CORE_INTEGRATIONS)
|
||||
|
||||
if not all(
|
||||
await asyncio.gather(
|
||||
*(
|
||||
async_setup_component(hass, domain, config)
|
||||
for domain in CORE_INTEGRATIONS
|
||||
)
|
||||
)
|
||||
):
|
||||
_LOGGER.error("Home Assistant core failed to initialize. ")
|
||||
return None
|
||||
|
||||
_LOGGER.debug("Home Assistant core initialized")
|
||||
|
||||
core_config = config.get(core.DOMAIN, {})
|
||||
|
||||
@@ -77,27 +175,19 @@ async def async_from_config_dict(
|
||||
)
|
||||
return None
|
||||
|
||||
# Make a copy because we are mutating it.
|
||||
config = OrderedDict(config)
|
||||
|
||||
# Merge packages
|
||||
await conf_util.merge_packages_config(
|
||||
hass, config, core_config.get(conf_util.CONF_PACKAGES, {})
|
||||
)
|
||||
|
||||
hass.config_entries = config_entries.ConfigEntries(hass, config)
|
||||
await hass.config_entries.async_initialize()
|
||||
|
||||
await _async_set_up_integrations(hass, config)
|
||||
|
||||
stop = time()
|
||||
stop = monotonic()
|
||||
_LOGGER.info("Home Assistant initialized in %.2fs", stop - start)
|
||||
|
||||
if sys.version_info[:3] < (3, 7, 0):
|
||||
if REQUIRED_NEXT_PYTHON_DATE and sys.version_info[:3] < REQUIRED_NEXT_PYTHON_VER:
|
||||
msg = (
|
||||
"Python 3.6 support is deprecated and will "
|
||||
"be removed in the first release after December 15, 2019. Please "
|
||||
"upgrade Python to 3.7.0 or higher."
|
||||
"Support for the running Python version "
|
||||
f"{'.'.join(str(x) for x in sys.version_info[:3])} is deprecated and will "
|
||||
f"be removed in the first release after {REQUIRED_NEXT_PYTHON_DATE}. "
|
||||
"Please upgrade Python to "
|
||||
f"{'.'.join(str(x) for x in REQUIRED_NEXT_PYTHON_VER)} or "
|
||||
"higher."
|
||||
)
|
||||
_LOGGER.warning(msg)
|
||||
hass.components.persistent_notification.async_create(
|
||||
@@ -107,46 +197,6 @@ async def async_from_config_dict(
|
||||
return hass
|
||||
|
||||
|
||||
async def async_from_config_file(
|
||||
config_path: str,
|
||||
hass: core.HomeAssistant,
|
||||
verbose: bool = False,
|
||||
skip_pip: bool = True,
|
||||
log_rotate_days: Any = None,
|
||||
log_file: Any = None,
|
||||
log_no_color: bool = False,
|
||||
) -> Optional[core.HomeAssistant]:
|
||||
"""Read the configuration file and try to start all the functionality.
|
||||
|
||||
Will add functionality to 'hass' parameter.
|
||||
This method is a coroutine.
|
||||
"""
|
||||
# Set config dir to directory holding config file
|
||||
config_dir = os.path.abspath(os.path.dirname(config_path))
|
||||
hass.config.config_dir = config_dir
|
||||
|
||||
if not is_virtual_env():
|
||||
await async_mount_local_lib_path(config_dir)
|
||||
|
||||
async_enable_logging(hass, verbose, log_rotate_days, log_file, log_no_color)
|
||||
|
||||
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
|
||||
|
||||
try:
|
||||
config_dict = await hass.async_add_executor_job(
|
||||
conf_util.load_yaml_config_file, config_path
|
||||
)
|
||||
except HomeAssistantError as err:
|
||||
_LOGGER.error("Error loading %s: %s", config_path, err)
|
||||
return None
|
||||
finally:
|
||||
clear_secret_cache()
|
||||
|
||||
return await async_from_config_dict(
|
||||
config_dict, hass, enable_log=False, skip_pip=skip_pip
|
||||
)
|
||||
|
||||
|
||||
@core.callback
|
||||
def async_enable_logging(
|
||||
hass: core.HomeAssistant,
|
||||
@@ -159,7 +209,7 @@ def async_enable_logging(
|
||||
|
||||
This method must be run in the event loop.
|
||||
"""
|
||||
fmt = "%(asctime)s %(levelname)s (%(threadName)s) " "[%(name)s] %(message)s"
|
||||
fmt = "%(asctime)s %(levelname)s (%(threadName)s) [%(name)s] %(message)s"
|
||||
datefmt = "%Y-%m-%d %H:%M:%S"
|
||||
|
||||
if not log_no_color:
|
||||
@@ -189,7 +239,7 @@ def async_enable_logging(
|
||||
pass
|
||||
|
||||
# If the above initialization failed for any reason, setup the default
|
||||
# formatting. If the above succeeds, this wil result in a no-op.
|
||||
# formatting. If the above succeeds, this will result in a no-op.
|
||||
logging.basicConfig(format=fmt, datefmt=datefmt, level=logging.INFO)
|
||||
|
||||
# Suppress overly verbose logs from libraries that aren't helpful
|
||||
@@ -260,7 +310,8 @@ def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]:
|
||||
domains = set(key.split(" ")[0] for key in config.keys() if key != core.DOMAIN)
|
||||
|
||||
# Add config entry domains
|
||||
domains.update(hass.config_entries.async_domains())
|
||||
if not hass.config.safe_mode:
|
||||
domains.update(hass.config_entries.async_domains())
|
||||
|
||||
# Make sure the Hass.io component is loaded
|
||||
if "HASSIO" in os.environ:
|
||||
@@ -291,25 +342,6 @@ async def _async_set_up_integrations(
|
||||
return_exceptions=True,
|
||||
)
|
||||
|
||||
# Set up core.
|
||||
_LOGGER.debug("Setting up %s", CORE_INTEGRATIONS)
|
||||
|
||||
if not all(
|
||||
await asyncio.gather(
|
||||
*(
|
||||
async_setup_component(hass, domain, config)
|
||||
for domain in CORE_INTEGRATIONS
|
||||
)
|
||||
)
|
||||
):
|
||||
_LOGGER.error(
|
||||
"Home Assistant core failed to initialize. "
|
||||
"Further initialization aborted"
|
||||
)
|
||||
return
|
||||
|
||||
_LOGGER.debug("Home Assistant core initialized")
|
||||
|
||||
# Finish resolving domains
|
||||
for dep_domains in await resolved_domains_task:
|
||||
# Result is either a set or an exception. We ignore exceptions
|
||||
|
@@ -11,7 +11,6 @@ import logging
|
||||
|
||||
from homeassistant.core import split_entity_id
|
||||
|
||||
|
||||
# mypy: allow-untyped-defs
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
22
homeassistant/components/abode/.translations/bg.json
Normal file
22
homeassistant/components/abode/.translations/bg.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430 \u0435 \u0441\u0430\u043c\u043e \u0435\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 Abode.",
|
||||
"identifier_exists": "\u041f\u0440\u043e\u0444\u0438\u043b\u044a\u0442 \u0435 \u0432\u0435\u0447\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043d.",
|
||||
"invalid_credentials": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0438 \u0434\u0430\u043d\u043d\u0438."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "\u041f\u0430\u0440\u043e\u043b\u0430",
|
||||
"username": "E-mail \u0430\u0434\u0440\u0435\u0441"
|
||||
},
|
||||
"title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0412\u0430\u0448\u0430\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0432\u0445\u043e\u0434 \u0432 Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -14,7 +14,7 @@
|
||||
"password": "Contrasenya",
|
||||
"username": "Correu electr\u00f2nic"
|
||||
},
|
||||
"title": "Introdueix la teva informaci\u00f3 d'inici de sessi\u00f3 a Abode."
|
||||
"title": "Introducci\u00f3 de la informaci\u00f3 d'inici de sessi\u00f3 a Abode."
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
|
22
homeassistant/components/abode/.translations/cs.json
Normal file
22
homeassistant/components/abode/.translations/cs.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Je povolena pouze jedna konfigurace Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Nelze se p\u0159ipojit k Abode.",
|
||||
"identifier_exists": "\u00da\u010det je ji\u017e zaregistrov\u00e1n.",
|
||||
"invalid_credentials": "Neplatn\u00e9 p\u0159ihla\u0161ovac\u00ed \u00fadaje."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Heslo",
|
||||
"username": "E-mailov\u00e1 adresa"
|
||||
},
|
||||
"title": "Vypl\u0148te p\u0159ihla\u0161ovac\u00ed \u00fadaje Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -12,7 +12,7 @@
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Adgangskode",
|
||||
"username": "Email adresse"
|
||||
"username": "Email-adresse"
|
||||
},
|
||||
"title": "Udfyld dine Abode-loginoplysninger"
|
||||
}
|
||||
|
22
homeassistant/components/abode/.translations/es-419.json
Normal file
22
homeassistant/components/abode/.translations/es-419.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Solo se permite una \u00fanica configuraci\u00f3n de Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "No se puede conectar a Abode.",
|
||||
"identifier_exists": "Cuenta ya registrada.",
|
||||
"invalid_credentials": "Credenciales inv\u00e1lidas."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Contrase\u00f1a",
|
||||
"username": "Direcci\u00f3n de correo electr\u00f3nico"
|
||||
},
|
||||
"title": "Complete su informaci\u00f3n de inicio de sesi\u00f3n de Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
22
homeassistant/components/abode/.translations/hu.json
Normal file
22
homeassistant/components/abode/.translations/hu.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Csak egyetlen Abode konfigur\u00e1ci\u00f3 enged\u00e9lyezett."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Nem lehet csatlakozni az Abode-hez.",
|
||||
"identifier_exists": "Fi\u00f3k m\u00e1r regisztr\u00e1lva van",
|
||||
"invalid_credentials": "\u00c9rv\u00e9nytelen hiteles\u00edt\u0151 adatok"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Jelsz\u00f3",
|
||||
"username": "Email c\u00edm"
|
||||
},
|
||||
"title": "T\u00f6ltse ki az Abode bejelentkez\u00e9si adatait"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z Abode.",
|
||||
"identifier_exists": "Konto zosta\u0142o ju\u017c zarejestrowane",
|
||||
"identifier_exists": "Konto jest ju\u017c zarejestrowane.",
|
||||
"invalid_credentials": "Nieprawid\u0142owe dane uwierzytelniaj\u0105ce"
|
||||
},
|
||||
"step": {
|
||||
|
@@ -1,8 +1,17 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Somente uma \u00fanica configura\u00e7\u00e3o de Abode \u00e9 permitida."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "N\u00e3o foi poss\u00edvel conectar ao Abode.",
|
||||
"identifier_exists": "Conta j\u00e1 cadastrada.",
|
||||
"invalid_credentials": "Credenciais inv\u00e1lidas."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Senha",
|
||||
"username": "Endere\u00e7o de e-mail"
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Palavra-passe",
|
||||
"username": "Endere\u00e7o de e-mail"
|
||||
}
|
||||
}
|
||||
|
@@ -5,8 +5,8 @@
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a Abode.",
|
||||
"identifier_exists": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430.",
|
||||
"invalid_credentials": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435."
|
||||
"identifier_exists": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430.",
|
||||
"invalid_credentials": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
|
22
homeassistant/components/abode/.translations/sv.json
Normal file
22
homeassistant/components/abode/.translations/sv.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Endast en enda konfiguration av Abode \u00e4r till\u00e5ten."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Det gick inte att ansluta till Abode.",
|
||||
"identifier_exists": "Kontot \u00e4r redan registrerat.",
|
||||
"invalid_credentials": "Ogiltiga autentiseringsuppgifter."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "L\u00f6senord",
|
||||
"username": "E-postadress"
|
||||
},
|
||||
"title": "Fyll i din inloggningsinformation f\u00f6r Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -21,9 +21,16 @@ from homeassistant.const import (
|
||||
EVENT_HOMEASSISTANT_STOP,
|
||||
)
|
||||
from homeassistant.helpers import config_validation as cv
|
||||
from homeassistant.helpers.dispatcher import dispatcher_send
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
from .const import ATTRIBUTION, DOMAIN, DEFAULT_CACHEDB
|
||||
from .const import (
|
||||
ATTRIBUTION,
|
||||
DEFAULT_CACHEDB,
|
||||
DOMAIN,
|
||||
SIGNAL_CAPTURE_IMAGE,
|
||||
SIGNAL_TRIGGER_QUICK_ACTION,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -89,7 +96,7 @@ class AbodeSystem:
|
||||
|
||||
self.abode = abode
|
||||
self.polling = polling
|
||||
self.devices = []
|
||||
self.entity_ids = set()
|
||||
self.logout_listener = None
|
||||
|
||||
|
||||
@@ -163,7 +170,7 @@ async def async_unload_entry(hass, config_entry):
|
||||
|
||||
|
||||
def setup_hass_services(hass):
|
||||
"""Home assistant services."""
|
||||
"""Home Assistant services."""
|
||||
|
||||
def change_setting(call):
|
||||
"""Change an Abode system setting."""
|
||||
@@ -179,27 +186,29 @@ def setup_hass_services(hass):
|
||||
"""Capture a new image."""
|
||||
entity_ids = call.data.get(ATTR_ENTITY_ID)
|
||||
|
||||
target_devices = [
|
||||
device
|
||||
for device in hass.data[DOMAIN].devices
|
||||
if device.entity_id in entity_ids
|
||||
target_entities = [
|
||||
entity_id
|
||||
for entity_id in hass.data[DOMAIN].entity_ids
|
||||
if entity_id in entity_ids
|
||||
]
|
||||
|
||||
for device in target_devices:
|
||||
device.capture()
|
||||
for entity_id in target_entities:
|
||||
signal = SIGNAL_CAPTURE_IMAGE.format(entity_id)
|
||||
dispatcher_send(hass, signal)
|
||||
|
||||
def trigger_quick_action(call):
|
||||
"""Trigger a quick action."""
|
||||
entity_ids = call.data.get(ATTR_ENTITY_ID, None)
|
||||
|
||||
target_devices = [
|
||||
device
|
||||
for device in hass.data[DOMAIN].devices
|
||||
if device.entity_id in entity_ids
|
||||
target_entities = [
|
||||
entity_id
|
||||
for entity_id in hass.data[DOMAIN].entity_ids
|
||||
if entity_id in entity_ids
|
||||
]
|
||||
|
||||
for device in target_devices:
|
||||
device.trigger()
|
||||
for entity_id in target_entities:
|
||||
signal = SIGNAL_TRIGGER_QUICK_ACTION.format(entity_id)
|
||||
dispatcher_send(hass, signal)
|
||||
|
||||
hass.services.register(
|
||||
DOMAIN, SERVICE_SETTINGS, change_setting, schema=CHANGE_SETTING_SCHEMA
|
||||
@@ -290,6 +299,7 @@ class AbodeDevice(Entity):
|
||||
self._device.device_id,
|
||||
self._update_callback,
|
||||
)
|
||||
self.hass.data[DOMAIN].entity_ids.add(self.entity_id)
|
||||
|
||||
async def async_will_remove_from_hass(self):
|
||||
"""Unsubscribe from device events."""
|
||||
@@ -352,13 +362,14 @@ class AbodeAutomation(Entity):
|
||||
self._event = event
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe Abode events."""
|
||||
"""Subscribe to a group of Abode timeline events."""
|
||||
if self._event:
|
||||
self.hass.async_add_job(
|
||||
self._data.abode.events.add_event_callback,
|
||||
self._event,
|
||||
self._update_callback,
|
||||
)
|
||||
self.hass.data[DOMAIN].entity_ids.add(self.entity_id)
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
|
@@ -2,6 +2,10 @@
|
||||
import logging
|
||||
|
||||
import homeassistant.components.alarm_control_panel as alarm
|
||||
from homeassistant.components.alarm_control_panel.const import (
|
||||
SUPPORT_ALARM_ARM_AWAY,
|
||||
SUPPORT_ALARM_ARM_HOME,
|
||||
)
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION,
|
||||
STATE_ALARM_ARMED_AWAY,
|
||||
@@ -17,15 +21,9 @@ _LOGGER = logging.getLogger(__name__)
|
||||
ICON = "mdi:security"
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up an alarm control panel for an Abode device."""
|
||||
"""Set up Abode alarm control panel device."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
async_add_entities(
|
||||
[AbodeAlarm(data, await hass.async_add_executor_job(data.abode.get_alarm))]
|
||||
)
|
||||
@@ -52,6 +50,11 @@ class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanel):
|
||||
state = None
|
||||
return state
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return the list of supported features."""
|
||||
return SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY
|
||||
|
||||
def alarm_disarm(self, code=None):
|
||||
"""Send disarm command."""
|
||||
self._device.set_standby()
|
||||
|
@@ -5,20 +5,16 @@ import abodepy.helpers.constants as CONST
|
||||
import abodepy.helpers.timeline as TIMELINE
|
||||
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
|
||||
from . import AbodeAutomation, AbodeDevice
|
||||
from .const import DOMAIN
|
||||
from .const import DOMAIN, SIGNAL_TRIGGER_QUICK_ACTION
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up a sensor for an Abode device."""
|
||||
"""Set up Abode binary sensor devices."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
device_types = [
|
||||
@@ -29,19 +25,19 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
CONST.TYPE_OPENING,
|
||||
]
|
||||
|
||||
devices = []
|
||||
entities = []
|
||||
|
||||
for device in data.abode.get_devices(generic_type=device_types):
|
||||
devices.append(AbodeBinarySensor(data, device))
|
||||
entities.append(AbodeBinarySensor(data, device))
|
||||
|
||||
for automation in data.abode.get_automations(generic_type=CONST.TYPE_QUICK_ACTION):
|
||||
devices.append(
|
||||
entities.append(
|
||||
AbodeQuickActionBinarySensor(
|
||||
data, automation, TIMELINE.AUTOMATION_EDIT_GROUP
|
||||
)
|
||||
)
|
||||
|
||||
async_add_entities(devices)
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeBinarySensor(AbodeDevice, BinarySensorDevice):
|
||||
@@ -61,6 +57,12 @@ class AbodeBinarySensor(AbodeDevice, BinarySensorDevice):
|
||||
class AbodeQuickActionBinarySensor(AbodeAutomation, BinarySensorDevice):
|
||||
"""A binary sensor implementation for Abode quick action automations."""
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe Abode events."""
|
||||
await super().async_added_to_hass()
|
||||
signal = SIGNAL_TRIGGER_QUICK_ACTION.format(self.entity_id)
|
||||
async_dispatcher_connect(self.hass, signal, self.trigger)
|
||||
|
||||
def trigger(self):
|
||||
"""Trigger a quick automation."""
|
||||
self._automation.trigger()
|
||||
|
@@ -7,31 +7,27 @@ import abodepy.helpers.timeline as TIMELINE
|
||||
import requests
|
||||
|
||||
from homeassistant.components.camera import Camera
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
from . import AbodeDevice
|
||||
from .const import DOMAIN
|
||||
from .const import DOMAIN, SIGNAL_CAPTURE_IMAGE
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=90)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up a camera for an Abode device."""
|
||||
|
||||
"""Set up Abode camera devices."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_CAMERA):
|
||||
devices.append(AbodeCamera(data, device, TIMELINE.CAPTURE_IMAGE))
|
||||
entities = []
|
||||
|
||||
async_add_entities(devices)
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_CAMERA):
|
||||
entities.append(AbodeCamera(data, device, TIMELINE.CAPTURE_IMAGE))
|
||||
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeCamera(AbodeDevice, Camera):
|
||||
@@ -54,6 +50,9 @@ class AbodeCamera(AbodeDevice, Camera):
|
||||
self._capture_callback,
|
||||
)
|
||||
|
||||
signal = SIGNAL_CAPTURE_IMAGE.format(self.entity_id)
|
||||
async_dispatcher_connect(self.hass, signal, self.capture)
|
||||
|
||||
def capture(self):
|
||||
"""Request a new image capture."""
|
||||
return self._device.capture()
|
||||
|
@@ -10,7 +10,7 @@ from homeassistant import config_entries
|
||||
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
|
||||
from homeassistant.core import callback
|
||||
|
||||
from .const import DOMAIN, DEFAULT_CACHEDB # pylint: disable=W0611
|
||||
from .const import DEFAULT_CACHEDB, DOMAIN # pylint: disable=unused-import
|
||||
|
||||
CONF_POLLING = "polling"
|
||||
|
||||
|
@@ -3,3 +3,6 @@ DOMAIN = "abode"
|
||||
ATTRIBUTION = "Data provided by goabode.com"
|
||||
|
||||
DEFAULT_CACHEDB = "abodepy_cache.pickle"
|
||||
|
||||
SIGNAL_CAPTURE_IMAGE = "abode_camera_capture_{}"
|
||||
SIGNAL_TRIGGER_QUICK_ACTION = "abode_trigger_quick_action_{}"
|
||||
|
@@ -11,21 +11,16 @@ from .const import DOMAIN
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up Abode cover devices."""
|
||||
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_COVER):
|
||||
devices.append(AbodeCover(data, device))
|
||||
entities = []
|
||||
|
||||
async_add_entities(devices)
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_COVER):
|
||||
entities.append(AbodeCover(data, device))
|
||||
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeCover(AbodeDevice, CoverDevice):
|
||||
|
@@ -24,21 +24,16 @@ from .const import DOMAIN
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up Abode light devices."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
entities = []
|
||||
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_LIGHT):
|
||||
devices.append(AbodeLight(data, device))
|
||||
entities.append(AbodeLight(data, device))
|
||||
|
||||
async_add_entities(devices)
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeLight(AbodeDevice, Light):
|
||||
@@ -55,7 +50,7 @@ class AbodeLight(AbodeDevice, Light):
|
||||
self._device.set_color(kwargs[ATTR_HS_COLOR])
|
||||
|
||||
if ATTR_BRIGHTNESS in kwargs and self._device.is_dimmable:
|
||||
# Convert HASS brightness (0-255) to Abode brightness (0-99)
|
||||
# Convert Home Assistant brightness (0-255) to Abode brightness (0-99)
|
||||
# If 100 is sent to Abode, response is 99 causing an error
|
||||
self._device.set_level(ceil(kwargs[ATTR_BRIGHTNESS] * 99 / 255.0))
|
||||
else:
|
||||
@@ -78,7 +73,7 @@ class AbodeLight(AbodeDevice, Light):
|
||||
# Abode returns 100 during device initialization and device refresh
|
||||
if brightness == 100:
|
||||
return 255
|
||||
# Convert Abode brightness (0-99) to HASS brightness (0-255)
|
||||
# Convert Abode brightness (0-99) to Home Assistant brightness (0-255)
|
||||
return ceil(brightness * 255 / 99.0)
|
||||
|
||||
@property
|
||||
|
@@ -11,21 +11,16 @@ from .const import DOMAIN
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up Abode lock devices."""
|
||||
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_LOCK):
|
||||
devices.append(AbodeLock(data, device))
|
||||
entities = []
|
||||
|
||||
async_add_entities(devices)
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_LOCK):
|
||||
entities.append(AbodeLock(data, device))
|
||||
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeLock(AbodeDevice, LockDevice):
|
||||
|
@@ -3,11 +3,7 @@
|
||||
"name": "Abode",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/abode",
|
||||
"requirements": [
|
||||
"abodepy==0.16.6"
|
||||
],
|
||||
"requirements": ["abodepy==0.17.0"],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@shred86"
|
||||
]
|
||||
}
|
||||
"codeowners": ["@shred86"]
|
||||
}
|
||||
|
@@ -16,28 +16,25 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
# Sensor types: Name, icon
|
||||
SENSOR_TYPES = {
|
||||
"temp": ["Temperature", DEVICE_CLASS_TEMPERATURE],
|
||||
"humidity": ["Humidity", DEVICE_CLASS_HUMIDITY],
|
||||
"lux": ["Lux", DEVICE_CLASS_ILLUMINANCE],
|
||||
CONST.TEMP_STATUS_KEY: ["Temperature", DEVICE_CLASS_TEMPERATURE],
|
||||
CONST.HUMI_STATUS_KEY: ["Humidity", DEVICE_CLASS_HUMIDITY],
|
||||
CONST.LUX_STATUS_KEY: ["Lux", DEVICE_CLASS_ILLUMINANCE],
|
||||
}
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up a sensor for an Abode device."""
|
||||
|
||||
"""Set up Abode sensor devices."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
entities = []
|
||||
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_SENSOR):
|
||||
for sensor_type in SENSOR_TYPES:
|
||||
devices.append(AbodeSensor(data, device, sensor_type))
|
||||
if sensor_type not in device.get_value(CONST.STATUSES_KEY):
|
||||
continue
|
||||
entities.append(AbodeSensor(data, device, sensor_type))
|
||||
|
||||
async_add_entities(devices)
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeSensor(AbodeDevice):
|
||||
@@ -62,22 +59,27 @@ class AbodeSensor(AbodeDevice):
|
||||
"""Return the device class."""
|
||||
return self._device_class
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return a unique ID to use for this device."""
|
||||
return f"{self._device.device_uuid}-{self._sensor_type}"
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the sensor."""
|
||||
if self._sensor_type == "temp":
|
||||
if self._sensor_type == CONST.TEMP_STATUS_KEY:
|
||||
return self._device.temp
|
||||
if self._sensor_type == "humidity":
|
||||
if self._sensor_type == CONST.HUMI_STATUS_KEY:
|
||||
return self._device.humidity
|
||||
if self._sensor_type == "lux":
|
||||
if self._sensor_type == CONST.LUX_STATUS_KEY:
|
||||
return self._device.lux
|
||||
|
||||
@property
|
||||
def unit_of_measurement(self):
|
||||
"""Return the units of measurement."""
|
||||
if self._sensor_type == "temp":
|
||||
if self._sensor_type == CONST.TEMP_STATUS_KEY:
|
||||
return self._device.temp_unit
|
||||
if self._sensor_type == "humidity":
|
||||
if self._sensor_type == CONST.HUMI_STATUS_KEY:
|
||||
return self._device.humidity_unit
|
||||
if self._sensor_type == "lux":
|
||||
if self._sensor_type == CONST.LUX_STATUS_KEY:
|
||||
return self._device.lux_unit
|
||||
|
@@ -11,27 +11,25 @@ from .const import DOMAIN
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Platform uses config entry setup."""
|
||||
pass
|
||||
DEVICE_TYPES = [CONST.TYPE_SWITCH, CONST.TYPE_VALVE]
|
||||
|
||||
|
||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
"""Set up Abode switch devices."""
|
||||
data = hass.data[DOMAIN]
|
||||
|
||||
devices = []
|
||||
entities = []
|
||||
|
||||
for device in data.abode.get_devices(generic_type=CONST.TYPE_SWITCH):
|
||||
devices.append(AbodeSwitch(data, device))
|
||||
for device_type in DEVICE_TYPES:
|
||||
for device in data.abode.get_devices(generic_type=device_type):
|
||||
entities.append(AbodeSwitch(data, device))
|
||||
|
||||
for automation in data.abode.get_automations(generic_type=CONST.TYPE_AUTOMATION):
|
||||
devices.append(
|
||||
entities.append(
|
||||
AbodeAutomationSwitch(data, automation, TIMELINE.AUTOMATION_EDIT_GROUP)
|
||||
)
|
||||
|
||||
async_add_entities(devices)
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeSwitch(AbodeDevice, SwitchDevice):
|
||||
|
@@ -1,10 +1,8 @@
|
||||
{
|
||||
"domain": "acer_projector",
|
||||
"name": "Acer projector",
|
||||
"name": "Acer Projector",
|
||||
"documentation": "https://www.home-assistant.io/integrations/acer_projector",
|
||||
"requirements": [
|
||||
"pyserial==3.1.1"
|
||||
],
|
||||
"requirements": ["pyserial==3.1.1"],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
||||
|
@@ -1,17 +1,17 @@
|
||||
"""Use serial protocol of Acer projector to obtain state of the projector."""
|
||||
import logging
|
||||
import re
|
||||
import serial
|
||||
|
||||
import serial
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.switch import SwitchDevice, PLATFORM_SCHEMA
|
||||
from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice
|
||||
from homeassistant.const import (
|
||||
STATE_ON,
|
||||
STATE_OFF,
|
||||
STATE_UNKNOWN,
|
||||
CONF_NAME,
|
||||
CONF_FILENAME,
|
||||
CONF_NAME,
|
||||
STATE_OFF,
|
||||
STATE_ON,
|
||||
STATE_UNKNOWN,
|
||||
)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
|
@@ -1,18 +1,19 @@
|
||||
"""Support for Actiontec MI424WR (Verizon FIOS) routers."""
|
||||
from collections import namedtuple
|
||||
import logging
|
||||
import re
|
||||
import telnetlib
|
||||
from collections import namedtuple
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
import homeassistant.util.dt as dt_util
|
||||
from homeassistant.components.device_tracker import (
|
||||
DOMAIN,
|
||||
PLATFORM_SCHEMA,
|
||||
DeviceScanner,
|
||||
)
|
||||
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
import homeassistant.util.dt as dt_util
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "\u0422\u0430\u0437\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0438\u0441\u043a\u0432\u0430 AdGuard Home {minimal_version} \u0438\u043b\u0438 \u043f\u043e-\u043d\u043e\u0432\u0430 {minimal_version}, \u0438\u043c\u0430\u0442\u0435 {current_version}. \u041c\u043e\u043b\u044f, \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043a\u0430 \u0437\u0430 Hass.io AdGuard Home.",
|
||||
"adguard_home_outdated": "\u0422\u0430\u0437\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0438\u0441\u043a\u0432\u0430 AdGuard Home {minimal_version} \u0438\u043b\u0438 \u043f\u043e-\u043d\u043e\u0432\u0430 {minimal_version}, \u0438\u043c\u0430\u0442\u0435 {current_version}.",
|
||||
"existing_instance_updated": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430\u0449\u0430\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f.",
|
||||
"single_instance_allowed": "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430 \u0435 \u0441\u0430\u043c\u043e \u0435\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 AdGuard Home."
|
||||
},
|
||||
|
10
homeassistant/components/adguard/.translations/cs.json
Normal file
10
homeassistant/components/adguard/.translations/cs.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"hassio_confirm": {
|
||||
"description": "Chcete nakonfigurovat slu\u017ebu Home Assistant pro p\u0159ipojen\u00ed k AddGuard pomoc\u00ed hass.io {addon}?",
|
||||
"title": "AdGuard prost\u0159ednictv\u00edm dopl\u0148ku Hass.io"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,16 +1,18 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "Denne integration kr\u00e6ver AdGuard Home {minimal_version} eller h\u00f8jere, du har {current_version}. Opdater venligst din Hass.io AdGuard Home-tilf\u00f8jelse.",
|
||||
"adguard_home_outdated": "Denne integration kr\u00e6ver AdGuard Home {minimal_version} eller h\u00f8jere, du har {current_version}.",
|
||||
"existing_instance_updated": "Opdaterede eksisterende konfiguration.",
|
||||
"single_instance_allowed": "Det er kun n\u00f8dvendigt med en ops\u00e6tning af AdGuard Home."
|
||||
"single_instance_allowed": "Kun en enkelt konfiguration af AdGuard Home er tilladt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Forbindelse mislykkedes."
|
||||
},
|
||||
"step": {
|
||||
"hassio_confirm": {
|
||||
"description": "Vil du konfigurere Home Assistant til at oprette forbindelse til AdGuard Home, der leveres af Hass.io add-on: {addon}?",
|
||||
"title": "AdGuard Home via Hass.io add-on"
|
||||
"description": "Vil du konfigurere Home Assistant til at oprette forbindelse til AdGuard Home leveret af Hass.io-tilf\u00f8jelsen: {addon}?",
|
||||
"title": "AdGuard Home via Hass.io-tilf\u00f8jelse"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -21,8 +23,8 @@
|
||||
"username": "Brugernavn",
|
||||
"verify_ssl": "AdGuard Home bruger et korrekt certifikat"
|
||||
},
|
||||
"description": "Konfigurer din AdGuard Home instans for at tillade overv\u00e5gning og kontrol.",
|
||||
"title": "Link AdGuard Home."
|
||||
"description": "Konfigurer din AdGuard Home-instans for at tillade overv\u00e5gning og kontrol.",
|
||||
"title": "Forbind din AdGuard Home."
|
||||
}
|
||||
},
|
||||
"title": "AdGuard Home"
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "Diese Integration erfordert AdGuard Home {minimal_version} oder h\u00f6her, du hast {current_version}. Bitte aktualisiere dein Hass.io AdGuard Home Add-on.",
|
||||
"adguard_home_outdated": "Diese Integration erfordert AdGuard Home {minimal_version} oder h\u00f6her, du hast {current_version}.",
|
||||
"existing_instance_updated": "Bestehende Konfiguration wurde aktualisiert.",
|
||||
"single_instance_allowed": "Es ist nur eine einzige Konfiguration von AdGuard Home zul\u00e4ssig."
|
||||
},
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "Esta integraci\u00f3n requiere AdGuard Home {minimal_version} o superior, tiene {current_version}. Actualice su complemento Hass.io AdGuard Home.",
|
||||
"adguard_home_outdated": "Esta integraci\u00f3n requiere AdGuard Home {minimal_version} o superior, tiene {current_version}.",
|
||||
"existing_instance_updated": "Se actualiz\u00f3 la configuraci\u00f3n existente.",
|
||||
"single_instance_allowed": "Solo se permite una \u00fanica configuraci\u00f3n de AdGuard Home."
|
||||
},
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "Questa integrazione richiede AdGuard Home {minimal_version} o versione successiva, si dispone di {current_version}. Aggiorna il componente aggiuntivo AdGuard Home di Hass.io.",
|
||||
"adguard_home_outdated": "Questa integrazione richiede AdGuard Home {minimal_version} o versione successiva, si dispone di {current_version}.",
|
||||
"existing_instance_updated": "Configurazione esistente aggiornata.",
|
||||
"single_instance_allowed": "\u00c8 consentita solo una singola configurazione di AdGuard Home."
|
||||
},
|
||||
@@ -9,7 +11,7 @@
|
||||
},
|
||||
"step": {
|
||||
"hassio_confirm": {
|
||||
"description": "Vuoi configurare Home Assistant per connettersi alla AdGuard Home fornita dal componente aggiuntivo di Hass.io: {addon} ?",
|
||||
"description": "Vuoi configurare Home Assistant per connettersi alla AdGuard Home fornita dal componente aggiuntivo di Hass.io: {addon}?",
|
||||
"title": "AdGuard Home tramite il componente aggiuntivo di Hass.io"
|
||||
},
|
||||
"user": {
|
||||
|
@@ -11,7 +11,7 @@
|
||||
},
|
||||
"step": {
|
||||
"hassio_confirm": {
|
||||
"description": "Hass.io {addon} \uc560\ub4dc\uc628\uc73c\ub85c AdGuard Home \uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant \ub97c \uad6c\uc131 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
|
||||
"description": "Hass.io {addon} \uc560\ub4dc\uc628\uc73c\ub85c AdGuard Home \uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant \ub97c \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
|
||||
"title": "Hass.io \uc560\ub4dc\uc628\uc758 AdGuard Home"
|
||||
},
|
||||
"user": {
|
||||
|
@@ -4,7 +4,9 @@
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "Servidor",
|
||||
"port": "Porta"
|
||||
"password": "Palavra-passe",
|
||||
"port": "Porta",
|
||||
"username": "Nome de Utilizador"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"adguard_home_addon_outdated": "Den h\u00e4r integrationen kr\u00e4ver AdGuard Home {minimal_version} eller senare, du har {current_version}. Uppdatera ditt Hass.io AdGuard Home-till\u00e4gg.",
|
||||
"adguard_home_outdated": "Den h\u00e4r integrationen kr\u00e4ver AdGuard Home {minimal_version} eller senare, du har {current_version}.",
|
||||
"existing_instance_updated": "Uppdaterade existerande konfiguration.",
|
||||
"single_instance_allowed": "Endast en enda konfiguration av AdGuard Home \u00e4r till\u00e5ten."
|
||||
},
|
||||
|
@@ -61,7 +61,6 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool
|
||||
password=entry.data[CONF_PASSWORD],
|
||||
tls=entry.data[CONF_SSL],
|
||||
verify_ssl=entry.data[CONF_VERIFY_SSL],
|
||||
loop=hass.loop,
|
||||
session=session,
|
||||
)
|
||||
|
||||
@@ -143,11 +142,14 @@ async def async_unload_entry(hass: HomeAssistantType, entry: ConfigType) -> bool
|
||||
class AdGuardHomeEntity(Entity):
|
||||
"""Defines a base AdGuard Home entity."""
|
||||
|
||||
def __init__(self, adguard, name: str, icon: str) -> None:
|
||||
def __init__(
|
||||
self, adguard, name: str, icon: str, enabled_default: bool = True
|
||||
) -> None:
|
||||
"""Initialize the AdGuard Home entity."""
|
||||
self._name = name
|
||||
self._icon = icon
|
||||
self._available = True
|
||||
self._enabled_default = enabled_default
|
||||
self._icon = icon
|
||||
self._name = name
|
||||
self.adguard = adguard
|
||||
|
||||
@property
|
||||
@@ -160,6 +162,11 @@ class AdGuardHomeEntity(Entity):
|
||||
"""Return the mdi icon of the entity."""
|
||||
return self._icon
|
||||
|
||||
@property
|
||||
def entity_registry_enabled_default(self) -> bool:
|
||||
"""Return if the entity should be enabled when first added to the entity registry."""
|
||||
return self._enabled_default
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
"""Return True if entity is available."""
|
||||
@@ -167,6 +174,9 @@ class AdGuardHomeEntity(Entity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update AdGuard Home entity."""
|
||||
if not self.enabled:
|
||||
return
|
||||
|
||||
try:
|
||||
await self._adguard_update()
|
||||
self._available = True
|
||||
|
@@ -79,7 +79,6 @@ class AdGuardHomeFlowHandler(ConfigFlow):
|
||||
password=user_input.get(CONF_PASSWORD),
|
||||
tls=user_input[CONF_SSL],
|
||||
verify_ssl=user_input[CONF_VERIFY_SSL],
|
||||
loop=self.hass.loop,
|
||||
session=session,
|
||||
)
|
||||
|
||||
@@ -161,7 +160,6 @@ class AdGuardHomeFlowHandler(ConfigFlow):
|
||||
self._hassio_discovery[CONF_HOST],
|
||||
port=self._hassio_discovery[CONF_PORT],
|
||||
tls=False,
|
||||
loop=self.hass.loop,
|
||||
session=session,
|
||||
)
|
||||
|
||||
|
@@ -1,13 +1,9 @@
|
||||
{
|
||||
"domain": "adguard",
|
||||
"name": "AdGuard Home",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/adguard",
|
||||
"requirements": [
|
||||
"adguardhome==0.3.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@frenck"
|
||||
]
|
||||
}
|
||||
"domain": "adguard",
|
||||
"name": "AdGuard Home",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/adguard",
|
||||
"requirements": ["adguardhome==0.4.1"],
|
||||
"dependencies": [],
|
||||
"codeowners": ["@frenck"]
|
||||
}
|
||||
|
@@ -51,14 +51,20 @@ class AdGuardHomeSensor(AdGuardHomeDeviceEntity):
|
||||
"""Defines a AdGuard Home sensor."""
|
||||
|
||||
def __init__(
|
||||
self, adguard, name: str, icon: str, measurement: str, unit_of_measurement: str
|
||||
self,
|
||||
adguard,
|
||||
name: str,
|
||||
icon: str,
|
||||
measurement: str,
|
||||
unit_of_measurement: str,
|
||||
enabled_default: bool = True,
|
||||
) -> None:
|
||||
"""Initialize AdGuard Home sensor."""
|
||||
self._state = None
|
||||
self._unit_of_measurement = unit_of_measurement
|
||||
self.measurement = measurement
|
||||
|
||||
super().__init__(adguard, name, icon)
|
||||
super().__init__(adguard, name, icon, enabled_default)
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
@@ -109,6 +115,7 @@ class AdGuardHomeBlockedFilteringSensor(AdGuardHomeSensor):
|
||||
"mdi:magnify-close",
|
||||
"blocked_filtering",
|
||||
"queries",
|
||||
enabled_default=False,
|
||||
)
|
||||
|
||||
async def _adguard_update(self) -> None:
|
||||
@@ -178,7 +185,7 @@ class AdGuardHomeReplacedSafeSearchSensor(AdGuardHomeSensor):
|
||||
"""Initialize AdGuard Home sensor."""
|
||||
super().__init__(
|
||||
adguard,
|
||||
"Searches Safe Search Enforced",
|
||||
"AdGuard Safe Searches Enforced",
|
||||
"mdi:shield-search",
|
||||
"enforced_safesearch",
|
||||
"requests",
|
||||
@@ -214,7 +221,12 @@ class AdGuardHomeRulesCountSensor(AdGuardHomeSensor):
|
||||
def __init__(self, adguard):
|
||||
"""Initialize AdGuard Home sensor."""
|
||||
super().__init__(
|
||||
adguard, "AdGuard Rules Count", "mdi:counter", "rules_count", "rules"
|
||||
adguard,
|
||||
"AdGuard Rules Count",
|
||||
"mdi:counter",
|
||||
"rules_count",
|
||||
"rules",
|
||||
enabled_default=False,
|
||||
)
|
||||
|
||||
async def _adguard_update(self) -> None:
|
||||
|
@@ -10,9 +10,9 @@ from homeassistant.components.adguard.const import (
|
||||
DATA_ADGUARD_VERION,
|
||||
DOMAIN,
|
||||
)
|
||||
from homeassistant.components.switch import SwitchDevice
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.exceptions import PlatformNotReady
|
||||
from homeassistant.helpers.entity import ToggleEntity
|
||||
from homeassistant.helpers.typing import HomeAssistantType
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -45,14 +45,16 @@ async def async_setup_entry(
|
||||
async_add_entities(switches, True)
|
||||
|
||||
|
||||
class AdGuardHomeSwitch(ToggleEntity, AdGuardHomeDeviceEntity):
|
||||
class AdGuardHomeSwitch(AdGuardHomeDeviceEntity, SwitchDevice):
|
||||
"""Defines a AdGuard Home switch."""
|
||||
|
||||
def __init__(self, adguard, name: str, icon: str, key: str):
|
||||
def __init__(
|
||||
self, adguard, name: str, icon: str, key: str, enabled_default: bool = True
|
||||
):
|
||||
"""Initialize AdGuard Home switch."""
|
||||
self._state = False
|
||||
self._key = key
|
||||
super().__init__(adguard, name, icon)
|
||||
super().__init__(adguard, name, icon, enabled_default)
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
@@ -204,7 +206,13 @@ class AdGuardHomeQueryLogSwitch(AdGuardHomeSwitch):
|
||||
|
||||
def __init__(self, adguard) -> None:
|
||||
"""Initialize AdGuard Home switch."""
|
||||
super().__init__(adguard, "AdGuard Query Log", "mdi:shield-check", "querylog")
|
||||
super().__init__(
|
||||
adguard,
|
||||
"AdGuard Query Log",
|
||||
"mdi:shield-check",
|
||||
"querylog",
|
||||
enabled_default=False,
|
||||
)
|
||||
|
||||
async def _adguard_turn_off(self) -> None:
|
||||
"""Turn off the switch."""
|
||||
|
@@ -1,14 +1,13 @@
|
||||
"""Support for Automation Device Specification (ADS)."""
|
||||
import threading
|
||||
import struct
|
||||
import logging
|
||||
import ctypes
|
||||
from collections import namedtuple
|
||||
import asyncio
|
||||
from collections import namedtuple
|
||||
import ctypes
|
||||
import logging
|
||||
import struct
|
||||
import threading
|
||||
|
||||
import async_timeout
|
||||
|
||||
import pyads
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import (
|
||||
|
@@ -11,7 +11,7 @@ from homeassistant.components.binary_sensor import (
|
||||
from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import CONF_ADS_VAR, DATA_ADS, AdsEntity, STATE_KEY_STATE
|
||||
from . import CONF_ADS_VAR, DATA_ADS, STATE_KEY_STATE, AdsEntity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -4,25 +4,25 @@ import logging
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.cover import (
|
||||
PLATFORM_SCHEMA,
|
||||
SUPPORT_OPEN,
|
||||
SUPPORT_CLOSE,
|
||||
SUPPORT_STOP,
|
||||
SUPPORT_SET_POSITION,
|
||||
ATTR_POSITION,
|
||||
DEVICE_CLASSES_SCHEMA,
|
||||
PLATFORM_SCHEMA,
|
||||
SUPPORT_CLOSE,
|
||||
SUPPORT_OPEN,
|
||||
SUPPORT_SET_POSITION,
|
||||
SUPPORT_STOP,
|
||||
CoverDevice,
|
||||
)
|
||||
from homeassistant.const import CONF_NAME, CONF_DEVICE_CLASS
|
||||
from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import (
|
||||
CONF_ADS_VAR,
|
||||
CONF_ADS_VAR_POSITION,
|
||||
DATA_ADS,
|
||||
AdsEntity,
|
||||
STATE_KEY_STATE,
|
||||
STATE_KEY_POSITION,
|
||||
STATE_KEY_STATE,
|
||||
AdsEntity,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
@@ -16,9 +16,9 @@ from . import (
|
||||
CONF_ADS_VAR,
|
||||
CONF_ADS_VAR_BRIGHTNESS,
|
||||
DATA_ADS,
|
||||
AdsEntity,
|
||||
STATE_KEY_BRIGHTNESS,
|
||||
STATE_KEY_STATE,
|
||||
AdsEntity,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
@@ -1,10 +1,8 @@
|
||||
{
|
||||
"domain": "ads",
|
||||
"name": "Ads",
|
||||
"name": "ADS",
|
||||
"documentation": "https://www.home-assistant.io/integrations/ads",
|
||||
"requirements": [
|
||||
"pyads==3.0.7"
|
||||
],
|
||||
"requirements": ["pyads==3.0.7"],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import CONF_ADS_FACTOR, CONF_ADS_TYPE, CONF_ADS_VAR, AdsEntity, STATE_KEY_STATE
|
||||
from . import CONF_ADS_FACTOR, CONF_ADS_TYPE, CONF_ADS_VAR, STATE_KEY_STATE, AdsEntity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -3,11 +3,11 @@ import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.switch import SwitchDevice, PLATFORM_SCHEMA
|
||||
from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice
|
||||
from homeassistant.const import CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import CONF_ADS_VAR, DATA_ADS, AdsEntity, STATE_KEY_STATE
|
||||
from . import CONF_ADS_VAR, DATA_ADS, STATE_KEY_STATE, AdsEntity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -1,10 +1,8 @@
|
||||
{
|
||||
"domain": "aftership",
|
||||
"name": "Aftership",
|
||||
"name": "AfterShip",
|
||||
"documentation": "https://www.home-assistant.io/integrations/aftership",
|
||||
"requirements": [
|
||||
"pyaftership==0.1.2"
|
||||
],
|
||||
"requirements": ["pyaftership==0.1.2"],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
from pyaftership.tracker import Tracking
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
@@ -11,6 +12,7 @@ import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
from .const import DOMAIN
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -56,8 +58,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||
|
||||
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||
"""Set up the AfterShip sensor platform."""
|
||||
from pyaftership.tracker import Tracking
|
||||
|
||||
apikey = config[CONF_API_KEY]
|
||||
name = config[CONF_NAME]
|
||||
|
||||
@@ -77,7 +77,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
||||
async_add_entities([instance], True)
|
||||
|
||||
async def handle_add_tracking(call):
|
||||
"""Call when a user adds a new Aftership tracking from HASS."""
|
||||
"""Call when a user adds a new Aftership tracking from Home Assistant."""
|
||||
title = call.data.get(CONF_TITLE)
|
||||
slug = call.data.get(CONF_SLUG)
|
||||
tracking_number = call.data[CONF_TRACKING_NUMBER]
|
||||
@@ -93,7 +93,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
||||
)
|
||||
|
||||
async def handle_remove_tracking(call):
|
||||
"""Call when a user removes an Aftership tracking from HASS."""
|
||||
"""Call when a user removes an Aftership tracking from Home Assistant."""
|
||||
slug = call.data[CONF_SLUG]
|
||||
tracking_number = call.data[CONF_TRACKING_NUMBER]
|
||||
|
||||
|
@@ -2,12 +2,12 @@
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
from homeassistant.helpers.config_validation import ( # noqa
|
||||
from homeassistant.helpers.config_validation import ( # noqa: F401
|
||||
PLATFORM_SCHEMA,
|
||||
PLATFORM_SCHEMA_BASE,
|
||||
)
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"domain": "air_quality",
|
||||
"name": "Air quality",
|
||||
"name": "Air Quality",
|
||||
"documentation": "https://www.home-assistant.io/integrations/air_quality",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
|
22
homeassistant/components/airly/.translations/bg.json
Normal file
22
homeassistant/components/airly/.translations/bg.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"auth": "API \u043a\u043b\u044e\u0447\u044a\u0442 \u043d\u0435 \u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0435\u043d.",
|
||||
"name_exists": "\u0418\u043c\u0435\u0442\u043e \u0432\u0435\u0447\u0435 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430.",
|
||||
"wrong_location": "\u0412 \u0442\u0430\u0437\u0438 \u043e\u0431\u043b\u0430\u0441\u0442 \u043d\u044f\u043c\u0430 \u0438\u0437\u043c\u0435\u0440\u0432\u0430\u0442\u0435\u043b\u043d\u0438 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043d\u0430 Airly."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "API \u043a\u043b\u044e\u0447 \u0437\u0430 Airly",
|
||||
"latitude": "\u0428\u0438\u0440\u0438\u043d\u0430",
|
||||
"longitude": "\u0414\u044a\u043b\u0436\u0438\u043d\u0430",
|
||||
"name": "\u0418\u043c\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u0442\u0430"
|
||||
},
|
||||
"description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u0442\u043e \u043d\u0430 \u0432\u044a\u0437\u0434\u0443\u0445\u0430 Airly \u0417\u0430 \u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0430\u0442\u0435 \u043a\u043b\u044e\u0447 \u0437\u0430 API, \u043e\u0442\u0438\u0434\u0435\u0442\u0435 \u043d\u0430 https://developer.airly.eu/register",
|
||||
"title": "Airly"
|
||||
}
|
||||
},
|
||||
"title": "Airly"
|
||||
}
|
||||
}
|
@@ -1,5 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "Ja est\u00e0 configurada un integraci\u00f3 Airly amb aquestes coordenades."
|
||||
},
|
||||
"error": {
|
||||
"auth": "La clau API no \u00e9s correcta.",
|
||||
"name_exists": "El nom ja existeix.",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user