mirror of
https://github.com/home-assistant/core.git
synced 2025-09-23 03:49:31 +00:00
Compare commits
2702 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dc8bfb76dc | ||
![]() |
96d0ee3153 | ||
![]() |
20c66b1fa3 | ||
![]() |
3c260c91c8 | ||
![]() |
cce95312a9 | ||
![]() |
a7be7bcd0a | ||
![]() |
a8e86a62a4 | ||
![]() |
4c052643ca | ||
![]() |
b7a071b23f | ||
![]() |
f0a8e8ea04 | ||
![]() |
caf306799b | ||
![]() |
d9a2cc93ba | ||
![]() |
dbdd4f0e39 | ||
![]() |
edc44230b4 | ||
![]() |
4d7a468c0e | ||
![]() |
a06595c08d | ||
![]() |
ff13b4c6b3 | ||
![]() |
8a755e790f | ||
![]() |
6a6dfdff4d | ||
![]() |
b9c233f013 | ||
![]() |
7418011d6d | ||
![]() |
3a6a439c02 | ||
![]() |
34c4dc2e80 | ||
![]() |
56853787e7 | ||
![]() |
976cbdd2aa | ||
![]() |
748f1c3607 | ||
![]() |
7fdb76cdf2 | ||
![]() |
1508d7a3ac | ||
![]() |
0698ae4850 | ||
![]() |
654159d34d | ||
![]() |
9c90aaf830 | ||
![]() |
5cbf77221a | ||
![]() |
508afd3b90 | ||
![]() |
7c63cfbbc7 | ||
![]() |
f90f4629ab | ||
![]() |
1e4c94b69c | ||
![]() |
67868220eb | ||
![]() |
e0367dc721 | ||
![]() |
35dc5ba742 | ||
![]() |
f7325a7d35 | ||
![]() |
a798b508bc | ||
![]() |
255d706c24 | ||
![]() |
cc8e0ef942 | ||
![]() |
d9a3b04e30 | ||
![]() |
4a65bed0eb | ||
![]() |
02adcc532f | ||
![]() |
fbd5ccf156 | ||
![]() |
8d69a4968f | ||
![]() |
e3b90ea3f7 | ||
![]() |
6c7355785a | ||
![]() |
a1ac1fb091 | ||
![]() |
8ca5a04a5d | ||
![]() |
04f75d6557 | ||
![]() |
26f09bae28 | ||
![]() |
2af961513d | ||
![]() |
fd1edf1bb6 | ||
![]() |
152a80abed | ||
![]() |
c289f9f099 | ||
![]() |
ed89d4869d | ||
![]() |
5b4187a9eb | ||
![]() |
5b79c1f9ef | ||
![]() |
b61b0321d6 | ||
![]() |
bb17cbdd83 | ||
![]() |
91e0395c1c | ||
![]() |
a71e0a4b29 | ||
![]() |
4e77969f5e | ||
![]() |
cf6480cda0 | ||
![]() |
1b3e5460a9 | ||
![]() |
a004e6aa68 | ||
![]() |
6610bbe7bb | ||
![]() |
2c7876fa66 | ||
![]() |
835f433cf7 | ||
![]() |
9d16edc1dc | ||
![]() |
e6d814da1d | ||
![]() |
7c5e852303 | ||
![]() |
149a3165e6 | ||
![]() |
82058f0b50 | ||
![]() |
63baf6fb0f | ||
![]() |
ad6315be5c | ||
![]() |
b4489e132c | ||
![]() |
2538cda9d4 | ||
![]() |
49a153a2e5 | ||
![]() |
d68148417f | ||
![]() |
8b21b415c4 | ||
![]() |
c28493098a | ||
![]() |
747490ab34 | ||
![]() |
ee816ed3dd | ||
![]() |
16f1ef5a44 | ||
![]() |
a2e705880d | ||
![]() |
e39997ca10 | ||
![]() |
620271c782 | ||
![]() |
d974cd4606 | ||
![]() |
247df5874b | ||
![]() |
e1060f154e | ||
![]() |
3f9e3d0905 | ||
![]() |
becc011135 | ||
![]() |
6660cf701d | ||
![]() |
280f49540e | ||
![]() |
a2e2c35011 | ||
![]() |
3a83f4bdbe | ||
![]() |
02d94f2fd0 | ||
![]() |
53a91ece4e | ||
![]() |
5446641f09 | ||
![]() |
e19c97af7c | ||
![]() |
7e696f19d3 | ||
![]() |
6906a19c01 | ||
![]() |
93f9f1b320 | ||
![]() |
3f427602ba | ||
![]() |
e25f216fd6 | ||
![]() |
b47be05efc | ||
![]() |
9d40ae96b5 | ||
![]() |
f131959f4b | ||
![]() |
0054904454 | ||
![]() |
5c8d8a290f | ||
![]() |
dcb3a57476 | ||
![]() |
78225c9ddd | ||
![]() |
215215747e | ||
![]() |
5cd85f9f00 | ||
![]() |
4674cb406e | ||
![]() |
82b77a8108 | ||
![]() |
1f9721bad3 | ||
![]() |
6aba87f3a6 | ||
![]() |
edad387b12 | ||
![]() |
f4b8a95205 | ||
![]() |
29adc6a27b | ||
![]() |
fed6625324 | ||
![]() |
1de97e3a35 | ||
![]() |
a6536bb622 | ||
![]() |
59e43ab6e4 | ||
![]() |
29f128eaad | ||
![]() |
d88efe405e | ||
![]() |
f866ff5f2b | ||
![]() |
efa0e1b2ac | ||
![]() |
4a432781ca | ||
![]() |
6c2dc521a3 | ||
![]() |
b112a742b2 | ||
![]() |
46cb9cff41 | ||
![]() |
9f65dcf4ba | ||
![]() |
13c0a59e28 | ||
![]() |
7d69b90eac | ||
![]() |
60dd94d5b0 | ||
![]() |
2196bd66c7 | ||
![]() |
8895f9b70a | ||
![]() |
a074cf4afd | ||
![]() |
2fd6431cff | ||
![]() |
5642027ffb | ||
![]() |
93272e3083 | ||
![]() |
2b5e7c2611 | ||
![]() |
683d960fa5 | ||
![]() |
d445c16697 | ||
![]() |
e4df0481da | ||
![]() |
3d1a5f76b2 | ||
![]() |
263bdaa565 | ||
![]() |
212660330f | ||
![]() |
f83d4e524b | ||
![]() |
6bffd9a892 | ||
![]() |
02e03340df | ||
![]() |
e92e26b73a | ||
![]() |
f69fc79fd1 | ||
![]() |
e7d982ee11 | ||
![]() |
94132e5572 | ||
![]() |
7920c5e5e8 | ||
![]() |
df59f87f34 | ||
![]() |
c0a2e6b655 | ||
![]() |
b4b2302e04 | ||
![]() |
098d82f4d3 | ||
![]() |
2883aacfa3 | ||
![]() |
ec440dface | ||
![]() |
3d385796da | ||
![]() |
3e14b2dc61 | ||
![]() |
7547a92479 | ||
![]() |
625c2aa19d | ||
![]() |
ec69edcb79 | ||
![]() |
f823afeadc | ||
![]() |
903db07feb | ||
![]() |
43cee39528 | ||
![]() |
d5cc3208af | ||
![]() |
94c8d74a66 | ||
![]() |
b3c851502d | ||
![]() |
a74e35795c | ||
![]() |
b464096edb | ||
![]() |
5228282f69 | ||
![]() |
fd67a079db | ||
![]() |
3ae4eba457 | ||
![]() |
dba326f16b | ||
![]() |
2b06fbbcf0 | ||
![]() |
d278dd9477 | ||
![]() |
fe03c9da68 | ||
![]() |
a6a6a7b69c | ||
![]() |
29df13abe9 | ||
![]() |
6db5ff98ed | ||
![]() |
25607c7129 | ||
![]() |
58f1d1754e | ||
![]() |
6273ad85f8 | ||
![]() |
a68af0a3a9 | ||
![]() |
f8de0594b9 | ||
![]() |
8541ae0360 | ||
![]() |
dfc345a921 | ||
![]() |
87f236c05c | ||
![]() |
0127974f09 | ||
![]() |
108082fd07 | ||
![]() |
61d6bd0cb5 | ||
![]() |
3a2138131c | ||
![]() |
ec65ebacd3 | ||
![]() |
b45e49902c | ||
![]() |
12781bf842 | ||
![]() |
d0ca8e62a4 | ||
![]() |
c37cd835b9 | ||
![]() |
3ee3ae7633 | ||
![]() |
02f174e2e6 | ||
![]() |
16cf16e418 | ||
![]() |
de12c21ce7 | ||
![]() |
b8c9f67533 | ||
![]() |
ba73ac12ba | ||
![]() |
0a219081ea | ||
![]() |
b0163b65c6 | ||
![]() |
83e3f680bf | ||
![]() |
e443dc1274 | ||
![]() |
717a21dc7b | ||
![]() |
1b6f0b78aa | ||
![]() |
e8d4a25635 | ||
![]() |
162e502962 | ||
![]() |
3cc94f7d6a | ||
![]() |
dfac9c5e03 | ||
![]() |
c96458c7e4 | ||
![]() |
9a867cbb75 | ||
![]() |
b15caf31a9 | ||
![]() |
0331ebdd47 | ||
![]() |
0b7d2aa4d7 | ||
![]() |
821de0e369 | ||
![]() |
02bcdf5162 | ||
![]() |
e7e2f4e786 | ||
![]() |
e969d364e6 | ||
![]() |
4862f6d516 | ||
![]() |
36ed3b1177 | ||
![]() |
9cc20fc6b8 | ||
![]() |
dd239661e7 | ||
![]() |
0bbb56dd05 | ||
![]() |
0bfcb99c04 | ||
![]() |
bdd255176c | ||
![]() |
e5f08ee657 | ||
![]() |
12c649ba27 | ||
![]() |
5eb7f5fcf3 | ||
![]() |
48b6f41048 | ||
![]() |
16d045aa9f | ||
![]() |
66ad69bff3 | ||
![]() |
599288dae2 | ||
![]() |
2594f11b34 | ||
![]() |
ad7edb4abe | ||
![]() |
9e73853d65 | ||
![]() |
504cb26329 | ||
![]() |
20428e670b | ||
![]() |
78af0a4705 | ||
![]() |
65e9e4a2f3 | ||
![]() |
922b332766 | ||
![]() |
1ffa8fcbba | ||
![]() |
785786ecd1 | ||
![]() |
b78ad7c2b8 | ||
![]() |
4412ce3b86 | ||
![]() |
238430136e | ||
![]() |
15113ae854 | ||
![]() |
7ce6ae9421 | ||
![]() |
f9bc0c9dab | ||
![]() |
bf95658e24 | ||
![]() |
3c57475c8f | ||
![]() |
e8b16f0dfd | ||
![]() |
c1cf3679aa | ||
![]() |
871afd2bf2 | ||
![]() |
5595ef0783 | ||
![]() |
5a3e0c6b25 | ||
![]() |
a8e9ccbf1a | ||
![]() |
44708ed8bb | ||
![]() |
8e44d797a3 | ||
![]() |
419a92db43 | ||
![]() |
986853d497 | ||
![]() |
d4d233536f | ||
![]() |
21acdbbbfd | ||
![]() |
394966e979 | ||
![]() |
aac7cf129d | ||
![]() |
0146f35687 | ||
![]() |
e2c9af42e8 | ||
![]() |
c9c8e8160f | ||
![]() |
c5972690ac | ||
![]() |
c2a261370e | ||
![]() |
4c139076ef | ||
![]() |
4bccb6e72b | ||
![]() |
f05288b597 | ||
![]() |
2d5faaf3f8 | ||
![]() |
dd6d18102f | ||
![]() |
14d715e7fc | ||
![]() |
b820b7c47d | ||
![]() |
afe4647896 | ||
![]() |
4df186787a | ||
![]() |
b353f45d84 | ||
![]() |
fc2c195ed4 | ||
![]() |
f1d5f95f7c | ||
![]() |
59f935beb0 | ||
![]() |
ddb85cee7b | ||
![]() |
14bff5a375 | ||
![]() |
9311b02369 | ||
![]() |
82090f5060 | ||
![]() |
186a299215 | ||
![]() |
00068e88b0 | ||
![]() |
2c1a76cf92 | ||
![]() |
c65e72886c | ||
![]() |
e13f206a06 | ||
![]() |
818b45384d | ||
![]() |
8d405c4585 | ||
![]() |
2ac4d30736 | ||
![]() |
fa17e6d5ab | ||
![]() |
1bbd05dee7 | ||
![]() |
d6f7a984b2 | ||
![]() |
01756011ff | ||
![]() |
d7ad974244 | ||
![]() |
212b9df87d | ||
![]() |
44552937b6 | ||
![]() |
8f3c84b349 | ||
![]() |
29b8f76e57 | ||
![]() |
29838ce1ed | ||
![]() |
5cf753422b | ||
![]() |
ded5329f03 | ||
![]() |
e3fc59ff3d | ||
![]() |
6166a7191b | ||
![]() |
a69938afa2 | ||
![]() |
94c3d9bac0 | ||
![]() |
fb7af0384f | ||
![]() |
5a9a95abe4 | ||
![]() |
e1ad108b6d | ||
![]() |
a76620b76f | ||
![]() |
1169ac568b | ||
![]() |
1ab1503641 | ||
![]() |
13fd80affa | ||
![]() |
d576749530 | ||
![]() |
2abd3844cf | ||
![]() |
854bdfb6f2 | ||
![]() |
5f8dcd45c1 | ||
![]() |
38bb8ef4d2 | ||
![]() |
7cc3102209 | ||
![]() |
525e220395 | ||
![]() |
140fd5adaf | ||
![]() |
5b2bf8fd17 | ||
![]() |
5e2de4531f | ||
![]() |
111a00aeeb | ||
![]() |
b3d5717df8 | ||
![]() |
a84378bb79 | ||
![]() |
53ba45cc8f | ||
![]() |
5d77eb1839 | ||
![]() |
c33edbe5bb | ||
![]() |
85ba29012f | ||
![]() |
517159dc4e | ||
![]() |
a9287b7117 | ||
![]() |
5975ec340b | ||
![]() |
3adfb86a19 | ||
![]() |
0b7bcc87df | ||
![]() |
482661f82c | ||
![]() |
b3cbce3566 | ||
![]() |
7a2820ded9 | ||
![]() |
af4fb03230 | ||
![]() |
a5da21a426 | ||
![]() |
16e36dca97 | ||
![]() |
f522c6c8c7 | ||
![]() |
1bdbe90d2a | ||
![]() |
8ed1b1782e | ||
![]() |
31dd06bd12 | ||
![]() |
de7bbd3e24 | ||
![]() |
fbbc681ad4 | ||
![]() |
9e7f516d07 | ||
![]() |
066784c88f | ||
![]() |
865d65c380 | ||
![]() |
609d202c4d | ||
![]() |
e43a0087e4 | ||
![]() |
b9bc147339 | ||
![]() |
dd3b0df22d | ||
![]() |
c987ca735e | ||
![]() |
81355a0e23 | ||
![]() |
215c7e0e14 | ||
![]() |
233284056a | ||
![]() |
56c69d9a25 | ||
![]() |
35cd6b9abf | ||
![]() |
823f27db5a | ||
![]() |
ad5101c5c0 | ||
![]() |
3bf389639b | ||
![]() |
31973de2d5 | ||
![]() |
524b48be7d | ||
![]() |
0c5ca3084e | ||
![]() |
49747684a0 | ||
![]() |
3495932eb0 | ||
![]() |
d73a4e1ed5 | ||
![]() |
14f5cab71d | ||
![]() |
29ab1935cb | ||
![]() |
bdc098645b | ||
![]() |
492874c4a0 | ||
![]() |
4b1761ccb5 | ||
![]() |
76b5017df1 | ||
![]() |
401b0dce68 | ||
![]() |
7520aa5b25 | ||
![]() |
85ee0a1a3a | ||
![]() |
a1b2dcc5a8 | ||
![]() |
d1c083eed9 | ||
![]() |
33ec314091 | ||
![]() |
1646113b69 | ||
![]() |
1831b3bfb7 | ||
![]() |
e053f75a08 | ||
![]() |
ca511cb06c | ||
![]() |
5e65d8d3c3 | ||
![]() |
1c329ff708 | ||
![]() |
cdf4588fb0 | ||
![]() |
2cf987bfc2 | ||
![]() |
e807274d7e | ||
![]() |
3cdcd5d223 | ||
![]() |
882359d784 | ||
![]() |
4950cbee1c | ||
![]() |
0a779ac64c | ||
![]() |
0bf64e9a2c | ||
![]() |
3076fc5f25 | ||
![]() |
b51d81edba | ||
![]() |
6faf9e8bbe | ||
![]() |
c0307dca3a | ||
![]() |
5b94807923 | ||
![]() |
4170eb0f83 | ||
![]() |
874c8fea03 | ||
![]() |
a4204b440c | ||
![]() |
f8e48a9230 | ||
![]() |
04231bcb54 | ||
![]() |
f170c80bea | ||
![]() |
0840092b29 | ||
![]() |
36207e56b9 | ||
![]() |
1b5a601417 | ||
![]() |
c7da4d77ce | ||
![]() |
84bd2067e4 | ||
![]() |
4cd04e3f99 | ||
![]() |
3aa4bb5469 | ||
![]() |
2c49311ee4 | ||
![]() |
394f16987d | ||
![]() |
f06c0a8b54 | ||
![]() |
36b157b85a | ||
![]() |
7a3c2e1f6c | ||
![]() |
fae80621fb | ||
![]() |
1edbdcb67b | ||
![]() |
99318b7b11 | ||
![]() |
a6107198b9 | ||
![]() |
203217c175 | ||
![]() |
c316735996 | ||
![]() |
40829d9d76 | ||
![]() |
68b077ffaa | ||
![]() |
8528b4db3a | ||
![]() |
48d1bc7c13 | ||
![]() |
08e85696c1 | ||
![]() |
e08ba6703c | ||
![]() |
9ef14efa29 | ||
![]() |
fc395de511 | ||
![]() |
ccdf5d13bd | ||
![]() |
751e2f4125 | ||
![]() |
dcb04acc65 | ||
![]() |
eba5b50e58 | ||
![]() |
d155a67687 | ||
![]() |
9871efd52f | ||
![]() |
2b5bb8dac0 | ||
![]() |
1510d5625a | ||
![]() |
98a056f7a9 | ||
![]() |
1186c2c48c | ||
![]() |
9aac8482d5 | ||
![]() |
3b606504a8 | ||
![]() |
eb95c5cd2e | ||
![]() |
660265fe50 | ||
![]() |
b8f8b6fa50 | ||
![]() |
0950ab0dd8 | ||
![]() |
355d655542 | ||
![]() |
35b95f77e9 | ||
![]() |
465b98513b | ||
![]() |
95563e04e8 | ||
![]() |
fcef259021 | ||
![]() |
8ccdaf2927 | ||
![]() |
d14112748c | ||
![]() |
37832d5e81 | ||
![]() |
5e2b87866e | ||
![]() |
a8e7bf6cf7 | ||
![]() |
94d8e77f8c | ||
![]() |
e80fac36d8 | ||
![]() |
0e2e39a5f2 | ||
![]() |
a7a58b9eac | ||
![]() |
8cd640867c | ||
![]() |
209f9a812e | ||
![]() |
7e2872bab3 | ||
![]() |
b5f12bd9c1 | ||
![]() |
544094af21 | ||
![]() |
2f6ffe7068 | ||
![]() |
e94228fddf | ||
![]() |
a5d520b603 | ||
![]() |
d2e6b863b7 | ||
![]() |
94a9b364b0 | ||
![]() |
763ab79e6c | ||
![]() |
69531593f2 | ||
![]() |
eedbb86b67 | ||
![]() |
5ba610859d | ||
![]() |
4180106125 | ||
![]() |
e347f3770c | ||
![]() |
5d6a563ac7 | ||
![]() |
f94bbdab61 | ||
![]() |
5f4fdaa171 | ||
![]() |
bfc5aa90b1 | ||
![]() |
44d7169642 | ||
![]() |
00387bf870 | ||
![]() |
5cf93e3639 | ||
![]() |
acfd907c50 | ||
![]() |
61c08e792d | ||
![]() |
1771fbbd34 | ||
![]() |
7722e417ad | ||
![]() |
578d4a9b6a | ||
![]() |
7338feb659 | ||
![]() |
770b622a6e | ||
![]() |
db8d4053d6 | ||
![]() |
08566f84cd | ||
![]() |
dfc3a24522 | ||
![]() |
c68e0a1d46 | ||
![]() |
26cbca101a | ||
![]() |
5d780ded29 | ||
![]() |
e86bedb223 | ||
![]() |
37f7d262d7 | ||
![]() |
bde94d187c | ||
![]() |
da6a99b333 | ||
![]() |
0629b30ade | ||
![]() |
a3865fb383 | ||
![]() |
cc4326276e | ||
![]() |
e6fe34e64d | ||
![]() |
a4d4e26fe5 | ||
![]() |
2b42d77f58 | ||
![]() |
a6e9a312a3 | ||
![]() |
1883b1d2a2 | ||
![]() |
07469127ce | ||
![]() |
391983a0cf | ||
![]() |
acbffb511d | ||
![]() |
cf6043fc2d | ||
![]() |
47706dac1a | ||
![]() |
a333417ddf | ||
![]() |
e5d81aeb2a | ||
![]() |
1c663dc179 | ||
![]() |
141c4c2f33 | ||
![]() |
dcbe2136cf | ||
![]() |
e4aca9d73c | ||
![]() |
5827a26dfc | ||
![]() |
aa1b32ad36 | ||
![]() |
d0fedad000 | ||
![]() |
5d7720832b | ||
![]() |
7da15378b1 | ||
![]() |
691ec21ba4 | ||
![]() |
e30893ed80 | ||
![]() |
276f3afb00 | ||
![]() |
d488c779fc | ||
![]() |
01d9366299 | ||
![]() |
6ed68d8ced | ||
![]() |
7197ef76a6 | ||
![]() |
0ae23fa166 | ||
![]() |
cd054a9579 | ||
![]() |
2a86d52dba | ||
![]() |
5920f3379c | ||
![]() |
39f2d4cb5a | ||
![]() |
db9900cf50 | ||
![]() |
fb754186bd | ||
![]() |
a062da05b4 | ||
![]() |
22a1452946 | ||
![]() |
1855c91988 | ||
![]() |
b6407f77da | ||
![]() |
efec62d98e | ||
![]() |
e1c6f01047 | ||
![]() |
86582ad1ba | ||
![]() |
940249f45e | ||
![]() |
f4a518edcc | ||
![]() |
fa00f3e49b | ||
![]() |
67f7a4bb57 | ||
![]() |
35c00fed6d | ||
![]() |
ff9de687c0 | ||
![]() |
26fae7c629 | ||
![]() |
ed014e3c96 | ||
![]() |
08f2714e57 | ||
![]() |
6f9770c067 | ||
![]() |
dcea238661 | ||
![]() |
fbe7b4ddfa | ||
![]() |
9c45115468 | ||
![]() |
7194b74580 | ||
![]() |
564fb1d1e5 | ||
![]() |
5183c40b23 | ||
![]() |
e1fd14e00a | ||
![]() |
f9aff4fc41 | ||
![]() |
b928d5d4b6 | ||
![]() |
33f645aba9 | ||
![]() |
093d797c3b | ||
![]() |
8426bdc9ae | ||
![]() |
ca0149c635 | ||
![]() |
e967c93b7b | ||
![]() |
3a80cb1d1d | ||
![]() |
61d8efae5f | ||
![]() |
c710f9994c | ||
![]() |
0865791116 | ||
![]() |
d4f7fe16ca | ||
![]() |
e6e7d0651d | ||
![]() |
4df8e51edd | ||
![]() |
2df1c90e6a | ||
![]() |
dc00fa9c27 | ||
![]() |
d1be3c8268 | ||
![]() |
f1af5b71e2 | ||
![]() |
31250eafe8 | ||
![]() |
7e693afcf3 | ||
![]() |
5c516ad013 | ||
![]() |
03f4202796 | ||
![]() |
3d02b3afc3 | ||
![]() |
c18ba6aec0 | ||
![]() |
7571fdc957 | ||
![]() |
4e74fae615 | ||
![]() |
1e9ec917f6 | ||
![]() |
f14a4935df | ||
![]() |
a7842b6301 | ||
![]() |
3ac376ebca | ||
![]() |
6609bd94e5 | ||
![]() |
f626129e2b | ||
![]() |
6fbc3b54bd | ||
![]() |
6f4829c390 | ||
![]() |
c7e97f0cf8 | ||
![]() |
a55c6c5f47 | ||
![]() |
ad6e21182e | ||
![]() |
879e2d1afd | ||
![]() |
cfaa851b5b | ||
![]() |
cb2821b512 | ||
![]() |
0a6deeb49b | ||
![]() |
6a06d648d7 | ||
![]() |
ca1e643bdc | ||
![]() |
59c112a3f2 | ||
![]() |
6507951bb1 | ||
![]() |
9a53240759 | ||
![]() |
8de863ecf1 | ||
![]() |
514c64619a | ||
![]() |
f8416484f8 | ||
![]() |
bc1dac80b6 | ||
![]() |
369745c4cf | ||
![]() |
4054b1744f | ||
![]() |
dc2fe66f29 | ||
![]() |
cf585babbe | ||
![]() |
73aca24f30 | ||
![]() |
701f906898 | ||
![]() |
4c21adfd88 | ||
![]() |
ef3019f922 | ||
![]() |
79ed8b03dc | ||
![]() |
a1eb513bbc | ||
![]() |
a656a40fd7 | ||
![]() |
53c2227b1d | ||
![]() |
3d921cec04 | ||
![]() |
249c00d08f | ||
![]() |
0f7ea290ca | ||
![]() |
7e90d4dd7b | ||
![]() |
b6c519e5df | ||
![]() |
179e601966 | ||
![]() |
fad79046a8 | ||
![]() |
1eeba0531e | ||
![]() |
011e0a0fcc | ||
![]() |
26fdb8eb1e | ||
![]() |
50b7d24e32 | ||
![]() |
97a523e854 | ||
![]() |
599d3ae930 | ||
![]() |
67a9622209 | ||
![]() |
7e67b6b568 | ||
![]() |
e61280095e | ||
![]() |
b15bac595d | ||
![]() |
3a97d96dc0 | ||
![]() |
8cbee76929 | ||
![]() |
15539536ad | ||
![]() |
3dfeec5033 | ||
![]() |
6fbc3c4a51 | ||
![]() |
376e0e0e93 | ||
![]() |
db92ffdf89 | ||
![]() |
05cbb3f0e4 | ||
![]() |
fa55f01c8c | ||
![]() |
2793e6cdd8 | ||
![]() |
654195454b | ||
![]() |
751428fe2b | ||
![]() |
ed62fe03b0 | ||
![]() |
a22a86e4d2 | ||
![]() |
d2a92ce4f3 | ||
![]() |
ba120d4220 | ||
![]() |
4313d4b26b | ||
![]() |
73fa617c1d | ||
![]() |
1f3d3c3e5b | ||
![]() |
71ebf8738f | ||
![]() |
2375e00029 | ||
![]() |
77eab66e0f | ||
![]() |
22a2c386e9 | ||
![]() |
5dfae0eb7c | ||
![]() |
b0012bd5a6 | ||
![]() |
12fb6a85d5 | ||
![]() |
59fe5458d0 | ||
![]() |
d4f3bb8ce0 | ||
![]() |
cc1951c13d | ||
![]() |
bd8848e57a | ||
![]() |
ed7ac3c1f7 | ||
![]() |
fe45935f38 | ||
![]() |
f897264c7f | ||
![]() |
9212d1c2dc | ||
![]() |
ab741535f7 | ||
![]() |
e6065569ae | ||
![]() |
fb3394f74b | ||
![]() |
ed4b1d7c9f | ||
![]() |
a90d1b531c | ||
![]() |
bd32a1fabb | ||
![]() |
88ebc6a08b | ||
![]() |
375f170da8 | ||
![]() |
cf6cc6c07c | ||
![]() |
22a12cea5c | ||
![]() |
1feb8ada6c | ||
![]() |
47995edd10 | ||
![]() |
5ffee336d5 | ||
![]() |
39f9981914 | ||
![]() |
9e1c35cfd7 | ||
![]() |
f4f031e703 | ||
![]() |
970bb346d0 | ||
![]() |
9401525464 | ||
![]() |
8a9ba7e72d | ||
![]() |
f452e26269 | ||
![]() |
d299a92cd3 | ||
![]() |
8d008d31bd | ||
![]() |
43ec35ee17 | ||
![]() |
534fcefae1 | ||
![]() |
19f36eb5a1 | ||
![]() |
f4c5b9f8f8 | ||
![]() |
eaa16fa818 | ||
![]() |
4dcff294c9 | ||
![]() |
f3411fee41 | ||
![]() |
a5caf8576b | ||
![]() |
be854b7363 | ||
![]() |
6e3bba07da | ||
![]() |
99e345d6e4 | ||
![]() |
e9a729a46c | ||
![]() |
b136390647 | ||
![]() |
2c7eee6722 | ||
![]() |
d21cfd869e | ||
![]() |
b0578018cb | ||
![]() |
cda2da62cf | ||
![]() |
04cfd36d06 | ||
![]() |
3d253fa52a | ||
![]() |
88ebdf3a53 | ||
![]() |
275c8b6982 | ||
![]() |
765bf760b4 | ||
![]() |
919f3243de | ||
![]() |
f1b91b050c | ||
![]() |
8b8aa198fa | ||
![]() |
0514960bda | ||
![]() |
80de233276 | ||
![]() |
56efc341dd | ||
![]() |
0e83cfade1 | ||
![]() |
cc369cd461 | ||
![]() |
6dfc362f98 | ||
![]() |
f74e2f8abb | ||
![]() |
7043d1e163 | ||
![]() |
8cd905487e | ||
![]() |
be416d9fc6 | ||
![]() |
7035a6da9f | ||
![]() |
8d5cf1a72c | ||
![]() |
973f66a974 | ||
![]() |
0dea4f2ad1 | ||
![]() |
7c784b6963 | ||
![]() |
5bef1c223d | ||
![]() |
f5a326c51e | ||
![]() |
b266d3aaae | ||
![]() |
e170e6563b | ||
![]() |
ddee8b68c6 | ||
![]() |
c88c011df9 | ||
![]() |
ae66f4250c | ||
![]() |
c7008eb761 | ||
![]() |
b9ab6d1e10 | ||
![]() |
1c38bcaeb5 | ||
![]() |
813203a38f | ||
![]() |
2d76e12c21 | ||
![]() |
e979b54413 | ||
![]() |
1958d132a9 | ||
![]() |
b57cabfce7 | ||
![]() |
6d03496372 | ||
![]() |
4805723a3f | ||
![]() |
78b57678d8 | ||
![]() |
b19223cb37 | ||
![]() |
c2f8e0bf66 | ||
![]() |
a82900ae27 | ||
![]() |
ed2a43ba5b | ||
![]() |
b32ec950ac | ||
![]() |
19573a9cbe | ||
![]() |
1593bdf2e9 | ||
![]() |
9907e95c34 | ||
![]() |
b3459d9190 | ||
![]() |
53a9d39a81 | ||
![]() |
4f317353e0 | ||
![]() |
2b3cf97979 | ||
![]() |
1502701e2b | ||
![]() |
70b14518d0 | ||
![]() |
f3e5d03384 | ||
![]() |
57bcb4743d | ||
![]() |
ee92d64088 | ||
![]() |
b452db8b67 | ||
![]() |
c10aa13d0b | ||
![]() |
37f9b24a85 | ||
![]() |
648df6d984 | ||
![]() |
d81a19b5a2 | ||
![]() |
39ce063500 | ||
![]() |
af34d130b6 | ||
![]() |
0cb5ccd492 | ||
![]() |
7433fa9265 | ||
![]() |
d629a55134 | ||
![]() |
28db0cebf0 | ||
![]() |
6c4a6568f5 | ||
![]() |
8970fd8a56 | ||
![]() |
2da718d7e8 | ||
![]() |
8c8feb95a9 | ||
![]() |
a51372f7b3 | ||
![]() |
2b38df2766 | ||
![]() |
12ec476821 | ||
![]() |
188255bd81 | ||
![]() |
d6a5cb6083 | ||
![]() |
ebed1de581 | ||
![]() |
aeae4edb74 | ||
![]() |
ef6b1f9302 | ||
![]() |
7a72ada8b2 | ||
![]() |
a28646bc24 | ||
![]() |
ca4433bd70 | ||
![]() |
c61bcbf982 | ||
![]() |
e9f398ac28 | ||
![]() |
7417b3be66 | ||
![]() |
99afc17b3f | ||
![]() |
cc5fc2baa4 | ||
![]() |
e2f0520028 | ||
![]() |
5cb1924290 | ||
![]() |
aa176aab07 | ||
![]() |
5695a63e59 | ||
![]() |
93fddbed2b | ||
![]() |
8258fa515d | ||
![]() |
a8fb627abc | ||
![]() |
b464d276e2 | ||
![]() |
6885d72180 | ||
![]() |
aec68a9c2d | ||
![]() |
d0e8880e48 | ||
![]() |
50105eed74 | ||
![]() |
affd11b372 | ||
![]() |
796e6141ac | ||
![]() |
52a7a7175b | ||
![]() |
2e0c0ded51 | ||
![]() |
312080de08 | ||
![]() |
902eb187ef | ||
![]() |
a03cb93f87 | ||
![]() |
03b14c9aae | ||
![]() |
f085fb1499 | ||
![]() |
3815d7d74f | ||
![]() |
8eb7777561 | ||
![]() |
5104b79b4b | ||
![]() |
b42a197293 | ||
![]() |
dbd821a564 | ||
![]() |
47801e7350 | ||
![]() |
71d41cbb71 | ||
![]() |
d98bd418b1 | ||
![]() |
06d32baea4 | ||
![]() |
1297a09344 | ||
![]() |
65e509ed8f | ||
![]() |
eec1b3e7a7 | ||
![]() |
e2551b4e21 | ||
![]() |
62aa16e6e3 | ||
![]() |
df830a50e7 | ||
![]() |
51eebb3906 | ||
![]() |
d02bb70f0c | ||
![]() |
e94f44f294 | ||
![]() |
fca96799a0 | ||
![]() |
98523fbb61 | ||
![]() |
cd68f7dc14 | ||
![]() |
11b786a4fc | ||
![]() |
6e0359efa6 | ||
![]() |
73616520c0 | ||
![]() |
d3ae8a938c | ||
![]() |
4a9a004de0 | ||
![]() |
c270d5edcf | ||
![]() |
cf034ee729 | ||
![]() |
316d44cf33 | ||
![]() |
dbd30d571d | ||
![]() |
78c9411dde | ||
![]() |
2f999dd77e | ||
![]() |
e8ee3c7d4d | ||
![]() |
aaf515ef67 | ||
![]() |
ab631a51bd | ||
![]() |
299a4fa1c0 | ||
![]() |
f3bb370b3a | ||
![]() |
bdd99024b1 | ||
![]() |
714047f789 | ||
![]() |
890013cecf | ||
![]() |
064321c21e | ||
![]() |
3a3f39b642 | ||
![]() |
7e56f2cc0e | ||
![]() |
92756f9b12 | ||
![]() |
ddb5ed9dc8 | ||
![]() |
e74e0d1710 | ||
![]() |
6d0909134c | ||
![]() |
5496a8ca05 | ||
![]() |
3928fe9578 | ||
![]() |
592ecd479f | ||
![]() |
d8c7a10fd7 | ||
![]() |
9586e9ebef | ||
![]() |
047f3d6061 | ||
![]() |
20188a36de | ||
![]() |
d66856dd17 | ||
![]() |
9adc48c0b0 | ||
![]() |
bcf068f66f | ||
![]() |
618ce2ff0a | ||
![]() |
05778ad307 | ||
![]() |
bc0109256f | ||
![]() |
fa487c7c2f | ||
![]() |
b3a0270acd | ||
![]() |
a930175c55 | ||
![]() |
45d3bb7da2 | ||
![]() |
b83adad417 | ||
![]() |
856c0e6a15 | ||
![]() |
eeaef5731f | ||
![]() |
cc431b9f14 | ||
![]() |
506dd1d423 | ||
![]() |
0e79b47b43 | ||
![]() |
5c0d237c2d | ||
![]() |
37cabe5562 | ||
![]() |
d0d9b4df78 | ||
![]() |
0be20ec6ab | ||
![]() |
626f72b97a | ||
![]() |
fca09b2615 | ||
![]() |
7e1c836acb | ||
![]() |
8cf354c042 | ||
![]() |
9fd6db4b5f | ||
![]() |
cb7b8d94c0 | ||
![]() |
a42a654590 | ||
![]() |
b7ab07c987 | ||
![]() |
4b00dedff5 | ||
![]() |
7d02b15437 | ||
![]() |
d480cb7b2c | ||
![]() |
256370afa8 | ||
![]() |
c67d035366 | ||
![]() |
55b444cccf | ||
![]() |
c9b702c4c2 | ||
![]() |
e6c58c9795 | ||
![]() |
cf50ccb919 | ||
![]() |
efb0593473 | ||
![]() |
7ab19bdfcc | ||
![]() |
99d3046a5b | ||
![]() |
710f226778 | ||
![]() |
e2b45915a6 | ||
![]() |
d6d94473e4 | ||
![]() |
638f37167f | ||
![]() |
2308b94702 | ||
![]() |
0efeefe3b2 | ||
![]() |
d447a8347b | ||
![]() |
6d8b8ecfa9 | ||
![]() |
85726b67b7 | ||
![]() |
0a94d9b284 | ||
![]() |
ce99fa8c02 | ||
![]() |
7147c5306d | ||
![]() |
c41fb2a21f | ||
![]() |
c12f8bed43 | ||
![]() |
ee96ff2846 | ||
![]() |
6464c94990 | ||
![]() |
2a120d9045 | ||
![]() |
2f6da20065 | ||
![]() |
36ad9a25e3 | ||
![]() |
785b8d2bd1 | ||
![]() |
eddb5c6c3f | ||
![]() |
306f15723d | ||
![]() |
3936cbebbb | ||
![]() |
8f76f59b8b | ||
![]() |
3fcd7866cc | ||
![]() |
16cc4aed06 | ||
![]() |
f6b6e2f7d1 | ||
![]() |
79a313d505 | ||
![]() |
13ff5862d1 | ||
![]() |
1351ddd11e | ||
![]() |
dd32324e01 | ||
![]() |
1f71bdedab | ||
![]() |
befda9a78b | ||
![]() |
68179e2672 | ||
![]() |
1bb01dccf5 | ||
![]() |
de22bb1df6 | ||
![]() |
1e157a4f41 | ||
![]() |
2984b9fd18 | ||
![]() |
15e8f4614c | ||
![]() |
53771bd576 | ||
![]() |
4099815a08 | ||
![]() |
86b984b0bd | ||
![]() |
e4afb949d7 | ||
![]() |
2748dcaaf1 | ||
![]() |
ea9c103fe1 | ||
![]() |
b1d59679e5 | ||
![]() |
2f73361381 | ||
![]() |
71b797faf2 | ||
![]() |
c5c1c2e298 | ||
![]() |
2d43698958 | ||
![]() |
3315c4c6c3 | ||
![]() |
dd22200a69 | ||
![]() |
751529feca | ||
![]() |
48899c7a1c | ||
![]() |
d2502f649f | ||
![]() |
93f8d21bc0 | ||
![]() |
3de4bc56b5 | ||
![]() |
132bb4e890 | ||
![]() |
9eb1505aa1 | ||
![]() |
0a9b373edb | ||
![]() |
6d9f561853 | ||
![]() |
31ee54c133 | ||
![]() |
f4e4ea10e5 | ||
![]() |
c401949af8 | ||
![]() |
f4ab5ee54f | ||
![]() |
5d8e6d5432 | ||
![]() |
823a44cd23 | ||
![]() |
717c55d1f5 | ||
![]() |
1e00fc2af7 | ||
![]() |
d072091926 | ||
![]() |
9d83059f14 | ||
![]() |
8b9bd67da7 | ||
![]() |
742e36ba26 | ||
![]() |
2e018ad841 | ||
![]() |
87e0f04515 | ||
![]() |
a6d587b6cd | ||
![]() |
facb115f14 | ||
![]() |
b3ee54b124 | ||
![]() |
c69d4943a5 | ||
![]() |
497c01c651 | ||
![]() |
70b29dc823 | ||
![]() |
e4263afd64 | ||
![]() |
a73440ebe8 | ||
![]() |
f4168a0e07 | ||
![]() |
4430b50fd7 | ||
![]() |
f09a20b66d | ||
![]() |
8f285c15d3 | ||
![]() |
c71b6c8a71 | ||
![]() |
4395fe9298 | ||
![]() |
799cdbe64d | ||
![]() |
f302c6fd65 | ||
![]() |
8050d8555e | ||
![]() |
08087b0f99 | ||
![]() |
9e3a8899c8 | ||
![]() |
b4142fc7ee | ||
![]() |
02a36a9b68 | ||
![]() |
8947ce5053 | ||
![]() |
a97460d1ab | ||
![]() |
8994931ec4 | ||
![]() |
3af3900581 | ||
![]() |
da0ff8d8c4 | ||
![]() |
cf30895460 | ||
![]() |
e2b622fb78 | ||
![]() |
0cf1ca7736 | ||
![]() |
0fabd73ad4 | ||
![]() |
42fc332123 | ||
![]() |
a17ab612ad | ||
![]() |
96d2b8cdf6 | ||
![]() |
06ddda8c95 | ||
![]() |
2148f63d89 | ||
![]() |
c20a9a1ff4 | ||
![]() |
2f5c4b81ba | ||
![]() |
c8cce7607c | ||
![]() |
d7f736ed6c | ||
![]() |
d61bde6ae6 | ||
![]() |
85f129492a | ||
![]() |
b4404b071f | ||
![]() |
c37100299a | ||
![]() |
e78ceab560 | ||
![]() |
7da41a6e86 | ||
![]() |
9353169203 | ||
![]() |
e90feb1d59 | ||
![]() |
b62c7abc5d | ||
![]() |
953adc105e | ||
![]() |
e65f72f2ed | ||
![]() |
4cf186a47e | ||
![]() |
3feb55a8e4 | ||
![]() |
54584e970c | ||
![]() |
c8deae6445 | ||
![]() |
efb52961f0 | ||
![]() |
e3e3a113e9 | ||
![]() |
62f2520ee1 | ||
![]() |
0ac95fbed3 | ||
![]() |
12caf17848 | ||
![]() |
b844d09797 | ||
![]() |
c19b222d5a | ||
![]() |
ad419911bc | ||
![]() |
c16a18b2bd | ||
![]() |
e56dd8ed50 | ||
![]() |
1be41b9de8 | ||
![]() |
3a0d5126ae | ||
![]() |
272ca3de35 | ||
![]() |
03ac82d440 | ||
![]() |
d03d90a955 | ||
![]() |
ddd6b9cff1 | ||
![]() |
4663845ebc | ||
![]() |
e696c08db0 | ||
![]() |
502afbe9c2 | ||
![]() |
4ec88b41dc | ||
![]() |
7ac547a6e0 | ||
![]() |
91730fe6a9 | ||
![]() |
2223592486 | ||
![]() |
7e4aa2409f | ||
![]() |
4d314ba4df | ||
![]() |
97d66c4eb2 | ||
![]() |
00282dab72 | ||
![]() |
f726908707 | ||
![]() |
fc7851a98c | ||
![]() |
efb0425602 | ||
![]() |
39fefa49cc | ||
![]() |
6146eaa350 | ||
![]() |
0ed25e9f4e | ||
![]() |
9d5704307a | ||
![]() |
a38bb5b33b | ||
![]() |
5e33842ce0 | ||
![]() |
53f64bae09 | ||
![]() |
ef489aad2a | ||
![]() |
dfe2a457c0 | ||
![]() |
00501019b4 | ||
![]() |
7f1793e6a9 | ||
![]() |
6518249470 | ||
![]() |
1a52632b68 | ||
![]() |
b42590c5a9 | ||
![]() |
4bf45cd2ea | ||
![]() |
36c3c624e7 | ||
![]() |
64ce8e970f | ||
![]() |
eb826e5956 | ||
![]() |
e3ca87bc5a | ||
![]() |
1d6a20228b | ||
![]() |
33077f0cdd | ||
![]() |
541b666a86 | ||
![]() |
5218b23fce | ||
![]() |
81651b0b25 | ||
![]() |
f1ecac92df | ||
![]() |
b35306052d | ||
![]() |
19734e7b2c | ||
![]() |
0b8f8db67b | ||
![]() |
3219c380c7 | ||
![]() |
35d8890f4e | ||
![]() |
1b3f9254bc | ||
![]() |
1b02410aa6 | ||
![]() |
d8222a8eb6 | ||
![]() |
c71a7b901f | ||
![]() |
2581b031d9 | ||
![]() |
1c5b4dbd97 | ||
![]() |
56beec1ce9 | ||
![]() |
14190bd497 | ||
![]() |
740d9c575e | ||
![]() |
a330eba61c | ||
![]() |
87d58a544b | ||
![]() |
9983c43697 | ||
![]() |
4ae31bc938 | ||
![]() |
2ac29cf1a4 | ||
![]() |
8e071b69f4 | ||
![]() |
86d410d863 | ||
![]() |
6b9eed5a70 | ||
![]() |
e45f2cf5a2 | ||
![]() |
710deb8316 | ||
![]() |
34e35f6aa3 | ||
![]() |
d2179e5321 | ||
![]() |
0e17f619c8 | ||
![]() |
de636cce6f | ||
![]() |
f5282bfcf3 | ||
![]() |
3f449e1d27 | ||
![]() |
d4200b5eb9 | ||
![]() |
222a8bb7be | ||
![]() |
96576a9775 | ||
![]() |
c03e3ce961 | ||
![]() |
45d934e64d | ||
![]() |
89cbbfc2e5 | ||
![]() |
0d8390b9df | ||
![]() |
ab2c3a2130 | ||
![]() |
d3b6255ffe | ||
![]() |
a3071571ac | ||
![]() |
f885e97a5b | ||
![]() |
53c1aba7df | ||
![]() |
96b84ff348 | ||
![]() |
4be1006b71 | ||
![]() |
dd715fcc3a | ||
![]() |
f9b420a5a5 | ||
![]() |
94b6130af6 | ||
![]() |
953228ebd2 | ||
![]() |
d8ebdda714 | ||
![]() |
8279efc164 | ||
![]() |
e54e9279e3 | ||
![]() |
b3e637ca7a | ||
![]() |
ee07fac9bc | ||
![]() |
c5ce95ff06 | ||
![]() |
dbf383f713 | ||
![]() |
7f2c6b43d2 | ||
![]() |
de628602c2 | ||
![]() |
5e3555022f | ||
![]() |
ad94ccdd6c | ||
![]() |
7a73c6adf7 | ||
![]() |
49979d0a75 | ||
![]() |
96a998ad25 | ||
![]() |
7284f4e7ca | ||
![]() |
c5379a0f35 | ||
![]() |
73fb57fd32 | ||
![]() |
e4e89becc6 | ||
![]() |
7e36699aac | ||
![]() |
5b7daa9e0c | ||
![]() |
42750088b9 | ||
![]() |
e7b9cecec9 | ||
![]() |
540cb6ea5b | ||
![]() |
39431c0764 | ||
![]() |
b90cb09fd1 | ||
![]() |
6f6c670b3b | ||
![]() |
2af984917e | ||
![]() |
e7fc886992 | ||
![]() |
90fbb150e7 | ||
![]() |
5a2528b0f1 | ||
![]() |
d644b610b7 | ||
![]() |
e0bcd0049c | ||
![]() |
a44724fdcc | ||
![]() |
de7f82e18e | ||
![]() |
661656e373 | ||
![]() |
f37f488cc3 | ||
![]() |
6afb42bf7a | ||
![]() |
aeb891649e | ||
![]() |
984a2769db | ||
![]() |
9efca0079c | ||
![]() |
78f846d532 | ||
![]() |
5f267be1db | ||
![]() |
cf2e71a530 | ||
![]() |
ec63ab0639 | ||
![]() |
bd882fa4e4 | ||
![]() |
752679c55d | ||
![]() |
a083eb334e | ||
![]() |
4c65c51ede | ||
![]() |
b0dc1fdfad | ||
![]() |
69b8032a5a | ||
![]() |
2f374abc58 | ||
![]() |
f445a81a4d | ||
![]() |
002a8f4900 | ||
![]() |
93631341a5 | ||
![]() |
6a5f9d74f5 | ||
![]() |
ed4441a1c2 | ||
![]() |
0c5b24a1f5 | ||
![]() |
43d63d0fe5 | ||
![]() |
5450cda3a5 | ||
![]() |
a2048b4c7a | ||
![]() |
221b07595f | ||
![]() |
4de30ca2ce | ||
![]() |
ab08c1bef8 | ||
![]() |
88b7aba1c8 | ||
![]() |
37f3613704 | ||
![]() |
9b59ef4fc9 | ||
![]() |
e602de55ac | ||
![]() |
2f31b8576e | ||
![]() |
8c84e47c94 | ||
![]() |
5a7d38b28c | ||
![]() |
0519b96bec | ||
![]() |
d9b9a004d2 | ||
![]() |
963236916c | ||
![]() |
187392deec | ||
![]() |
842e09923a | ||
![]() |
f4f2aff5b6 | ||
![]() |
dff2ee2156 | ||
![]() |
ecdcfb835d | ||
![]() |
e1ae455f1d | ||
![]() |
b3201523aa | ||
![]() |
9436645648 | ||
![]() |
a65e656c03 | ||
![]() |
8661cf463a | ||
![]() |
e6be297fba | ||
![]() |
2b13a8cde4 | ||
![]() |
ea70d71e8f | ||
![]() |
8c65062271 | ||
![]() |
f3d79104a7 | ||
![]() |
1cfa46d80b | ||
![]() |
be58c4f71a | ||
![]() |
66d3832be9 | ||
![]() |
02cca1a4da | ||
![]() |
8ec5e53cf4 | ||
![]() |
a2896b4764 | ||
![]() |
421ebb087b | ||
![]() |
850b5cb02b | ||
![]() |
7e47481676 | ||
![]() |
837b1384af | ||
![]() |
af5cdc1f65 | ||
![]() |
bc9125666f | ||
![]() |
b01131ab9d | ||
![]() |
b8070567bf | ||
![]() |
77d89d13b6 | ||
![]() |
12119f89e5 | ||
![]() |
3a4b8625bd | ||
![]() |
42dd3ba748 | ||
![]() |
de18207ca3 | ||
![]() |
b68228c7e8 | ||
![]() |
9ccd56c019 | ||
![]() |
4d49fe6b93 | ||
![]() |
e7157f2164 | ||
![]() |
af62660b14 | ||
![]() |
82a478e2fb | ||
![]() |
72e7beeb76 | ||
![]() |
03bb2a68b3 | ||
![]() |
8f9467492d | ||
![]() |
225059f8ea | ||
![]() |
bb08959131 | ||
![]() |
1f66821256 | ||
![]() |
7b90cbd2b2 | ||
![]() |
3e06e6b4b3 | ||
![]() |
793592b2b8 | ||
![]() |
5699cb8a09 | ||
![]() |
a2efc079f1 | ||
![]() |
cfc0edff6b | ||
![]() |
208fa84a27 | ||
![]() |
4e55fa6c5c | ||
![]() |
bd72ddda3c | ||
![]() |
6056753a9c | ||
![]() |
76f392476b | ||
![]() |
ba7391528f | ||
![]() |
799d98eaf0 | ||
![]() |
928d9ec117 | ||
![]() |
6fe00497d6 | ||
![]() |
ec47216388 | ||
![]() |
6b16c34fd0 | ||
![]() |
d4b66717a4 | ||
![]() |
435a88636a | ||
![]() |
bf5cc22bef | ||
![]() |
d43617c41d | ||
![]() |
55bf5514ad | ||
![]() |
29a05a6a65 | ||
![]() |
a65edc8dc1 | ||
![]() |
15b1a9ecea | ||
![]() |
becc120ad9 | ||
![]() |
ade4e36da7 | ||
![]() |
b4083dc14f | ||
![]() |
38f9559348 | ||
![]() |
d974e64a8b | ||
![]() |
6f20a4a181 | ||
![]() |
6b2a006fea | ||
![]() |
88c755518f | ||
![]() |
e2475e67c6 | ||
![]() |
d891810e95 | ||
![]() |
98bff965f5 | ||
![]() |
d391b87227 | ||
![]() |
5f7711e7a6 | ||
![]() |
3bf1cf4f85 | ||
![]() |
6d9aafd3b0 | ||
![]() |
81a2fb9615 | ||
![]() |
f3c6f665af | ||
![]() |
e01ceb1a57 | ||
![]() |
fcd58b7c9b | ||
![]() |
574d8d30a7 | ||
![]() |
8467b91390 | ||
![]() |
5d37eb8eeb | ||
![]() |
7d71a2c979 | ||
![]() |
58d9c96b5f | ||
![]() |
b9f74f3d25 | ||
![]() |
6c18a2cae2 | ||
![]() |
6ae7f31947 | ||
![]() |
97c82089b4 | ||
![]() |
6ce0819287 | ||
![]() |
5516063f46 | ||
![]() |
b8a5597d3e | ||
![]() |
481b2035db | ||
![]() |
f656f352a3 | ||
![]() |
a6ee2995bc | ||
![]() |
58bff0a183 | ||
![]() |
405062d2df | ||
![]() |
50144e883e | ||
![]() |
e7e0f049d1 | ||
![]() |
15569f1e7f | ||
![]() |
dad0109eca | ||
![]() |
1e23019df8 | ||
![]() |
2788de9b10 | ||
![]() |
6e0d61e5e8 | ||
![]() |
0bb83e5b7c | ||
![]() |
aca1c5a5f8 | ||
![]() |
24fd395d09 | ||
![]() |
13f4393042 | ||
![]() |
a3d048e9c0 | ||
![]() |
66d938fcea | ||
![]() |
72d805d458 | ||
![]() |
1a2e6eae8e | ||
![]() |
d634ed0bbb | ||
![]() |
bdbeb1d68f | ||
![]() |
e8314e1d86 | ||
![]() |
bf424caf4a | ||
![]() |
996af94bb8 | ||
![]() |
f47055a1b0 | ||
![]() |
e416e0a9e9 | ||
![]() |
fd690db01f | ||
![]() |
e03df37417 | ||
![]() |
3f232f3dbd | ||
![]() |
942cd7caa5 | ||
![]() |
5a93a6eec4 | ||
![]() |
c56391e972 | ||
![]() |
de062bc2a6 | ||
![]() |
976457ccef | ||
![]() |
f64c35c3f9 | ||
![]() |
592f316b3f | ||
![]() |
c82ece2721 | ||
![]() |
c695b6f6a5 | ||
![]() |
3debb7cdf3 | ||
![]() |
79c3148fc0 | ||
![]() |
7faba60e83 | ||
![]() |
b9bd757df1 | ||
![]() |
5825cd7868 | ||
![]() |
e46f1b69ba | ||
![]() |
26241980d7 | ||
![]() |
ed7cacbf92 | ||
![]() |
a217630fdd | ||
![]() |
2f3bd80de4 | ||
![]() |
0246761f94 | ||
![]() |
87801d8aca | ||
![]() |
28f6e79385 | ||
![]() |
893f796df2 | ||
![]() |
c97ce05b09 | ||
![]() |
454c5d824a | ||
![]() |
c29c0e7e13 | ||
![]() |
e13f78dfc5 | ||
![]() |
b768c9cc64 | ||
![]() |
8237ccfa03 | ||
![]() |
28a4af89d9 | ||
![]() |
77cec174b8 | ||
![]() |
511366f329 | ||
![]() |
e4d320d5f5 | ||
![]() |
b8ebb94bc6 | ||
![]() |
d74ece92f9 | ||
![]() |
360ac7e71f | ||
![]() |
ed925f9ef5 | ||
![]() |
b876f7f11a | ||
![]() |
097b1d112b | ||
![]() |
961327f76b | ||
![]() |
d7fbb8ed8e | ||
![]() |
79135f59fd | ||
![]() |
96ef92659f | ||
![]() |
5e249aac5f | ||
![]() |
be57d45653 | ||
![]() |
e4590539e1 | ||
![]() |
bec8781558 | ||
![]() |
2cae17deb7 | ||
![]() |
cc14dfa31c | ||
![]() |
a643d6cd3e | ||
![]() |
4b998ea6af | ||
![]() |
aa2bfbb541 | ||
![]() |
13c8c2e841 | ||
![]() |
de3f0c788c | ||
![]() |
22fdccba02 | ||
![]() |
b85bd2cb99 | ||
![]() |
b6292d7c77 | ||
![]() |
1c84905bcd | ||
![]() |
ca6243c18a | ||
![]() |
066e921a8b | ||
![]() |
e4333a7a44 | ||
![]() |
8402363568 | ||
![]() |
8ff1fc6f8b | ||
![]() |
0c066a0944 | ||
![]() |
86ae02e5c5 | ||
![]() |
17c31ed640 | ||
![]() |
7fa3950001 | ||
![]() |
9def9464e9 | ||
![]() |
f474631ac0 | ||
![]() |
f436e29a0d | ||
![]() |
aa60d362fd | ||
![]() |
d3ed80cf53 | ||
![]() |
90e0a1af8a | ||
![]() |
9ca2ad53f9 | ||
![]() |
e7f8d6bbf7 | ||
![]() |
5760fb94fe | ||
![]() |
147dfa06af | ||
![]() |
b44464e0fa | ||
![]() |
fd339be458 | ||
![]() |
29383f98b5 | ||
![]() |
c4c2b4f9da | ||
![]() |
0d700f6a63 | ||
![]() |
d53cb951e7 | ||
![]() |
8c5c963b96 | ||
![]() |
6f7f5b4034 | ||
![]() |
29bc93ea98 | ||
![]() |
b30d117e7d | ||
![]() |
62bc02fdda | ||
![]() |
56f7c3b55c | ||
![]() |
5f775c1427 | ||
![]() |
9a4a83cb91 | ||
![]() |
e757c47bc8 | ||
![]() |
2452f3504c | ||
![]() |
e3b91f4ce7 | ||
![]() |
214d6f5cf5 | ||
![]() |
f3f2aa807b | ||
![]() |
a65bb6d804 | ||
![]() |
1063594bf0 | ||
![]() |
a7f4b4d248 | ||
![]() |
5b4cfc6b25 | ||
![]() |
93aa47851a | ||
![]() |
513f33f454 | ||
![]() |
7b35f5d66d | ||
![]() |
40d3d64027 | ||
![]() |
77443b3d09 | ||
![]() |
b741199ed3 | ||
![]() |
9994554c56 | ||
![]() |
79fdac6674 | ||
![]() |
86d3321d59 | ||
![]() |
1d22936a82 | ||
![]() |
73535200c2 | ||
![]() |
f3de26444e | ||
![]() |
a2fab264c4 | ||
![]() |
c93c6a66e8 | ||
![]() |
6404882ec4 | ||
![]() |
4afa2a2651 | ||
![]() |
71617e8e8b | ||
![]() |
175204a65e | ||
![]() |
d416029e82 | ||
![]() |
d3bbd9ec65 | ||
![]() |
813e945d86 | ||
![]() |
c582911879 | ||
![]() |
f94329dbbd | ||
![]() |
5ba0ccd43b | ||
![]() |
5b7a4434c4 | ||
![]() |
637ff5698c | ||
![]() |
afe15a2e6b | ||
![]() |
7bfc1d2840 | ||
![]() |
e9c5f3e74a | ||
![]() |
7ff196d043 | ||
![]() |
cc28150253 | ||
![]() |
5a9ee9bd6c | ||
![]() |
f02475fede | ||
![]() |
73cb06c6af | ||
![]() |
dd6322593a | ||
![]() |
b783927039 | ||
![]() |
7c54cd5583 | ||
![]() |
370838ea7b | ||
![]() |
3560081efd | ||
![]() |
38342b2f25 | ||
![]() |
e851fc13dc | ||
![]() |
eb983018ad | ||
![]() |
6651844d41 | ||
![]() |
eca9710845 | ||
![]() |
03d72ff2ec | ||
![]() |
1595ed1228 | ||
![]() |
b022e08db9 | ||
![]() |
0b64f49e3a | ||
![]() |
f922128a14 | ||
![]() |
4fa268ecb4 | ||
![]() |
36413e112f | ||
![]() |
0869d209d7 | ||
![]() |
b578a76efa | ||
![]() |
5f1855abf5 | ||
![]() |
a7e8446454 | ||
![]() |
3ce89409d2 | ||
![]() |
828f368323 | ||
![]() |
4a5cf5cd2b | ||
![]() |
c3689d7416 | ||
![]() |
a0fbf9ba47 | ||
![]() |
116f7934d3 | ||
![]() |
561b033ebb | ||
![]() |
da87ec8499 | ||
![]() |
4d292c2723 | ||
![]() |
4448eb94a1 | ||
![]() |
d6ab36bf8e | ||
![]() |
a8cd7203df | ||
![]() |
6631bbc6f5 | ||
![]() |
116012680a | ||
![]() |
dbd1ca45c4 | ||
![]() |
224c874673 | ||
![]() |
4431dd278c | ||
![]() |
dcf51e5a14 | ||
![]() |
08cacb9f51 | ||
![]() |
fc8d41d024 | ||
![]() |
50e7b4dc10 | ||
![]() |
ccc3ce81f9 | ||
![]() |
4a08c65205 | ||
![]() |
e002c84eba | ||
![]() |
ab7bd302f6 | ||
![]() |
276c79aa85 | ||
![]() |
9a4a3204d6 | ||
![]() |
dd03fcbeb3 | ||
![]() |
2c5079ebb6 | ||
![]() |
123a1baead | ||
![]() |
6dd836589c | ||
![]() |
7f77e99e4d | ||
![]() |
6c3ea2a904 | ||
![]() |
193e9bec97 | ||
![]() |
a5b98b40ac | ||
![]() |
e9ff1940d6 | ||
![]() |
96649a7e27 | ||
![]() |
9b757e4c22 | ||
![]() |
46920e9be6 | ||
![]() |
877eb0c3ad | ||
![]() |
61620dec30 | ||
![]() |
12e92d504d | ||
![]() |
16e1b3772c | ||
![]() |
59686274d7 | ||
![]() |
945567150d | ||
![]() |
eedfca6623 | ||
![]() |
41e4dc4336 | ||
![]() |
730a257f3c | ||
![]() |
d06fce6997 | ||
![]() |
ca08b70984 | ||
![]() |
867138ebb8 | ||
![]() |
e004cd029a | ||
![]() |
b73c774b07 | ||
![]() |
5635cdb77c | ||
![]() |
0d598dd6d6 | ||
![]() |
ef9d9b17bd | ||
![]() |
fbde040f59 | ||
![]() |
220baed33a | ||
![]() |
5f2a9ed965 | ||
![]() |
08e74352ec | ||
![]() |
60f79c848a | ||
![]() |
2584a07452 | ||
![]() |
6a4c25b668 | ||
![]() |
d305247485 | ||
![]() |
782d2d0b75 | ||
![]() |
8e150ff1f5 | ||
![]() |
f12bd7ad99 | ||
![]() |
bc5a2da7b7 | ||
![]() |
19be31d13a | ||
![]() |
95357dfc55 | ||
![]() |
d560e8245a | ||
![]() |
095d2718f3 | ||
![]() |
9de57382cd | ||
![]() |
6fc517fdbe | ||
![]() |
214aa3de08 | ||
![]() |
01581ff92e | ||
![]() |
a5af746013 | ||
![]() |
4a788b62d1 | ||
![]() |
ccc818266b | ||
![]() |
c9fba5db5e | ||
![]() |
f0d553514d | ||
![]() |
d144228272 | ||
![]() |
9062d6e5e6 | ||
![]() |
c87ecf0ff6 | ||
![]() |
2123f6f133 | ||
![]() |
c5d2e44baf | ||
![]() |
2a6948e696 | ||
![]() |
1b4851f2e0 | ||
![]() |
b4282fca84 | ||
![]() |
4720a7a891 | ||
![]() |
75e5f085d3 | ||
![]() |
675525f47c | ||
![]() |
6d7fb9f46a | ||
![]() |
0abcf2d176 | ||
![]() |
bd46a6130a | ||
![]() |
26f78132ae | ||
![]() |
f492a7678d | ||
![]() |
e6a2507b50 | ||
![]() |
d10f5a48d4 | ||
![]() |
e5a861dc90 | ||
![]() |
a80ce60e75 | ||
![]() |
3259ba6116 | ||
![]() |
e8e9500a30 | ||
![]() |
75608ce378 | ||
![]() |
4e095e9fff | ||
![]() |
7f06a939ac | ||
![]() |
2686869f88 | ||
![]() |
7a8d1c00a4 | ||
![]() |
a6b407d706 | ||
![]() |
966cb14a38 | ||
![]() |
21e85ba9c5 | ||
![]() |
608a7578fc | ||
![]() |
98f1548f2d | ||
![]() |
d1b3ed717e | ||
![]() |
a365f456fc | ||
![]() |
37463d655a | ||
![]() |
61a5793073 | ||
![]() |
b3eba49a2f | ||
![]() |
3b12fd22a4 | ||
![]() |
a9bbc42981 | ||
![]() |
b78b705e32 | ||
![]() |
71c8fcee20 | ||
![]() |
44b4f14375 | ||
![]() |
64cd38d96f | ||
![]() |
01599d44f5 | ||
![]() |
42b6ec2fb5 | ||
![]() |
dd4a350bd5 | ||
![]() |
82784a320c | ||
![]() |
2faa3af51f | ||
![]() |
5007a9e702 | ||
![]() |
30744bea9c | ||
![]() |
4484afc0d6 | ||
![]() |
3776a06281 | ||
![]() |
618538aeff | ||
![]() |
3aa2de5fa5 | ||
![]() |
591845ce23 | ||
![]() |
54542ee90c | ||
![]() |
6a1f3f1117 | ||
![]() |
1c6e92c45b | ||
![]() |
267d98b5eb | ||
![]() |
f04be61f6f | ||
![]() |
1637a49442 | ||
![]() |
23f278e090 | ||
![]() |
813f8dd63f | ||
![]() |
55af2ab4dc | ||
![]() |
660b1dc1e4 | ||
![]() |
d672eed331 | ||
![]() |
ced59e599f | ||
![]() |
1259979204 | ||
![]() |
a2b280f342 | ||
![]() |
8277ebcbe1 | ||
![]() |
9aee91b98c | ||
![]() |
465eeab553 | ||
![]() |
6e86cbf947 | ||
![]() |
2326a2941e | ||
![]() |
334fecdf6f | ||
![]() |
317d08b6c1 | ||
![]() |
059df5e3e2 | ||
![]() |
de440cf579 | ||
![]() |
81d006499e | ||
![]() |
0a1e33b7e1 | ||
![]() |
5157c2d10c | ||
![]() |
8a8cbeb4c0 | ||
![]() |
de6fc53ca5 | ||
![]() |
b9e882fd5e | ||
![]() |
eaa73ef0c7 | ||
![]() |
a6e9933236 | ||
![]() |
f757ca6b11 | ||
![]() |
ff469cb592 | ||
![]() |
c9cc024e9b | ||
![]() |
b87b618c94 | ||
![]() |
97609576cb | ||
![]() |
cd3fc7c76d | ||
![]() |
6e2cf9663a | ||
![]() |
374fe47809 | ||
![]() |
abae48c287 | ||
![]() |
8bd0fca751 | ||
![]() |
ca67fd9faa | ||
![]() |
8825561a99 | ||
![]() |
5dcac36b78 | ||
![]() |
9d794b820a | ||
![]() |
ede432ba71 | ||
![]() |
ab352c3bc9 | ||
![]() |
0d60d40512 | ||
![]() |
55dfca7467 | ||
![]() |
6119e79023 | ||
![]() |
2f415b0db1 | ||
![]() |
e20bfdd19c | ||
![]() |
0d999649c0 | ||
![]() |
371bea03d6 | ||
![]() |
94a3cec4bf | ||
![]() |
3d9ae1b8bd | ||
![]() |
5a2eddb32c | ||
![]() |
6d812bd957 | ||
![]() |
5617e6913b | ||
![]() |
19a0a7029f | ||
![]() |
77655cad0d | ||
![]() |
5e3e4bda28 | ||
![]() |
e8710002b1 | ||
![]() |
d6a47cb3e0 | ||
![]() |
188f3e35fd | ||
![]() |
1f4cdda234 | ||
![]() |
446c7349ff | ||
![]() |
0d8c75d9ce | ||
![]() |
1ffc3a00e7 | ||
![]() |
d011b46985 | ||
![]() |
5bfc1f3d4d | ||
![]() |
72cc656b7e | ||
![]() |
9f1bffe3be | ||
![]() |
e41753556c | ||
![]() |
86f09a42a2 | ||
![]() |
f06aeea385 | ||
![]() |
970fe3f3da | ||
![]() |
607b09ccdd | ||
![]() |
d36204a968 | ||
![]() |
76b65c5779 | ||
![]() |
632d44c7b7 | ||
![]() |
1b36a34ae4 | ||
![]() |
0afb849e7f | ||
![]() |
5f97937ba0 | ||
![]() |
ca48148150 | ||
![]() |
9142fa1aa6 | ||
![]() |
1ac8442c63 | ||
![]() |
e47b548192 | ||
![]() |
337cc6e79f | ||
![]() |
d842dacfd6 | ||
![]() |
1ea7229f32 | ||
![]() |
5faa9795b0 | ||
![]() |
0b90ebf91e | ||
![]() |
0db1fcca0f | ||
![]() |
55bec20b02 | ||
![]() |
6dc6f2d099 | ||
![]() |
075030f15a | ||
![]() |
bf33169627 | ||
![]() |
c30600a044 | ||
![]() |
f3b702db5a | ||
![]() |
f516b24dfb | ||
![]() |
e2af216bcd | ||
![]() |
96aaa25aad | ||
![]() |
e268c5b873 | ||
![]() |
e0a7ea52fd | ||
![]() |
18478ebd05 | ||
![]() |
ba394fd2aa | ||
![]() |
535ce8726d | ||
![]() |
5fc0e00ead | ||
![]() |
994e83811f | ||
![]() |
52fe19ca31 | ||
![]() |
6fa29d6e2e | ||
![]() |
91d35c7c5c | ||
![]() |
f87c44e544 | ||
![]() |
600db816a2 | ||
![]() |
a9908f0a94 | ||
![]() |
c555ab1a84 | ||
![]() |
d93c09327a | ||
![]() |
45beb3c6e4 | ||
![]() |
bea354b82a | ||
![]() |
615a346a39 | ||
![]() |
dbcc294d67 | ||
![]() |
5a9970e63c | ||
![]() |
89fe488b7c | ||
![]() |
d6e1bc3e75 | ||
![]() |
5ddcc22583 | ||
![]() |
e1d66f6fdd | ||
![]() |
4e3414fc8a | ||
![]() |
2553b0d1e0 | ||
![]() |
2d8bb8e6d2 | ||
![]() |
e365f807c1 | ||
![]() |
87504806b1 | ||
![]() |
e742711a76 | ||
![]() |
667a87988d | ||
![]() |
4337dd6864 | ||
![]() |
fc286900d3 | ||
![]() |
908e044db1 | ||
![]() |
bb60286ed9 | ||
![]() |
983b1e1e9d | ||
![]() |
29f50ddc9c | ||
![]() |
028e08c7f6 | ||
![]() |
b0bb125860 | ||
![]() |
59d707df54 | ||
![]() |
fb33667c5a | ||
![]() |
6924192523 | ||
![]() |
7bd6f5413d | ||
![]() |
2239f2f732 | ||
![]() |
6d24a65313 | ||
![]() |
4bcceb4078 | ||
![]() |
f49831c03b | ||
![]() |
328cfe86b1 | ||
![]() |
c5adcab195 | ||
![]() |
c7ab5de07c | ||
![]() |
ab1eda7412 | ||
![]() |
fffda27385 | ||
![]() |
5d649b2541 | ||
![]() |
173d7fa060 | ||
![]() |
c75d3ce8c7 | ||
![]() |
e6a6c3ceb6 | ||
![]() |
ad5a396c10 | ||
![]() |
ec2c7ea932 | ||
![]() |
200e140e80 | ||
![]() |
19dd797dfe | ||
![]() |
00b6409b76 | ||
![]() |
538bb60022 | ||
![]() |
44afffcfbf | ||
![]() |
138470d86c | ||
![]() |
4b1626a748 | ||
![]() |
f8f8dddca7 | ||
![]() |
d454c6a43d | ||
![]() |
b160f1c813 | ||
![]() |
ab493eba96 | ||
![]() |
c25cf82668 | ||
![]() |
95e7c98c91 | ||
![]() |
b2af1de273 | ||
![]() |
5aca16ef01 | ||
![]() |
fc670e46d9 | ||
![]() |
f965fb6350 | ||
![]() |
20aa089243 | ||
![]() |
4f519a2fe1 | ||
![]() |
1e8281fb06 | ||
![]() |
ee47becd00 | ||
![]() |
8407321cfd | ||
![]() |
e273ff5e5e | ||
![]() |
24c45bfd84 | ||
![]() |
e3f47beda4 | ||
![]() |
8901508df6 | ||
![]() |
9f713dac7f | ||
![]() |
4f50b858d0 | ||
![]() |
123ae941a9 | ||
![]() |
ea9f1376a6 | ||
![]() |
6e6ebb9495 | ||
![]() |
946b77e2ec | ||
![]() |
8c4a139aeb | ||
![]() |
d5f73378f0 | ||
![]() |
b893150154 | ||
![]() |
c18a6d5ea3 | ||
![]() |
f839ba00eb | ||
![]() |
2ab79115d1 | ||
![]() |
9aa0e76d65 | ||
![]() |
e88af54016 | ||
![]() |
df121c2e88 | ||
![]() |
91e7bcbfac | ||
![]() |
2af9f4fffe | ||
![]() |
11ee01424d | ||
![]() |
52e154f881 | ||
![]() |
c6a86edd36 | ||
![]() |
2dc6ba0ab4 | ||
![]() |
19ce367f88 | ||
![]() |
671e324f48 | ||
![]() |
c3542f8bb2 | ||
![]() |
569057c215 | ||
![]() |
c1962a4895 | ||
![]() |
44f8dab0b0 | ||
![]() |
5ea4a68aae | ||
![]() |
328cadbaa2 | ||
![]() |
04c4501455 | ||
![]() |
32e87fc4c7 | ||
![]() |
1db6e9fcb2 | ||
![]() |
c8aa55439f | ||
![]() |
5b5a232695 | ||
![]() |
10799952af | ||
![]() |
dfc66b2018 | ||
![]() |
f00f3d6b0c | ||
![]() |
de3f5e8d69 | ||
![]() |
302e631984 | ||
![]() |
d4dc7f806c | ||
![]() |
8e6e8dfbe0 | ||
![]() |
c254b71559 | ||
![]() |
d90a3b6c42 | ||
![]() |
da3ee0aa61 | ||
![]() |
eb17b68ad3 | ||
![]() |
2243855209 | ||
![]() |
82df4a3a4d | ||
![]() |
bc2ac65b1e | ||
![]() |
9bc04d7b5c | ||
![]() |
b620c53662 | ||
![]() |
ab35ceab5a | ||
![]() |
294a2d2460 | ||
![]() |
13dda7bd98 | ||
![]() |
14c35c9223 | ||
![]() |
8198970af9 | ||
![]() |
cfef8ee961 | ||
![]() |
25198242c1 | ||
![]() |
02c9e47db8 | ||
![]() |
c3c4752fa5 | ||
![]() |
6d3046cb42 | ||
![]() |
496da8823d | ||
![]() |
78d87dc40f | ||
![]() |
ca0648afe8 | ||
![]() |
7b9585cd8e | ||
![]() |
a0b3a9e50b | ||
![]() |
bc036351f6 | ||
![]() |
8e188d7e75 | ||
![]() |
9b7e31eca3 | ||
![]() |
0727c7b9e8 | ||
![]() |
e9e1ec5312 | ||
![]() |
e9c412bac6 | ||
![]() |
3331b81b64 | ||
![]() |
8259a5a71f | ||
![]() |
2edfa82237 | ||
![]() |
3100e852ce | ||
![]() |
1b0ccf10e5 | ||
![]() |
f38ff3b622 | ||
![]() |
3ad9052b5c | ||
![]() |
e0595ce518 | ||
![]() |
54bf83855c | ||
![]() |
2713469651 | ||
![]() |
64bdf2d35b | ||
![]() |
c3ac8869b0 | ||
![]() |
ecb37d0bdf | ||
![]() |
b2083a7bee | ||
![]() |
2ff255dedc | ||
![]() |
995f5db913 | ||
![]() |
9efbf2f880 | ||
![]() |
34fdf5a36f | ||
![]() |
f70a2ba1f7 | ||
![]() |
a000af5c03 | ||
![]() |
c2d1db61b6 | ||
![]() |
127cc744a4 | ||
![]() |
42ca566e05 | ||
![]() |
30c6ace0f3 | ||
![]() |
6b2baae0de | ||
![]() |
425c97626a | ||
![]() |
9535dd87b0 | ||
![]() |
4c38e6cfa5 | ||
![]() |
d510384c0d | ||
![]() |
f2fbe657c4 | ||
![]() |
c651ce06c5 | ||
![]() |
32499dc8fe | ||
![]() |
bc26be3c11 | ||
![]() |
70ee9d7f26 | ||
![]() |
a4c9446b8d | ||
![]() |
90f7cd2d44 | ||
![]() |
45b28b8b00 | ||
![]() |
dd7fbef948 | ||
![]() |
3845539577 | ||
![]() |
87e7e7fe8a | ||
![]() |
1adb45f74e | ||
![]() |
21dfee831f | ||
![]() |
eb718bffe0 | ||
![]() |
70f14600d1 | ||
![]() |
05289216c4 | ||
![]() |
c1814201be | ||
![]() |
dceb0d9bf7 | ||
![]() |
df768cab7d | ||
![]() |
9b8d1b88c5 | ||
![]() |
885cf20afa | ||
![]() |
663c994dfb | ||
![]() |
7eba08f385 | ||
![]() |
da8ce07216 | ||
![]() |
442499b452 | ||
![]() |
49db0a3720 | ||
![]() |
ebac7b7aad | ||
![]() |
b46eee04e4 | ||
![]() |
daf941e771 | ||
![]() |
d494da271a | ||
![]() |
ff936302d7 | ||
![]() |
8be7cb4539 | ||
![]() |
bdb998bdb3 | ||
![]() |
7cc683658b | ||
![]() |
9a40d5b7ed | ||
![]() |
ac9429988b | ||
![]() |
fb8f8133a0 | ||
![]() |
15ab63a4c2 | ||
![]() |
2d1002d40d | ||
![]() |
7dd42bc32d | ||
![]() |
b09b5729a3 | ||
![]() |
0b715b751d | ||
![]() |
ceb171974d | ||
![]() |
588409c784 | ||
![]() |
d03248962d | ||
![]() |
df744c5944 | ||
![]() |
292dcb7e37 | ||
![]() |
173c276c5c | ||
![]() |
ea709d0630 | ||
![]() |
cec3b57390 | ||
![]() |
3b246fb40a | ||
![]() |
5ff50e8b4f | ||
![]() |
10d25c798e | ||
![]() |
c3decc6531 | ||
![]() |
8d61893c39 | ||
![]() |
7383e81609 | ||
![]() |
db9b6aba31 | ||
![]() |
1c4b563e54 | ||
![]() |
57bbbbcf26 | ||
![]() |
a3e84791c6 | ||
![]() |
f5b7deda72 | ||
![]() |
38158376b3 | ||
![]() |
245eae89eb | ||
![]() |
837f7638cf | ||
![]() |
9675cc5ed2 | ||
![]() |
b0978f064f | ||
![]() |
14f035a39b | ||
![]() |
035b28045c | ||
![]() |
c6c7dd10f5 | ||
![]() |
ba8ae17487 | ||
![]() |
ad619817c6 | ||
![]() |
8b5ab3221f | ||
![]() |
eae21be5b9 | ||
![]() |
d7e3b0b755 | ||
![]() |
d95ffb3aa3 | ||
![]() |
46bbe816f6 | ||
![]() |
d54ee77375 | ||
![]() |
265666b75a | ||
![]() |
4901fa24ec | ||
![]() |
d92d74a14f | ||
![]() |
b9336272d4 | ||
![]() |
1bd1b8339d | ||
![]() |
078ce6766e | ||
![]() |
abdee3fcb7 | ||
![]() |
3873b23704 | ||
![]() |
81569f10c0 | ||
![]() |
8fb89854d3 | ||
![]() |
9d38413e7c | ||
![]() |
ddef681dd2 | ||
![]() |
3697ea7b27 | ||
![]() |
bb8bbc9c54 | ||
![]() |
bee742994e | ||
![]() |
60bc517d01 | ||
![]() |
1f7803c541 | ||
![]() |
60eb488d0c | ||
![]() |
2304a76979 | ||
![]() |
5cfae3f177 | ||
![]() |
a61224c578 | ||
![]() |
325e5416ef | ||
![]() |
894aac1b45 | ||
![]() |
b3286a4a01 | ||
![]() |
c19a1bf26d | ||
![]() |
93f7f78263 | ||
![]() |
cb98d62968 | ||
![]() |
643848cac4 | ||
![]() |
0ba04ec1ef | ||
![]() |
a33e5728de | ||
![]() |
087ddcb682 | ||
![]() |
e8da7f333b | ||
![]() |
33849a15a8 | ||
![]() |
e3d90f53cc | ||
![]() |
e1e768fa65 | ||
![]() |
b48dcca05d | ||
![]() |
648b340e8c | ||
![]() |
98e7865457 | ||
![]() |
cc1564da4a | ||
![]() |
cf563df42a | ||
![]() |
6ca2c4da3a | ||
![]() |
b3b770476d | ||
![]() |
2dbd8cf72c | ||
![]() |
db2110f0c6 | ||
![]() |
34ecc803b3 | ||
![]() |
de2eab30fa | ||
![]() |
69b98def5c | ||
![]() |
0d2de919a6 | ||
![]() |
8a68b1a3a9 | ||
![]() |
8392406476 | ||
![]() |
565b54d852 | ||
![]() |
49dc7ffb5b | ||
![]() |
5fd8763c3c | ||
![]() |
f3b6575272 | ||
![]() |
66ac5d5b76 | ||
![]() |
c39fe36a1c | ||
![]() |
476072927a | ||
![]() |
c2a90a4f0d | ||
![]() |
6dfffb23c4 | ||
![]() |
cedf7e3945 | ||
![]() |
98a2efcbab | ||
![]() |
b31284b855 | ||
![]() |
a1aebe904e | ||
![]() |
ffa111deb9 | ||
![]() |
f53dfc4308 | ||
![]() |
e4ee4cf302 | ||
![]() |
f7b822d000 | ||
![]() |
529656cf64 | ||
![]() |
738ef38ddc | ||
![]() |
d99e228983 | ||
![]() |
e3e2e817e5 | ||
![]() |
2e6108365e | ||
![]() |
67c3a4c970 | ||
![]() |
15f41c84f9 | ||
![]() |
d28b477f9a | ||
![]() |
a16e742107 | ||
![]() |
5711c0882f | ||
![]() |
18e4493ca3 | ||
![]() |
60dd2213cf | ||
![]() |
00e67fb2c7 | ||
![]() |
40ce8f8c9c | ||
![]() |
983ed8b8b4 | ||
![]() |
b1326928df | ||
![]() |
171c1b20f7 | ||
![]() |
0793b5ac62 | ||
![]() |
c8df5fb8ad | ||
![]() |
d33cf28936 | ||
![]() |
f89c73d79d | ||
![]() |
3f0936f068 | ||
![]() |
fca90a8ddc | ||
![]() |
39336d3ea3 | ||
![]() |
e3bcfb88e7 | ||
![]() |
b855177fe6 | ||
![]() |
de317fb2f6 | ||
![]() |
f38011560f | ||
![]() |
5bf7e0fcc0 | ||
![]() |
24840b54ac | ||
![]() |
7653dc947a | ||
![]() |
0f39296251 | ||
![]() |
dd0fd36049 | ||
![]() |
30a391b88b | ||
![]() |
71803cbdef | ||
![]() |
f5eafbe760 | ||
![]() |
52f710528f | ||
![]() |
38b729b00a | ||
![]() |
5dae7f8451 | ||
![]() |
6a297b3758 | ||
![]() |
ab7afbdaf7 | ||
![]() |
0763503151 | ||
![]() |
000ad256fb | ||
![]() |
d3a4270312 | ||
![]() |
8d3a415d07 | ||
![]() |
927c2314c4 | ||
![]() |
528c7f4871 | ||
![]() |
61b4d1e8de | ||
![]() |
b00b8ea0c1 | ||
![]() |
59f1a1be93 | ||
![]() |
262b01d632 | ||
![]() |
03dd92d51b | ||
![]() |
d267d674b9 | ||
![]() |
c20a965eda | ||
![]() |
bf1b408038 | ||
![]() |
d7e9959442 | ||
![]() |
906385172a | ||
![]() |
1c25468b21 | ||
![]() |
c3c7b68cac | ||
![]() |
0a3ec6fea1 | ||
![]() |
feed139ae7 | ||
![]() |
db72039b8f | ||
![]() |
dde93304d3 | ||
![]() |
d2e70eb967 | ||
![]() |
22ae498f3a | ||
![]() |
fddaea797e | ||
![]() |
0d95eff21d | ||
![]() |
541e30d155 | ||
![]() |
6f1900c6f4 | ||
![]() |
03cae17992 | ||
![]() |
886308a953 | ||
![]() |
ed71683488 | ||
![]() |
71a47fc80c | ||
![]() |
187b6525b4 | ||
![]() |
7d3c974747 | ||
![]() |
d85222ad80 | ||
![]() |
39a01fcdc6 | ||
![]() |
29d06e8faf | ||
![]() |
e8a0abd107 | ||
![]() |
025cce3445 | ||
![]() |
b9b1cee403 | ||
![]() |
9dfcae3dc2 | ||
![]() |
29df8e546f | ||
![]() |
f71125092f | ||
![]() |
b112be3556 | ||
![]() |
211ed3d596 | ||
![]() |
46fa20411e | ||
![]() |
debc1f78d4 | ||
![]() |
05192b7164 | ||
![]() |
4a9f4f585d | ||
![]() |
0d05bd309a | ||
![]() |
b60527c986 | ||
![]() |
c628c2cef2 | ||
![]() |
c6ba607c8c | ||
![]() |
07ae3f9ee9 | ||
![]() |
42353282d4 | ||
![]() |
1041dbe23c | ||
![]() |
8a8ee95336 | ||
![]() |
851c1711d4 | ||
![]() |
f1d3c0d19b | ||
![]() |
cd300f54a8 | ||
![]() |
dc7127aacf | ||
![]() |
4ead87270e | ||
![]() |
d1663f2733 | ||
![]() |
1634592d90 | ||
![]() |
ddddd8566d | ||
![]() |
5cf2043c04 | ||
![]() |
43777ace20 | ||
![]() |
a7e5cc31c3 | ||
![]() |
aa6520cac1 | ||
![]() |
af10cd315e | ||
![]() |
ef28bcaa9c | ||
![]() |
ff3bfade31 | ||
![]() |
4eafd8adf7 | ||
![]() |
cb5de0e090 | ||
![]() |
254394ecab | ||
![]() |
e4e0c37a8c | ||
![]() |
6f7bd673fb | ||
![]() |
3a74066529 | ||
![]() |
b8e9e3af2f | ||
![]() |
4e6fd19624 | ||
![]() |
a813847f6e | ||
![]() |
066254afdf | ||
![]() |
912eb321d9 | ||
![]() |
c0315e32bd | ||
![]() |
dd37c3f447 | ||
![]() |
54dd77fe88 | ||
![]() |
c8e0daee24 | ||
![]() |
b7dd8cdf50 | ||
![]() |
62835f0536 | ||
![]() |
730d90fb8c | ||
![]() |
eccab375a2 | ||
![]() |
b5c89b4ef4 | ||
![]() |
2d751c1edd | ||
![]() |
d1c1aa518d | ||
![]() |
ae22b5187a | ||
![]() |
aef06a3544 | ||
![]() |
83cc871edf | ||
![]() |
d2cd557523 | ||
![]() |
d98171ed05 | ||
![]() |
2065039f65 | ||
![]() |
081b822d25 | ||
![]() |
f25321e010 | ||
![]() |
e27d5cd9fb | ||
![]() |
6f449cd383 | ||
![]() |
d47cef4ba2 | ||
![]() |
a8da03912e | ||
![]() |
8f233b822f | ||
![]() |
060c6c89e3 | ||
![]() |
96dc0319d8 | ||
![]() |
08b0c1178b | ||
![]() |
252c724602 | ||
![]() |
c529bcca9b | ||
![]() |
9b94d128ad | ||
![]() |
9c224e0515 | ||
![]() |
899e7bfb5a | ||
![]() |
ef5f4b2aca | ||
![]() |
2b0bdd580c | ||
![]() |
08c9ceb752 | ||
![]() |
e64104300f | ||
![]() |
cb058ff6c0 | ||
![]() |
55870aec31 | ||
![]() |
3df46cd70a | ||
![]() |
9165ea5fbd | ||
![]() |
a30e217bb5 | ||
![]() |
f2dad7905d | ||
![]() |
3db9d6a6aa | ||
![]() |
8fbdc703e0 | ||
![]() |
201e958854 | ||
![]() |
36a606f81d | ||
![]() |
b719a77503 | ||
![]() |
6afe6acb6c | ||
![]() |
4b2c45e668 | ||
![]() |
4caf65dc97 | ||
![]() |
39408ab240 | ||
![]() |
1d89d22a38 | ||
![]() |
8b0a0ee521 | ||
![]() |
9fd0192441 | ||
![]() |
30fd9950e2 | ||
![]() |
b10319f69e | ||
![]() |
1d2713b0ea | ||
![]() |
457d439e24 | ||
![]() |
590e714021 | ||
![]() |
4ebbabcdd1 | ||
![]() |
314bc07cee | ||
![]() |
23e091696e | ||
![]() |
f8f05c4d0d | ||
![]() |
5a55d50879 | ||
![]() |
58ae117bb4 | ||
![]() |
be3cf52613 | ||
![]() |
e28bcb52d9 | ||
![]() |
4a4496b21d | ||
![]() |
7ae802bb0d | ||
![]() |
aaa1d06809 | ||
![]() |
4e043b3123 | ||
![]() |
775010f160 | ||
![]() |
e86fb3fc5c | ||
![]() |
fbd197146a | ||
![]() |
c63ec698a1 | ||
![]() |
71aaf2d809 | ||
![]() |
400602a8b3 | ||
![]() |
4a32a0f1da | ||
![]() |
0cf9268ca8 | ||
![]() |
fb93b79b12 | ||
![]() |
eff9b2a1a0 | ||
![]() |
4dbbf93af9 | ||
![]() |
3d73f166be | ||
![]() |
0e6aacb440 | ||
![]() |
cc443ff37a | ||
![]() |
2cfa0af532 | ||
![]() |
83fb5e5071 | ||
![]() |
955c94e313 | ||
![]() |
b892dbc6ea | ||
![]() |
3566803d2e | ||
![]() |
774b1d1663 | ||
![]() |
90dd796644 | ||
![]() |
a473ae6711 | ||
![]() |
be99f3bf32 | ||
![]() |
5047635224 | ||
![]() |
e6ed2f0377 | ||
![]() |
b88f56cbfb | ||
![]() |
06216a8a45 | ||
![]() |
f085a0c54a | ||
![]() |
b783aab41b | ||
![]() |
12b408219e | ||
![]() |
6cafc9aaef | ||
![]() |
f5cbc9d208 | ||
![]() |
dd1608db0d | ||
![]() |
f2f03cf552 | ||
![]() |
977f1a6916 | ||
![]() |
ffefdcfe22 | ||
![]() |
f4eb1f0652 | ||
![]() |
23668f3c5e | ||
![]() |
6208d8c911 | ||
![]() |
d0dad4bfd6 | ||
![]() |
7330e30fd3 | ||
![]() |
a9cbd355ca | ||
![]() |
3e0eaa3c87 | ||
![]() |
98f68f4798 | ||
![]() |
0e3c1dc031 | ||
![]() |
9508c51403 | ||
![]() |
531207e005 | ||
![]() |
952aa02e37 | ||
![]() |
3e0ccd2e86 | ||
![]() |
bcd1eb952c | ||
![]() |
01bf4daf37 | ||
![]() |
0186ce7896 | ||
![]() |
f42804805c | ||
![]() |
eee0a6e9f4 | ||
![]() |
0e6b905cdf | ||
![]() |
d59209ff47 | ||
![]() |
ad8cf2d0d0 | ||
![]() |
fe0db80fb8 | ||
![]() |
ef61118d49 | ||
![]() |
de54659097 | ||
![]() |
ad3c5240c2 | ||
![]() |
0f9790f5f1 | ||
![]() |
68e86c5e3a | ||
![]() |
1cd0e764b6 | ||
![]() |
d45c386149 | ||
![]() |
dd3cd95954 | ||
![]() |
188ca630de | ||
![]() |
ffafcf27a8 | ||
![]() |
21098bc3e5 | ||
![]() |
1f9f5bfaa8 | ||
![]() |
312af53935 | ||
![]() |
3c2df7f8f2 | ||
![]() |
42cb5a5239 | ||
![]() |
d832ce0b26 | ||
![]() |
f32ae95ef4 | ||
![]() |
de2f506585 | ||
![]() |
f7ae78f78e | ||
![]() |
5bedc4ede2 | ||
![]() |
03a090e384 | ||
![]() |
dd232a3507 | ||
![]() |
03a9e3284c | ||
![]() |
c08ca8a439 | ||
![]() |
bf16b50679 | ||
![]() |
5a1b0edd96 | ||
![]() |
1477087c71 | ||
![]() |
4a2236fe85 | ||
![]() |
95cefd1acc | ||
![]() |
5ce31cb383 | ||
![]() |
ff391e538a | ||
![]() |
28a2c9c653 | ||
![]() |
369ffe2288 | ||
![]() |
5f72ad8da6 | ||
![]() |
00c38c5f70 | ||
![]() |
18a4829314 | ||
![]() |
c629e7dc0e | ||
![]() |
73c52e668e | ||
![]() |
6cafc45d2b | ||
![]() |
4f767dd3ef | ||
![]() |
c89975adf6 | ||
![]() |
867630a4a7 | ||
![]() |
a6d5ed0160 | ||
![]() |
f93e4e3de7 | ||
![]() |
f5a6c3484d | ||
![]() |
b8afb9277a | ||
![]() |
262ed9ed2a | ||
![]() |
f1e58d0784 | ||
![]() |
6c6318d18f | ||
![]() |
3dc6612cd9 | ||
![]() |
a38db1f677 | ||
![]() |
558cccc68c | ||
![]() |
b598ff94d1 | ||
![]() |
c267946284 | ||
![]() |
07ce284acd | ||
![]() |
6c4b4ad1e0 | ||
![]() |
815d153e55 | ||
![]() |
eac03ef4be | ||
![]() |
a38e075bda | ||
![]() |
cced74740f | ||
![]() |
1236c2b91e | ||
![]() |
d54d7c6958 | ||
![]() |
9365ba3fcf | ||
![]() |
5650b390b9 | ||
![]() |
8f4d3146c1 | ||
![]() |
2647296475 | ||
![]() |
6d311a31dd | ||
![]() |
4bbc0a03ca | ||
![]() |
16670a38a4 | ||
![]() |
eb8e8d00a6 | ||
![]() |
d5f4dfdd6b | ||
![]() |
4a0a56ebdc | ||
![]() |
6990c70123 | ||
![]() |
bb68e7a532 | ||
![]() |
bb3592baa0 | ||
![]() |
1fa996ed68 | ||
![]() |
2a3c94bad0 | ||
![]() |
3ee05ad4bb | ||
![]() |
44425a184e | ||
![]() |
28c2f9caa9 | ||
![]() |
2a36adae46 | ||
![]() |
46985bba0d | ||
![]() |
3f4a7ec396 | ||
![]() |
ad9f4db983 | ||
![]() |
0e2fa7700d | ||
![]() |
109f083c5d | ||
![]() |
fb22f6c301 | ||
![]() |
aec2fe86e4 | ||
![]() |
763ed0dc7b | ||
![]() |
baf7fb7264 | ||
![]() |
f150c9c65c | ||
![]() |
d979648c01 | ||
![]() |
9226589bcd | ||
![]() |
edfe8e1583 | ||
![]() |
b36b1dbc70 | ||
![]() |
253c848692 | ||
![]() |
7a6ac578b4 | ||
![]() |
e616ab5fb2 | ||
![]() |
3c59791b2e | ||
![]() |
b50281a917 | ||
![]() |
2d002f3ef6 | ||
![]() |
6180f7bd64 | ||
![]() |
45241e57ca | ||
![]() |
cd57b764ce | ||
![]() |
c2a9aba467 | ||
![]() |
5c2bd8b743 | ||
![]() |
513abcb7e5 | ||
![]() |
1ff245d9c2 | ||
![]() |
2360fd4141 | ||
![]() |
95de94e53f | ||
![]() |
ea23ffedfe | ||
![]() |
bf4b099f11 | ||
![]() |
b8fdebd05c | ||
![]() |
181b2803cd | ||
![]() |
0e3dc7976c | ||
![]() |
c8d4cf08d9 | ||
![]() |
df67ab995f | ||
![]() |
e0f2fa33df | ||
![]() |
884c346bdf | ||
![]() |
c218ff5a75 | ||
![]() |
fa43a218d2 | ||
![]() |
f4cc64d289 | ||
![]() |
4c31829832 | ||
![]() |
ff32c1c3e9 | ||
![]() |
c21a2eab22 | ||
![]() |
df2351b920 | ||
![]() |
4332cbe112 | ||
![]() |
f9a7c64106 | ||
![]() |
49ebea2be3 | ||
![]() |
b09a9fc81a | ||
![]() |
fa60e9b03b | ||
![]() |
0b2a8bf79a | ||
![]() |
087b672449 | ||
![]() |
d3f9408650 | ||
![]() |
6e6ad94df6 | ||
![]() |
e344c2ea64 | ||
![]() |
ab8c50895e | ||
![]() |
f0472f2dc2 | ||
![]() |
0249daef2e | ||
![]() |
8d2e72cdf6 | ||
![]() |
52ac7285a7 | ||
![]() |
2a3d688923 | ||
![]() |
ca3a22b5a3 | ||
![]() |
912cda4e6f | ||
![]() |
c79b3df73f | ||
![]() |
8423d18d8d | ||
![]() |
9d87c1ab1a | ||
![]() |
f95c3e265d | ||
![]() |
66402b9b38 | ||
![]() |
99877c32b1 | ||
![]() |
4510e83150 | ||
![]() |
252d934caa | ||
![]() |
e8bd1b9216 | ||
![]() |
99d732b974 | ||
![]() |
05e7238c45 | ||
![]() |
677c276b41 | ||
![]() |
991afccbd4 | ||
![]() |
d5e606640c | ||
![]() |
ca1c696f54 | ||
![]() |
78e5878247 | ||
![]() |
470537bc5f | ||
![]() |
64556f6f69 | ||
![]() |
2785b067e3 | ||
![]() |
a129bc05ae | ||
![]() |
197736f66b | ||
![]() |
6d4fa76107 | ||
![]() |
ba2558790d | ||
![]() |
79f6d55fe8 | ||
![]() |
403b4a2e0b | ||
![]() |
8272c71811 | ||
![]() |
699ca44260 | ||
![]() |
5893f6b14b | ||
![]() |
a7b08c48f3 | ||
![]() |
0148708613 | ||
![]() |
81cef9a281 | ||
![]() |
2bb29485be | ||
![]() |
57820be92a | ||
![]() |
e18bea0215 | ||
![]() |
49c2a4a4e3 | ||
![]() |
ebc4804e04 | ||
![]() |
ffc9bcb4d7 | ||
![]() |
d82d7fa2e9 | ||
![]() |
e87fab6b5f | ||
![]() |
663db747e9 | ||
![]() |
57998f6f0f | ||
![]() |
edbb995fff | ||
![]() |
312903025d | ||
![]() |
0ae5c325fe | ||
![]() |
b6d9454b54 | ||
![]() |
85328399e0 | ||
![]() |
836413a4a8 | ||
![]() |
d16d44d3e7 | ||
![]() |
c2ac8e813a | ||
![]() |
37687561c0 | ||
![]() |
acf41d03db | ||
![]() |
92d373055f | ||
![]() |
c00f04221f | ||
![]() |
414559f018 | ||
![]() |
661101df08 | ||
![]() |
ecbcdee934 | ||
![]() |
eb77b94315 | ||
![]() |
6ab14a3729 | ||
![]() |
f81464161a | ||
![]() |
3461f3a1ed | ||
![]() |
0ed7bc3b8e | ||
![]() |
d8e3e9abaa | ||
![]() |
c3c5cc9ae7 | ||
![]() |
5db1a67c20 | ||
![]() |
1a4199c485 | ||
![]() |
8cb1d630c8 | ||
![]() |
f275b7e5ed | ||
![]() |
c9592c1447 | ||
![]() |
ff2367fffb | ||
![]() |
4c9303bbd5 | ||
![]() |
84712d2f40 | ||
![]() |
5a2aabea9c | ||
![]() |
23045af4a7 | ||
![]() |
9451920ab5 | ||
![]() |
62f2ee5f60 | ||
![]() |
c8c81d493d | ||
![]() |
d33a3ca90f | ||
![]() |
5b4d2aed64 | ||
![]() |
242aff9269 | ||
![]() |
445ef861c0 | ||
![]() |
03c906a2f1 | ||
![]() |
e0d2e5dcb0 | ||
![]() |
5c1dc60505 | ||
![]() |
f6ce5f2d05 | ||
![]() |
08aa4b098c | ||
![]() |
5123baba3f | ||
![]() |
ede0cfaeb8 | ||
![]() |
34e44e7f3a | ||
![]() |
0cb27ff236 | ||
![]() |
cb450dcebd | ||
![]() |
661570dfad | ||
![]() |
05abf37046 | ||
![]() |
7c79adad8f | ||
![]() |
e0769f9ad4 | ||
![]() |
7d23a734fc | ||
![]() |
4e4fd90455 | ||
![]() |
4517f0d59a | ||
![]() |
c1ceab09e5 | ||
![]() |
609263e1bb | ||
![]() |
f02c5f66d6 | ||
![]() |
82c8f18bc7 | ||
![]() |
a9d16d4276 | ||
![]() |
505de3dce3 | ||
![]() |
52a4c16980 | ||
![]() |
a2ac335222 | ||
![]() |
cd79720a14 | ||
![]() |
576970d1ad | ||
![]() |
9146f76b01 | ||
![]() |
e97d21aec0 | ||
![]() |
097b056324 | ||
![]() |
aece76f6cd | ||
![]() |
7bbffa6e6d | ||
![]() |
ff582721dd | ||
![]() |
3910ab6cab | ||
![]() |
5c83367bb0 | ||
![]() |
433b89de50 | ||
![]() |
4c32fd12fc | ||
![]() |
a3e2504470 | ||
![]() |
d98432c328 | ||
![]() |
1da35e2939 | ||
![]() |
0c49c8578b | ||
![]() |
abd1909e2b | ||
![]() |
86d48c608e | ||
![]() |
a278cf3db2 | ||
![]() |
2cda7bf1e7 | ||
![]() |
7ac014744c | ||
![]() |
51b9afe3c1 | ||
![]() |
397238372e | ||
![]() |
682fcec99e | ||
![]() |
41cd3ba532 | ||
![]() |
426f546c2f | ||
![]() |
2f1824774f | ||
![]() |
999c5443c1 | ||
![]() |
7ec7306ea8 | ||
![]() |
8d68f34650 | ||
![]() |
c1908d16b5 | ||
![]() |
40356b4fc5 | ||
![]() |
f4b3760a1a | ||
![]() |
fa63dc1e25 | ||
![]() |
b9ad40ed38 | ||
![]() |
77b3f31e9b | ||
![]() |
451c6c25cd | ||
![]() |
af021b1c81 | ||
![]() |
4e3b079a29 | ||
![]() |
9a099bdf0a | ||
![]() |
cf8dfdae47 | ||
![]() |
6e95b90f42 | ||
![]() |
d36259f067 | ||
![]() |
d62bb9ed47 | ||
![]() |
ef54f33af7 | ||
![]() |
1391f90a30 | ||
![]() |
2889067ece | ||
![]() |
f4bf66aecd | ||
![]() |
2f80489428 | ||
![]() |
b6e69cd370 | ||
![]() |
f9634f0232 | ||
![]() |
6affb27711 | ||
![]() |
5ec76af875 | ||
![]() |
5b41680506 | ||
![]() |
4f81109304 | ||
![]() |
04763c5bfb | ||
![]() |
e5e38edcb2 | ||
![]() |
e86919a997 | ||
![]() |
d04479044c | ||
![]() |
7737387efe | ||
![]() |
743166d284 | ||
![]() |
5dd031af17 | ||
![]() |
750ed2facd | ||
![]() |
aa972b0005 | ||
![]() |
628f77f8f2 | ||
![]() |
9db3900cff | ||
![]() |
fd5895118e | ||
![]() |
607cdfdd32 | ||
![]() |
460857a765 | ||
![]() |
6bd55011a8 | ||
![]() |
e2a113a2de | ||
![]() |
86f61b8e55 | ||
![]() |
f3fed5647e | ||
![]() |
992daa4a44 | ||
![]() |
26d7b2164e | ||
![]() |
31d150794d | ||
![]() |
7e6e36db15 | ||
![]() |
4f0997f6e9 | ||
![]() |
94b6ab2862 | ||
![]() |
11a25157c1 | ||
![]() |
ff92a8b260 | ||
![]() |
1fe26c77e0 | ||
![]() |
00d5e5cfb2 | ||
![]() |
c968e455a9 | ||
![]() |
a3dd9979d2 | ||
![]() |
6e97975ff8 | ||
![]() |
af7c01f957 | ||
![]() |
29533d8d4d | ||
![]() |
374a8157e7 | ||
![]() |
40fc72aac2 | ||
![]() |
b8fab33e69 | ||
![]() |
221d5205e4 | ||
![]() |
77ebda0c20 | ||
![]() |
ac30e5799c | ||
![]() |
f9a0b4b3cf | ||
![]() |
233568ac29 | ||
![]() |
76b0302c7f | ||
![]() |
8bc542776b | ||
![]() |
5f5cb8bea8 | ||
![]() |
da761fdd39 | ||
![]() |
22415ce49a | ||
![]() |
19be4a5d6d |
214
.coveragerc
214
.coveragerc
@@ -8,32 +8,35 @@ omit =
|
||||
homeassistant/scripts/*.py
|
||||
|
||||
# omit pieces of code that rely on external devices being present
|
||||
homeassistant/components/abode/__init__.py
|
||||
homeassistant/components/abode/alarm_control_panel.py
|
||||
homeassistant/components/abode/binary_sensor.py
|
||||
homeassistant/components/abode/camera.py
|
||||
homeassistant/components/abode/cover.py
|
||||
homeassistant/components/abode/light.py
|
||||
homeassistant/components/abode/lock.py
|
||||
homeassistant/components/abode/sensor.py
|
||||
homeassistant/components/abode/switch.py
|
||||
homeassistant/components/acer_projector/switch.py
|
||||
homeassistant/components/actiontec/device_tracker.py
|
||||
homeassistant/components/acmeda/__init__.py
|
||||
homeassistant/components/acmeda/base.py
|
||||
homeassistant/components/acmeda/const.py
|
||||
homeassistant/components/acmeda/cover.py
|
||||
homeassistant/components/acmeda/errors.py
|
||||
homeassistant/components/acmeda/helpers.py
|
||||
homeassistant/components/acmeda/hub.py
|
||||
homeassistant/components/acmeda/sensor.py
|
||||
homeassistant/components/adguard/__init__.py
|
||||
homeassistant/components/adguard/const.py
|
||||
homeassistant/components/adguard/sensor.py
|
||||
homeassistant/components/adguard/switch.py
|
||||
homeassistant/components/ads/*
|
||||
homeassistant/components/aftership/sensor.py
|
||||
homeassistant/components/agent_dvr/__init__.py
|
||||
homeassistant/components/agent_dvr/camera.py
|
||||
homeassistant/components/agent_dvr/const.py
|
||||
homeassistant/components/agent_dvr/helpers.py
|
||||
homeassistant/components/airly/__init__.py
|
||||
homeassistant/components/airly/air_quality.py
|
||||
homeassistant/components/airly/sensor.py
|
||||
homeassistant/components/airly/const.py
|
||||
homeassistant/components/airvisual/__init__.py
|
||||
homeassistant/components/airvisual/air_quality.py
|
||||
homeassistant/components/airvisual/sensor.py
|
||||
homeassistant/components/aladdin_connect/cover.py
|
||||
homeassistant/components/alarmdecoder/*
|
||||
homeassistant/components/alarmdotcom/alarm_control_panel.py
|
||||
homeassistant/components/alpha_vantage/sensor.py
|
||||
homeassistant/components/amazon_polly/tts.py
|
||||
homeassistant/components/ambiclimate/climate.py
|
||||
@@ -43,7 +46,6 @@ omit =
|
||||
homeassistant/components/android_ip_webcam/*
|
||||
homeassistant/components/anel_pwrctrl/switch.py
|
||||
homeassistant/components/anthemav/media_player.py
|
||||
homeassistant/components/apache_kafka/*
|
||||
homeassistant/components/apcupsd/*
|
||||
homeassistant/components/apple_tv/*
|
||||
homeassistant/components/aqualogic/*
|
||||
@@ -55,6 +57,7 @@ omit =
|
||||
homeassistant/components/arest/sensor.py
|
||||
homeassistant/components/arest/switch.py
|
||||
homeassistant/components/arlo/*
|
||||
homeassistant/components/arris_tg2492lg/*
|
||||
homeassistant/components/aruba/device_tracker.py
|
||||
homeassistant/components/arwn/sensor.py
|
||||
homeassistant/components/asterisk_cdr/mailbox.py
|
||||
@@ -62,11 +65,10 @@ omit =
|
||||
homeassistant/components/aten_pe/*
|
||||
homeassistant/components/atome/*
|
||||
homeassistant/components/aurora_abb_powerone/sensor.py
|
||||
homeassistant/components/automatic/device_tracker.py
|
||||
homeassistant/components/avea/light.py
|
||||
homeassistant/components/avion/light.py
|
||||
homeassistant/components/avri/const.py
|
||||
homeassistant/components/avri/sensor.py
|
||||
homeassistant/components/azure_event_hub/*
|
||||
homeassistant/components/azure_service_bus/*
|
||||
homeassistant/components/baidu/tts.py
|
||||
homeassistant/components/beewi_smartclim/sensor.py
|
||||
@@ -76,7 +78,12 @@ omit =
|
||||
homeassistant/components/bh1750/sensor.py
|
||||
homeassistant/components/bitcoin/sensor.py
|
||||
homeassistant/components/bizkaibus/sensor.py
|
||||
homeassistant/components/blink/*
|
||||
homeassistant/components/blink/__init__.py
|
||||
homeassistant/components/blink/alarm_control_panel.py
|
||||
homeassistant/components/blink/binary_sensor.py
|
||||
homeassistant/components/blink/camera.py
|
||||
homeassistant/components/blink/const.py
|
||||
homeassistant/components/blink/sensor.py
|
||||
homeassistant/components/blinksticklight/light.py
|
||||
homeassistant/components/blinkt/light.py
|
||||
homeassistant/components/blockchain/sensor.py
|
||||
@@ -85,20 +92,25 @@ omit =
|
||||
homeassistant/components/bluetooth_tracker/*
|
||||
homeassistant/components/bme280/sensor.py
|
||||
homeassistant/components/bme680/sensor.py
|
||||
homeassistant/components/bmp280/sensor.py
|
||||
homeassistant/components/bmw_connected_drive/*
|
||||
homeassistant/components/bom/camera.py
|
||||
homeassistant/components/bom/sensor.py
|
||||
homeassistant/components/bom/weather.py
|
||||
homeassistant/components/braviatv/__init__.py
|
||||
homeassistant/components/braviatv/const.py
|
||||
homeassistant/components/braviatv/media_player.py
|
||||
homeassistant/components/broadlink/const.py
|
||||
homeassistant/components/broadlink/device.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
|
||||
homeassistant/components/bsblan/__init__.py
|
||||
homeassistant/components/bsblan/climate.py
|
||||
homeassistant/components/bsblan/const.py
|
||||
homeassistant/components/bt_home_hub_5/device_tracker.py
|
||||
homeassistant/components/bt_smarthub/device_tracker.py
|
||||
homeassistant/components/buienradar/sensor.py
|
||||
@@ -110,6 +122,7 @@ omit =
|
||||
homeassistant/components/cast/*
|
||||
homeassistant/components/cert_expiry/helper.py
|
||||
homeassistant/components/channels/*
|
||||
homeassistant/components/circuit/*
|
||||
homeassistant/components/cisco_ios/device_tracker.py
|
||||
homeassistant/components/cisco_mobility_express/device_tracker.py
|
||||
homeassistant/components/cisco_webex_teams/notify.py
|
||||
@@ -145,7 +158,15 @@ omit =
|
||||
homeassistant/components/deluge/switch.py
|
||||
homeassistant/components/denon/media_player.py
|
||||
homeassistant/components/denonavr/media_player.py
|
||||
homeassistant/components/denonavr/receiver.py
|
||||
homeassistant/components/deutsche_bahn/sensor.py
|
||||
homeassistant/components/devolo_home_control/__init__.py
|
||||
homeassistant/components/devolo_home_control/binary_sensor.py
|
||||
homeassistant/components/devolo_home_control/const.py
|
||||
homeassistant/components/devolo_home_control/devolo_device.py
|
||||
homeassistant/components/devolo_home_control/sensor.py
|
||||
homeassistant/components/devolo_home_control/subscriber.py
|
||||
homeassistant/components/devolo_home_control/switch.py
|
||||
homeassistant/components/dht/sensor.py
|
||||
homeassistant/components/digital_ocean/*
|
||||
homeassistant/components/digitalloggers/switch.py
|
||||
@@ -164,6 +185,8 @@ omit =
|
||||
homeassistant/components/dsmr_reader/*
|
||||
homeassistant/components/dte_energy_bridge/sensor.py
|
||||
homeassistant/components/dublin_bus_transport/sensor.py
|
||||
homeassistant/components/dunehd/__init__.py
|
||||
homeassistant/components/dunehd/const.py
|
||||
homeassistant/components/dunehd/media_player.py
|
||||
homeassistant/components/dwd_weather_warnings/sensor.py
|
||||
homeassistant/components/dweet/*
|
||||
@@ -229,22 +252,28 @@ omit =
|
||||
homeassistant/components/fleetgo/device_tracker.py
|
||||
homeassistant/components/flexit/climate.py
|
||||
homeassistant/components/flic/binary_sensor.py
|
||||
homeassistant/components/flick_electric/__init__.py
|
||||
homeassistant/components/flick_electric/const.py
|
||||
homeassistant/components/flick_electric/sensor.py
|
||||
homeassistant/components/flock/notify.py
|
||||
homeassistant/components/flume/*
|
||||
homeassistant/components/flunearyou/__init__.py
|
||||
homeassistant/components/flunearyou/sensor.py
|
||||
homeassistant/components/flux_led/light.py
|
||||
homeassistant/components/folder/sensor.py
|
||||
homeassistant/components/folder_watcher/*
|
||||
homeassistant/components/foobot/sensor.py
|
||||
homeassistant/components/fortios/device_tracker.py
|
||||
homeassistant/components/fortigate/*
|
||||
homeassistant/components/foscam/camera.py
|
||||
homeassistant/components/foscam/const.py
|
||||
homeassistant/components/foursquare/*
|
||||
homeassistant/components/free_mobile/notify.py
|
||||
homeassistant/components/freebox/*
|
||||
homeassistant/components/freebox/__init__.py
|
||||
homeassistant/components/freebox/device_tracker.py
|
||||
homeassistant/components/freebox/router.py
|
||||
homeassistant/components/freebox/sensor.py
|
||||
homeassistant/components/freebox/switch.py
|
||||
homeassistant/components/fritz/device_tracker.py
|
||||
homeassistant/components/fritzbox/*
|
||||
homeassistant/components/fritzbox_callmonitor/sensor.py
|
||||
homeassistant/components/fritzbox_netmonitor/sensor.py
|
||||
homeassistant/components/fronius/sensor.py
|
||||
@@ -256,7 +285,6 @@ omit =
|
||||
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
|
||||
@@ -264,10 +292,10 @@ omit =
|
||||
homeassistant/components/gitlab_ci/sensor.py
|
||||
homeassistant/components/gitter/sensor.py
|
||||
homeassistant/components/glances/__init__.py
|
||||
homeassistant/components/glances/const.py
|
||||
homeassistant/components/glances/sensor.py
|
||||
homeassistant/components/gntp/notify.py
|
||||
homeassistant/components/goalfeed/*
|
||||
homeassistant/components/gogogate2/cover.py
|
||||
homeassistant/components/google/*
|
||||
homeassistant/components/google_cloud/tts.py
|
||||
homeassistant/components/google_maps/device_tracker.py
|
||||
@@ -281,6 +309,10 @@ omit =
|
||||
homeassistant/components/growatt_server/sensor.py
|
||||
homeassistant/components/gstreamer/media_player.py
|
||||
homeassistant/components/gtfs/sensor.py
|
||||
homeassistant/components/guardian/__init__.py
|
||||
homeassistant/components/guardian/binary_sensor.py
|
||||
homeassistant/components/guardian/sensor.py
|
||||
homeassistant/components/guardian/switch.py
|
||||
homeassistant/components/habitica/*
|
||||
homeassistant/components/hangouts/*
|
||||
homeassistant/components/hangouts/__init__.py
|
||||
@@ -298,6 +330,7 @@ omit =
|
||||
homeassistant/components/hitron_coda/device_tracker.py
|
||||
homeassistant/components/hive/*
|
||||
homeassistant/components/hlk_sw16/*
|
||||
homeassistant/components/home_connect/*
|
||||
homeassistant/components/homematic/*
|
||||
homeassistant/components/homematic/climate.py
|
||||
homeassistant/components/homematic/cover.py
|
||||
@@ -310,7 +343,13 @@ omit =
|
||||
homeassistant/components/huawei_lte/*
|
||||
homeassistant/components/huawei_router/device_tracker.py
|
||||
homeassistant/components/hue/light.py
|
||||
homeassistant/components/hunterdouglas_powerview/__init__.py
|
||||
homeassistant/components/hunterdouglas_powerview/scene.py
|
||||
homeassistant/components/hunterdouglas_powerview/sensor.py
|
||||
homeassistant/components/hunterdouglas_powerview/cover.py
|
||||
homeassistant/components/hunterdouglas_powerview/entity.py
|
||||
homeassistant/components/hvv_departures/sensor.py
|
||||
homeassistant/components/hvv_departures/__init__.py
|
||||
homeassistant/components/hydrawise/*
|
||||
homeassistant/components/hyperion/light.py
|
||||
homeassistant/components/ialarm/alarm_control_panel.py
|
||||
@@ -343,11 +382,27 @@ omit =
|
||||
homeassistant/components/iqvia/*
|
||||
homeassistant/components/irish_rail_transport/sensor.py
|
||||
homeassistant/components/iss/binary_sensor.py
|
||||
homeassistant/components/isy994/*
|
||||
homeassistant/components/isy994/__init__.py
|
||||
homeassistant/components/isy994/binary_sensor.py
|
||||
homeassistant/components/isy994/climate.py
|
||||
homeassistant/components/isy994/cover.py
|
||||
homeassistant/components/isy994/entity.py
|
||||
homeassistant/components/isy994/fan.py
|
||||
homeassistant/components/isy994/helpers.py
|
||||
homeassistant/components/isy994/light.py
|
||||
homeassistant/components/isy994/lock.py
|
||||
homeassistant/components/isy994/sensor.py
|
||||
homeassistant/components/isy994/services.py
|
||||
homeassistant/components/isy994/switch.py
|
||||
homeassistant/components/itach/remote.py
|
||||
homeassistant/components/itunes/media_player.py
|
||||
homeassistant/components/joaoapps_join/*
|
||||
homeassistant/components/juicenet/*
|
||||
homeassistant/components/juicenet/__init__.py
|
||||
homeassistant/components/juicenet/const.py
|
||||
homeassistant/components/juicenet/device.py
|
||||
homeassistant/components/juicenet/entity.py
|
||||
homeassistant/components/juicenet/sensor.py
|
||||
homeassistant/components/juicenet/switch.py
|
||||
homeassistant/components/kaiterra/*
|
||||
homeassistant/components/kankun/switch.py
|
||||
homeassistant/components/keba/*
|
||||
@@ -387,7 +442,6 @@ omit =
|
||||
homeassistant/components/linux_battery/sensor.py
|
||||
homeassistant/components/lirc/*
|
||||
homeassistant/components/llamalab_automate/notify.py
|
||||
homeassistant/components/lockitron/lock.py
|
||||
homeassistant/components/logi_circle/__init__.py
|
||||
homeassistant/components/logi_circle/camera.py
|
||||
homeassistant/components/logi_circle/const.py
|
||||
@@ -398,7 +452,13 @@ omit =
|
||||
homeassistant/components/luftdaten/*
|
||||
homeassistant/components/lupusec/*
|
||||
homeassistant/components/lutron/*
|
||||
homeassistant/components/lutron_caseta/*
|
||||
homeassistant/components/lutron_caseta/__init__.py
|
||||
homeassistant/components/lutron_caseta/binary_sensor.py
|
||||
homeassistant/components/lutron_caseta/cover.py
|
||||
homeassistant/components/lutron_caseta/fan.py
|
||||
homeassistant/components/lutron_caseta/light.py
|
||||
homeassistant/components/lutron_caseta/scene.py
|
||||
homeassistant/components/lutron_caseta/switch.py
|
||||
homeassistant/components/lw12wifi/light.py
|
||||
homeassistant/components/lyft/sensor.py
|
||||
homeassistant/components/magicseaweed/sensor.py
|
||||
@@ -428,11 +488,13 @@ omit =
|
||||
homeassistant/components/miflora/sensor.py
|
||||
homeassistant/components/mikrotik/hub.py
|
||||
homeassistant/components/mikrotik/device_tracker.py
|
||||
homeassistant/components/mill/__init__.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/helpers.py
|
||||
homeassistant/components/minecraft_server/sensor.py
|
||||
homeassistant/components/minio/*
|
||||
homeassistant/components/mitemp_bt/sensor.py
|
||||
@@ -441,7 +503,6 @@ omit =
|
||||
homeassistant/components/mochad/*
|
||||
homeassistant/components/modbus/*
|
||||
homeassistant/components/modem_callerid/sensor.py
|
||||
homeassistant/components/mopar/*
|
||||
homeassistant/components/mpchc/media_player.py
|
||||
homeassistant/components/mpd/media_player.py
|
||||
homeassistant/components/mqtt_room/sensor.py
|
||||
@@ -450,7 +511,6 @@ omit =
|
||||
homeassistant/components/mychevy/*
|
||||
homeassistant/components/mycroft/*
|
||||
homeassistant/components/mycroft/notify.py
|
||||
homeassistant/components/myq/cover.py
|
||||
homeassistant/components/mysensors/*
|
||||
homeassistant/components/mystrom/binary_sensor.py
|
||||
homeassistant/components/mystrom/light.py
|
||||
@@ -476,6 +536,7 @@ omit =
|
||||
homeassistant/components/netgear_lte/*
|
||||
homeassistant/components/netio/switch.py
|
||||
homeassistant/components/neurio_energy/sensor.py
|
||||
homeassistant/components/nextcloud/*
|
||||
homeassistant/components/nfandroidtv/notify.py
|
||||
homeassistant/components/niko_home_control/light.py
|
||||
homeassistant/components/nilu/air_quality.py
|
||||
@@ -487,6 +548,7 @@ omit =
|
||||
homeassistant/components/notion/sensor.py
|
||||
homeassistant/components/noaa_tides/sensor.py
|
||||
homeassistant/components/norway_air/air_quality.py
|
||||
homeassistant/components/notify_events/notify.py
|
||||
homeassistant/components/nsw_fuel_station/sensor.py
|
||||
homeassistant/components/nuimo_controller/*
|
||||
homeassistant/components/nuki/lock.py
|
||||
@@ -502,12 +564,21 @@ omit =
|
||||
homeassistant/components/ombi/*
|
||||
homeassistant/components/onewire/sensor.py
|
||||
homeassistant/components/onkyo/media_player.py
|
||||
homeassistant/components/onvif/__init__.py
|
||||
homeassistant/components/onvif/base.py
|
||||
homeassistant/components/onvif/binary_sensor.py
|
||||
homeassistant/components/onvif/camera.py
|
||||
homeassistant/components/onvif/device.py
|
||||
homeassistant/components/onvif/event.py
|
||||
homeassistant/components/onvif/parsers.py
|
||||
homeassistant/components/onvif/sensor.py
|
||||
homeassistant/components/opencv/*
|
||||
homeassistant/components/openevse/sensor.py
|
||||
homeassistant/components/openexchangerates/sensor.py
|
||||
homeassistant/components/opengarage/cover.py
|
||||
homeassistant/components/openhome/__init__.py
|
||||
homeassistant/components/openhome/media_player.py
|
||||
homeassistant/components/openhome/const.py
|
||||
homeassistant/components/opensensemap/air_quality.py
|
||||
homeassistant/components/opensky/sensor.py
|
||||
homeassistant/components/opentherm_gw/__init__.py
|
||||
@@ -533,6 +604,8 @@ omit =
|
||||
homeassistant/components/pencom/switch.py
|
||||
homeassistant/components/philips_js/media_player.py
|
||||
homeassistant/components/pi_hole/sensor.py
|
||||
homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py
|
||||
homeassistant/components/pi4ioe5v9xxxx/switch.py
|
||||
homeassistant/components/picotts/tts.py
|
||||
homeassistant/components/piglow/light.py
|
||||
homeassistant/components/pilight/*
|
||||
@@ -543,7 +616,11 @@ omit =
|
||||
homeassistant/components/plaato/*
|
||||
homeassistant/components/plex/media_player.py
|
||||
homeassistant/components/plex/sensor.py
|
||||
homeassistant/components/plugwise/*
|
||||
homeassistant/components/plugwise/__init__.py
|
||||
homeassistant/components/plugwise/binary_sensor.py
|
||||
homeassistant/components/plugwise/climate.py
|
||||
homeassistant/components/plugwise/sensor.py
|
||||
homeassistant/components/plugwise/switch.py
|
||||
homeassistant/components/plum_lightpad/*
|
||||
homeassistant/components/pocketcasts/sensor.py
|
||||
homeassistant/components/point/*
|
||||
@@ -557,7 +634,6 @@ omit =
|
||||
homeassistant/components/pulseaudio_loopback/switch.py
|
||||
homeassistant/components/pushbullet/notify.py
|
||||
homeassistant/components/pushbullet/sensor.py
|
||||
homeassistant/components/pushetta/notify.py
|
||||
homeassistant/components/pushover/notify.py
|
||||
homeassistant/components/pushsafer/notify.py
|
||||
homeassistant/components/pvoutput/sensor.py
|
||||
@@ -567,7 +643,6 @@ omit =
|
||||
homeassistant/components/qrcode/image_processing.py
|
||||
homeassistant/components/quantum_gateway/device_tracker.py
|
||||
homeassistant/components/qvr_pro/*
|
||||
homeassistant/components/qwikswitch/*
|
||||
homeassistant/components/rachio/*
|
||||
homeassistant/components/radarr/sensor.py
|
||||
homeassistant/components/radiotherm/climate.py
|
||||
@@ -597,11 +672,15 @@ omit =
|
||||
homeassistant/components/ring/camera.py
|
||||
homeassistant/components/ripple/sensor.py
|
||||
homeassistant/components/rocketchat/notify.py
|
||||
homeassistant/components/roku/*
|
||||
homeassistant/components/roomba/binary_sensor.py
|
||||
homeassistant/components/roomba/braava.py
|
||||
homeassistant/components/roomba/irobot_base.py
|
||||
homeassistant/components/roomba/roomba.py
|
||||
homeassistant/components/roomba/sensor.py
|
||||
homeassistant/components/roomba/vacuum.py
|
||||
homeassistant/components/route53/*
|
||||
homeassistant/components/rova/sensor.py
|
||||
homeassistant/components/rpi_camera/camera.py
|
||||
homeassistant/components/rpi_camera/*
|
||||
homeassistant/components/rpi_gpio/*
|
||||
homeassistant/components/rpi_gpio/cover.py
|
||||
homeassistant/components/rpi_gpio_pwm/light.py
|
||||
@@ -614,6 +693,7 @@ omit =
|
||||
homeassistant/components/saj/sensor.py
|
||||
homeassistant/components/salt/device_tracker.py
|
||||
homeassistant/components/satel_integra/*
|
||||
homeassistant/components/schluter/*
|
||||
homeassistant/components/scrape/sensor.py
|
||||
homeassistant/components/scsgate/*
|
||||
homeassistant/components/scsgate/cover.py
|
||||
@@ -645,12 +725,16 @@ omit =
|
||||
homeassistant/components/sinch/*
|
||||
homeassistant/components/slide/*
|
||||
homeassistant/components/sma/sensor.py
|
||||
homeassistant/components/smappee/*
|
||||
homeassistant/components/smappee/__init__.py
|
||||
homeassistant/components/smappee/api.py
|
||||
homeassistant/components/smappee/binary_sensor.py
|
||||
homeassistant/components/smappee/sensor.py
|
||||
homeassistant/components/smappee/switch.py
|
||||
homeassistant/components/smarty/*
|
||||
homeassistant/components/smarthab/*
|
||||
homeassistant/components/sms/*
|
||||
homeassistant/components/smtp/notify.py
|
||||
homeassistant/components/snapcast/media_player.py
|
||||
homeassistant/components/snapcast/*
|
||||
homeassistant/components/snmp/*
|
||||
homeassistant/components/sochain/sensor.py
|
||||
homeassistant/components/socialblade/sensor.py
|
||||
@@ -663,8 +747,6 @@ omit =
|
||||
homeassistant/components/soma/__init__.py
|
||||
homeassistant/components/somfy/*
|
||||
homeassistant/components/somfy_mylink/*
|
||||
homeassistant/components/sonarr/sensor.py
|
||||
homeassistant/components/songpal/*
|
||||
homeassistant/components/sonos/*
|
||||
homeassistant/components/sony_projector/switch.py
|
||||
homeassistant/components/spc/*
|
||||
@@ -673,12 +755,14 @@ omit =
|
||||
homeassistant/components/spotcrime/sensor.py
|
||||
homeassistant/components/spotify/__init__.py
|
||||
homeassistant/components/spotify/media_player.py
|
||||
homeassistant/components/squeezebox/*
|
||||
homeassistant/components/squeezebox/__init__.py
|
||||
homeassistant/components/squeezebox/media_player.py
|
||||
homeassistant/components/starline/*
|
||||
homeassistant/components/starlingbank/sensor.py
|
||||
homeassistant/components/steam_online/sensor.py
|
||||
homeassistant/components/stiebel_eltron/*
|
||||
homeassistant/components/stookalert/*
|
||||
homeassistant/components/stream/*
|
||||
homeassistant/components/streamlabswater/*
|
||||
homeassistant/components/suez_water/*
|
||||
homeassistant/components/supervisord/sensor.py
|
||||
@@ -692,8 +776,10 @@ omit =
|
||||
homeassistant/components/syncthru/sensor.py
|
||||
homeassistant/components/synology/camera.py
|
||||
homeassistant/components/synology_chat/notify.py
|
||||
homeassistant/components/synology_dsm/__init__.py
|
||||
homeassistant/components/synology_dsm/binary_sensor.py
|
||||
homeassistant/components/synology_dsm/sensor.py
|
||||
homeassistant/components/synology_srm/device_tracker.py
|
||||
homeassistant/components/synologydsm/sensor.py
|
||||
homeassistant/components/syslog/notify.py
|
||||
homeassistant/components/systemmonitor/sensor.py
|
||||
homeassistant/components/tado/*
|
||||
@@ -727,6 +813,7 @@ omit =
|
||||
homeassistant/components/thomson/device_tracker.py
|
||||
homeassistant/components/tibber/*
|
||||
homeassistant/components/tikteck/light.py
|
||||
homeassistant/components/tile/__init__.py
|
||||
homeassistant/components/tile/device_tracker.py
|
||||
homeassistant/components/time_date/sensor.py
|
||||
homeassistant/components/tmb/sensor.py
|
||||
@@ -734,7 +821,16 @@ omit =
|
||||
homeassistant/components/todoist/const.py
|
||||
homeassistant/components/tof/sensor.py
|
||||
homeassistant/components/tomato/device_tracker.py
|
||||
homeassistant/components/toon/*
|
||||
homeassistant/components/toon/__init__.py
|
||||
homeassistant/components/toon/binary_sensor.py
|
||||
homeassistant/components/toon/climate.py
|
||||
homeassistant/components/toon/const.py
|
||||
homeassistant/components/toon/coordinator.py
|
||||
homeassistant/components/toon/helpers.py
|
||||
homeassistant/components/toon/models.py
|
||||
homeassistant/components/toon/oauth2.py
|
||||
homeassistant/components/toon/sensor.py
|
||||
homeassistant/components/toon/switch.py
|
||||
homeassistant/components/torque/sensor.py
|
||||
homeassistant/components/totalconnect/*
|
||||
homeassistant/components/touchline/climate.py
|
||||
@@ -764,6 +860,10 @@ omit =
|
||||
homeassistant/components/ubus/device_tracker.py
|
||||
homeassistant/components/ue_smart_radio/media_player.py
|
||||
homeassistant/components/unifiled/*
|
||||
homeassistant/components/upb/__init__.py
|
||||
homeassistant/components/upb/const.py
|
||||
homeassistant/components/upb/light.py
|
||||
homeassistant/components/upb/scene.py
|
||||
homeassistant/components/upcloud/*
|
||||
homeassistant/components/upnp/*
|
||||
homeassistant/components/upc_connect/*
|
||||
@@ -807,20 +907,35 @@ omit =
|
||||
homeassistant/components/webostv/*
|
||||
homeassistant/components/wemo/*
|
||||
homeassistant/components/whois/sensor.py
|
||||
homeassistant/components/wiffi/*
|
||||
homeassistant/components/wink/*
|
||||
homeassistant/components/wirelesstag/*
|
||||
homeassistant/components/worldtidesinfo/sensor.py
|
||||
homeassistant/components/worxlandroid/sensor.py
|
||||
homeassistant/components/wunderlist/*
|
||||
homeassistant/components/wwlln/__init__.py
|
||||
homeassistant/components/wwlln/geo_location.py
|
||||
homeassistant/components/x10/light.py
|
||||
homeassistant/components/xbox_live/sensor.py
|
||||
homeassistant/components/xeoma/camera.py
|
||||
homeassistant/components/xfinity/device_tracker.py
|
||||
homeassistant/components/xiaomi/camera.py
|
||||
homeassistant/components/xiaomi_aqara/*
|
||||
homeassistant/components/xiaomi_miio/*
|
||||
homeassistant/components/xiaomi_aqara/__init__.py
|
||||
homeassistant/components/xiaomi_aqara/binary_sensor.py
|
||||
homeassistant/components/xiaomi_aqara/const.py
|
||||
homeassistant/components/xiaomi_aqara/cover.py
|
||||
homeassistant/components/xiaomi_aqara/light.py
|
||||
homeassistant/components/xiaomi_aqara/lock.py
|
||||
homeassistant/components/xiaomi_aqara/sensor.py
|
||||
homeassistant/components/xiaomi_aqara/switch.py
|
||||
homeassistant/components/xiaomi_miio/__init__.py
|
||||
homeassistant/components/xiaomi_miio/air_quality.py
|
||||
homeassistant/components/xiaomi_miio/alarm_control_panel.py
|
||||
homeassistant/components/xiaomi_miio/device_tracker.py
|
||||
homeassistant/components/xiaomi_miio/fan.py
|
||||
homeassistant/components/xiaomi_miio/gateway.py
|
||||
homeassistant/components/xiaomi_miio/light.py
|
||||
homeassistant/components/xiaomi_miio/remote.py
|
||||
homeassistant/components/xiaomi_miio/sensor.py
|
||||
homeassistant/components/xiaomi_miio/switch.py
|
||||
homeassistant/components/xiaomi_miio/vacuum.py
|
||||
homeassistant/components/xiaomi_tv/media_player.py
|
||||
homeassistant/components/xmpp/notify.py
|
||||
homeassistant/components/xs1/*
|
||||
@@ -835,8 +950,9 @@ omit =
|
||||
homeassistant/components/zamg/weather.py
|
||||
homeassistant/components/zengge/light.py
|
||||
homeassistant/components/zeroconf/*
|
||||
homeassistant/components/zerproc/__init__.py
|
||||
homeassistant/components/zerproc/const.py
|
||||
homeassistant/components/zestimate/sensor.py
|
||||
homeassistant/components/zha/__init__.py
|
||||
homeassistant/components/zha/api.py
|
||||
homeassistant/components/zha/core/channels/*
|
||||
homeassistant/components/zha/core/const.py
|
||||
@@ -850,11 +966,15 @@ omit =
|
||||
homeassistant/components/zha/light.py
|
||||
homeassistant/components/zha/sensor.py
|
||||
homeassistant/components/zhong_hong/climate.py
|
||||
homeassistant/components/zigbee/*
|
||||
homeassistant/components/xbee/*
|
||||
homeassistant/components/ziggo_mediabox_xl/media_player.py
|
||||
homeassistant/components/zoneminder/*
|
||||
homeassistant/components/supla/*
|
||||
homeassistant/components/zwave/util.py
|
||||
homeassistant/components/ozw/__init__.py
|
||||
homeassistant/components/ozw/discovery.py
|
||||
homeassistant/components/ozw/entity.py
|
||||
homeassistant/components/ozw/services.py
|
||||
|
||||
[report]
|
||||
# Regexes for lines to exclude from consideration
|
||||
|
@@ -2,9 +2,15 @@
|
||||
.git
|
||||
.github
|
||||
config
|
||||
docs
|
||||
|
||||
# Development
|
||||
.devcontainer
|
||||
.vscode
|
||||
|
||||
# Test related files
|
||||
.tox
|
||||
tests
|
||||
|
||||
# Other virtualization methods
|
||||
venv
|
||||
|
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -8,3 +8,5 @@
|
||||
*.png binary
|
||||
*.zip binary
|
||||
*.mp3 binary
|
||||
|
||||
Dockerfile.dev linguist-language=Dockerfile
|
||||
|
49
.github/ISSUE_TEMPLATE.md
vendored
Normal file
49
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
<!-- 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/core/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.
|
||||
-->
|
||||
|
||||
|
||||
## 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 Core release with the issue:
|
||||
- Last working Home Assistant Core release (if known):
|
||||
- Operating environment (OS/Container/Supervised/Core):
|
||||
- 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
|
||||
|
14
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
14
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
@@ -1,10 +1,10 @@
|
||||
---
|
||||
name: Report a bug with Home Assistant
|
||||
about: Report an issue with Home Assistant
|
||||
name: Report a bug with Home Assistant Core
|
||||
about: Report an issue with Home Assistant Core
|
||||
---
|
||||
<!-- 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
|
||||
- Make sure you are running the latest version of Home Assistant before reporting an issue: https://github.com/home-assistant/core/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.
|
||||
@@ -12,7 +12,7 @@ about: Report an issue with Home Assistant
|
||||
## 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.
|
||||
maintainers. Tell us what you were trying to do and what happened.
|
||||
-->
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@ about: Report an issue with Home Assistant
|
||||
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.):
|
||||
- Home Assistant Core release with the issue:
|
||||
- Last working Home Assistant Core release (if known):
|
||||
- Operating environment (OS/Container/Supervised/Core):
|
||||
- Integration causing this issue:
|
||||
- Link to integration documentation on our website:
|
||||
|
||||
|
1
.github/stale.yml
vendored
1
.github/stale.yml
vendored
@@ -57,6 +57,7 @@ limitPerRun: 30
|
||||
# Handle pull requests a little bit faster and with an adjusted comment.
|
||||
pulls:
|
||||
daysUntilStale: 30
|
||||
exemptProjects: false
|
||||
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
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -106,6 +106,7 @@ virtualization/vagrant/config
|
||||
!.vscode/cSpell.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/tasks.json
|
||||
.env
|
||||
|
||||
# Built docs
|
||||
docs/build
|
||||
|
5
.hadolint.yaml
Normal file
5
.hadolint.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
ignored:
|
||||
- DL3006
|
||||
- DL3008
|
||||
- DL3013
|
||||
- DL3018
|
@@ -1,4 +1,9 @@
|
||||
repos:
|
||||
- repo: https://github.com/asottile/pyupgrade
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: pyupgrade
|
||||
args: [--py37-plus]
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 19.10b0
|
||||
hooks:
|
||||
@@ -13,11 +18,11 @@ repos:
|
||||
- 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"
|
||||
- --skip="./.*,*.csv,*.json"
|
||||
- --quiet-level=2
|
||||
exclude_types: [json]
|
||||
exclude_types: [csv, json]
|
||||
- repo: https://gitlab.com/pycqa/flake8
|
||||
rev: 3.7.9
|
||||
rev: 3.8.1
|
||||
hooks:
|
||||
- id: flake8
|
||||
additional_dependencies:
|
||||
@@ -40,12 +45,23 @@ repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.4.0
|
||||
hooks:
|
||||
- id: check-executables-have-shebangs
|
||||
stages: [manual]
|
||||
- id: check-json
|
||||
- id: no-commit-to-branch
|
||||
args:
|
||||
- --branch=dev
|
||||
- --branch=master
|
||||
- --branch=rc
|
||||
- repo: https://github.com/adrienverge/yamllint.git
|
||||
rev: v1.23.0
|
||||
hooks:
|
||||
- id: yamllint
|
||||
- repo: https://github.com/prettier/prettier
|
||||
rev: 2.0.4
|
||||
hooks:
|
||||
- id: prettier
|
||||
stages: [manual]
|
||||
- repo: local
|
||||
hooks:
|
||||
# Run mypy through our wrapper script in order to get the possible
|
||||
@@ -59,3 +75,17 @@ repos:
|
||||
types: [python]
|
||||
require_serial: true
|
||||
files: ^homeassistant/.+\.py$
|
||||
- id: gen_requirements_all
|
||||
name: gen_requirements_all
|
||||
entry: script/run-in-env.sh python3 -m script.gen_requirements_all
|
||||
pass_filenames: false
|
||||
language: script
|
||||
types: [text]
|
||||
files: ^(homeassistant/.+/manifest\.json|\.pre-commit-config\.yaml)$
|
||||
- id: hassfest
|
||||
name: hassfest
|
||||
entry: script/run-in-env.sh python3 -m script.hassfest
|
||||
pass_filenames: false
|
||||
language: script
|
||||
types: [json]
|
||||
files: ^homeassistant/.+/(manifest|strings)\.json$
|
||||
|
5
.prettierignore
Normal file
5
.prettierignore
Normal file
@@ -0,0 +1,5 @@
|
||||
*.md
|
||||
azure-*.yml
|
||||
docs/source/_templates/*
|
||||
homeassistant/components/*/translations/*.json
|
||||
tests/fixtures/*
|
@@ -11,6 +11,9 @@ addons:
|
||||
- libswscale-dev
|
||||
- libswresample-dev
|
||||
- libavfilter-dev
|
||||
sources:
|
||||
- sourceline: ppa:savoury1/ffmpeg4
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
|
3
.vscode/extensions.json
vendored
Normal file
3
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["esbenp.prettier-vscode", "ms-python.python"]
|
||||
}
|
61
.yamllint
Normal file
61
.yamllint
Normal file
@@ -0,0 +1,61 @@
|
||||
ignore: |
|
||||
azure-*.yml
|
||||
rules:
|
||||
braces:
|
||||
level: error
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 1
|
||||
min-spaces-inside-empty: -1
|
||||
max-spaces-inside-empty: -1
|
||||
brackets:
|
||||
level: error
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 0
|
||||
min-spaces-inside-empty: -1
|
||||
max-spaces-inside-empty: -1
|
||||
colons:
|
||||
level: error
|
||||
max-spaces-before: 0
|
||||
max-spaces-after: 1
|
||||
commas:
|
||||
level: error
|
||||
max-spaces-before: 0
|
||||
min-spaces-after: 1
|
||||
max-spaces-after: 1
|
||||
comments:
|
||||
level: error
|
||||
require-starting-space: true
|
||||
min-spaces-from-content: 2
|
||||
comments-indentation:
|
||||
level: error
|
||||
document-end:
|
||||
level: error
|
||||
present: false
|
||||
document-start:
|
||||
level: error
|
||||
present: false
|
||||
empty-lines:
|
||||
level: error
|
||||
max: 1
|
||||
max-start: 0
|
||||
max-end: 1
|
||||
hyphens:
|
||||
level: error
|
||||
max-spaces-after: 1
|
||||
indentation:
|
||||
level: error
|
||||
spaces: 2
|
||||
indent-sequences: true
|
||||
check-multi-line-strings: false
|
||||
key-duplicates:
|
||||
level: error
|
||||
line-length: disable
|
||||
new-line-at-end-of-file:
|
||||
level: error
|
||||
new-lines:
|
||||
level: error
|
||||
type: unix
|
||||
trailing-spaces:
|
||||
level: error
|
||||
truthy:
|
||||
level: error
|
111
CODEOWNERS
111
CODEOWNERS
@@ -14,9 +14,12 @@ homeassistant/scripts/check_config.py @kellerza
|
||||
|
||||
# Integrations
|
||||
homeassistant/components/abode/* @shred86
|
||||
homeassistant/components/acmeda/* @atmurray
|
||||
homeassistant/components/adguard/* @frenck
|
||||
homeassistant/components/agent_dvr/* @ispysoftware
|
||||
homeassistant/components/airly/* @bieniu
|
||||
homeassistant/components/airvisual/* @bachya
|
||||
homeassistant/components/alarmdecoder/* @ajschmidt8
|
||||
homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy
|
||||
homeassistant/components/almond/* @gcampax @balloob
|
||||
homeassistant/components/alpha_vantage/* @fabaff
|
||||
@@ -32,34 +35,40 @@ homeassistant/components/aprs/* @PhilRW
|
||||
homeassistant/components/arcam_fmj/* @elupus
|
||||
homeassistant/components/arduino/* @fabaff
|
||||
homeassistant/components/arest/* @fabaff
|
||||
homeassistant/components/arris_tg2492lg/* @vanbalken
|
||||
homeassistant/components/asuswrt/* @kennedyshead
|
||||
homeassistant/components/atag/* @MatsNL
|
||||
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
|
||||
homeassistant/components/automation/* @home-assistant/core
|
||||
homeassistant/components/avea/* @pattyland
|
||||
homeassistant/components/avri/* @timvancann
|
||||
homeassistant/components/awair/* @danielsjf
|
||||
homeassistant/components/awair/* @ahayworth @danielsjf
|
||||
homeassistant/components/aws/* @awarecan @robbiet480
|
||||
homeassistant/components/axis/* @kane610
|
||||
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/blebox/* @gadgetmobile
|
||||
homeassistant/components/blink/* @fronzbot
|
||||
homeassistant/components/bmw_connected_drive/* @gerard33
|
||||
homeassistant/components/bmp280/* @belidzs
|
||||
homeassistant/components/bmw_connected_drive/* @gerard33 @rikroe
|
||||
homeassistant/components/bom/* @maddenp
|
||||
homeassistant/components/braviatv/* @robbiet480
|
||||
homeassistant/components/braviatv/* @robbiet480 @bieniu
|
||||
homeassistant/components/broadlink/* @danielhiversen @felipediel
|
||||
homeassistant/components/brother/* @bieniu
|
||||
homeassistant/components/brunt/* @eavanvalkenburg
|
||||
homeassistant/components/bsblan/* @liudger
|
||||
homeassistant/components/bt_smarthub/* @jxwolstenholme
|
||||
homeassistant/components/buienradar/* @mjj4791 @ties
|
||||
homeassistant/components/cast/* @emontnemery
|
||||
homeassistant/components/cert_expiry/* @Cereal2nd @jjlawren
|
||||
homeassistant/components/circuit/* @braam
|
||||
homeassistant/components/cisco_ios/* @fbradyirl
|
||||
homeassistant/components/cisco_mobility_express/* @fbradyirl
|
||||
homeassistant/components/cisco_webex_teams/* @fbradyirl
|
||||
@@ -75,18 +84,22 @@ homeassistant/components/counter/* @fabaff
|
||||
homeassistant/components/cover/* @home-assistant/core
|
||||
homeassistant/components/cpuspeed/* @fabaff
|
||||
homeassistant/components/cups/* @fabaff
|
||||
homeassistant/components/daikin/* @fredrike @rofrantz
|
||||
homeassistant/components/daikin/* @fredrike
|
||||
homeassistant/components/darksky/* @fabaff
|
||||
homeassistant/components/deconz/* @kane610
|
||||
homeassistant/components/delijn/* @bollewolle
|
||||
homeassistant/components/debugpy/* @frenck
|
||||
homeassistant/components/deconz/* @Kane610
|
||||
homeassistant/components/delijn/* @bollewolle @Emilv2
|
||||
homeassistant/components/demo/* @home-assistant/core
|
||||
homeassistant/components/denonavr/* @scarface-4711 @starkillerOG
|
||||
homeassistant/components/derivative/* @afaucogney
|
||||
homeassistant/components/device_automation/* @home-assistant/core
|
||||
homeassistant/components/devolo_home_control/* @2Fake @Shutgun
|
||||
homeassistant/components/digital_ocean/* @fabaff
|
||||
homeassistant/components/directv/* @ctalkington
|
||||
homeassistant/components/discogs/* @thibmaek
|
||||
homeassistant/components/doorbird/* @oblogic7
|
||||
homeassistant/components/doorbird/* @oblogic7 @bdraco
|
||||
homeassistant/components/dsmr_reader/* @depl0y
|
||||
homeassistant/components/dunehd/* @bieniu
|
||||
homeassistant/components/dweet/* @fabaff
|
||||
homeassistant/components/dynalite/* @ziv1234
|
||||
homeassistant/components/dyson/* @etheralm
|
||||
@@ -96,6 +109,7 @@ homeassistant/components/edl21/* @mtdcr
|
||||
homeassistant/components/egardia/* @jeroenterheerdt
|
||||
homeassistant/components/eight_sleep/* @mezz64
|
||||
homeassistant/components/elgato/* @frenck
|
||||
homeassistant/components/elkm1/* @bdraco
|
||||
homeassistant/components/elv/* @majuss
|
||||
homeassistant/components/emby/* @mezz64
|
||||
homeassistant/components/emoncms/* @borpin
|
||||
@@ -115,19 +129,19 @@ homeassistant/components/file/* @fabaff
|
||||
homeassistant/components/filter/* @dgomes
|
||||
homeassistant/components/fitbit/* @robbiet480
|
||||
homeassistant/components/fixer/* @fabaff
|
||||
homeassistant/components/flick_electric/* @ZephireNZ
|
||||
homeassistant/components/flock/* @fabaff
|
||||
homeassistant/components/flume/* @ChrisMandich
|
||||
homeassistant/components/flume/* @ChrisMandich @bdraco
|
||||
homeassistant/components/flunearyou/* @bachya
|
||||
homeassistant/components/fortigate/* @kifeo
|
||||
homeassistant/components/forked_daapd/* @uvjustin
|
||||
homeassistant/components/fortios/* @kimfrellsen
|
||||
homeassistant/components/foscam/* @skgsergio
|
||||
homeassistant/components/foursquare/* @robbiet480
|
||||
homeassistant/components/freebox/* @snoof85
|
||||
homeassistant/components/freebox/* @snoof85 @Quentame
|
||||
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
|
||||
@@ -136,6 +150,7 @@ homeassistant/components/gios/* @bieniu
|
||||
homeassistant/components/gitter/* @fabaff
|
||||
homeassistant/components/glances/* @fabaff @engrbm87
|
||||
homeassistant/components/gntp/* @robbiet480
|
||||
homeassistant/components/gogogate2/* @vangorra
|
||||
homeassistant/components/google_assistant/* @home-assistant/cloud
|
||||
homeassistant/components/google_cloud/* @lufton
|
||||
homeassistant/components/google_translate/* @awarecan
|
||||
@@ -146,7 +161,8 @@ homeassistant/components/griddy/* @bdraco
|
||||
homeassistant/components/group/* @home-assistant/core
|
||||
homeassistant/components/growatt_server/* @indykoning
|
||||
homeassistant/components/gtfs/* @robbiet480
|
||||
homeassistant/components/harmony/* @ehendrix23
|
||||
homeassistant/components/guardian/* @bachya
|
||||
homeassistant/components/harmony/* @ehendrix23 @bramkragten @bdraco
|
||||
homeassistant/components/hassio/* @home-assistant/hass-io
|
||||
homeassistant/components/heatmiser/* @andylockran
|
||||
homeassistant/components/heos/* @andrewsayre
|
||||
@@ -156,16 +172,22 @@ homeassistant/components/hikvisioncam/* @fbradyirl
|
||||
homeassistant/components/hisense_aehw4a1/* @bannhead
|
||||
homeassistant/components/history/* @home-assistant/core
|
||||
homeassistant/components/hive/* @Rendili @KJonline
|
||||
homeassistant/components/home_connect/* @DavidMStraub
|
||||
homeassistant/components/homeassistant/* @home-assistant/core
|
||||
homeassistant/components/homekit/* @bdraco
|
||||
homeassistant/components/homekit_controller/* @Jc2k
|
||||
homeassistant/components/homematic/* @pvizeli @danielperna84
|
||||
homeassistant/components/homematicip_cloud/* @SukramJ
|
||||
homeassistant/components/honeywell/* @zxdavb
|
||||
homeassistant/components/html5/* @robbiet480
|
||||
homeassistant/components/http/* @home-assistant/core
|
||||
homeassistant/components/huawei_lte/* @scop
|
||||
homeassistant/components/huawei_lte/* @scop @fphammerle
|
||||
homeassistant/components/huawei_router/* @abmantis
|
||||
homeassistant/components/hue/* @balloob
|
||||
homeassistant/components/humidifier/* @home-assistant/core @Shulyaka
|
||||
homeassistant/components/hunterdouglas_powerview/* @bdraco
|
||||
homeassistant/components/hvv_departures/* @vigonotion
|
||||
homeassistant/components/hydrawise/* @ptcryan
|
||||
homeassistant/components/iammeter/* @lewei50
|
||||
homeassistant/components/iaqualink/* @flz
|
||||
homeassistant/components/icloud/* @Quentame
|
||||
@@ -177,14 +199,18 @@ homeassistant/components/input_datetime/* @home-assistant/core
|
||||
homeassistant/components/input_number/* @home-assistant/core
|
||||
homeassistant/components/input_select/* @home-assistant/core
|
||||
homeassistant/components/input_text/* @home-assistant/core
|
||||
homeassistant/components/insteon/* @teharris1
|
||||
homeassistant/components/integration/* @dgomes
|
||||
homeassistant/components/intent/* @home-assistant/core
|
||||
homeassistant/components/intesishome/* @jnimmo
|
||||
homeassistant/components/ios/* @robbiet480
|
||||
homeassistant/components/iperf3/* @rohankapoorcom
|
||||
homeassistant/components/ipma/* @dgomes @abmantis
|
||||
homeassistant/components/ipp/* @ctalkington
|
||||
homeassistant/components/iqvia/* @bachya
|
||||
homeassistant/components/irish_rail_transport/* @ttroy50
|
||||
homeassistant/components/islamic_prayer_times/* @engrbm87
|
||||
homeassistant/components/isy994/* @bdraco @shbatm
|
||||
homeassistant/components/izone/* @Swamp-Ig
|
||||
homeassistant/components/jewish_calendar/* @tsvi
|
||||
homeassistant/components/juicenet/* @jesserockz
|
||||
@@ -210,6 +236,7 @@ homeassistant/components/luci/* @fbradyirl @mzdrale
|
||||
homeassistant/components/luftdaten/* @fabaff
|
||||
homeassistant/components/lupusec/* @majuss
|
||||
homeassistant/components/lutron/* @JonGilmore
|
||||
homeassistant/components/lutron_caseta/* @swails
|
||||
homeassistant/components/mastodon/* @fabaff
|
||||
homeassistant/components/matrix/* @tinloaf
|
||||
homeassistant/components/mcp23017/* @jardiamj
|
||||
@@ -219,6 +246,7 @@ homeassistant/components/melissa/* @kennedyshead
|
||||
homeassistant/components/met/* @danielhiversen
|
||||
homeassistant/components/meteo_france/* @victorcerutti @oncleben31 @Quentame
|
||||
homeassistant/components/meteoalarm/* @rolfberkenbosch
|
||||
homeassistant/components/metoffice/* @MrHarcombe
|
||||
homeassistant/components/miflora/* @danielhiversen @ChristianKuehnel
|
||||
homeassistant/components/mikrotik/* @engrbm87
|
||||
homeassistant/components/mill/* @danielhiversen
|
||||
@@ -226,12 +254,13 @@ 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/modbus/* @adamchengtkc @janiversen
|
||||
homeassistant/components/monoprice/* @etsinko @OnFreund
|
||||
homeassistant/components/moon/* @fabaff
|
||||
homeassistant/components/mpd/* @fabaff
|
||||
homeassistant/components/mqtt/* @home-assistant/core
|
||||
homeassistant/components/mqtt/* @home-assistant/core @emontnemery
|
||||
homeassistant/components/msteams/* @peroyvind
|
||||
homeassistant/components/myq/* @bdraco
|
||||
homeassistant/components/mysensors/* @MartinHjelmare
|
||||
homeassistant/components/mystrom/* @fabaff
|
||||
homeassistant/components/neato/* @dshokouhi @Santobert
|
||||
@@ -241,16 +270,22 @@ homeassistant/components/ness_alarm/* @nickw444
|
||||
homeassistant/components/nest/* @awarecan
|
||||
homeassistant/components/netatmo/* @cgtobi
|
||||
homeassistant/components/netdata/* @fabaff
|
||||
homeassistant/components/nexia/* @ryannazaretian @bdraco
|
||||
homeassistant/components/nextbus/* @vividboarder
|
||||
homeassistant/components/nextcloud/* @meichthys
|
||||
homeassistant/components/nilu/* @hfurubotten
|
||||
homeassistant/components/nissan_leaf/* @filcole
|
||||
homeassistant/components/nmbs/* @thibmaek
|
||||
homeassistant/components/no_ip/* @fabaff
|
||||
homeassistant/components/notify/* @home-assistant/core
|
||||
homeassistant/components/notify_events/* @matrozov @papajojo
|
||||
homeassistant/components/notion/* @bachya
|
||||
homeassistant/components/nsw_fuel_station/* @nickw444
|
||||
homeassistant/components/nsw_rural_fire_service_feed/* @exxamalte
|
||||
homeassistant/components/nuheat/* @bdraco
|
||||
homeassistant/components/nuki/* @pvizeli
|
||||
homeassistant/components/numato/* @clssn
|
||||
homeassistant/components/nut/* @bdraco
|
||||
homeassistant/components/nws/* @MatthewFlamm
|
||||
homeassistant/components/nzbget/* @chriscla
|
||||
homeassistant/components/obihai/* @dshokouhi
|
||||
@@ -258,34 +293,45 @@ homeassistant/components/ohmconnect/* @robbiet480
|
||||
homeassistant/components/ombi/* @larssont
|
||||
homeassistant/components/onboarding/* @home-assistant/core
|
||||
homeassistant/components/onewire/* @garbled1
|
||||
homeassistant/components/onvif/* @hunterjm
|
||||
homeassistant/components/openerz/* @misialq
|
||||
homeassistant/components/opengarage/* @danielhiversen
|
||||
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/ozw/* @cgarwood @marcelveldt @MartinHjelmare
|
||||
homeassistant/components/panasonic_viera/* @joogps
|
||||
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/pi4ioe5v9xxxx/* @antonverburg
|
||||
homeassistant/components/pi_hole/* @fabaff @johnluetke @shenxn
|
||||
homeassistant/components/pilight/* @trekky12
|
||||
homeassistant/components/plaato/* @JohNan
|
||||
homeassistant/components/plant/* @ChristianKuehnel
|
||||
homeassistant/components/plex/* @jjlawren
|
||||
homeassistant/components/plugwise/* @laetificat @CoMPaTech @bouwew
|
||||
homeassistant/components/plugwise/* @CoMPaTech @bouwew
|
||||
homeassistant/components/plum_lightpad/* @ColinHarrington @prystupa
|
||||
homeassistant/components/point/* @fredrike
|
||||
homeassistant/components/proxmoxve/* @k4ds3
|
||||
homeassistant/components/powerwall/* @bdraco @jrester
|
||||
homeassistant/components/prometheus/* @knyar
|
||||
homeassistant/components/proxmoxve/* @k4ds3 @jhollowe
|
||||
homeassistant/components/ps4/* @ktnrg45
|
||||
homeassistant/components/ptvsd/* @swamp-ig
|
||||
homeassistant/components/push/* @dgomes
|
||||
homeassistant/components/pvoutput/* @fabaff
|
||||
homeassistant/components/pvpc_hourly_pricing/* @azogue
|
||||
homeassistant/components/qld_bushfire/* @exxamalte
|
||||
homeassistant/components/qnap/* @colinodell
|
||||
homeassistant/components/quantum_gateway/* @cisasteelersfan
|
||||
homeassistant/components/qvr_pro/* @oblogic7
|
||||
homeassistant/components/qwikswitch/* @kellerza
|
||||
homeassistant/components/rachio/* @bdraco
|
||||
homeassistant/components/rainbird/* @konikvranik
|
||||
homeassistant/components/raincloud/* @vanstinator
|
||||
homeassistant/components/rainforest_eagle/* @gtdiehl @jcalbert
|
||||
@@ -296,12 +342,13 @@ homeassistant/components/rfxtrx/* @danielhiversen
|
||||
homeassistant/components/ring/* @balloob
|
||||
homeassistant/components/rmvtransport/* @cgtobi
|
||||
homeassistant/components/roku/* @ctalkington
|
||||
homeassistant/components/roomba/* @pschmitt
|
||||
homeassistant/components/roomba/* @pschmitt @cyr-ius @shenxn
|
||||
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/schluter/* @prairieapps
|
||||
homeassistant/components/scrape/* @fabaff
|
||||
homeassistant/components/script/* @home-assistant/core
|
||||
homeassistant/components/search/* @home-assistant/core
|
||||
@@ -309,6 +356,7 @@ homeassistant/components/sense/* @kbickar
|
||||
homeassistant/components/sensibo/* @andrey-git
|
||||
homeassistant/components/sentry/* @dcramer
|
||||
homeassistant/components/serial/* @fabaff
|
||||
homeassistant/components/seven_segments/* @fabaff
|
||||
homeassistant/components/seventeentrack/* @bachya
|
||||
homeassistant/components/shell_command/* @home-assistant/core
|
||||
homeassistant/components/shiftr/* @fabaff
|
||||
@@ -320,6 +368,7 @@ homeassistant/components/sinch/* @bendikrb
|
||||
homeassistant/components/sisyphus/* @jkeljo
|
||||
homeassistant/components/slide/* @ualex73
|
||||
homeassistant/components/sma/* @kellerza
|
||||
homeassistant/components/smappee/* @bsmappee
|
||||
homeassistant/components/smarthab/* @outadoc
|
||||
homeassistant/components/smartthings/* @andrewsayre
|
||||
homeassistant/components/smarty/* @z0mbieprocess
|
||||
@@ -330,12 +379,14 @@ homeassistant/components/solarlog/* @Ernst79
|
||||
homeassistant/components/solax/* @squishykid
|
||||
homeassistant/components/soma/* @ratsept
|
||||
homeassistant/components/somfy/* @tetienne
|
||||
homeassistant/components/songpal/* @rytilahti
|
||||
homeassistant/components/sonarr/* @ctalkington
|
||||
homeassistant/components/songpal/* @rytilahti @shenxn
|
||||
homeassistant/components/spaceapi/* @fabaff
|
||||
homeassistant/components/speedtestdotnet/* @rohankapoorcom
|
||||
homeassistant/components/speedtestdotnet/* @rohankapoorcom @engrbm87
|
||||
homeassistant/components/spider/* @peternijssen
|
||||
homeassistant/components/spotify/* @frenck
|
||||
homeassistant/components/sql/* @dgomes
|
||||
homeassistant/components/squeezebox/* @rajlaud
|
||||
homeassistant/components/starline/* @anonym-tsk
|
||||
homeassistant/components/statistics/* @fabaff
|
||||
homeassistant/components/stiebel_eltron/* @fucm
|
||||
@@ -352,9 +403,10 @@ homeassistant/components/switchbot/* @danielhiversen
|
||||
homeassistant/components/switcher_kis/* @tomerfi
|
||||
homeassistant/components/switchmate/* @danielhiversen
|
||||
homeassistant/components/syncthru/* @nielstron
|
||||
homeassistant/components/synology_dsm/* @ProtoThis @Quentame
|
||||
homeassistant/components/synology_srm/* @aerialls
|
||||
homeassistant/components/syslog/* @fabaff
|
||||
homeassistant/components/tado/* @michaelarnauts
|
||||
homeassistant/components/tado/* @michaelarnauts @bdraco
|
||||
homeassistant/components/tahoma/* @philklei
|
||||
homeassistant/components/tankerkoenig/* @guillempages
|
||||
homeassistant/components/tautulli/* @ludeeus
|
||||
@@ -377,12 +429,14 @@ homeassistant/components/tradfri/* @ggravlingen
|
||||
homeassistant/components/trafikverket_train/* @endor-force
|
||||
homeassistant/components/transmission/* @engrbm87 @JPHutchins
|
||||
homeassistant/components/tts/* @pvizeli
|
||||
homeassistant/components/tuya/* @ollo69
|
||||
homeassistant/components/twentemilieu/* @frenck
|
||||
homeassistant/components/twilio_call/* @robbiet480
|
||||
homeassistant/components/twilio_sms/* @robbiet480
|
||||
homeassistant/components/ubee/* @mzdrale
|
||||
homeassistant/components/unifi/* @kane610
|
||||
homeassistant/components/unifi/* @Kane610
|
||||
homeassistant/components/unifiled/* @florisvdk
|
||||
homeassistant/components/upb/* @gwww
|
||||
homeassistant/components/upc_connect/* @pvizeli
|
||||
homeassistant/components/upcloud/* @scop
|
||||
homeassistant/components/updater/* @home-assistant/core
|
||||
@@ -392,6 +446,7 @@ homeassistant/components/usgs_earthquakes_feed/* @exxamalte
|
||||
homeassistant/components/utility_meter/* @dgomes
|
||||
homeassistant/components/velbus/* @Cereal2nd @brefra
|
||||
homeassistant/components/velux/* @Julius2342
|
||||
homeassistant/components/vera/* @vangorra
|
||||
homeassistant/components/versasense/* @flamm3blemuff1n
|
||||
homeassistant/components/version/* @fabaff
|
||||
homeassistant/components/vesync/* @markperdue @webdjoe
|
||||
@@ -405,12 +460,11 @@ homeassistant/components/watson_tts/* @rutkai
|
||||
homeassistant/components/weather/* @fabaff
|
||||
homeassistant/components/webostv/* @bendavid
|
||||
homeassistant/components/websocket_api/* @home-assistant/core
|
||||
homeassistant/components/wemo/* @sqldiablo
|
||||
homeassistant/components/wiffi/* @mampfes
|
||||
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
|
||||
homeassistant/components/xfinity/* @cisasteelersfan
|
||||
homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi
|
||||
@@ -425,6 +479,7 @@ homeassistant/components/yessssms/* @flowolf
|
||||
homeassistant/components/yi/* @bachya
|
||||
homeassistant/components/yr/* @danielhiversen
|
||||
homeassistant/components/zeroconf/* @robbiet480 @Kane610
|
||||
homeassistant/components/zerproc/* @emlove
|
||||
homeassistant/components/zha/* @dmulcahey @adminiuga
|
||||
homeassistant/components/zone/* @home-assistant/core
|
||||
homeassistant/components/zoneminder/* @rohankapoorcom
|
||||
|
@@ -2,79 +2,139 @@
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at [safety@home-assistant.io][email]. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
reported to the community leaders responsible for enforcement at
|
||||
[safety@home-assistant.io][email] or by using the report/flag feature of
|
||||
the medium used. All complaints will be reviewed and investigated promptly and
|
||||
fairly.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available [here][version].
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available [here][version].
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder][mozilla].
|
||||
|
||||
## Adoption
|
||||
|
||||
This Code of Conduct was first adopted January 21st, 2017 and announced in [this][coc-blog] blog post.
|
||||
This Code of Conduct was first adopted January 21st, 2017 and announced in
|
||||
[this][coc-blog] blog post and has been updated on May 25th, 2020 to version
|
||||
2.0 of the [Contributor Covenant][homepage] as announced in [this][coc2-blog]
|
||||
blog post.
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
<https://www.contributor-covenant.org/faq>. Translations are available at
|
||||
<https://www.contributor-covenant.org/translations>.
|
||||
|
||||
[coc-blog]: /blog/2017/01/21/home-assistant-governance/
|
||||
[coc2-blog]: /blog/2020/05/25/code-of-conduct-updated/
|
||||
[email]: mailto:safety@home-assistant.io
|
||||
[coc-blog]: https://home-assistant.io/blog/2017/01/21/home-assistant-governance/
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[mozilla]: https://github.com/mozilla/diversity
|
||||
[version]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
|
||||
|
21
Dockerfile
Normal file
21
Dockerfile
Normal file
@@ -0,0 +1,21 @@
|
||||
ARG BUILD_FROM
|
||||
FROM ${BUILD_FROM}
|
||||
|
||||
ENV \
|
||||
S6_SERVICES_GRACETIME=60000
|
||||
|
||||
WORKDIR /usr/src
|
||||
|
||||
## Setup Home Assistant
|
||||
COPY . homeassistant/
|
||||
RUN \
|
||||
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
|
||||
-r homeassistant/requirements_all.txt -c homeassistant/homeassistant/package_constraints.txt \
|
||||
&& pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
|
||||
-e ./homeassistant \
|
||||
&& python3 -m compileall homeassistant/homeassistant
|
||||
|
||||
# Home Assistant S6-Overlay
|
||||
COPY rootfs /
|
||||
|
||||
WORKDIR /config
|
@@ -1,7 +1,7 @@
|
||||
FROM python:3.7
|
||||
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.8
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
RUN \
|
||||
apt-get update && apt-get install -y --no-install-recommends \
|
||||
libudev-dev \
|
||||
libavformat-dev \
|
||||
libavcodec-dev \
|
||||
@@ -18,8 +18,7 @@ WORKDIR /usr/src
|
||||
|
||||
# Setup hass-release
|
||||
RUN git clone --depth 1 https://github.com/home-assistant/hass-release \
|
||||
&& cd hass-release \
|
||||
&& pip3 install -e .
|
||||
&& pip3 install -e hass-release/
|
||||
|
||||
WORKDIR /workspaces
|
||||
|
||||
|
@@ -16,62 +16,82 @@ resources:
|
||||
containers:
|
||||
- container: 37
|
||||
image: homeassistant/ci-azure:3.7
|
||||
- container: 38
|
||||
image: homeassistant/ci-azure:3.8
|
||||
repositories:
|
||||
- repository: azure
|
||||
type: github
|
||||
name: 'home-assistant/ci-azure'
|
||||
endpoint: 'home-assistant'
|
||||
name: "home-assistant/ci-azure"
|
||||
endpoint: "home-assistant"
|
||||
variables:
|
||||
- name: PythonMain
|
||||
value: '37'
|
||||
- group: codecov
|
||||
value: "37"
|
||||
- name: versionHadolint
|
||||
value: "v1.17.6"
|
||||
|
||||
stages:
|
||||
|
||||
- stage: 'Overview'
|
||||
- stage: "Overview"
|
||||
jobs:
|
||||
- job: 'Lint'
|
||||
- job: "Lint"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
container: $[ variables['PythonMain'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'requirements_test.txt | homeassistant/package_constraints.txt'
|
||||
keyfile: "requirements_test.txt | homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
python -m venv venv
|
||||
|
||||
. 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 --hook-stage manual check-executables-have-shebangs --all-files
|
||||
displayName: "Run executables check"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run codespell --all-files
|
||||
displayName: 'Run codespell'
|
||||
displayName: "Run codespell"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run flake8 --all-files
|
||||
displayName: 'Run flake8'
|
||||
displayName: "Run flake8"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run bandit --all-files
|
||||
displayName: 'Run bandit'
|
||||
displayName: "Run bandit"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run isort --all-files --show-diff-on-failure
|
||||
displayName: 'Run isort'
|
||||
displayName: "Run isort"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run check-json --all-files
|
||||
displayName: 'Run check-json'
|
||||
- job: 'Validate'
|
||||
displayName: "Run check-json"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run yamllint --all-files
|
||||
displayName: "Run yamllint"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run pyupgrade --all-files --show-diff-on-failure
|
||||
displayName: "Run pyupgrade"
|
||||
# Prettier seems to hang on Azure, unknown why yet.
|
||||
# Temporarily disable the check to no block PRs
|
||||
# - script: |
|
||||
# . venv/bin/activate
|
||||
# pre-commit run prettier --all-files --show-diff-on-failure
|
||||
# displayName: 'Run prettier'
|
||||
- job: "Validate"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
container: $[ variables['PythonMain'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'homeassistant/package_constraints.txt'
|
||||
keyfile: "homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
python -m venv venv
|
||||
|
||||
@@ -79,20 +99,20 @@ stages:
|
||||
pip install -e .
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
python -m script.hassfest validate
|
||||
displayName: 'Validate manifests'
|
||||
python -m script.hassfest --action validate
|
||||
displayName: "Validate manifests"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
./script/gen_requirements_all.py validate
|
||||
displayName: 'requirements_all validate'
|
||||
- job: 'CheckFormat'
|
||||
displayName: "requirements_all validate"
|
||||
- job: "CheckFormat"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
container: $[ variables['PythonMain'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'requirements_test.txt | homeassistant/package_constraints.txt'
|
||||
keyfile: "requirements_test.txt | homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
python -m venv venv
|
||||
|
||||
@@ -102,25 +122,43 @@ stages:
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run black --all-files --show-diff-on-failure
|
||||
displayName: 'Check Black formatting'
|
||||
|
||||
- stage: 'Tests'
|
||||
dependsOn:
|
||||
- 'Overview'
|
||||
jobs:
|
||||
- job: 'PyTest'
|
||||
displayName: "Check Black formatting"
|
||||
- job: "Docker"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
steps:
|
||||
- script: sudo docker pull hadolint/hadolint:$(versionHadolint)
|
||||
displayName: "Install Hadolint"
|
||||
- script: |
|
||||
set -e
|
||||
for dockerfile in Dockerfile Dockerfile.dev
|
||||
do
|
||||
echo "Linting: $dockerfile"
|
||||
docker run --rm -i \
|
||||
-v "$(pwd)/.hadolint.yaml:/.hadolint.yaml:ro" \
|
||||
hadolint/hadolint:$(versionHadolint) < "$dockerfile"
|
||||
done
|
||||
displayName: "Run Hadolint"
|
||||
|
||||
- stage: "Tests"
|
||||
dependsOn:
|
||||
- "Overview"
|
||||
jobs:
|
||||
- job: "PyTest"
|
||||
pool:
|
||||
vmImage: "ubuntu-latest"
|
||||
strategy:
|
||||
maxParallel: 3
|
||||
matrix:
|
||||
Python37:
|
||||
python.container: '37'
|
||||
python.container: "37"
|
||||
Python38:
|
||||
python.container: "38"
|
||||
container: $[ variables['python.container'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'requirements_test_all.txt | homeassistant/package_constraints.txt'
|
||||
keyfile: "requirements_test_all.txt | requirements_test.txt | homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
set -e
|
||||
python -m venv venv
|
||||
@@ -134,37 +172,37 @@ stages:
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pip install -e .
|
||||
displayName: 'Install Home Assistant'
|
||||
displayName: "Install Home Assistant"
|
||||
- script: |
|
||||
set -e
|
||||
|
||||
. venv/bin/activate
|
||||
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)'
|
||||
displayName: "Run pytest for python $(python.container)"
|
||||
condition: and(succeeded(), ne(variables['python.container'], variables['PythonMain']))
|
||||
- script: |
|
||||
set -e
|
||||
|
||||
. venv/bin/activate
|
||||
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)
|
||||
codecov --token $(codecovToken)
|
||||
script/check_dirty
|
||||
displayName: 'Run pytest for python $(python.container) / coverage'
|
||||
displayName: "Run pytest for python $(python.container) / coverage"
|
||||
condition: and(succeeded(), eq(variables['python.container'], variables['PythonMain']))
|
||||
|
||||
- stage: 'FullCheck'
|
||||
- stage: "FullCheck"
|
||||
dependsOn:
|
||||
- 'Overview'
|
||||
- "Overview"
|
||||
jobs:
|
||||
- job: 'Pylint'
|
||||
- job: "Pylint"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
container: $[ variables['PythonMain'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'requirements_all.txt | requirements_test.txt | homeassistant/package_constraints.txt'
|
||||
keyfile: "requirements_all.txt | requirements_test.txt | homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
set -e
|
||||
python -m venv venv
|
||||
@@ -173,22 +211,25 @@ stages:
|
||||
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
|
||||
# This is a TEMP. Eventually we should make sure our 4 dependencies drop typing.
|
||||
# Find offending deps with `pipdeptree -r -p typing`
|
||||
pip uninstall -y typing
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pip install -e .
|
||||
displayName: 'Install Home Assistant'
|
||||
displayName: "Install Home Assistant"
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pylint homeassistant
|
||||
displayName: 'Run pylint'
|
||||
- job: 'Mypy'
|
||||
displayName: "Run pylint"
|
||||
- job: "Mypy"
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
vmImage: "ubuntu-latest"
|
||||
container: $[ variables['PythonMain'] ]
|
||||
steps:
|
||||
- template: templates/azp-step-cache.yaml@azure
|
||||
parameters:
|
||||
keyfile: 'requirements_test.txt | setup.py | homeassistant/package_constraints.txt'
|
||||
keyfile: "requirements_test.txt | setup.py | homeassistant/package_constraints.txt"
|
||||
build: |
|
||||
python -m venv venv
|
||||
|
||||
@@ -198,4 +239,4 @@ stages:
|
||||
- script: |
|
||||
. venv/bin/activate
|
||||
pre-commit run mypy --all-files
|
||||
displayName: 'Run mypy'
|
||||
displayName: "Run mypy"
|
||||
|
@@ -14,7 +14,7 @@ schedules:
|
||||
always: true
|
||||
variables:
|
||||
- name: versionBuilder
|
||||
value: '6.9'
|
||||
value: '7.2.0'
|
||||
- group: docker
|
||||
- group: github
|
||||
- group: twine
|
||||
@@ -108,11 +108,9 @@ stages:
|
||||
docker run --rm --privileged \
|
||||
-v ~/.docker:/root/.docker:rw \
|
||||
-v /run/docker.sock:/run/docker.sock:rw \
|
||||
-v $(pwd):/homeassistant:ro \
|
||||
-v $(pwd):/data:ro \
|
||||
homeassistant/amd64-builder:$(versionBuilder) \
|
||||
--homeassistant $(homeassistantRelease) "--$(buildArch)" \
|
||||
-r https://github.com/home-assistant/hassio-homeassistant \
|
||||
-t generic --docker-hub homeassistant
|
||||
--generic $(homeassistantRelease) "--$(buildArch)" -t /data \
|
||||
|
||||
docker run --rm --privileged \
|
||||
-v ~/.docker:/root/.docker \
|
||||
|
@@ -7,7 +7,7 @@ trigger:
|
||||
- dev
|
||||
pr: none
|
||||
schedules:
|
||||
- cron: "30 0 * * *"
|
||||
- cron: "0 0 * * *"
|
||||
displayName: "translation update"
|
||||
branches:
|
||||
include:
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
export LOKALISE_TOKEN="$(lokaliseToken)"
|
||||
export AZURE_BRANCH="$(Build.SourceBranchName)"
|
||||
|
||||
./script/translations_upload
|
||||
python3 -m script.translations upload
|
||||
displayName: 'Upload Translation'
|
||||
|
||||
- job: 'Download'
|
||||
@@ -54,9 +54,8 @@ jobs:
|
||||
- template: templates/azp-step-git-init.yaml@azure
|
||||
- script: |
|
||||
export LOKALISE_TOKEN="$(lokaliseToken)"
|
||||
export AZURE_BRANCH="$(Build.SourceBranchName)"
|
||||
|
||||
./script/translations_download
|
||||
python3 -m script.translations download
|
||||
displayName: 'Download Translation'
|
||||
- script: |
|
||||
git checkout dev
|
||||
|
@@ -1,10 +1,10 @@
|
||||
# https://dev.azure.com/home-assistant
|
||||
|
||||
trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- dev
|
||||
- rc
|
||||
paths:
|
||||
include:
|
||||
- requirements_all.txt
|
||||
@@ -15,10 +15,9 @@ schedules:
|
||||
branches:
|
||||
include:
|
||||
- dev
|
||||
always: true
|
||||
variables:
|
||||
- name: versionWheels
|
||||
value: '1.4-3.7-alpine3.10'
|
||||
value: '1.10.1-3.7-alpine3.11'
|
||||
resources:
|
||||
repositories:
|
||||
- repository: azure
|
||||
@@ -32,8 +31,10 @@ jobs:
|
||||
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;gammu-dev'
|
||||
builderPip: 'Cython;numpy'
|
||||
skipBinary: 'aiohttp'
|
||||
wheelsRequirement: 'requirements_wheels.txt'
|
||||
wheelsRequirementDiff: 'requirements_diff.txt'
|
||||
wheelsConstraint: 'homeassistant/package_constraints.txt'
|
||||
preBuild:
|
||||
- script: |
|
||||
cp requirements_all.txt requirements_wheels.txt
|
||||
@@ -69,9 +70,5 @@ jobs:
|
||||
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}
|
||||
fi
|
||||
done
|
||||
displayName: 'Prepare requirements files for Hass.io'
|
||||
displayName: 'Prepare requirements files for Home Assistant wheels'
|
||||
|
14
build.json
Normal file
14
build.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"image": "homeassistant/{arch}-homeassistant",
|
||||
"build_from": {
|
||||
"aarch64": "homeassistant/aarch64-homeassistant-base:7.2.0",
|
||||
"armhf": "homeassistant/armhf-homeassistant-base:7.2.0",
|
||||
"armv7": "homeassistant/armv7-homeassistant-base:7.2.0",
|
||||
"amd64": "homeassistant/amd64-homeassistant-base:7.2.0",
|
||||
"i386": "homeassistant/i386-homeassistant-base:7.2.0"
|
||||
},
|
||||
"labels": {
|
||||
"io.hass.type": "core"
|
||||
},
|
||||
"version_tag": true
|
||||
}
|
12
codecov.yml
12
codecov.yml
@@ -6,14 +6,4 @@ coverage:
|
||||
default:
|
||||
target: 90
|
||||
threshold: 0.09
|
||||
notify:
|
||||
# Notify codecov room in Discord. The webhook URL (encrypted below) ends in /slack which is why we configure a Slack notification.
|
||||
slack:
|
||||
default:
|
||||
url: "secret:TgWDUM4Jw0w7wMJxuxNF/yhSOHglIo1fGwInJnRLEVPy2P2aLimkoK1mtKCowH5TFw+baUXVXT3eAqefbdvIuM8BjRR4aRji95C6CYyD0QHy4N8i7nn1SQkWDPpS8IthYTg07rUDF7s5guurkKv2RrgoCdnnqjAMSzHoExMOF7xUmblMdhBTWJgBpWEhASJy85w/xxjlsE1xoTkzeJu9Q67pTXtRcn+5kb5/vIzPSYg="
|
||||
comment:
|
||||
require_changes: yes
|
||||
layout: reach
|
||||
branches:
|
||||
- master
|
||||
- !dev
|
||||
comment: false
|
||||
|
@@ -8,19 +8,19 @@ Loosely based on https://github.com/astropy/astropy/pull/347
|
||||
import os
|
||||
import warnings
|
||||
|
||||
__licence__ = 'BSD (3 clause)'
|
||||
__licence__ = "BSD (3 clause)"
|
||||
|
||||
|
||||
def get_github_url(app, view, path):
|
||||
github_fmt = 'https://github.com/{}/{}/{}/{}{}'
|
||||
return (
|
||||
github_fmt.format(app.config.edit_on_github_project, view,
|
||||
app.config.edit_on_github_branch,
|
||||
app.config.edit_on_github_src_path, path))
|
||||
f"https://github.com/{app.config.edit_on_github_project}/"
|
||||
f"{view}/{app.config.edit_on_github_branch}/"
|
||||
f"{app.config.edit_on_github_src_path}{path}"
|
||||
)
|
||||
|
||||
|
||||
def html_page_context(app, pagename, templatename, context, doctree):
|
||||
if templatename != 'page.html':
|
||||
if templatename != "page.html":
|
||||
return
|
||||
|
||||
if not app.config.edit_on_github_project:
|
||||
@@ -29,16 +29,16 @@ def html_page_context(app, pagename, templatename, context, doctree):
|
||||
if not doctree:
|
||||
warnings.warn("doctree is None")
|
||||
return
|
||||
path = os.path.relpath(doctree.get('source'), app.builder.srcdir)
|
||||
show_url = get_github_url(app, 'blob', path)
|
||||
edit_url = get_github_url(app, 'edit', path)
|
||||
path = os.path.relpath(doctree.get("source"), app.builder.srcdir)
|
||||
show_url = get_github_url(app, "blob", path)
|
||||
edit_url = get_github_url(app, "edit", path)
|
||||
|
||||
context['show_on_github_url'] = show_url
|
||||
context['edit_on_github_url'] = edit_url
|
||||
context["show_on_github_url"] = show_url
|
||||
context["edit_on_github_url"] = edit_url
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_config_value('edit_on_github_project', '', True)
|
||||
app.add_config_value('edit_on_github_branch', 'master', True)
|
||||
app.add_config_value('edit_on_github_src_path', '', True) # 'eg' "docs/"
|
||||
app.connect('html-page-context', html_page_context)
|
||||
app.add_config_value("edit_on_github_project", "", True)
|
||||
app.add_config_value("edit_on_github_branch", "master", True)
|
||||
app.add_config_value("edit_on_github_src_path", "", True) # 'eg' "docs/"
|
||||
app.connect("html-page-context", html_page_context)
|
||||
|
29
docs/source/api/auth.rst
Normal file
29
docs/source/api/auth.rst
Normal file
@@ -0,0 +1,29 @@
|
||||
:mod:`homeassistant.auth`
|
||||
=========================
|
||||
|
||||
.. automodule:: homeassistant.auth
|
||||
:members:
|
||||
|
||||
homeassistant.auth.auth\_store
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.auth.auth_store
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.auth.const
|
||||
------------------------
|
||||
|
||||
.. automodule:: homeassistant.auth.const
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.auth.models
|
||||
-------------------------
|
||||
|
||||
.. automodule:: homeassistant.auth.models
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
@@ -1,7 +1,7 @@
|
||||
.. _bootstrap_module:
|
||||
|
||||
:mod:`homeassistant.bootstrap`
|
||||
-------------------------
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.bootstrap
|
||||
:members:
|
||||
|
170
docs/source/api/components.rst
Normal file
170
docs/source/api/components.rst
Normal file
@@ -0,0 +1,170 @@
|
||||
:mod:`homeassistant.components`
|
||||
===============================
|
||||
|
||||
air\_quality
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.air_quality
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
alarm\_control\_panel
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.alarm_control_panel
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
binary\_sensor
|
||||
--------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.binary_sensor
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
camera
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.camera
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
calendar
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.calendar
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
climate
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.climate
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
conversation
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.conversation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
cover
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.cover
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
device\_tracker
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.device_tracker
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
fan
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.fan
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
light
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.light
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
lock
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.lock
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
media\_player
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.media_player
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
notify
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.notify
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
remote
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.remote
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
switch
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.switch
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
sensor
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.sensor
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
vacuum
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.vacuum
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
water\_heater
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.water_heater
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
weather
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.weather
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
webhook
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.webhook
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
7
docs/source/api/config_entries.rst
Normal file
7
docs/source/api/config_entries.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
.. _config_entries_module:
|
||||
|
||||
:mod:`homeassistant.config_entries`
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.config_entries
|
||||
:members:
|
@@ -4,35 +4,4 @@
|
||||
-------------------------
|
||||
|
||||
.. automodule:: homeassistant.core
|
||||
|
||||
.. autoclass:: Config
|
||||
:members:
|
||||
|
||||
.. autoclass:: Event
|
||||
:members:
|
||||
|
||||
.. autoclass:: EventBus
|
||||
:members:
|
||||
|
||||
.. autoclass:: HomeAssistant
|
||||
:members:
|
||||
|
||||
.. autoclass:: State
|
||||
:members:
|
||||
|
||||
.. autoclass:: StateMachine
|
||||
:members:
|
||||
|
||||
.. autoclass:: ServiceCall
|
||||
:members:
|
||||
|
||||
.. autoclass:: ServiceRegistry
|
||||
:members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: homeassistant.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
7
docs/source/api/data_entry_flow.rst
Normal file
7
docs/source/api/data_entry_flow.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
.. _data_entry_flow_module:
|
||||
|
||||
:mod:`homeassistant.data_entry_flow`
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.data_entry_flow
|
||||
:members:
|
@@ -1,10 +0,0 @@
|
||||
.. _components_device_tracker_module:
|
||||
|
||||
:mod:`homeassistant.components.device_tracker`
|
||||
----------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.components.device_tracker
|
||||
:members:
|
||||
|
||||
.. autoclass:: Device
|
||||
:members:
|
@@ -1,12 +0,0 @@
|
||||
.. _helpers_entity_module:
|
||||
|
||||
:mod:`homeassistant.helpers.entity`
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity
|
||||
|
||||
.. autoclass:: Entity
|
||||
:members:
|
||||
|
||||
.. autoclass:: ToggleEntity
|
||||
:members:
|
@@ -1,20 +0,0 @@
|
||||
.. _helpers_event_module:
|
||||
|
||||
:mod:`homeassistant.helpers.event`
|
||||
----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.event
|
||||
|
||||
.. autofunction:: track_state_change
|
||||
|
||||
.. autofunction:: track_point_in_time
|
||||
|
||||
.. autofunction:: track_point_in_utc_time
|
||||
|
||||
.. autofunction:: track_sunrise
|
||||
|
||||
.. autofunction:: track_sunset
|
||||
|
||||
.. autofunction:: track_utc_time_change
|
||||
|
||||
.. autofunction:: track_time_change
|
7
docs/source/api/exceptions.rst
Normal file
7
docs/source/api/exceptions.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
.. _exceptions_module:
|
||||
|
||||
:mod:`homeassistant.exceptions`
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.exceptions
|
||||
:members:
|
@@ -1,287 +1,335 @@
|
||||
homeassistant.helpers package
|
||||
=============================
|
||||
:mod:`homeassistant.helpers`
|
||||
============================
|
||||
|
||||
Submodules
|
||||
----------
|
||||
.. automodule:: homeassistant.helpers
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.aiohttp_client module
|
||||
-------------------------------------------
|
||||
homeassistant.helpers.aiohttp\_client
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.aiohttp_client
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
homeassistant.helpers.area_registry module
|
||||
------------------------------------------
|
||||
homeassistant.helpers.area\_registry
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.area_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.condition module
|
||||
--------------------------------------
|
||||
homeassistant.helpers.check\_config
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.check_config
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.collection
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.collection
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.condition
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.condition
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.config_entry_flow module
|
||||
----------------------------------------------
|
||||
homeassistant.helpers.config\_entry\_flow
|
||||
-----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.config_entry_flow
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.config_validation module
|
||||
----------------------------------------------
|
||||
homeassistant.helpers.config\_entry\_oauth2\_flow
|
||||
-------------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.config_entry_oauth2_flow
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.config\_validation
|
||||
----------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.config_validation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.data_entry_flow module
|
||||
--------------------------------------------
|
||||
homeassistant.helpers.data\_entry\_flow
|
||||
---------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.data_entry_flow
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.deprecation module
|
||||
----------------------------------------
|
||||
homeassistant.helpers.debounce
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.debounce
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.deprecation
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.deprecation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.device_registry module
|
||||
--------------------------------------------
|
||||
homeassistant.helpers.device\_registry
|
||||
--------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.device_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.discovery module
|
||||
--------------------------------------
|
||||
homeassistant.helpers.discovery
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.discovery
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.dispatcher module
|
||||
---------------------------------------
|
||||
homeassistant.helpers.dispatcher
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.dispatcher
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity module
|
||||
-----------------------------------
|
||||
homeassistant.helpers.entity
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_component module
|
||||
---------------------------------------------
|
||||
homeassistant.helpers.entity\_component
|
||||
---------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_component
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_platform module
|
||||
--------------------------------------------
|
||||
homeassistant.helpers.entity\_platform
|
||||
--------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_platform
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_registry module
|
||||
--------------------------------------------
|
||||
homeassistant.helpers.entity\_registry
|
||||
--------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entity_values module
|
||||
------------------------------------------
|
||||
homeassistant.helpers.entity\_values
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entity_values
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.entityfilter module
|
||||
-----------------------------------------
|
||||
homeassistant.helpers.entityfilter
|
||||
----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.entityfilter
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.event module
|
||||
----------------------------------
|
||||
homeassistant.helpers.event
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.event
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.icon module
|
||||
---------------------------------
|
||||
homeassistant.helpers.icon
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.icon
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.intent module
|
||||
-----------------------------------
|
||||
homeassistant.helpers.integration\_platform
|
||||
-------------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.integration_platform
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.intent
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.intent
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.json module
|
||||
---------------------------------
|
||||
homeassistant.helpers.json
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.json
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.location module
|
||||
-------------------------------------
|
||||
homeassistant.helpers.location
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.location
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.logging module
|
||||
------------------------------------
|
||||
homeassistant.helpers.logging
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.logging
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.restore_state module
|
||||
------------------------------------------
|
||||
homeassistant.helpers.network
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.network
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.restore\_state
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.restore_state
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.script module
|
||||
-----------------------------------
|
||||
homeassistant.helpers.script
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.script
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.service module
|
||||
------------------------------------
|
||||
homeassistant.helpers.service
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.service
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.signal module
|
||||
-----------------------------------
|
||||
homeassistant.helpers.signal
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.signal
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.state module
|
||||
----------------------------------
|
||||
homeassistant.helpers.state
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.state
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.storage module
|
||||
------------------------------------
|
||||
homeassistant.helpers.storage
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.storage
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.sun module
|
||||
--------------------------------
|
||||
homeassistant.helpers.sun
|
||||
-------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.sun
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.system_info module
|
||||
----------------------------------------
|
||||
homeassistant.helpers.system\_info
|
||||
----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.system_info
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.temperature module
|
||||
----------------------------------------
|
||||
homeassistant.helpers.temperature
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.temperature
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.template module
|
||||
-------------------------------------
|
||||
homeassistant.helpers.template
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.template
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.translation module
|
||||
-----------------------------------------
|
||||
homeassistant.helpers.translation
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.translation
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.typing module
|
||||
-----------------------------------
|
||||
homeassistant.helpers.typing
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.helpers.typing
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.helpers.update\_coordinator
|
||||
-----------------------------------------
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: homeassistant.helpers
|
||||
.. automodule:: homeassistant.helpers.update_coordinator
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
@@ -1,70 +0,0 @@
|
||||
homeassistant package
|
||||
=====================
|
||||
|
||||
Subpackages
|
||||
-----------
|
||||
|
||||
.. toctree::
|
||||
|
||||
helpers
|
||||
util
|
||||
|
||||
Submodules
|
||||
----------
|
||||
|
||||
bootstrap module
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.bootstrap
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
config module
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.config
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
const module
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.const
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
core module
|
||||
-------------------------
|
||||
|
||||
.. automodule:: homeassistant.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
exceptions module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.exceptions
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
loader module
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.loader
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: homeassistant
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
7
docs/source/api/loader.rst
Normal file
7
docs/source/api/loader.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
.. _loader_module:
|
||||
|
||||
:mod:`homeassistant.loader`
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.loader
|
||||
:members:
|
@@ -1,86 +1,159 @@
|
||||
homeassistant.util package
|
||||
==========================
|
||||
:mod:`homeassistant.util`
|
||||
=========================
|
||||
|
||||
Submodules
|
||||
----------
|
||||
|
||||
homeassistant.util.async_ module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.async_
|
||||
.. automodule:: homeassistant.util
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.color module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.color
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.distance module
|
||||
----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.distance
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.dt module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.dt
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.location module
|
||||
----------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.location
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.package module
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.package
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.temperature module
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.temperature
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.unit_system module
|
||||
-------------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.unit_system
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.yaml module
|
||||
------------------------------
|
||||
homeassistant.util.yaml
|
||||
-----------------------
|
||||
|
||||
.. automodule:: homeassistant.util.yaml
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.aiohttp
|
||||
--------------------------
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: homeassistant.util
|
||||
.. automodule:: homeassistant.util.aiohttp
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.async\_
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.async_
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.color
|
||||
------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.color
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.decorator
|
||||
----------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.decorator
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.distance
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.distance
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.dt
|
||||
---------------------
|
||||
|
||||
.. automodule:: homeassistant.util.dt
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.json
|
||||
-----------------------
|
||||
|
||||
.. automodule:: homeassistant.util.json
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.location
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.location
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.logging
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.logging
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.network
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.network
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.package
|
||||
--------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.package
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.pil
|
||||
----------------------
|
||||
|
||||
.. automodule:: homeassistant.util.pil
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.pressure
|
||||
---------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.pressure
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.ruamel\_yaml
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.ruamel_yaml
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.ssl
|
||||
----------------------
|
||||
|
||||
.. automodule:: homeassistant.util.ssl
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.temperature
|
||||
------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.temperature
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.unit\_system
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.unit_system
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
homeassistant.util.volume
|
||||
-------------------------
|
||||
|
||||
.. automodule:: homeassistant.util.volume
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
@@ -1,5 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Home-Assistant documentation build configuration file, created by
|
||||
# sphinx-quickstart on Sun Aug 28 13:13:10 2016.
|
||||
@@ -23,25 +22,26 @@ import sys
|
||||
|
||||
from homeassistant.const import __short_version__, __version__
|
||||
|
||||
PROJECT_NAME = 'Home Assistant'
|
||||
PROJECT_PACKAGE_NAME = 'homeassistant'
|
||||
PROJECT_AUTHOR = 'The Home Assistant Authors'
|
||||
PROJECT_COPYRIGHT = ' 2013-2018, {}'.format(PROJECT_AUTHOR)
|
||||
PROJECT_LONG_DESCRIPTION = ('Home Assistant is an open-source '
|
||||
'home automation platform running on Python 3. '
|
||||
'Track and control all devices at home and '
|
||||
'automate control. '
|
||||
'Installation in less than a minute.')
|
||||
PROJECT_GITHUB_USERNAME = 'home-assistant'
|
||||
PROJECT_GITHUB_REPOSITORY = 'home-assistant'
|
||||
PROJECT_NAME = "Home Assistant"
|
||||
PROJECT_PACKAGE_NAME = "homeassistant"
|
||||
PROJECT_AUTHOR = "The Home Assistant Authors"
|
||||
PROJECT_COPYRIGHT = f" 2013-2020, {PROJECT_AUTHOR}"
|
||||
PROJECT_LONG_DESCRIPTION = (
|
||||
"Home Assistant is an open-source "
|
||||
"home automation platform running on Python 3. "
|
||||
"Track and control all devices at home and "
|
||||
"automate control. "
|
||||
"Installation in less than a minute."
|
||||
)
|
||||
PROJECT_GITHUB_USERNAME = "home-assistant"
|
||||
PROJECT_GITHUB_REPOSITORY = "home-assistant"
|
||||
|
||||
GITHUB_PATH = '{}/{}'.format(
|
||||
PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY)
|
||||
GITHUB_URL = 'https://github.com/{}'.format(GITHUB_PATH)
|
||||
GITHUB_PATH = f"{PROJECT_GITHUB_USERNAME}/{PROJECT_GITHUB_REPOSITORY}"
|
||||
GITHUB_URL = f"https://github.com/{GITHUB_PATH}"
|
||||
|
||||
|
||||
sys.path.insert(0, os.path.abspath('_ext'))
|
||||
sys.path.insert(0, os.path.abspath('../homeassistant'))
|
||||
sys.path.insert(0, os.path.abspath("_ext"))
|
||||
sys.path.insert(0, os.path.abspath("../homeassistant"))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
@@ -53,27 +53,27 @@ sys.path.insert(0, os.path.abspath('../homeassistant'))
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.linkcode',
|
||||
'sphinx_autodoc_annotation',
|
||||
'edit_on_github'
|
||||
"sphinx.ext.autodoc",
|
||||
"sphinx.ext.linkcode",
|
||||
"sphinx_autodoc_annotation",
|
||||
"edit_on_github",
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
templates_path = ["_templates"]
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
source_suffix = ".rst"
|
||||
|
||||
# The encoding of source files.
|
||||
#
|
||||
# source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
master_doc = "index"
|
||||
|
||||
# General information about the project.
|
||||
project = PROJECT_NAME
|
||||
@@ -89,25 +89,25 @@ version = __short_version__
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = __version__
|
||||
|
||||
code_branch = 'dev' if 'dev' in __version__ else 'master'
|
||||
code_branch = "dev" if "dev" in __version__ else "master"
|
||||
|
||||
# Edit on Github config
|
||||
edit_on_github_project = GITHUB_PATH
|
||||
edit_on_github_branch = code_branch
|
||||
edit_on_github_src_path = 'docs/source/'
|
||||
edit_on_github_src_path = "docs/source/"
|
||||
|
||||
|
||||
def linkcode_resolve(domain, info):
|
||||
"""Determine the URL corresponding to Python object."""
|
||||
if domain != 'py':
|
||||
if domain != "py":
|
||||
return None
|
||||
modname = info['module']
|
||||
fullname = info['fullname']
|
||||
modname = info["module"]
|
||||
fullname = info["fullname"]
|
||||
submod = sys.modules.get(modname)
|
||||
if submod is None:
|
||||
return None
|
||||
obj = submod
|
||||
for part in fullname.split('.'):
|
||||
for part in fullname.split("."):
|
||||
try:
|
||||
obj = getattr(obj, part)
|
||||
except:
|
||||
@@ -132,7 +132,8 @@ def linkcode_resolve(domain, info):
|
||||
|
||||
fn = fn[index:]
|
||||
|
||||
return '{}/blob/{}/{}{}'.format(GITHUB_URL, code_branch, fn, linespec)
|
||||
return f"{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}"
|
||||
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
@@ -175,7 +176,7 @@ exclude_patterns = []
|
||||
# show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
pygments_style = "sphinx"
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
# modindex_common_prefix = []
|
||||
@@ -192,22 +193,22 @@ todo_include_todos = False
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'alabaster'
|
||||
html_theme = "alabaster"
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
html_theme_options = {
|
||||
'logo': 'logo.png',
|
||||
'logo_name': PROJECT_NAME,
|
||||
'description': PROJECT_LONG_DESCRIPTION,
|
||||
'github_user': PROJECT_GITHUB_USERNAME,
|
||||
'github_repo': PROJECT_GITHUB_REPOSITORY,
|
||||
'github_type': 'star',
|
||||
'github_banner': True,
|
||||
'travis_button': True,
|
||||
'touch_icon': 'logo-apple.png',
|
||||
"logo": "logo.png",
|
||||
"logo_name": PROJECT_NAME,
|
||||
"description": PROJECT_LONG_DESCRIPTION,
|
||||
"github_user": PROJECT_GITHUB_USERNAME,
|
||||
"github_repo": PROJECT_GITHUB_REPOSITORY,
|
||||
"github_type": "star",
|
||||
"github_banner": True,
|
||||
"travis_button": True,
|
||||
"touch_icon": "logo-apple.png",
|
||||
# 'fixed_sidebar': True, # Re-enable when we have more content
|
||||
}
|
||||
|
||||
@@ -233,12 +234,12 @@ html_theme_options = {
|
||||
# This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#
|
||||
html_favicon = '_static/favicon.ico'
|
||||
html_favicon = "_static/favicon.ico"
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
html_static_path = ["_static"]
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
@@ -250,7 +251,7 @@ html_static_path = ['_static']
|
||||
# bottom, using the given strftime format.
|
||||
# The empty string is equivalent to '%b %d, %Y'.
|
||||
#
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
html_last_updated_fmt = "%b %d, %Y"
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
@@ -260,13 +261,13 @@ html_use_smartypants = True
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#
|
||||
html_sidebars = {
|
||||
'**': [
|
||||
'about.html',
|
||||
'links.html',
|
||||
'searchbox.html',
|
||||
'sourcelink.html',
|
||||
'navigation.html',
|
||||
'relations.html'
|
||||
"**": [
|
||||
"about.html",
|
||||
"links.html",
|
||||
"searchbox.html",
|
||||
"sourcelink.html",
|
||||
"navigation.html",
|
||||
"relations.html",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -327,7 +328,7 @@ html_sidebars = {
|
||||
# html_search_scorer = 'scorer.js'
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'Home-Assistantdoc'
|
||||
htmlhelp_basename = "Home-Assistantdoc"
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
@@ -335,15 +336,12 @@ latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
@@ -353,8 +351,13 @@ latex_elements = {
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'home-assistant.tex', 'Home Assistant Documentation',
|
||||
'Home Assistant Team', 'manual'),
|
||||
(
|
||||
master_doc,
|
||||
"home-assistant.tex",
|
||||
"Home Assistant Documentation",
|
||||
"Home Assistant Team",
|
||||
"manual",
|
||||
)
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
@@ -395,8 +398,7 @@ latex_documents = [
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'home-assistant', 'Home Assistant Documentation',
|
||||
[author], 1)
|
||||
(master_doc, "home-assistant", "Home Assistant Documentation", [author], 1)
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
@@ -410,9 +412,15 @@ man_pages = [
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'Home-Assistant', 'Home Assistant Documentation',
|
||||
author, 'Home Assistant', 'Open-source home automation platform.',
|
||||
'Miscellaneous'),
|
||||
(
|
||||
master_doc,
|
||||
"Home-Assistant",
|
||||
"Home Assistant Documentation",
|
||||
author,
|
||||
"Home Assistant",
|
||||
"Open-source home automation platform.",
|
||||
"Miscellaneous",
|
||||
)
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
|
@@ -8,11 +8,14 @@ import sys
|
||||
import threading
|
||||
from typing import List
|
||||
|
||||
import yarl
|
||||
|
||||
from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __version__
|
||||
|
||||
|
||||
def set_loop() -> None:
|
||||
"""Attempt to use different loop."""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from asyncio.events import BaseDefaultEventLoopPolicy
|
||||
|
||||
if sys.platform == "win32":
|
||||
@@ -35,15 +38,15 @@ def validate_python() -> None:
|
||||
"""Validate that the right Python version is running."""
|
||||
if sys.version_info[:3] < REQUIRED_PYTHON_VER:
|
||||
print(
|
||||
"Home Assistant requires at least Python {}.{}.{}".format(
|
||||
*REQUIRED_PYTHON_VER
|
||||
)
|
||||
"Home Assistant requires at least Python "
|
||||
f"{REQUIRED_PYTHON_VER[0]}.{REQUIRED_PYTHON_VER[1]}.{REQUIRED_PYTHON_VER[2]}"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def ensure_config_path(config_dir: str) -> None:
|
||||
"""Validate the configuration directory."""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
import homeassistant.config as config_util
|
||||
|
||||
lib_dir = os.path.join(config_dir, "deps")
|
||||
@@ -77,6 +80,7 @@ def ensure_config_path(config_dir: str) -> None:
|
||||
|
||||
def get_arguments() -> argparse.Namespace:
|
||||
"""Get parsed passed in arguments."""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
import homeassistant.config as config_util
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
@@ -164,7 +168,7 @@ def daemonize() -> None:
|
||||
sys.exit(0)
|
||||
|
||||
# redirect standard file descriptors to devnull
|
||||
infd = open(os.devnull, "r")
|
||||
infd = open(os.devnull)
|
||||
outfd = open(os.devnull, "a+")
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
@@ -177,7 +181,7 @@ def check_pid(pid_file: str) -> None:
|
||||
"""Check that Home Assistant is not already running."""
|
||||
# Check pid file
|
||||
try:
|
||||
with open(pid_file, "r") as file:
|
||||
with open(pid_file) as file:
|
||||
pid = int(file.readline())
|
||||
except OSError:
|
||||
# PID File does not exist
|
||||
@@ -214,6 +218,7 @@ def closefds_osx(min_fd: int, max_fd: int) -> None:
|
||||
are guarded. But we can set the close-on-exec flag on everything we want to
|
||||
get rid of.
|
||||
"""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from fcntl import fcntl, F_GETFD, F_SETFD, FD_CLOEXEC
|
||||
|
||||
for _fd in range(min_fd, max_fd):
|
||||
@@ -237,6 +242,7 @@ def cmdline() -> List[str]:
|
||||
|
||||
async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int:
|
||||
"""Set up Home Assistant and run."""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from homeassistant import bootstrap
|
||||
|
||||
hass = await bootstrap.async_setup_hass(
|
||||
@@ -252,10 +258,17 @@ async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int:
|
||||
if hass is None:
|
||||
return 1
|
||||
|
||||
if args.open_ui and hass.config.api is not None:
|
||||
import webbrowser
|
||||
if args.open_ui:
|
||||
import webbrowser # pylint: disable=import-outside-toplevel
|
||||
|
||||
hass.add_job(webbrowser.open, hass.config.api.base_url)
|
||||
if hass.config.api is not None:
|
||||
scheme = "https" if hass.config.api.use_ssl else "http"
|
||||
url = str(
|
||||
yarl.URL.build(
|
||||
scheme=scheme, host="127.0.0.1", port=hass.config.api.port
|
||||
)
|
||||
)
|
||||
hass.add_job(webbrowser.open, url)
|
||||
|
||||
return await hass.async_run()
|
||||
|
||||
@@ -324,6 +337,7 @@ def main() -> int:
|
||||
args = get_arguments()
|
||||
|
||||
if args.script is not None:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from homeassistant import scripts
|
||||
|
||||
return scripts.run(args.script)
|
||||
@@ -339,7 +353,7 @@ def main() -> int:
|
||||
if args.pid_file:
|
||||
write_pid(args.pid_file)
|
||||
|
||||
exit_code = asyncio.run(setup_and_run_hass(config_dir, args))
|
||||
exit_code = asyncio.run(setup_and_run_hass(config_dir, args), debug=args.debug)
|
||||
if exit_code == RESTART_EXIT_CODE and not args.runner:
|
||||
try_to_restart()
|
||||
|
||||
|
@@ -215,12 +215,14 @@ class AuthManager:
|
||||
|
||||
return user
|
||||
|
||||
async def async_create_user(self, name: str) -> models.User:
|
||||
async def async_create_user(
|
||||
self, name: str, group_ids: Optional[List[str]] = None
|
||||
) -> models.User:
|
||||
"""Create a user."""
|
||||
kwargs: Dict[str, Any] = {
|
||||
"name": name,
|
||||
"is_active": True,
|
||||
"group_ids": [GROUP_ID_ADMIN],
|
||||
"group_ids": group_ids or [],
|
||||
}
|
||||
|
||||
if await self._user_should_be_owner():
|
||||
|
@@ -47,28 +47,28 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
def _generate_secret() -> str:
|
||||
"""Generate a secret."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
return str(pyotp.random_base32())
|
||||
|
||||
|
||||
def _generate_random() -> int:
|
||||
"""Generate a 8 digit number."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
return int(pyotp.random_base32(length=8, chars=list("1234567890")))
|
||||
|
||||
|
||||
def _generate_otp(secret: str, count: int) -> str:
|
||||
"""Generate one time password."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
return str(pyotp.HOTP(secret).at(count))
|
||||
|
||||
|
||||
def _verify_otp(secret: str, otp: str, count: int) -> bool:
|
||||
"""Verify one time password."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
return bool(pyotp.HOTP(secret).verify(otp, count))
|
||||
|
||||
@@ -204,7 +204,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
|
||||
await self._async_load()
|
||||
assert self._user_settings is not None
|
||||
|
||||
notify_setting = self._user_settings.get(user_id, None)
|
||||
notify_setting = self._user_settings.get(user_id)
|
||||
if notify_setting is None:
|
||||
return False
|
||||
|
||||
@@ -222,7 +222,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
|
||||
await self._async_load()
|
||||
assert self._user_settings is not None
|
||||
|
||||
notify_setting = self._user_settings.get(user_id, None)
|
||||
notify_setting = self._user_settings.get(user_id)
|
||||
if notify_setting is None:
|
||||
raise ValueError("Cannot find user_id")
|
||||
|
||||
@@ -246,7 +246,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
|
||||
await self._async_load()
|
||||
assert self._user_settings is not None
|
||||
|
||||
notify_setting = self._user_settings.get(user_id, None)
|
||||
notify_setting = self._user_settings.get(user_id)
|
||||
if notify_setting is None:
|
||||
_LOGGER.error("Cannot find user %s", user_id)
|
||||
return
|
||||
|
@@ -35,13 +35,13 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
def _generate_qr_code(data: str) -> str:
|
||||
"""Generate a base64 PNG string represent QR Code image of data."""
|
||||
import pyqrcode
|
||||
import pyqrcode # pylint: disable=import-outside-toplevel
|
||||
|
||||
qr_code = pyqrcode.create(data)
|
||||
|
||||
with BytesIO() as buffer:
|
||||
qr_code.svg(file=buffer, scale=4)
|
||||
return "{}".format(
|
||||
return str(
|
||||
buffer.getvalue()
|
||||
.decode("ascii")
|
||||
.replace("\n", "")
|
||||
@@ -55,7 +55,7 @@ def _generate_qr_code(data: str) -> str:
|
||||
|
||||
def _generate_secret_and_qr_code(username: str) -> Tuple[str, str, str]:
|
||||
"""Generate a secret, url, and QR code."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
ota_secret = pyotp.random_base32()
|
||||
url = pyotp.totp.TOTP(ota_secret).provisioning_uri(
|
||||
@@ -105,7 +105,7 @@ class TotpAuthModule(MultiFactorAuthModule):
|
||||
|
||||
def _add_ota_secret(self, user_id: str, secret: Optional[str] = None) -> str:
|
||||
"""Create a ota_secret for user."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
ota_secret: str = secret or pyotp.random_base32()
|
||||
|
||||
@@ -117,7 +117,8 @@ class TotpAuthModule(MultiFactorAuthModule):
|
||||
|
||||
Mfa module should extend SetupFlow
|
||||
"""
|
||||
user = await self.hass.auth.async_get_user(user_id) # type: ignore
|
||||
user = await self.hass.auth.async_get_user(user_id)
|
||||
assert user is not None
|
||||
return TotpSetupFlow(self, self.input_schema, user)
|
||||
|
||||
async def async_setup_user(self, user_id: str, setup_data: Any) -> str:
|
||||
@@ -160,7 +161,7 @@ class TotpAuthModule(MultiFactorAuthModule):
|
||||
|
||||
def _validate_2fa(self, user_id: str, code: str) -> bool:
|
||||
"""Validate two factor authentication code."""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
ota_secret = self._users.get(user_id) # type: ignore
|
||||
if ota_secret is None:
|
||||
@@ -195,7 +196,7 @@ class TotpSetupFlow(SetupFlow):
|
||||
Return self.async_show_form(step_id='init') if user_input is None.
|
||||
Return self.async_create_entry(data={'result': result}) if finish.
|
||||
"""
|
||||
import pyotp
|
||||
import pyotp # pylint: disable=import-outside-toplevel
|
||||
|
||||
errors: Dict[str, str] = {}
|
||||
|
||||
|
@@ -123,4 +123,8 @@ class Credentials:
|
||||
is_new = attr.ib(type=bool, default=True)
|
||||
|
||||
|
||||
UserMeta = NamedTuple("UserMeta", [("name", Optional[str]), ("is_active", bool)])
|
||||
class UserMeta(NamedTuple):
|
||||
"""User metadata."""
|
||||
|
||||
name: Optional[str]
|
||||
is_active: bool
|
||||
|
@@ -116,7 +116,6 @@ class AuthProvider:
|
||||
|
||||
async def async_initialize(self) -> None:
|
||||
"""Initialize the auth provider."""
|
||||
pass
|
||||
|
||||
|
||||
async def auth_provider_from_config(
|
||||
@@ -176,7 +175,7 @@ class LoginFlow(data_entry_flow.FlowHandler):
|
||||
"""Initialize the login flow."""
|
||||
self._auth_provider = auth_provider
|
||||
self._auth_module_id: Optional[str] = None
|
||||
self._auth_manager = auth_provider.hass.auth # type: ignore
|
||||
self._auth_manager = auth_provider.hass.auth
|
||||
self.available_mfa_modules: Dict[str, str] = {}
|
||||
self.created_at = dt_util.utcnow()
|
||||
self.invalid_mfa_times = 0
|
||||
@@ -225,6 +224,7 @@ class LoginFlow(data_entry_flow.FlowHandler):
|
||||
|
||||
errors = {}
|
||||
|
||||
assert self._auth_module_id is not None
|
||||
auth_module = self._auth_manager.get_auth_mfa_module(self._auth_module_id)
|
||||
if auth_module is None:
|
||||
# Given an invalid input to async_step_select_mfa_module
|
||||
@@ -235,7 +235,9 @@ class LoginFlow(data_entry_flow.FlowHandler):
|
||||
auth_module, "async_initialize_login_mfa_step"
|
||||
):
|
||||
try:
|
||||
await auth_module.async_initialize_login_mfa_step(self.user.id)
|
||||
await auth_module.async_initialize_login_mfa_step( # type: ignore
|
||||
self.user.id
|
||||
)
|
||||
except HomeAssistantError:
|
||||
_LOGGER.exception("Error initializing MFA step")
|
||||
return self.async_abort(reason="unknown_error")
|
||||
|
@@ -61,8 +61,7 @@ class CommandLineAuthProvider(AuthProvider):
|
||||
"""Validate a username and password."""
|
||||
env = {"username": username, "password": password}
|
||||
try:
|
||||
# pylint: disable=no-member
|
||||
process = await asyncio.subprocess.create_subprocess_exec(
|
||||
process = await asyncio.subprocess.create_subprocess_exec( # pylint: disable=no-member
|
||||
self.config[CONF_COMMAND],
|
||||
*self.config[CONF_ARGS],
|
||||
env=env,
|
||||
|
@@ -138,8 +138,9 @@ class Data:
|
||||
if not bcrypt.checkpw(password.encode(), user_hash):
|
||||
raise InvalidAuth
|
||||
|
||||
# pylint: disable=no-self-use
|
||||
def hash_password(self, password: str, for_storage: bool = False) -> bytes:
|
||||
def hash_password( # pylint: disable=no-self-use
|
||||
self, password: str, for_storage: bool = False
|
||||
) -> bytes:
|
||||
"""Encode a password."""
|
||||
hashed: bytes = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
|
||||
|
||||
|
14
homeassistant/block_async_io.py
Normal file
14
homeassistant/block_async_io.py
Normal file
@@ -0,0 +1,14 @@
|
||||
"""Block I/O being done in asyncio."""
|
||||
from http.client import HTTPConnection
|
||||
|
||||
from homeassistant.util.async_ import protect_loop
|
||||
|
||||
|
||||
def enable() -> None:
|
||||
"""Enable the detection of I/O in the event loop."""
|
||||
# Prevent urllib3 and requests doing I/O in event loop
|
||||
HTTPConnection.putrequest = protect_loop(HTTPConnection.putrequest)
|
||||
|
||||
# Currently disabled. pytz doing I/O when getting timezone.
|
||||
# Prevent files being opened inside the event loop
|
||||
# builtins.open = protect_loop(builtins.open)
|
@@ -1,6 +1,7 @@
|
||||
"""Provide methods to bootstrap a Home Assistant instance."""
|
||||
import asyncio
|
||||
import contextlib
|
||||
from datetime import datetime
|
||||
import logging
|
||||
import logging.handlers
|
||||
import os
|
||||
@@ -14,14 +15,19 @@ import voluptuous as vol
|
||||
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.helpers.typing import ConfigType
|
||||
from homeassistant.setup import (
|
||||
DATA_SETUP,
|
||||
DATA_SETUP_STARTED,
|
||||
async_set_domains_to_be_loaded,
|
||||
async_setup_component,
|
||||
)
|
||||
from homeassistant.util.logging import async_activate_log_queue_handler
|
||||
from homeassistant.util.package import async_get_user_site, is_virtual_env
|
||||
from homeassistant.util.yaml import clear_secret_cache
|
||||
|
||||
@@ -32,16 +38,30 @@ ERROR_LOG_FILENAME = "home-assistant.log"
|
||||
# hass.data key for logging information.
|
||||
DATA_LOGGING = "logging"
|
||||
|
||||
DEBUGGER_INTEGRATIONS = {"ptvsd"}
|
||||
LOG_SLOW_STARTUP_INTERVAL = 60
|
||||
|
||||
DEBUGGER_INTEGRATIONS = {"debugpy", "ptvsd"}
|
||||
CORE_INTEGRATIONS = ("homeassistant", "persistent_notification")
|
||||
LOGGING_INTEGRATIONS = {"logger", "system_log", "sentry"}
|
||||
STAGE_1_INTEGRATIONS = {
|
||||
LOGGING_INTEGRATIONS = {
|
||||
# Set log levels
|
||||
"logger",
|
||||
# Error logging
|
||||
"system_log",
|
||||
"sentry",
|
||||
# To record data
|
||||
"recorder",
|
||||
}
|
||||
STAGE_1_INTEGRATIONS = {
|
||||
# To make sure we forward data to other instances
|
||||
"mqtt_eventstream",
|
||||
# To provide account link implementations
|
||||
"cloud",
|
||||
# Ensure supervisor is available
|
||||
"hassio",
|
||||
# Get the frontend up and running as soon
|
||||
# as possible so problem integrations can
|
||||
# be removed
|
||||
"frontend",
|
||||
}
|
||||
|
||||
|
||||
@@ -116,8 +136,12 @@ async def async_setup_hass(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
safe_mode = True
|
||||
old_config = hass.config
|
||||
hass = core.HomeAssistant()
|
||||
hass.config.config_dir = config_dir
|
||||
hass.config.skip_pip = old_config.skip_pip
|
||||
hass.config.internal_url = old_config.internal_url
|
||||
hass.config.external_url = old_config.external_url
|
||||
hass.config.config_dir = old_config.config_dir
|
||||
|
||||
if safe_mode:
|
||||
_LOGGER.info("Starting in safe mode")
|
||||
@@ -133,7 +157,7 @@ async def async_setup_hass(
|
||||
|
||||
|
||||
async def async_from_config_dict(
|
||||
config: Dict[str, Any], hass: core.HomeAssistant
|
||||
config: ConfigType, hass: core.HomeAssistant
|
||||
) -> Optional[core.HomeAssistant]:
|
||||
"""Try to configure Home Assistant from a configuration dictionary.
|
||||
|
||||
@@ -214,6 +238,7 @@ def async_enable_logging(
|
||||
|
||||
if not log_no_color:
|
||||
try:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from colorlog import ColoredFormatter
|
||||
|
||||
# basicConfig must be called after importing colorlog in order to
|
||||
@@ -247,6 +272,10 @@ def async_enable_logging(
|
||||
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
||||
logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
|
||||
|
||||
sys.excepthook = lambda *args: logging.getLogger(None).exception(
|
||||
"Uncaught exception", exc_info=args # type: ignore
|
||||
)
|
||||
|
||||
# Log errors to a file if we have write access to file or config dir
|
||||
if log_file is None:
|
||||
err_log_path = hass.config.path(ERROR_LOG_FILENAME)
|
||||
@@ -272,24 +301,17 @@ def async_enable_logging(
|
||||
err_handler.setLevel(logging.INFO if verbose else logging.WARNING)
|
||||
err_handler.setFormatter(logging.Formatter(fmt, datefmt=datefmt))
|
||||
|
||||
async_handler = AsyncHandler(hass.loop, err_handler)
|
||||
|
||||
async def async_stop_async_handler(_: Any) -> None:
|
||||
"""Cleanup async handler."""
|
||||
logging.getLogger("").removeHandler(async_handler) # type: ignore
|
||||
await async_handler.async_close(blocking=True)
|
||||
|
||||
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_CLOSE, async_stop_async_handler)
|
||||
|
||||
logger = logging.getLogger("")
|
||||
logger.addHandler(async_handler) # type: ignore
|
||||
logger.setLevel(logging.INFO)
|
||||
logger.addHandler(err_handler)
|
||||
logger.setLevel(logging.INFO if verbose else logging.WARNING)
|
||||
|
||||
# Save the log file location for access by other components.
|
||||
hass.data[DATA_LOGGING] = err_log_path
|
||||
else:
|
||||
_LOGGER.error("Unable to set up error log %s (access denied)", err_log_path)
|
||||
|
||||
async_activate_log_queue_handler(hass)
|
||||
|
||||
|
||||
async def async_mount_local_lib_path(config_dir: str) -> str:
|
||||
"""Add local library to Python Path.
|
||||
@@ -307,7 +329,7 @@ async def async_mount_local_lib_path(config_dir: str) -> str:
|
||||
def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]:
|
||||
"""Get domains of components to set up."""
|
||||
# Filter out the repeating and common config section [homeassistant]
|
||||
domains = set(key.split(" ")[0] for key in config.keys() if key != core.DOMAIN)
|
||||
domains = {key.split(" ")[0] for key in config.keys() if key != core.DOMAIN}
|
||||
|
||||
# Add config entry domains
|
||||
if not hass.config.safe_mode:
|
||||
@@ -320,46 +342,130 @@ def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]:
|
||||
return domains
|
||||
|
||||
|
||||
async def _async_log_pending_setups(
|
||||
domains: Set[str], setup_started: Dict[str, datetime]
|
||||
) -> None:
|
||||
"""Periodic log of setups that are pending for longer than LOG_SLOW_STARTUP_INTERVAL."""
|
||||
while True:
|
||||
await asyncio.sleep(LOG_SLOW_STARTUP_INTERVAL)
|
||||
remaining = [domain for domain in domains if domain in setup_started]
|
||||
|
||||
if remaining:
|
||||
_LOGGER.info(
|
||||
"Waiting on integrations to complete setup: %s", ", ".join(remaining),
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_multi_components(
|
||||
hass: core.HomeAssistant,
|
||||
domains: Set[str],
|
||||
config: Dict[str, Any],
|
||||
setup_started: Dict[str, datetime],
|
||||
) -> None:
|
||||
"""Set up multiple domains. Log on failure."""
|
||||
futures = {
|
||||
domain: hass.async_create_task(async_setup_component(hass, domain, config))
|
||||
for domain in domains
|
||||
}
|
||||
log_task = asyncio.create_task(_async_log_pending_setups(domains, setup_started))
|
||||
await asyncio.wait(futures.values())
|
||||
log_task.cancel()
|
||||
errors = [domain for domain in domains if futures[domain].exception()]
|
||||
for domain in errors:
|
||||
exception = futures[domain].exception()
|
||||
assert exception is not None
|
||||
_LOGGER.error(
|
||||
"Error setting up integration %s - received exception",
|
||||
domain,
|
||||
exc_info=(type(exception), exception, exception.__traceback__),
|
||||
)
|
||||
|
||||
|
||||
async def _async_set_up_integrations(
|
||||
hass: core.HomeAssistant, config: Dict[str, Any]
|
||||
) -> None:
|
||||
"""Set up all the integrations."""
|
||||
domains = _get_domains(hass, config)
|
||||
setup_started = hass.data[DATA_SETUP_STARTED] = {}
|
||||
domains_to_setup = _get_domains(hass, config)
|
||||
|
||||
# Start up debuggers. Start these first in case they want to wait.
|
||||
debuggers = domains & DEBUGGER_INTEGRATIONS
|
||||
if debuggers:
|
||||
_LOGGER.debug("Starting up debuggers %s", debuggers)
|
||||
await asyncio.gather(
|
||||
*(async_setup_component(hass, domain, config) for domain in debuggers)
|
||||
)
|
||||
domains -= DEBUGGER_INTEGRATIONS
|
||||
# Resolve all dependencies so we know all integrations
|
||||
# that will have to be loaded and start rightaway
|
||||
integration_cache: Dict[str, loader.Integration] = {}
|
||||
to_resolve = domains_to_setup
|
||||
while to_resolve:
|
||||
old_to_resolve = to_resolve
|
||||
to_resolve = set()
|
||||
|
||||
# Resolve all dependencies of all components so we can find the logging
|
||||
# and integrations that need faster initialization.
|
||||
resolved_domains_task = asyncio.gather(
|
||||
*(loader.async_component_dependencies(hass, domain) for domain in domains),
|
||||
integrations_to_process = [
|
||||
int_or_exc
|
||||
for int_or_exc in await asyncio.gather(
|
||||
*(
|
||||
loader.async_get_integration(hass, domain)
|
||||
for domain in old_to_resolve
|
||||
),
|
||||
return_exceptions=True,
|
||||
)
|
||||
if isinstance(int_or_exc, loader.Integration)
|
||||
]
|
||||
resolve_dependencies_tasks = [
|
||||
itg.resolve_dependencies()
|
||||
for itg in integrations_to_process
|
||||
if not itg.all_dependencies_resolved
|
||||
]
|
||||
|
||||
# Finish resolving domains
|
||||
for dep_domains in await resolved_domains_task:
|
||||
# Result is either a set or an exception. We ignore exceptions
|
||||
# It will be properly handled during setup of the domain.
|
||||
if isinstance(dep_domains, set):
|
||||
domains.update(dep_domains)
|
||||
if resolve_dependencies_tasks:
|
||||
await asyncio.gather(*resolve_dependencies_tasks)
|
||||
|
||||
# setup components
|
||||
logging_domains = domains & LOGGING_INTEGRATIONS
|
||||
stage_1_domains = domains & STAGE_1_INTEGRATIONS
|
||||
stage_2_domains = domains - logging_domains - stage_1_domains
|
||||
for itg in integrations_to_process:
|
||||
integration_cache[itg.domain] = itg
|
||||
|
||||
for dep in itg.all_dependencies:
|
||||
if dep in domains_to_setup:
|
||||
continue
|
||||
|
||||
domains_to_setup.add(dep)
|
||||
to_resolve.add(dep)
|
||||
|
||||
_LOGGER.info("Domains to be set up: %s", domains_to_setup)
|
||||
|
||||
logging_domains = domains_to_setup & LOGGING_INTEGRATIONS
|
||||
|
||||
# Load logging as soon as possible
|
||||
if logging_domains:
|
||||
_LOGGER.info("Setting up %s", logging_domains)
|
||||
_LOGGER.info("Setting up logging: %s", logging_domains)
|
||||
await async_setup_multi_components(hass, logging_domains, config, setup_started)
|
||||
|
||||
await asyncio.gather(
|
||||
*(async_setup_component(hass, domain, config) for domain in logging_domains)
|
||||
)
|
||||
# Start up debuggers. Start these first in case they want to wait.
|
||||
debuggers = domains_to_setup & DEBUGGER_INTEGRATIONS
|
||||
|
||||
if debuggers:
|
||||
_LOGGER.debug("Setting up debuggers: %s", debuggers)
|
||||
await async_setup_multi_components(hass, debuggers, config, setup_started)
|
||||
|
||||
# calculate what components to setup in what stage
|
||||
stage_1_domains = set()
|
||||
|
||||
# Find all dependencies of any dependency of any stage 1 integration that
|
||||
# we plan on loading and promote them to stage 1
|
||||
deps_promotion = STAGE_1_INTEGRATIONS
|
||||
while deps_promotion:
|
||||
old_deps_promotion = deps_promotion
|
||||
deps_promotion = set()
|
||||
|
||||
for domain in old_deps_promotion:
|
||||
if domain not in domains_to_setup or domain in stage_1_domains:
|
||||
continue
|
||||
|
||||
stage_1_domains.add(domain)
|
||||
|
||||
dep_itg = integration_cache.get(domain)
|
||||
|
||||
if dep_itg is None:
|
||||
continue
|
||||
|
||||
deps_promotion.update(dep_itg.all_dependencies)
|
||||
|
||||
stage_2_domains = domains_to_setup - logging_domains - debuggers - stage_1_domains
|
||||
|
||||
# Kick off loading the registries. They don't need to be awaited.
|
||||
asyncio.gather(
|
||||
@@ -368,53 +474,18 @@ async def _async_set_up_integrations(
|
||||
hass.helpers.area_registry.async_get_registry(),
|
||||
)
|
||||
|
||||
# Start setup
|
||||
if stage_1_domains:
|
||||
await asyncio.gather(
|
||||
*(async_setup_component(hass, domain, config) for domain in stage_1_domains)
|
||||
)
|
||||
_LOGGER.info("Setting up stage 1: %s", stage_1_domains)
|
||||
await async_setup_multi_components(hass, stage_1_domains, config, setup_started)
|
||||
|
||||
# Load all integrations
|
||||
after_dependencies: Dict[str, Set[str]] = {}
|
||||
# Enables after dependencies
|
||||
async_set_domains_to_be_loaded(hass, stage_1_domains | stage_2_domains)
|
||||
|
||||
for int_or_exc in await asyncio.gather(
|
||||
*(loader.async_get_integration(hass, domain) for domain in stage_2_domains),
|
||||
return_exceptions=True,
|
||||
):
|
||||
# Exceptions are handled in async_setup_component.
|
||||
if isinstance(int_or_exc, loader.Integration) and int_or_exc.after_dependencies:
|
||||
after_dependencies[int_or_exc.domain] = set(int_or_exc.after_dependencies)
|
||||
|
||||
last_load = None
|
||||
while stage_2_domains:
|
||||
domains_to_load = set()
|
||||
|
||||
for domain in stage_2_domains:
|
||||
after_deps = after_dependencies.get(domain)
|
||||
# Load if integration has no after_dependencies or they are
|
||||
# all loaded
|
||||
if not after_deps or not after_deps - hass.config.components:
|
||||
domains_to_load.add(domain)
|
||||
|
||||
if not domains_to_load or domains_to_load == last_load:
|
||||
break
|
||||
|
||||
_LOGGER.debug("Setting up %s", domains_to_load)
|
||||
|
||||
await asyncio.gather(
|
||||
*(async_setup_component(hass, domain, config) for domain in domains_to_load)
|
||||
)
|
||||
|
||||
last_load = domains_to_load
|
||||
stage_2_domains -= domains_to_load
|
||||
|
||||
# These are stage 2 domains that never have their after_dependencies
|
||||
# satisfied.
|
||||
if stage_2_domains:
|
||||
_LOGGER.debug("Final set up: %s", stage_2_domains)
|
||||
|
||||
await asyncio.gather(
|
||||
*(async_setup_component(hass, domain, config) for domain in stage_2_domains)
|
||||
)
|
||||
_LOGGER.info("Setting up stage 2: %s", stage_2_domains)
|
||||
await async_setup_multi_components(hass, stage_2_domains, config, setup_started)
|
||||
|
||||
# Wrap up startup
|
||||
_LOGGER.debug("Waiting for startup to wrap up")
|
||||
await hass.async_block_till_done()
|
||||
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Nom\u00e9s es permet una \u00fanica configuraci\u00f3 d'Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "No es pot connectar amb Abode.",
|
||||
"identifier_exists": "Compte ja registrat.",
|
||||
"invalid_credentials": "Credencials inv\u00e0lides."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Contrasenya",
|
||||
"username": "Correu electr\u00f2nic"
|
||||
},
|
||||
"title": "Introducci\u00f3 de la informaci\u00f3 d'inici de sessi\u00f3 a Abode."
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Det er kun n\u00f8dvendigt med en ops\u00e6tning af Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kunne ikke oprette forbindelse til Abode.",
|
||||
"identifier_exists": "Konto er allerede registreret.",
|
||||
"invalid_credentials": "Ugyldige legitimationsoplysninger."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Adgangskode",
|
||||
"username": "Email-adresse"
|
||||
},
|
||||
"title": "Udfyld dine Abode-loginoplysninger"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Es ist nur eine einzige Konfiguration von Abode erlaubt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Es kann keine Verbindung zu Abode hergestellt werden.",
|
||||
"identifier_exists": "Das Konto ist bereits registriert.",
|
||||
"invalid_credentials": "Ung\u00fcltige Anmeldeinformationen"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Passwort",
|
||||
"username": "E-Mail-Adresse"
|
||||
},
|
||||
"title": "Gib deine Abode-Anmeldeinformationen ein"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Only a single configuration of Abode is allowed."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Unable to connect to Abode.",
|
||||
"identifier_exists": "Account already registered.",
|
||||
"invalid_credentials": "Invalid credentials."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Password",
|
||||
"username": "Email Address"
|
||||
},
|
||||
"title": "Fill in your Abode login information"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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": "Rellene la informaci\u00f3n de acceso Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Une seule configuration d'Abode est autoris\u00e9e."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Impossible de se connecter \u00e0 Abode.",
|
||||
"identifier_exists": "Compte d\u00e9j\u00e0 enregistr\u00e9.",
|
||||
"invalid_credentials": "Informations d'identification invalides."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Mot de passe",
|
||||
"username": "Adresse e-mail"
|
||||
},
|
||||
"title": "Remplissez vos informations de connexion Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\u00c8 consentita una sola configurazione di Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Impossibile connettersi ad Abode.",
|
||||
"identifier_exists": "Account gi\u00e0 registrato",
|
||||
"invalid_credentials": "Credenziali non valide"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Password",
|
||||
"username": "Indirizzo email"
|
||||
},
|
||||
"title": "Inserisci le tue informazioni di accesso Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\ud558\ub098\uc758 Abode \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Abode \uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
|
||||
"identifier_exists": "\uacc4\uc815\uc774 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
|
||||
"invalid_credentials": "\uc0ac\uc6a9\uc790 \uc774\ub984 \ud639\uc740 \ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "\ube44\ubc00\ubc88\ud638",
|
||||
"username": "\uc774\uba54\uc77c \uc8fc\uc18c"
|
||||
},
|
||||
"title": "Abode \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "N\u00ebmmen eng eenzeg Konfiguratioun vun ZHA ass erlaabt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kann sech net mat Abode verbannen.",
|
||||
"identifier_exists": "Konto ass scho registr\u00e9iert",
|
||||
"invalid_credentials": "Ong\u00eblteg Login Informatioune"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Passwuert",
|
||||
"username": "E-Mail Adress"
|
||||
},
|
||||
"title": "F\u00ebllt \u00e4r Abode Login Informatiounen aus."
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Slechts een enkele configuratie van Abode is toegestaan."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kan geen verbinding maken met Abode.",
|
||||
"identifier_exists": "Account is al geregistreerd.",
|
||||
"invalid_credentials": "Ongeldige inloggegevens."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Wachtwoord",
|
||||
"username": "E-mailadres"
|
||||
},
|
||||
"title": "Vul uw Abode-inloggegevens in"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Bare en enkelt konfigurasjon av Abode er tillatt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kan ikke koble til Abode.",
|
||||
"identifier_exists": "Kontoen er allerede registrert.",
|
||||
"invalid_credentials": "Ugyldig brukerinformasjon"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Passord",
|
||||
"username": "E-postadresse"
|
||||
},
|
||||
"title": "Fyll ut innloggingsinformasjonen for Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Dozwolona jest tylko jedna konfiguracja Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z Abode.",
|
||||
"identifier_exists": "Konto jest ju\u017c zarejestrowane.",
|
||||
"invalid_credentials": "Nieprawid\u0142owe dane uwierzytelniaj\u0105ce"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Has\u0142o",
|
||||
"username": "Adres e-mail"
|
||||
},
|
||||
"title": "Wprowad\u017a informacje logowania Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": ""
|
||||
}
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"identifier_exists": "Conta j\u00e1 registada"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Palavra-passe",
|
||||
"username": "Endere\u00e7o de e-mail"
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": ""
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430."
|
||||
},
|
||||
"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\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": {
|
||||
"data": {
|
||||
"password": "\u041f\u0430\u0440\u043e\u043b\u044c",
|
||||
"username": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b"
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Dovoljena je samo ena konfiguracija Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Ni mogo\u010de vzpostaviti povezave z Abode.",
|
||||
"identifier_exists": "Ra\u010dun je \u017ee registriran.",
|
||||
"invalid_credentials": "Neveljavne poverilnice."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Geslo",
|
||||
"username": "E-po\u0161tni naslov"
|
||||
},
|
||||
"title": "Izpolnite svoje podatke za prijavo v Abode"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\u50c5\u5141\u8a31\u8a2d\u5b9a\u4e00\u7d44 Abode\u3002"
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "\u7121\u6cd5\u9023\u7dda\u81f3 Abode\u3002",
|
||||
"identifier_exists": "\u5e33\u865f\u5df2\u8a3b\u518a\u3002",
|
||||
"invalid_credentials": "\u6191\u8b49\u7121\u6548\u3002"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "\u5bc6\u78bc",
|
||||
"username": "\u96fb\u5b50\u90f5\u4ef6\u5730\u5740"
|
||||
},
|
||||
"title": "\u586b\u5beb Abode \u767b\u5165\u8cc7\u8a0a"
|
||||
}
|
||||
},
|
||||
"title": "Abode"
|
||||
}
|
||||
}
|
@@ -19,6 +19,7 @@ from homeassistant.const import (
|
||||
CONF_USERNAME,
|
||||
EVENT_HOMEASSISTANT_STOP,
|
||||
)
|
||||
from homeassistant.exceptions import ConfigEntryNotReady
|
||||
from homeassistant.helpers import config_validation as cv
|
||||
from homeassistant.helpers.dispatcher import dispatcher_send
|
||||
from homeassistant.helpers.entity import Entity
|
||||
@@ -119,7 +120,7 @@ async def async_setup_entry(hass, config_entry):
|
||||
|
||||
except (AbodeException, ConnectTimeout, HTTPError) as ex:
|
||||
LOGGER.error("Unable to connect to Abode: %s", str(ex))
|
||||
return False
|
||||
raise ConfigEntryNotReady
|
||||
|
||||
for platform in ABODE_PLATFORMS:
|
||||
hass.async_create_task(
|
||||
@@ -186,7 +187,7 @@ def setup_hass_services(hass):
|
||||
|
||||
def trigger_automation(call):
|
||||
"""Trigger an Abode automation."""
|
||||
entity_ids = call.data.get(ATTR_ENTITY_ID, None)
|
||||
entity_ids = call.data.get(ATTR_ENTITY_ID)
|
||||
|
||||
target_entities = [
|
||||
entity_id
|
||||
@@ -263,7 +264,6 @@ def setup_abode_events(hass):
|
||||
TIMELINE.TEST_GROUP,
|
||||
TIMELINE.CAPTURE_GROUP,
|
||||
TIMELINE.DEVICE_GROUP,
|
||||
TIMELINE.AUTOMATION_EDIT_GROUP,
|
||||
]
|
||||
|
||||
for event in events:
|
||||
@@ -272,36 +272,72 @@ def setup_abode_events(hass):
|
||||
)
|
||||
|
||||
|
||||
class AbodeDevice(Entity):
|
||||
"""Representation of an Abode device."""
|
||||
class AbodeEntity(Entity):
|
||||
"""Representation of an Abode entity."""
|
||||
|
||||
def __init__(self, data, device):
|
||||
"""Initialize Abode device."""
|
||||
def __init__(self, data):
|
||||
"""Initialize Abode entity."""
|
||||
self._data = data
|
||||
self._device = device
|
||||
self._available = True
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe to device events."""
|
||||
self.hass.async_add_job(
|
||||
self._data.abode.events.add_device_callback,
|
||||
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."""
|
||||
self.hass.async_add_job(
|
||||
self._data.abode.events.remove_all_device_callbacks, self._device.device_id
|
||||
)
|
||||
@property
|
||||
def available(self):
|
||||
"""Return the available state."""
|
||||
return self._available
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return the polling state."""
|
||||
return self._data.polling
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe to Abode connection status updates."""
|
||||
await self.hass.async_add_executor_job(
|
||||
self._data.abode.events.add_connection_status_callback,
|
||||
self.unique_id,
|
||||
self._update_connection_status,
|
||||
)
|
||||
|
||||
self.hass.data[DOMAIN].entity_ids.add(self.entity_id)
|
||||
|
||||
async def async_will_remove_from_hass(self):
|
||||
"""Unsubscribe from Abode connection status updates."""
|
||||
await self.hass.async_add_executor_job(
|
||||
self._data.abode.events.remove_connection_status_callback, self.unique_id
|
||||
)
|
||||
|
||||
def _update_connection_status(self):
|
||||
"""Update the entity available property."""
|
||||
self._available = self._data.abode.events.connected
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
|
||||
class AbodeDevice(AbodeEntity):
|
||||
"""Representation of an Abode device."""
|
||||
|
||||
def __init__(self, data, device):
|
||||
"""Initialize Abode device."""
|
||||
super().__init__(data)
|
||||
self._device = device
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe to device events."""
|
||||
await super().async_added_to_hass()
|
||||
await self.hass.async_add_executor_job(
|
||||
self._data.abode.events.add_device_callback,
|
||||
self._device.device_id,
|
||||
self._update_callback,
|
||||
)
|
||||
|
||||
async def async_will_remove_from_hass(self):
|
||||
"""Unsubscribe from device events."""
|
||||
await super().async_will_remove_from_hass()
|
||||
await self.hass.async_add_executor_job(
|
||||
self._data.abode.events.remove_all_device_callbacks, self._device.device_id
|
||||
)
|
||||
|
||||
def update(self):
|
||||
"""Update device and automation states."""
|
||||
"""Update device state."""
|
||||
self._device.refresh()
|
||||
|
||||
@property
|
||||
@@ -340,29 +376,13 @@ class AbodeDevice(Entity):
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
|
||||
class AbodeAutomation(Entity):
|
||||
class AbodeAutomation(AbodeEntity):
|
||||
"""Representation of an Abode automation."""
|
||||
|
||||
def __init__(self, data, automation, event=None):
|
||||
def __init__(self, data, automation):
|
||||
"""Initialize for Abode automation."""
|
||||
self._data = data
|
||||
super().__init__(data)
|
||||
self._automation = automation
|
||||
self._event = event
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""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):
|
||||
"""Return the polling state."""
|
||||
return self._data.polling
|
||||
|
||||
def update(self):
|
||||
"""Update automation state."""
|
||||
@@ -376,17 +396,9 @@ class AbodeAutomation(Entity):
|
||||
@property
|
||||
def device_state_attributes(self):
|
||||
"""Return the state attributes."""
|
||||
return {
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
"type": "CUE automation",
|
||||
}
|
||||
return {ATTR_ATTRIBUTION: ATTRIBUTION, "type": "CUE automation"}
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return a unique ID to use for this automation."""
|
||||
return self._automation.automation_id
|
||||
|
||||
def _update_callback(self, device):
|
||||
"""Update the automation state."""
|
||||
self._automation.refresh()
|
||||
self.schedule_update_ha_state()
|
||||
|
@@ -25,7 +25,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
)
|
||||
|
||||
|
||||
class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanel):
|
||||
class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanelEntity):
|
||||
"""An alarm_control_panel implementation for Abode."""
|
||||
|
||||
@property
|
||||
|
@@ -1,7 +1,10 @@
|
||||
"""Support for Abode Security System binary sensors."""
|
||||
import abodepy.helpers.constants as CONST
|
||||
|
||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||
from homeassistant.components.binary_sensor import (
|
||||
DEVICE_CLASS_WINDOW,
|
||||
BinarySensorEntity,
|
||||
)
|
||||
|
||||
from . import AbodeDevice
|
||||
from .const import DOMAIN
|
||||
@@ -27,7 +30,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeBinarySensor(AbodeDevice, BinarySensorDevice):
|
||||
class AbodeBinarySensor(AbodeDevice, BinarySensorEntity):
|
||||
"""A binary sensor implementation for Abode device."""
|
||||
|
||||
@property
|
||||
@@ -38,4 +41,6 @@ class AbodeBinarySensor(AbodeDevice, BinarySensorDevice):
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the class of the binary sensor."""
|
||||
if self._device.get_value("is_window") == "1":
|
||||
return DEVICE_CLASS_WINDOW
|
||||
return self._device.generic_type
|
||||
|
@@ -41,14 +41,14 @@ class AbodeCamera(AbodeDevice, Camera):
|
||||
"""Subscribe Abode events."""
|
||||
await super().async_added_to_hass()
|
||||
|
||||
self.hass.async_add_job(
|
||||
self.hass.async_add_executor_job(
|
||||
self._data.abode.events.add_timeline_callback,
|
||||
self._event,
|
||||
self._capture_callback,
|
||||
)
|
||||
|
||||
signal = f"abode_camera_capture_{self.entity_id}"
|
||||
async_dispatcher_connect(self.hass, signal, self.capture)
|
||||
self.async_on_remove(async_dispatcher_connect(self.hass, signal, self.capture))
|
||||
|
||||
def capture(self):
|
||||
"""Request a new image capture."""
|
||||
|
@@ -5,7 +5,7 @@ from requests.exceptions import ConnectTimeout, HTTPError
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant import config_entries
|
||||
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
|
||||
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_BAD_REQUEST
|
||||
from homeassistant.core import callback
|
||||
|
||||
from .const import DEFAULT_CACHEDB, DOMAIN, LOGGER # pylint: disable=unused-import
|
||||
@@ -46,7 +46,7 @@ class AbodeFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
||||
|
||||
except (AbodeException, ConnectTimeout, HTTPError) as ex:
|
||||
LOGGER.error("Unable to connect to Abode: %s", str(ex))
|
||||
if ex.errcode == 400:
|
||||
if ex.errcode == HTTP_BAD_REQUEST:
|
||||
return self._show_form({"base": "invalid_credentials"})
|
||||
return self._show_form({"base": "connection_error"})
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
"""Support for Abode Security System covers."""
|
||||
import abodepy.helpers.constants as CONST
|
||||
|
||||
from homeassistant.components.cover import CoverDevice
|
||||
from homeassistant.components.cover import CoverEntity
|
||||
|
||||
from . import AbodeDevice
|
||||
from .const import DOMAIN
|
||||
@@ -19,7 +19,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeCover(AbodeDevice, CoverDevice):
|
||||
class AbodeCover(AbodeDevice, CoverEntity):
|
||||
"""Representation of an Abode cover."""
|
||||
|
||||
@property
|
||||
|
@@ -10,7 +10,7 @@ from homeassistant.components.light import (
|
||||
SUPPORT_BRIGHTNESS,
|
||||
SUPPORT_COLOR,
|
||||
SUPPORT_COLOR_TEMP,
|
||||
Light,
|
||||
LightEntity,
|
||||
)
|
||||
from homeassistant.util.color import (
|
||||
color_temperature_kelvin_to_mired,
|
||||
@@ -33,7 +33,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeLight(AbodeDevice, Light):
|
||||
class AbodeLight(AbodeDevice, LightEntity):
|
||||
"""Representation of an Abode light."""
|
||||
|
||||
def turn_on(self, **kwargs):
|
||||
|
@@ -1,7 +1,7 @@
|
||||
"""Support for the Abode Security System locks."""
|
||||
import abodepy.helpers.constants as CONST
|
||||
|
||||
from homeassistant.components.lock import LockDevice
|
||||
from homeassistant.components.lock import LockEntity
|
||||
|
||||
from . import AbodeDevice
|
||||
from .const import DOMAIN
|
||||
@@ -19,7 +19,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeLock(AbodeDevice, LockDevice):
|
||||
class AbodeLock(AbodeDevice, LockEntity):
|
||||
"""Representation of an Abode lock."""
|
||||
|
||||
def lock(self, **kwargs):
|
||||
|
@@ -3,7 +3,9 @@
|
||||
"name": "Abode",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/abode",
|
||||
"requirements": ["abodepy==0.18.1"],
|
||||
"dependencies": [],
|
||||
"codeowners": ["@shred86"]
|
||||
"requirements": ["abodepy==0.19.0"],
|
||||
"codeowners": ["@shred86"],
|
||||
"homekit": {
|
||||
"models": ["Abode", "Iota"]
|
||||
}
|
||||
}
|
||||
|
@@ -1,13 +1,21 @@
|
||||
capture_image:
|
||||
description: Request a new image capture from a camera device.
|
||||
fields:
|
||||
entity_id: {description: Entity id of the camera to request an image., example: camera.downstairs_motion_camera}
|
||||
entity_id:
|
||||
description: Entity id of the camera to request an image.
|
||||
example: camera.downstairs_motion_camera
|
||||
change_setting:
|
||||
description: Change an Abode system setting.
|
||||
fields:
|
||||
setting: {description: Setting to change., example: beeper_mute}
|
||||
value: {description: Value of the setting., example: '1'}
|
||||
setting:
|
||||
description: Setting to change.
|
||||
example: beeper_mute
|
||||
value:
|
||||
description: Value of the setting.
|
||||
example: "1"
|
||||
trigger_automation:
|
||||
description: Trigger an Abode automation.
|
||||
fields:
|
||||
entity_id: {description: Entity id of the automation to trigger., example: switch.my_automation}
|
||||
entity_id:
|
||||
description: Entity id of the automation to trigger.
|
||||
example: switch.my_automation
|
||||
|
@@ -1,12 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "Abode",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Fill in your Abode login information",
|
||||
"data": {
|
||||
"username": "Email Address",
|
||||
"password": "Password"
|
||||
"username": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@@ -1,8 +1,7 @@
|
||||
"""Support for Abode Security System switches."""
|
||||
import abodepy.helpers.constants as CONST
|
||||
import abodepy.helpers.timeline as TIMELINE
|
||||
|
||||
from homeassistant.components.switch import SwitchDevice
|
||||
from homeassistant.components.switch import SwitchEntity
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
|
||||
from . import AbodeAutomation, AbodeDevice
|
||||
@@ -24,14 +23,12 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||
entities.append(AbodeSwitch(data, device))
|
||||
|
||||
for automation in data.abode.get_automations():
|
||||
entities.append(
|
||||
AbodeAutomationSwitch(data, automation, TIMELINE.AUTOMATION_EDIT_GROUP)
|
||||
)
|
||||
entities.append(AbodeAutomationSwitch(data, automation))
|
||||
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class AbodeSwitch(AbodeDevice, SwitchDevice):
|
||||
class AbodeSwitch(AbodeDevice, SwitchEntity):
|
||||
"""Representation of an Abode switch."""
|
||||
|
||||
def turn_on(self, **kwargs):
|
||||
@@ -48,15 +45,15 @@ class AbodeSwitch(AbodeDevice, SwitchDevice):
|
||||
return self._device.is_on
|
||||
|
||||
|
||||
class AbodeAutomationSwitch(AbodeAutomation, SwitchDevice):
|
||||
class AbodeAutomationSwitch(AbodeAutomation, SwitchEntity):
|
||||
"""A switch implementation for Abode automations."""
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Subscribe Abode events."""
|
||||
"""Set up trigger automation service."""
|
||||
await super().async_added_to_hass()
|
||||
|
||||
signal = f"abode_trigger_automation_{self.entity_id}"
|
||||
async_dispatcher_connect(self.hass, signal, self.trigger)
|
||||
self.async_on_remove(async_dispatcher_connect(self.hass, signal, self.trigger))
|
||||
|
||||
def turn_on(self, **kwargs):
|
||||
"""Enable the automation."""
|
||||
|
21
homeassistant/components/abode/translations/bg.json
Normal file
21
homeassistant/components/abode/translations/bg.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/ca.json
Normal file
21
homeassistant/components/abode/translations/ca.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Nom\u00e9s es permet una \u00fanica configuraci\u00f3 d'Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "No es pot connectar amb Abode.",
|
||||
"identifier_exists": "Compte ja registrat.",
|
||||
"invalid_credentials": "Credencials inv\u00e0lides."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Contrasenya",
|
||||
"username": "Correu electr\u00f2nic"
|
||||
},
|
||||
"title": "Introducci\u00f3 de la informaci\u00f3 d'inici de sessi\u00f3 a Abode."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/cs.json
Normal file
21
homeassistant/components/abode/translations/cs.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/da.json
Normal file
21
homeassistant/components/abode/translations/da.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Det er kun n\u00f8dvendigt med en ops\u00e6tning af Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kunne ikke oprette forbindelse til Abode.",
|
||||
"identifier_exists": "Konto er allerede registreret.",
|
||||
"invalid_credentials": "Ugyldige legitimationsoplysninger."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Adgangskode",
|
||||
"username": "Email-adresse"
|
||||
},
|
||||
"title": "Udfyld dine Abode-loginoplysninger"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/de.json
Normal file
21
homeassistant/components/abode/translations/de.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Es ist nur eine einzige Konfiguration von Abode erlaubt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Es kann keine Verbindung zu Abode hergestellt werden.",
|
||||
"identifier_exists": "Das Konto ist bereits registriert.",
|
||||
"invalid_credentials": "Ung\u00fcltige Anmeldeinformationen"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Passwort",
|
||||
"username": "E-Mail-Adresse"
|
||||
},
|
||||
"title": "Gib deine Abode-Anmeldeinformationen ein"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/en.json
Normal file
21
homeassistant/components/abode/translations/en.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Only a single configuration of Abode is allowed."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Unable to connect to Abode.",
|
||||
"identifier_exists": "Account already registered.",
|
||||
"invalid_credentials": "Invalid credentials."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Password",
|
||||
"username": "Email"
|
||||
},
|
||||
"title": "Fill in your Abode login information"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/es-419.json
Normal file
21
homeassistant/components/abode/translations/es-419.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/es.json
Normal file
21
homeassistant/components/abode/translations/es.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"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": "Rellene la informaci\u00f3n de acceso Abode"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
7
homeassistant/components/abode/translations/fi.json
Normal file
7
homeassistant/components/abode/translations/fi.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"connection_error": "Yhteytt\u00e4 Abodeen ei voi muodostaa."
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/fr.json
Normal file
21
homeassistant/components/abode/translations/fr.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Une seule configuration d'Abode est autoris\u00e9e."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Impossible de se connecter \u00e0 Abode.",
|
||||
"identifier_exists": "Compte d\u00e9j\u00e0 enregistr\u00e9.",
|
||||
"invalid_credentials": "Informations d'identification invalides."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Mot de passe",
|
||||
"username": "Adresse e-mail"
|
||||
},
|
||||
"title": "Remplissez vos informations de connexion Abode"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/hu.json
Normal file
21
homeassistant/components/abode/translations/hu.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"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": "E-mail"
|
||||
},
|
||||
"title": "T\u00f6ltse ki az Abode bejelentkez\u00e9si adatait"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/it.json
Normal file
21
homeassistant/components/abode/translations/it.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\u00c8 consentita una sola configurazione di Abode."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Impossibile connettersi ad Abode.",
|
||||
"identifier_exists": "Account gi\u00e0 registrato",
|
||||
"invalid_credentials": "Credenziali non valide"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Password",
|
||||
"username": "E-mail"
|
||||
},
|
||||
"title": "Inserisci le tue informazioni di accesso Abode"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/ko.json
Normal file
21
homeassistant/components/abode/translations/ko.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "\ud558\ub098\uc758 Abode \ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Abode \uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
|
||||
"identifier_exists": "\uacc4\uc815\uc774 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
|
||||
"invalid_credentials": "\uc0ac\uc6a9\uc790 \uc774\ub984 \ud639\uc740 \ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "\ube44\ubc00\ubc88\ud638",
|
||||
"username": "\uc774\uba54\uc77c"
|
||||
},
|
||||
"title": "Abode \uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825\ud558\uae30"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/lb.json
Normal file
21
homeassistant/components/abode/translations/lb.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "N\u00ebmmen eng eenzeg Konfiguratioun vun ZHA ass erlaabt."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kann sech net mat Abode verbannen.",
|
||||
"identifier_exists": "Konto ass scho registr\u00e9iert",
|
||||
"invalid_credentials": "Ong\u00eblteg Login Informatioune"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Passwuert",
|
||||
"username": "E-Mail"
|
||||
},
|
||||
"title": "F\u00ebllt \u00e4r Abode Login Informatiounen aus."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
homeassistant/components/abode/translations/nl.json
Normal file
21
homeassistant/components/abode/translations/nl.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"single_instance_allowed": "Slechts een enkele configuratie van Abode is toegestaan."
|
||||
},
|
||||
"error": {
|
||||
"connection_error": "Kan geen verbinding maken met Abode.",
|
||||
"identifier_exists": "Account is al geregistreerd.",
|
||||
"invalid_credentials": "Ongeldige inloggegevens."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "Wachtwoord",
|
||||
"username": "E-mailadres"
|
||||
},
|
||||
"title": "Vul uw Abode-inloggegevens in"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user