mirror of
https://github.com/home-assistant/core.git
synced 2025-09-28 14:29:27 +00:00
Compare commits
1859 Commits
2023.10.0b
...
fix-host-d
Author | SHA1 | Date | |
---|---|---|---|
![]() |
83458d24c7 | ||
![]() |
df6d43adc4 | ||
![]() |
5cbfc1c224 | ||
![]() |
2a4a5d0a07 | ||
![]() |
2d2e215e2c | ||
![]() |
1ef97ab6f8 | ||
![]() |
d1463a81d3 | ||
![]() |
f149c809c2 | ||
![]() |
28a3d36bc1 | ||
![]() |
d318155f09 | ||
![]() |
a1aff5f4a0 | ||
![]() |
e048ad5a62 | ||
![]() |
7d45227a59 | ||
![]() |
e594c19c1e | ||
![]() |
fd5cda4ec6 | ||
![]() |
5cde367366 | ||
![]() |
04ba7fcbf4 | ||
![]() |
7efc581a48 | ||
![]() |
b994141bc6 | ||
![]() |
ba33ad6b18 | ||
![]() |
360ef894a7 | ||
![]() |
2a4ab3d53d | ||
![]() |
239d7c9d80 | ||
![]() |
664aca2c68 | ||
![]() |
74d7d02833 | ||
![]() |
a5934e9acc | ||
![]() |
706add4a57 | ||
![]() |
cf9b0e804f | ||
![]() |
5550dcbec8 | ||
![]() |
ba8e2ed7d6 | ||
![]() |
a5fd479608 | ||
![]() |
855c2da64e | ||
![]() |
b4553f19a1 | ||
![]() |
669b347ed1 | ||
![]() |
ccc8804906 | ||
![]() |
9907e11b03 | ||
![]() |
b3ff30a9c8 | ||
![]() |
5ba70ef2cb | ||
![]() |
95c771e330 | ||
![]() |
7fbf68fd11 | ||
![]() |
321b24b146 | ||
![]() |
670e5a2eae | ||
![]() |
b49505b390 | ||
![]() |
53e78cb017 | ||
![]() |
06b74249f7 | ||
![]() |
087efb7545 | ||
![]() |
be889c89c1 | ||
![]() |
6e5dfa0e9b | ||
![]() |
8a1f7b6802 | ||
![]() |
b314df272f | ||
![]() |
ad17acc6ca | ||
![]() |
14387cf94b | ||
![]() |
c831802774 | ||
![]() |
959b98be0e | ||
![]() |
2e1c722303 | ||
![]() |
e3599bc26f | ||
![]() |
32eab2c7ed | ||
![]() |
4a5b1ab301 | ||
![]() |
bd27358398 | ||
![]() |
e2e58c4495 | ||
![]() |
a074c06f92 | ||
![]() |
b42629ecf3 | ||
![]() |
8ffad6f7a6 | ||
![]() |
76f78d7747 | ||
![]() |
498bea09f2 | ||
![]() |
86b172037b | ||
![]() |
fc5ae50e06 | ||
![]() |
837f34c40c | ||
![]() |
48f8cec84b | ||
![]() |
03caa21a51 | ||
![]() |
71268bd407 | ||
![]() |
eb472d9f71 | ||
![]() |
e821ff8b49 | ||
![]() |
dd028220ba | ||
![]() |
17cef8940f | ||
![]() |
1cfbdd6a5d | ||
![]() |
af7155df7a | ||
![]() |
ceb2680185 | ||
![]() |
c685d56e82 | ||
![]() |
8376a6bda9 | ||
![]() |
df37ee4033 | ||
![]() |
1c4d7e9588 | ||
![]() |
487ff8cd7f | ||
![]() |
b94c9c8f6d | ||
![]() |
8273427974 | ||
![]() |
4860daf1f9 | ||
![]() |
0c39c18aaf | ||
![]() |
19040becd3 | ||
![]() |
d4458cbac4 | ||
![]() |
94995f560f | ||
![]() |
9962301b42 | ||
![]() |
4700ad7817 | ||
![]() |
e161bb9e41 | ||
![]() |
2515dbeee1 | ||
![]() |
724352d55c | ||
![]() |
95cfe41f87 | ||
![]() |
b14a7edb55 | ||
![]() |
af71c2bb45 | ||
![]() |
852fb58ca8 | ||
![]() |
512902fc59 | ||
![]() |
a1701f0c56 | ||
![]() |
65a2f5bcd5 | ||
![]() |
df025b5993 | ||
![]() |
62473936e2 | ||
![]() |
adc56b6b67 | ||
![]() |
130822fcc6 | ||
![]() |
378a708bf7 | ||
![]() |
4096687112 | ||
![]() |
76427a0080 | ||
![]() |
e9dd158a8d | ||
![]() |
9ed745638d | ||
![]() |
b41b56e54c | ||
![]() |
3c72cd7612 | ||
![]() |
560ac3d087 | ||
![]() |
6f54aaf564 | ||
![]() |
6271fe333d | ||
![]() |
d4450c6c55 | ||
![]() |
a3eb44209d | ||
![]() |
b3211fa5ee | ||
![]() |
e03ccb5ab6 | ||
![]() |
114ca70961 | ||
![]() |
60370228f6 | ||
![]() |
140b563312 | ||
![]() |
6a2fd434fc | ||
![]() |
258a93bf19 | ||
![]() |
b24fa4839d | ||
![]() |
d78c0bd948 | ||
![]() |
616f6aab76 | ||
![]() |
a1f7f899c9 | ||
![]() |
6b138a276a | ||
![]() |
e9920ff73d | ||
![]() |
933cd89833 | ||
![]() |
d460eadce0 | ||
![]() |
1144e33e68 | ||
![]() |
2febc9c4b3 | ||
![]() |
ada0578f3a | ||
![]() |
a91fad47bc | ||
![]() |
32aa1aaec2 | ||
![]() |
0b213c6732 | ||
![]() |
5623834b37 | ||
![]() |
eaba2c7dc1 | ||
![]() |
556e72abf8 | ||
![]() |
a59076d140 | ||
![]() |
a3c0f36592 | ||
![]() |
3e641b3ef2 | ||
![]() |
3a42bd35e7 | ||
![]() |
968563253f | ||
![]() |
ae4552eb3e | ||
![]() |
41626ed500 | ||
![]() |
7a727dc3ad | ||
![]() |
200804237f | ||
![]() |
9278db7344 | ||
![]() |
b5f8b35549 | ||
![]() |
5f41d6bbfb | ||
![]() |
75f237b587 | ||
![]() |
01c49ba0e4 | ||
![]() |
1f3f073df9 | ||
![]() |
60dcd24bf9 | ||
![]() |
0996c82c02 | ||
![]() |
02e09ed4cc | ||
![]() |
254d43dcf7 | ||
![]() |
4f94649ee2 | ||
![]() |
cbb5d7ea39 | ||
![]() |
6c6e85f996 | ||
![]() |
59469828f1 | ||
![]() |
af15aab35e | ||
![]() |
3929b0163c | ||
![]() |
edf18df0e6 | ||
![]() |
f1fd8a0d2b | ||
![]() |
464270d849 | ||
![]() |
aea15ee20c | ||
![]() |
91e0a53cb2 | ||
![]() |
33c5d1855d | ||
![]() |
f45d373e17 | ||
![]() |
b604c1c222 | ||
![]() |
95e322c52e | ||
![]() |
4c7da97eca | ||
![]() |
c929b70fba | ||
![]() |
6d529a82d7 | ||
![]() |
dece6c8042 | ||
![]() |
2dd0a74b38 | ||
![]() |
2d38a42fea | ||
![]() |
9ce161c09d | ||
![]() |
eb5c7a3e76 | ||
![]() |
5805601a83 | ||
![]() |
6f41243410 | ||
![]() |
f359b33f2e | ||
![]() |
5c72d3c2d8 | ||
![]() |
29ac3a8f66 | ||
![]() |
3e1c12507e | ||
![]() |
dad8545138 | ||
![]() |
645f916cf4 | ||
![]() |
d4ca9843e2 | ||
![]() |
af6f451cc0 | ||
![]() |
afc664f83f | ||
![]() |
6f82c2e230 | ||
![]() |
9d3f374728 | ||
![]() |
5527cbd78a | ||
![]() |
5fe5057b15 | ||
![]() |
b7f8ddb04c | ||
![]() |
4da77d2253 | ||
![]() |
80f8e76fa3 | ||
![]() |
58a73f7723 | ||
![]() |
f69045fb64 | ||
![]() |
ce497dd7ed | ||
![]() |
cd5595a130 | ||
![]() |
9c5e0fc2c9 | ||
![]() |
923c13907c | ||
![]() |
6d7df5ae13 | ||
![]() |
124e1cebac | ||
![]() |
a573f60947 | ||
![]() |
2def7d2e71 | ||
![]() |
afea9f7739 | ||
![]() |
67e25dc0bf | ||
![]() |
d90605f9bc | ||
![]() |
88698d8dfe | ||
![]() |
a9384d6d4f | ||
![]() |
ae2099b2eb | ||
![]() |
e6226b0924 | ||
![]() |
7160e956a6 | ||
![]() |
cc31d77205 | ||
![]() |
6ef194f992 | ||
![]() |
f8e3f1497c | ||
![]() |
a1678ebd23 | ||
![]() |
173f4760bc | ||
![]() |
41224f1674 | ||
![]() |
091559d147 | ||
![]() |
25cc4df455 | ||
![]() |
9a38e23f28 | ||
![]() |
1ca95965b6 | ||
![]() |
68f8b2cab5 | ||
![]() |
ec069fbebf | ||
![]() |
9e0bc9e252 | ||
![]() |
51385dcaab | ||
![]() |
d3b4dd226b | ||
![]() |
e7cec9b148 | ||
![]() |
267bbaf425 | ||
![]() |
47cd368ed2 | ||
![]() |
0eb8daee23 | ||
![]() |
3622944dda | ||
![]() |
9c86adf644 | ||
![]() |
c2e81bbafb | ||
![]() |
09df04fafe | ||
![]() |
ce38d8542f | ||
![]() |
bee457ed6f | ||
![]() |
dfff22b5ce | ||
![]() |
6773c29ccc | ||
![]() |
878ccbaaef | ||
![]() |
0d2bcc0192 | ||
![]() |
bf87773d87 | ||
![]() |
80813e992d | ||
![]() |
23ef97f774 | ||
![]() |
e5bc25523e | ||
![]() |
2d891c77ef | ||
![]() |
e2f6fbd59b | ||
![]() |
2387e4941b | ||
![]() |
483e0c9a85 | ||
![]() |
e755dd83b6 | ||
![]() |
c047f47595 | ||
![]() |
8c99cf14d3 | ||
![]() |
fd7f75e9af | ||
![]() |
a78764f000 | ||
![]() |
2ff9beb9c9 | ||
![]() |
a8acde62ff | ||
![]() |
43c5bf27e6 | ||
![]() |
97d38dae09 | ||
![]() |
b58af167a2 | ||
![]() |
cd27b0e961 | ||
![]() |
d70ef30a2a | ||
![]() |
b3ceb82700 | ||
![]() |
cf9299df59 | ||
![]() |
f605df5bf2 | ||
![]() |
d5885e0da2 | ||
![]() |
33d144fe2d | ||
![]() |
ef5c9c2187 | ||
![]() |
ea6a26467e | ||
![]() |
0a3b20d8b2 | ||
![]() |
cd9ad32e32 | ||
![]() |
a996a51aa9 | ||
![]() |
b3e247d5f0 | ||
![]() |
4536fb3541 | ||
![]() |
7c030cfffa | ||
![]() |
2c003d8c10 | ||
![]() |
b400b33b0d | ||
![]() |
cf985a8702 | ||
![]() |
38961c6ddc | ||
![]() |
b4797e283f | ||
![]() |
654c4b6e35 | ||
![]() |
d8a49b14e5 | ||
![]() |
98030a9ce1 | ||
![]() |
86f87262ed | ||
![]() |
e10c5246b9 | ||
![]() |
1c817cc18c | ||
![]() |
613afe322f | ||
![]() |
422b09f4ec | ||
![]() |
0899be6d4b | ||
![]() |
45f1d50f03 | ||
![]() |
c92945ecd6 | ||
![]() |
5b37096b5f | ||
![]() |
c132900b92 | ||
![]() |
c92a90e04d | ||
![]() |
cf3a2741c5 | ||
![]() |
c98a3a2fd1 | ||
![]() |
dbe193aaa4 | ||
![]() |
b4e8243e18 | ||
![]() |
0e04cd6b35 | ||
![]() |
194104f5f8 | ||
![]() |
c4bf8f96dd | ||
![]() |
23ac3248e6 | ||
![]() |
5f13faac76 | ||
![]() |
bba2734a5c | ||
![]() |
bb456464ae | ||
![]() |
dd7670cacf | ||
![]() |
ac0c1d12c3 | ||
![]() |
9326ea09a5 | ||
![]() |
51c1ea85f3 | ||
![]() |
3f11bb5f62 | ||
![]() |
7803ca2612 | ||
![]() |
b082ee2050 | ||
![]() |
a101bb9354 | ||
![]() |
2d36225405 | ||
![]() |
880483624b | ||
![]() |
cfac6d18f3 | ||
![]() |
8df7291abb | ||
![]() |
182c40f16e | ||
![]() |
d1e460e97a | ||
![]() |
f24212b66e | ||
![]() |
a513511936 | ||
![]() |
3359619436 | ||
![]() |
e9c6da9803 | ||
![]() |
aecfa67265 | ||
![]() |
599579b26d | ||
![]() |
76ccad40ff | ||
![]() |
1a079d7c6f | ||
![]() |
ce1e6ce006 | ||
![]() |
17f0676483 | ||
![]() |
54c98f32c2 | ||
![]() |
e87ebbef01 | ||
![]() |
9facdc2dbb | ||
![]() |
be8507f870 | ||
![]() |
2cb4435cf0 | ||
![]() |
aca48b5e45 | ||
![]() |
7f08f139d6 | ||
![]() |
b35afab5ef | ||
![]() |
c621c5df39 | ||
![]() |
4465c74d23 | ||
![]() |
381ebf3e53 | ||
![]() |
2d39eaf0a2 | ||
![]() |
94a2087ba0 | ||
![]() |
85eac5a1b1 | ||
![]() |
44c1cef42e | ||
![]() |
fe15ed4a28 | ||
![]() |
0a84c2dba6 | ||
![]() |
96bcc6c35a | ||
![]() |
7a060176b6 | ||
![]() |
dedd3418a1 | ||
![]() |
9241554d45 | ||
![]() |
cf6c72fdbd | ||
![]() |
7ca264e746 | ||
![]() |
feabbfc375 | ||
![]() |
74c51ec9e0 | ||
![]() |
8ca1eaa839 | ||
![]() |
f7fef14d06 | ||
![]() |
685537e475 | ||
![]() |
2557e41ec0 | ||
![]() |
0eafc8f2cd | ||
![]() |
1a3475ea60 | ||
![]() |
f0a455e5c7 | ||
![]() |
1610dd94f9 | ||
![]() |
7ab4d9793a | ||
![]() |
067ece97b8 | ||
![]() |
7ef47da27d | ||
![]() |
39c81cb4b1 | ||
![]() |
1e57bc5415 | ||
![]() |
ba3269540f | ||
![]() |
0e4186ff8a | ||
![]() |
818bc12f87 | ||
![]() |
f89194784d | ||
![]() |
07af073735 | ||
![]() |
c6f9af2cab | ||
![]() |
a1356874ea | ||
![]() |
e64582ae9a | ||
![]() |
2bdd969cf6 | ||
![]() |
109bcd86f1 | ||
![]() |
1e375352bb | ||
![]() |
9bd73ab362 | ||
![]() |
8e71086c21 | ||
![]() |
d4c5a93b63 | ||
![]() |
92b3c0c96b | ||
![]() |
be2cee228c | ||
![]() |
74bf255da6 | ||
![]() |
d0efea3dbd | ||
![]() |
50a65fc8c4 | ||
![]() |
1888311800 | ||
![]() |
64c9aa0cff | ||
![]() |
efe33d815f | ||
![]() |
f94167a4bb | ||
![]() |
5ee62f2965 | ||
![]() |
eda475fe25 | ||
![]() |
3a531f5698 | ||
![]() |
9ab1cb83d8 | ||
![]() |
abb1328a67 | ||
![]() |
80042aa108 | ||
![]() |
96a19d61ab | ||
![]() |
51b599e1f6 | ||
![]() |
1168956f8c | ||
![]() |
6303366cf4 | ||
![]() |
01b3e0c49e | ||
![]() |
fd7d2dfe75 | ||
![]() |
b2f31d5763 | ||
![]() |
50e11a7a37 | ||
![]() |
adcd4e59cf | ||
![]() |
bb63da764e | ||
![]() |
0c421b7309 | ||
![]() |
04a497343d | ||
![]() |
b9bc6ca070 | ||
![]() |
6a7e87f1c3 | ||
![]() |
5a452155fc | ||
![]() |
81450f0117 | ||
![]() |
2cffb4df6d | ||
![]() |
492d8acf3f | ||
![]() |
25650563fe | ||
![]() |
48a8ae4df5 | ||
![]() |
1d5fcfc7c8 | ||
![]() |
a70ec64408 | ||
![]() |
66d1a7f1dd | ||
![]() |
c35f56ea77 | ||
![]() |
bf41167951 | ||
![]() |
048b989b2b | ||
![]() |
f3cccf0a2b | ||
![]() |
787fb3b954 | ||
![]() |
667a453a35 | ||
![]() |
3f70437888 | ||
![]() |
eaaca3e556 | ||
![]() |
531a3e4fa8 | ||
![]() |
618b666126 | ||
![]() |
229944c21c | ||
![]() |
70f7582f95 | ||
![]() |
ebdd2daab6 | ||
![]() |
e157206eeb | ||
![]() |
253e6188eb | ||
![]() |
82ce5e56b5 | ||
![]() |
3666af0b10 | ||
![]() |
93f63c5472 | ||
![]() |
dda40c10d4 | ||
![]() |
10e7622e38 | ||
![]() |
70ad5ab3e4 | ||
![]() |
9f6eef7cca | ||
![]() |
2f26096469 | ||
![]() |
a06fabfbc6 | ||
![]() |
64e8c995e6 | ||
![]() |
527a3dba9c | ||
![]() |
04e0e2bd75 | ||
![]() |
b81f15725f | ||
![]() |
5ee826528d | ||
![]() |
0a57968fdc | ||
![]() |
81909f7ddf | ||
![]() |
d1f1bbe304 | ||
![]() |
1a6c3a4944 | ||
![]() |
9af5e838c6 | ||
![]() |
4bbdf475b4 | ||
![]() |
cd94ad125a | ||
![]() |
143e114528 | ||
![]() |
78add0f51d | ||
![]() |
dc7d817398 | ||
![]() |
123f14dd6c | ||
![]() |
f511a8a26a | ||
![]() |
1a51d863cf | ||
![]() |
cec617cfbb | ||
![]() |
5901f6f7e7 | ||
![]() |
241e8560e9 | ||
![]() |
db97e7588b | ||
![]() |
5bb3c7ca55 | ||
![]() |
24a65808ac | ||
![]() |
d913508607 | ||
![]() |
44fe704f49 | ||
![]() |
a78ef60773 | ||
![]() |
0a2a699133 | ||
![]() |
3697567f18 | ||
![]() |
8e99760595 | ||
![]() |
381d8abd58 | ||
![]() |
81cb7470fc | ||
![]() |
cc5eda76d3 | ||
![]() |
40dc6d8191 | ||
![]() |
8e9528d34d | ||
![]() |
4f11ee6e0b | ||
![]() |
a0f19f26c4 | ||
![]() |
f69b8f37f8 | ||
![]() |
0fdd929f54 | ||
![]() |
23578d8046 | ||
![]() |
a51bbe9a66 | ||
![]() |
22fa33ce7a | ||
![]() |
2b12a95607 | ||
![]() |
780e6c06ec | ||
![]() |
3e204ab82b | ||
![]() |
91ffe4f9e5 | ||
![]() |
e49f6b41ee | ||
![]() |
41a235bb52 | ||
![]() |
77a2f1664e | ||
![]() |
36011d0384 | ||
![]() |
cbccdbc6fa | ||
![]() |
a11091890f | ||
![]() |
d935d06265 | ||
![]() |
c69141236e | ||
![]() |
2859055b36 | ||
![]() |
947ce592c1 | ||
![]() |
859c5c48c4 | ||
![]() |
e8c568a243 | ||
![]() |
c29b0cd05b | ||
![]() |
95fe7aa491 | ||
![]() |
836ebfd84b | ||
![]() |
624837912c | ||
![]() |
0d67557106 | ||
![]() |
9c2febc72e | ||
![]() |
0d63e2f9b5 | ||
![]() |
d3ed8a6b8b | ||
![]() |
05deae09fc | ||
![]() |
6276c4483c | ||
![]() |
0fcaa2c581 | ||
![]() |
21af563dfe | ||
![]() |
5b43351807 | ||
![]() |
b636a4d5cf | ||
![]() |
c13744f4cf | ||
![]() |
38acad8263 | ||
![]() |
6c5ba53668 | ||
![]() |
76b322c6b3 | ||
![]() |
b233d248ff | ||
![]() |
2349e3ac1d | ||
![]() |
2a80164508 | ||
![]() |
ef7a3787bb | ||
![]() |
da1780f9ec | ||
![]() |
3ca6cddc1f | ||
![]() |
446de10aec | ||
![]() |
0a05a16fcb | ||
![]() |
b6a3f628d1 | ||
![]() |
369cea175a | ||
![]() |
9a1173f6a6 | ||
![]() |
9a776d958c | ||
![]() |
b372a64057 | ||
![]() |
53b15fd16d | ||
![]() |
9c0bfc1b58 | ||
![]() |
96e9a57fa3 | ||
![]() |
c9e8a3a887 | ||
![]() |
0b4d20b1f9 | ||
![]() |
af4ccefb8a | ||
![]() |
0dc6c1d03a | ||
![]() |
ae516ffbb5 | ||
![]() |
054089291f | ||
![]() |
e08d2408c9 | ||
![]() |
471fb4bce3 | ||
![]() |
408e977b17 | ||
![]() |
570b4ccb4b | ||
![]() |
57a3c70731 | ||
![]() |
8371fe520e | ||
![]() |
08b43c4477 | ||
![]() |
ad22a11485 | ||
![]() |
54cf7010cd | ||
![]() |
5cd61a0cf4 | ||
![]() |
b0e04ae690 | ||
![]() |
91182603d5 | ||
![]() |
a35f5dc6f5 | ||
![]() |
cee8379628 | ||
![]() |
6d567c3e0a | ||
![]() |
779b19ca46 | ||
![]() |
5dd787aa10 | ||
![]() |
b580ca6e6f | ||
![]() |
3cfb2d557f | ||
![]() |
aa8b36c4e2 | ||
![]() |
1b17f6d837 | ||
![]() |
70196d5ee0 | ||
![]() |
52736c6039 | ||
![]() |
5eba6dbc9f | ||
![]() |
fd3d615c0d | ||
![]() |
f6cb7e1bc5 | ||
![]() |
ab6b3d5668 | ||
![]() |
77baea8cb7 | ||
![]() |
17acb04fb8 | ||
![]() |
43cab28700 | ||
![]() |
f88e137679 | ||
![]() |
35791d7d6c | ||
![]() |
701a93c298 | ||
![]() |
806205952f | ||
![]() |
751ebbda51 | ||
![]() |
fefea89d89 | ||
![]() |
a8deb6afd0 | ||
![]() |
8ef3cf2e18 | ||
![]() |
108aed7843 | ||
![]() |
3ba8a82243 | ||
![]() |
936956a430 | ||
![]() |
d3bbcbe27c | ||
![]() |
c04db6a249 | ||
![]() |
941239262a | ||
![]() |
d0603729f2 | ||
![]() |
8e8f2a2163 | ||
![]() |
d078a4396c | ||
![]() |
b9b986dc8d | ||
![]() |
8b30a901dd | ||
![]() |
22306bd309 | ||
![]() |
7671ab0bb7 | ||
![]() |
26e1285f34 | ||
![]() |
72c02d4d63 | ||
![]() |
2d3318e767 | ||
![]() |
07f03d9ec9 | ||
![]() |
c561372f30 | ||
![]() |
1517081a2d | ||
![]() |
216349de25 | ||
![]() |
109944e4ff | ||
![]() |
aa2a748235 | ||
![]() |
6036fda219 | ||
![]() |
37757f777f | ||
![]() |
39c97f5b14 | ||
![]() |
2b3d57859e | ||
![]() |
fa6d8d281d | ||
![]() |
22be56a05b | ||
![]() |
96409cf0e0 | ||
![]() |
f5fee73e01 | ||
![]() |
5cd27a877e | ||
![]() |
bb8375da72 | ||
![]() |
68471b6da5 | ||
![]() |
62067fc64c | ||
![]() |
51c3a5d11d | ||
![]() |
ae1117bc74 | ||
![]() |
0ea0a1ed06 | ||
![]() |
dca72c598e | ||
![]() |
062b510ec0 | ||
![]() |
4778c55d2b | ||
![]() |
0f1c96ba97 | ||
![]() |
921d6feae7 | ||
![]() |
88850334f1 | ||
![]() |
fd8caaf846 | ||
![]() |
1df69f52e5 | ||
![]() |
c1d979dc07 | ||
![]() |
5bcff82148 | ||
![]() |
eeb88f5e07 | ||
![]() |
eadfd51dab | ||
![]() |
2a31eb6762 | ||
![]() |
5d2110c32c | ||
![]() |
680162d494 | ||
![]() |
ac1dc4eeea | ||
![]() |
89a9e6c6e8 | ||
![]() |
f5cc4dcf3e | ||
![]() |
c81ada16ba | ||
![]() |
a63c420890 | ||
![]() |
12e1acfcfc | ||
![]() |
379c75ea1b | ||
![]() |
a95aa4e15f | ||
![]() |
06c9719cd6 | ||
![]() |
b86f3be510 | ||
![]() |
4a117c0a1e | ||
![]() |
e7db0bf34d | ||
![]() |
4e3ff45a5e | ||
![]() |
f15fb6cf5e | ||
![]() |
45f5c21402 | ||
![]() |
35e1ecec8d | ||
![]() |
b12d99bd2b | ||
![]() |
4c3c86511b | ||
![]() |
194a799b0a | ||
![]() |
401bb90215 | ||
![]() |
a0741c74b2 | ||
![]() |
d18b2d8748 | ||
![]() |
4a4d2ad743 | ||
![]() |
fe482af561 | ||
![]() |
76115ce766 | ||
![]() |
47d6d6c344 | ||
![]() |
f05d2eb261 | ||
![]() |
135944b6f0 | ||
![]() |
67fa304b78 | ||
![]() |
56b4369f44 | ||
![]() |
12c5aec5e6 | ||
![]() |
ebee51a794 | ||
![]() |
e48cb909f4 | ||
![]() |
ae02e3f903 | ||
![]() |
66dd3b153d | ||
![]() |
4a93465e85 | ||
![]() |
cef68ea33c | ||
![]() |
8b7cfc070e | ||
![]() |
6e5479d307 | ||
![]() |
412b0e1c55 | ||
![]() |
f624946ac0 | ||
![]() |
78e546b35a | ||
![]() |
daee5baef6 | ||
![]() |
6ea5af7575 | ||
![]() |
04dfbd2e03 | ||
![]() |
f944c68e01 | ||
![]() |
e880ad7bda | ||
![]() |
1a6184a9aa | ||
![]() |
8eb7766f30 | ||
![]() |
4d475a9758 | ||
![]() |
6433bf4d77 | ||
![]() |
3ebd029026 | ||
![]() |
9b27552238 | ||
![]() |
d75a6a3b4b | ||
![]() |
f55cd17982 | ||
![]() |
620a3350d7 | ||
![]() |
22126a1280 | ||
![]() |
193ce08b39 | ||
![]() |
55a4769172 | ||
![]() |
5f09503cf3 | ||
![]() |
8668f47543 | ||
![]() |
8e2c2e5cc5 | ||
![]() |
1fc1e85b01 | ||
![]() |
0304ac5a1b | ||
![]() |
a851907f78 | ||
![]() |
b63c33d320 | ||
![]() |
61a1245a84 | ||
![]() |
85d49a2920 | ||
![]() |
06bbea2e0f | ||
![]() |
8e3b5f1be4 | ||
![]() |
12afd0ad94 | ||
![]() |
246ebc99cc | ||
![]() |
64f8967739 | ||
![]() |
df814af076 | ||
![]() |
6e62cf5efb | ||
![]() |
84b71c9ddb | ||
![]() |
d97a030872 | ||
![]() |
7319abcab0 | ||
![]() |
0f72495a7d | ||
![]() |
cb0517d20e | ||
![]() |
bdfb138b09 | ||
![]() |
78e316aa7e | ||
![]() |
74b19564ad | ||
![]() |
7b6910882e | ||
![]() |
953d5e0080 | ||
![]() |
f160fa4bc3 | ||
![]() |
92ec525de1 | ||
![]() |
4ed3676a56 | ||
![]() |
487dcf227e | ||
![]() |
b3743937de | ||
![]() |
7dbe0c3a48 | ||
![]() |
ba7dbc5927 | ||
![]() |
9952eed671 | ||
![]() |
8acc45d482 | ||
![]() |
422af9d438 | ||
![]() |
dd3790641a | ||
![]() |
7c94293cb4 | ||
![]() |
71ecb39dc5 | ||
![]() |
8fde275662 | ||
![]() |
0369187340 | ||
![]() |
89d7c33e31 | ||
![]() |
d6a0f9b5a0 | ||
![]() |
a373f5eac5 | ||
![]() |
d75f1b2b3e | ||
![]() |
b323295aa1 | ||
![]() |
46ecf0d4bd | ||
![]() |
b7667d44fd | ||
![]() |
94e192db12 | ||
![]() |
59f238b9a7 | ||
![]() |
8a87ea5506 | ||
![]() |
2616794e1d | ||
![]() |
19f1d14000 | ||
![]() |
9cc7012d32 | ||
![]() |
af851b6c2b | ||
![]() |
4e22958486 | ||
![]() |
82688d2a33 | ||
![]() |
6202f178af | ||
![]() |
4599b788b4 | ||
![]() |
a4c31f63bf | ||
![]() |
b1aeaf2296 | ||
![]() |
efc9f845db | ||
![]() |
fb5d058885 | ||
![]() |
8703621c64 | ||
![]() |
03d3a87f23 | ||
![]() |
7e4e124f50 | ||
![]() |
5648dc6cd1 | ||
![]() |
18fa5b8532 | ||
![]() |
7d598801fe | ||
![]() |
009dc91b97 | ||
![]() |
524e20536d | ||
![]() |
6f515c06a2 | ||
![]() |
7f5896bc45 | ||
![]() |
2601c6789d | ||
![]() |
8e112c04fb | ||
![]() |
fd1c1dba7c | ||
![]() |
923d2d0d81 | ||
![]() |
100c3079ae | ||
![]() |
4fa551612e | ||
![]() |
9c6884a526 | ||
![]() |
1c1ff56021 | ||
![]() |
c7d7ce457c | ||
![]() |
c3da075554 | ||
![]() |
ca5bcb9ab1 | ||
![]() |
a516f32bbd | ||
![]() |
3f56ca49c6 | ||
![]() |
c77a3facf5 | ||
![]() |
a7183a0cbf | ||
![]() |
294f565bad | ||
![]() |
43915fbaf3 | ||
![]() |
e0885ef109 | ||
![]() |
8eaf38cd44 | ||
![]() |
6b5f2a1349 | ||
![]() |
3b2a849f77 | ||
![]() |
ae9106effd | ||
![]() |
af9cae289f | ||
![]() |
c741b8cbd1 | ||
![]() |
e7a867f630 | ||
![]() |
cf03f8338a | ||
![]() |
9ea97fd8d2 | ||
![]() |
1a1bc05470 | ||
![]() |
36c6f426df | ||
![]() |
edf2e42e4d | ||
![]() |
087df10d27 | ||
![]() |
4838b2dee6 | ||
![]() |
aa67542ef8 | ||
![]() |
dd28d1e17f | ||
![]() |
6939970624 | ||
![]() |
b89e7a2fe2 | ||
![]() |
43ac77ca2f | ||
![]() |
e5078a3e13 | ||
![]() |
64f0ea60d1 | ||
![]() |
69a0c0d435 | ||
![]() |
f9712627c5 | ||
![]() |
27ac2ceae3 | ||
![]() |
371a49d2f4 | ||
![]() |
13378b4ae2 | ||
![]() |
f28c9221e6 | ||
![]() |
8b1cfbc46c | ||
![]() |
bcade5fe73 | ||
![]() |
4cac20f835 | ||
![]() |
b83ada8c19 | ||
![]() |
e734a4bc53 | ||
![]() |
cd8e3a81db | ||
![]() |
8d034a85fe | ||
![]() |
89e2f06304 | ||
![]() |
4447336083 | ||
![]() |
6e72499f96 | ||
![]() |
e4a1efb680 | ||
![]() |
b50f5e50c3 | ||
![]() |
2c46a975fb | ||
![]() |
edc9aba722 | ||
![]() |
47c9d58b5e | ||
![]() |
476e867fe8 | ||
![]() |
35d18a9a3e | ||
![]() |
8ca5df6fcc | ||
![]() |
0658c7b307 | ||
![]() |
6fae50cb75 | ||
![]() |
d2f8c527a5 | ||
![]() |
4812d62ccf | ||
![]() |
45e4f71d1a | ||
![]() |
267721af43 | ||
![]() |
4328f887be | ||
![]() |
dfc454d527 | ||
![]() |
7f7064ce59 | ||
![]() |
ffed1e8274 | ||
![]() |
37cde54b2b | ||
![]() |
a6c5927976 | ||
![]() |
b38692f3a7 | ||
![]() |
c89acf2abe | ||
![]() |
93a8b60c2b | ||
![]() |
4bf475185e | ||
![]() |
b37e9bc79a | ||
![]() |
7038bd67f7 | ||
![]() |
0cb0e3ceeb | ||
![]() |
fb13d9ce7c | ||
![]() |
704881743b | ||
![]() |
ad692f3341 | ||
![]() |
789a00043a | ||
![]() |
aa36229519 | ||
![]() |
626123acc0 | ||
![]() |
b870933dc7 | ||
![]() |
9047dcf242 | ||
![]() |
dd111416e7 | ||
![]() |
ece7ec6a38 | ||
![]() |
2e643c0c75 | ||
![]() |
6294339944 | ||
![]() |
8d5cb20285 | ||
![]() |
7c93d4fccf | ||
![]() |
ec3ee7f02c | ||
![]() |
40817dabbf | ||
![]() |
eb52943d27 | ||
![]() |
a1a5713e10 | ||
![]() |
f91583a0fc | ||
![]() |
a691bd26cf | ||
![]() |
b37253b206 | ||
![]() |
f56343f447 | ||
![]() |
3a11a6f973 | ||
![]() |
530611c44e | ||
![]() |
21d0fa640f | ||
![]() |
8da421c442 | ||
![]() |
4bb6787909 | ||
![]() |
a4487637ef | ||
![]() |
2e9a3e8c8e | ||
![]() |
e1394d720f | ||
![]() |
02a83740cc | ||
![]() |
69ce85d5af | ||
![]() |
e708faa4d6 | ||
![]() |
e761d5715b | ||
![]() |
b5a6e6b9d5 | ||
![]() |
ff60a8072e | ||
![]() |
1b61cd9179 | ||
![]() |
2049d892ba | ||
![]() |
0e8bd9805a | ||
![]() |
3ed67f134f | ||
![]() |
9cf9b36637 | ||
![]() |
14485af22d | ||
![]() |
bead989e7f | ||
![]() |
9d3cdc85ca | ||
![]() |
4d83cffb39 | ||
![]() |
56ee1753ec | ||
![]() |
0ce7f44294 | ||
![]() |
fd8fdba7e8 | ||
![]() |
5ee14f7f7d | ||
![]() |
a5461a9a90 | ||
![]() |
f5a6c88051 | ||
![]() |
0b8f48205a | ||
![]() |
ee1007abdb | ||
![]() |
2807c9eaca | ||
![]() |
d8baa38751 | ||
![]() |
8737d84d30 | ||
![]() |
82cc62416e | ||
![]() |
952f40a181 | ||
![]() |
eac1d47ec6 | ||
![]() |
f9fa1edabf | ||
![]() |
691de148cf | ||
![]() |
6d1d3f4207 | ||
![]() |
6edbee75f0 | ||
![]() |
cedade15ef | ||
![]() |
51f6dac97f | ||
![]() |
4536720540 | ||
![]() |
ec3596e85d | ||
![]() |
13be486d61 | ||
![]() |
223abb6dca | ||
![]() |
acc5edb088 | ||
![]() |
d25b4aae14 | ||
![]() |
4febb2e1d3 | ||
![]() |
f733f20834 | ||
![]() |
508cffd1b5 | ||
![]() |
8c3ae1b30c | ||
![]() |
9600c7fac1 | ||
![]() |
80b3fec675 | ||
![]() |
4604c5a152 | ||
![]() |
97cc05d0b4 | ||
![]() |
46322a0f59 | ||
![]() |
fea15148a1 | ||
![]() |
8cfb8cb084 | ||
![]() |
e20d4abfe1 | ||
![]() |
421832e09c | ||
![]() |
b42c47e800 | ||
![]() |
57a10a2e0d | ||
![]() |
b0d4e5cb65 | ||
![]() |
b953f2998c | ||
![]() |
6372bc3aaa | ||
![]() |
d5e7cccff9 | ||
![]() |
2935d7d919 | ||
![]() |
5245c94342 | ||
![]() |
5d430f53cd | ||
![]() |
fa1df7e334 | ||
![]() |
4c8a919ca3 | ||
![]() |
a78e3f7b0f | ||
![]() |
c481fdb7d0 | ||
![]() |
7a009ed6cd | ||
![]() |
c555fe4462 | ||
![]() |
a52761171f | ||
![]() |
54bcd70878 | ||
![]() |
c7d2499a52 | ||
![]() |
40ccae3d07 | ||
![]() |
5b39a08feb | ||
![]() |
04c0bca487 | ||
![]() |
9c0427a7ac | ||
![]() |
42c062de68 | ||
![]() |
d5af6c595d | ||
![]() |
8c9c915c45 | ||
![]() |
8a7de27946 | ||
![]() |
e27baedf32 | ||
![]() |
3e23a4b4ee | ||
![]() |
4c99d2607f | ||
![]() |
109819e9cd | ||
![]() |
0c5b963847 | ||
![]() |
e4af09d261 | ||
![]() |
a6ade59133 | ||
![]() |
30ba78cf82 | ||
![]() |
1176003b51 | ||
![]() |
a2bc2bf8a0 | ||
![]() |
54ba376b4b | ||
![]() |
268425b5e3 | ||
![]() |
4ee9a6f130 | ||
![]() |
b980ed3eac | ||
![]() |
a97e34f28e | ||
![]() |
04b883a8e9 | ||
![]() |
164872e1af | ||
![]() |
bc45de627a | ||
![]() |
c8007b841b | ||
![]() |
721c45b7a3 | ||
![]() |
37fdb4950a | ||
![]() |
c2abc3dcec | ||
![]() |
5e30c2ab9c | ||
![]() |
7d2fa5bf60 | ||
![]() |
e936ca0cb1 | ||
![]() |
0adb6fb02c | ||
![]() |
27f6c6fdf4 | ||
![]() |
2dfb3ba693 | ||
![]() |
e3b238861d | ||
![]() |
3f88c518a5 | ||
![]() |
4bf0d6e536 | ||
![]() |
6b618fc95a | ||
![]() |
b416c8fbf6 | ||
![]() |
a77a0ef4a5 | ||
![]() |
877410bb9d | ||
![]() |
1fd7378caf | ||
![]() |
c9c152d46d | ||
![]() |
f8ed051f01 | ||
![]() |
0b5218ec96 | ||
![]() |
409afddeb5 | ||
![]() |
82c0610050 | ||
![]() |
af0b53cc79 | ||
![]() |
a04c37c59f | ||
![]() |
b79eae2e94 | ||
![]() |
e4943dd1e6 | ||
![]() |
392b53e256 | ||
![]() |
1a8558012f | ||
![]() |
ee8037afc1 | ||
![]() |
58e84b7ba1 | ||
![]() |
1412c2ea6e | ||
![]() |
3259e39170 | ||
![]() |
06a2664a07 | ||
![]() |
51f989c57a | ||
![]() |
8bfd418c3e | ||
![]() |
af264c6e0d | ||
![]() |
1621310ba7 | ||
![]() |
1973287c91 | ||
![]() |
b3bd34a024 | ||
![]() |
311e539c0e | ||
![]() |
d5862c350a | ||
![]() |
9820f4288f | ||
![]() |
00607fb778 | ||
![]() |
62d8472757 | ||
![]() |
973b8900a9 | ||
![]() |
215febc912 | ||
![]() |
c4f562ff6a | ||
![]() |
1801a7738c | ||
![]() |
6f2245bba3 | ||
![]() |
0ebc97ad85 | ||
![]() |
242124504b | ||
![]() |
f4d91043fc | ||
![]() |
aa9301be32 | ||
![]() |
51596c6231 | ||
![]() |
f9dbddc884 | ||
![]() |
89f9d64bf5 | ||
![]() |
f626f3bc1e | ||
![]() |
017c699e19 | ||
![]() |
235a3486ee | ||
![]() |
f0f3a43b09 | ||
![]() |
e8146e5565 | ||
![]() |
c36166f01d | ||
![]() |
864b69e586 | ||
![]() |
bd0df2f18f | ||
![]() |
e5b5858915 | ||
![]() |
3896ed47be | ||
![]() |
faa149b71a | ||
![]() |
9f3a733f73 | ||
![]() |
a8f0a66c27 | ||
![]() |
aa5c4d8786 | ||
![]() |
09a8b8567d | ||
![]() |
5cec687247 | ||
![]() |
29f61349ea | ||
![]() |
5aefe963ae | ||
![]() |
013e580c02 | ||
![]() |
41b59b6990 | ||
![]() |
a2c60d9015 | ||
![]() |
55a8f01dcf | ||
![]() |
7e6c14d062 | ||
![]() |
3c455391c2 | ||
![]() |
b881057aa6 | ||
![]() |
f51743f123 | ||
![]() |
b70262fe8c | ||
![]() |
f08a3b96e4 | ||
![]() |
f6238c16f6 | ||
![]() |
6f84549784 | ||
![]() |
038040ffbe | ||
![]() |
e1972ba3c8 | ||
![]() |
1bd0b2d05f | ||
![]() |
5ff6779f5c | ||
![]() |
dd4ac823d3 | ||
![]() |
27b5a9e074 | ||
![]() |
6be401918e | ||
![]() |
2d6dc2bccc | ||
![]() |
31daac61a9 | ||
![]() |
1939beeca6 | ||
![]() |
14483db892 | ||
![]() |
0bd416e53d | ||
![]() |
c7affa75d4 | ||
![]() |
73ac2d3dcc | ||
![]() |
00978026cd | ||
![]() |
c9cba77940 | ||
![]() |
467d24548d | ||
![]() |
ab67304ebc | ||
![]() |
d55b6a0839 | ||
![]() |
dd15e3f706 | ||
![]() |
7963008a1e | ||
![]() |
3599ddfd9f | ||
![]() |
f5e681ad33 | ||
![]() |
221efd7d4d | ||
![]() |
f896b82b49 | ||
![]() |
ec6128d9c4 | ||
![]() |
a187f05da0 | ||
![]() |
f12ce41d00 | ||
![]() |
3aba98a297 | ||
![]() |
1a45b0af28 | ||
![]() |
c916ac67bd | ||
![]() |
f7e84fcb60 | ||
![]() |
2d7f054058 | ||
![]() |
3fb79829ef | ||
![]() |
b2bbe4f4b8 | ||
![]() |
edce212dc9 | ||
![]() |
1e1dbf3cef | ||
![]() |
24a1e540b9 | ||
![]() |
1371a03d14 | ||
![]() |
1b83620213 | ||
![]() |
08d5d5336a | ||
![]() |
406e58df69 | ||
![]() |
e9e677d933 | ||
![]() |
3cfcffc6f2 | ||
![]() |
50c7587ab8 | ||
![]() |
cc0491e85d | ||
![]() |
5e483c5573 | ||
![]() |
da653c36fd | ||
![]() |
a187164bf8 | ||
![]() |
485c52568d | ||
![]() |
20a58d2314 | ||
![]() |
d7e195ba40 | ||
![]() |
8202071683 | ||
![]() |
c042863486 | ||
![]() |
16e3ed47e7 | ||
![]() |
6f83374f3e | ||
![]() |
fe8fb8928c | ||
![]() |
712c061ac0 | ||
![]() |
25ab622b51 | ||
![]() |
e319b04fde | ||
![]() |
7d9014ae41 | ||
![]() |
f85b4f734c | ||
![]() |
4e63823970 | ||
![]() |
554ab94782 | ||
![]() |
1efbba2631 | ||
![]() |
12c4a10cfc | ||
![]() |
f1eb28b7ac | ||
![]() |
3014a651c3 | ||
![]() |
84d0907fc8 | ||
![]() |
8a79870e3a | ||
![]() |
92e625636a | ||
![]() |
c7b1e4186b | ||
![]() |
38a0d31edb | ||
![]() |
04fdcbe5fa | ||
![]() |
bb90c1f168 | ||
![]() |
b911f242dd | ||
![]() |
3285c982fe | ||
![]() |
dcdd4b470c | ||
![]() |
e6d9f89991 | ||
![]() |
5264cdf382 | ||
![]() |
fd435a5416 | ||
![]() |
f4e7c5aed3 | ||
![]() |
6baa8082d5 | ||
![]() |
ec1b3fe6fb | ||
![]() |
54c80491e3 | ||
![]() |
e6e2aa0ea0 | ||
![]() |
5c422c61e9 | ||
![]() |
96b450ad39 | ||
![]() |
063d74c35d | ||
![]() |
e26a2596af | ||
![]() |
b57af4e404 | ||
![]() |
22c21fdc18 | ||
![]() |
f497bcee3a | ||
![]() |
9db9f1b8a9 | ||
![]() |
c574cefc30 | ||
![]() |
5eb0a33795 | ||
![]() |
1456809f6a | ||
![]() |
d0341c9754 | ||
![]() |
3853214496 | ||
![]() |
c408b60e4e | ||
![]() |
615b02be59 | ||
![]() |
c266583bea | ||
![]() |
eab4c24f7f | ||
![]() |
3a4341dbeb | ||
![]() |
fb984b5218 | ||
![]() |
651b725cc0 | ||
![]() |
d149bffb07 | ||
![]() |
90687e9794 | ||
![]() |
dae742fba0 | ||
![]() |
2d833fd6ea | ||
![]() |
dff18b4a16 | ||
![]() |
4498c2e8c4 | ||
![]() |
9857c0fa3a | ||
![]() |
c377cf1ce0 | ||
![]() |
857f2e1d86 | ||
![]() |
ea61160fd8 | ||
![]() |
327bdce561 | ||
![]() |
7ec2496c81 | ||
![]() |
d00934a8f8 | ||
![]() |
393544b3e7 | ||
![]() |
870e38e8ba | ||
![]() |
4b39d34f4c | ||
![]() |
ae62999457 | ||
![]() |
afec5b6730 | ||
![]() |
159b623b95 | ||
![]() |
20fdd45e60 | ||
![]() |
c98c18f25e | ||
![]() |
606b76c681 | ||
![]() |
2531b0bc09 | ||
![]() |
1372126bc0 | ||
![]() |
22de378d91 | ||
![]() |
b9c7613774 | ||
![]() |
61104dd726 | ||
![]() |
9d6518265c | ||
![]() |
d0bff10502 | ||
![]() |
664e490cfa | ||
![]() |
1b73219137 | ||
![]() |
eee294d384 | ||
![]() |
9d775bdbf6 | ||
![]() |
3bb23a6d88 | ||
![]() |
5f35eecf93 | ||
![]() |
799342497b | ||
![]() |
a65ad37c8b | ||
![]() |
43aaf78f7b | ||
![]() |
a06d8c4d3f | ||
![]() |
42f830600c | ||
![]() |
6c1bcae291 | ||
![]() |
3cedfbcc66 | ||
![]() |
cfb88766c7 | ||
![]() |
c3d1db5db6 | ||
![]() |
e2e9c84c88 | ||
![]() |
d8e541a284 | ||
![]() |
e6895b5738 | ||
![]() |
60c1a8d56f | ||
![]() |
9dd2f37b11 | ||
![]() |
29e8814d1b | ||
![]() |
4ae5757bc1 | ||
![]() |
44a5a2dc06 | ||
![]() |
474f4329bc | ||
![]() |
af66bc5e3a | ||
![]() |
f7c1dd2f79 | ||
![]() |
52063537d7 | ||
![]() |
7cd376574e | ||
![]() |
928086a9e5 | ||
![]() |
fc09d87c3c | ||
![]() |
ab29c796da | ||
![]() |
10fd26df4b | ||
![]() |
433c022687 | ||
![]() |
eea9de063b | ||
![]() |
16c5a12c87 | ||
![]() |
912032e8b9 | ||
![]() |
25671a2e42 | ||
![]() |
6d457e808f | ||
![]() |
f891fb6b41 | ||
![]() |
4130980100 | ||
![]() |
23b379b7da | ||
![]() |
9444e1e2ab | ||
![]() |
e151358aa1 | ||
![]() |
4913e7e846 | ||
![]() |
79811e3cd9 | ||
![]() |
b8904fa173 | ||
![]() |
eaf6197d43 | ||
![]() |
6b05f51413 | ||
![]() |
88296c1998 | ||
![]() |
17c9d85e0e | ||
![]() |
d0ba42283c | ||
![]() |
c60cc11505 | ||
![]() |
ce7573c3ad | ||
![]() |
422252e3a0 | ||
![]() |
e5ebdf7ad4 | ||
![]() |
d0fb994199 | ||
![]() |
8dd8af0718 | ||
![]() |
653da6e31f | ||
![]() |
36e1c740fd | ||
![]() |
11740d1e68 | ||
![]() |
93f10cdce8 | ||
![]() |
3c3f512583 | ||
![]() |
24afbf3ae4 | ||
![]() |
b4295e909c | ||
![]() |
3577547eb3 | ||
![]() |
683046272d | ||
![]() |
471d1abe47 | ||
![]() |
b95060df99 | ||
![]() |
b4e4a98f17 | ||
![]() |
6f5a72edf2 | ||
![]() |
2c3067b9c2 | ||
![]() |
36fcf198b1 | ||
![]() |
1a348babd4 | ||
![]() |
8c14824bd5 | ||
![]() |
d237ab6d67 | ||
![]() |
e427fc511b | ||
![]() |
264eef8dd8 | ||
![]() |
148087a1c9 | ||
![]() |
dcb5faa305 | ||
![]() |
05ee28cae5 | ||
![]() |
23e5bc20c2 | ||
![]() |
7fe2bfa990 | ||
![]() |
dc19290271 | ||
![]() |
0eb4567364 | ||
![]() |
5b8da03596 | ||
![]() |
f9615999db | ||
![]() |
1f1a27d6a5 | ||
![]() |
547c38a515 | ||
![]() |
7b2aa3a369 | ||
![]() |
2d1afc1c7d | ||
![]() |
76083a0b4c | ||
![]() |
302b444269 | ||
![]() |
8a4fe5add1 | ||
![]() |
89d86fe983 | ||
![]() |
5ed8de8348 | ||
![]() |
0e499e07d2 | ||
![]() |
f8f39a29de | ||
![]() |
8fd5d89d43 | ||
![]() |
371d988643 | ||
![]() |
76e2afbce9 | ||
![]() |
2e3013f2f8 | ||
![]() |
ae7bb60677 | ||
![]() |
6a6f6fd99d | ||
![]() |
a302f1a616 | ||
![]() |
ce77566783 | ||
![]() |
a0a3d91a28 | ||
![]() |
85fa364152 | ||
![]() |
7d8ea404b3 | ||
![]() |
370e3166ee | ||
![]() |
2609394b9f | ||
![]() |
02567d9bf6 | ||
![]() |
2dfc8b9d7f | ||
![]() |
4e9ec82082 | ||
![]() |
53e97fee0e | ||
![]() |
93d7ff3779 | ||
![]() |
8b8df2ec3b | ||
![]() |
2fac26c6c6 | ||
![]() |
e17a25ca4a | ||
![]() |
e3122ec6dc | ||
![]() |
497da016af | ||
![]() |
43753b841f | ||
![]() |
5f91bdcfc5 | ||
![]() |
fecaf9aa60 | ||
![]() |
f330bc0f97 | ||
![]() |
a36115993c | ||
![]() |
d712a29052 | ||
![]() |
03210d7f81 | ||
![]() |
dc18a7f1fb | ||
![]() |
ff5504f55f | ||
![]() |
8b134f26a9 | ||
![]() |
6d2fbeb556 | ||
![]() |
536ad57bf4 | ||
![]() |
cc3d1a11bd | ||
![]() |
c4ce900567 | ||
![]() |
0c901435bd | ||
![]() |
85af452c6e | ||
![]() |
a92919b8fd | ||
![]() |
472ab437e8 | ||
![]() |
3843e91af0 | ||
![]() |
edf510f9c0 | ||
![]() |
a4e0b3140b | ||
![]() |
b6d8211c6c | ||
![]() |
e5f37050a9 | ||
![]() |
8870991802 | ||
![]() |
dc29190564 | ||
![]() |
f5b5215247 | ||
![]() |
5c52a15df7 | ||
![]() |
6e1c23906c | ||
![]() |
3e4edc8edd | ||
![]() |
014546c75e | ||
![]() |
b0dabfa3f7 | ||
![]() |
ca1d6ddbb6 | ||
![]() |
7670b5d3b0 | ||
![]() |
04dc44c069 | ||
![]() |
c2cf497302 | ||
![]() |
34693d4a9b | ||
![]() |
c9b9851605 | ||
![]() |
3b13c9129a | ||
![]() |
ffe60102fd | ||
![]() |
5946681454 | ||
![]() |
eae6f9b0f8 | ||
![]() |
959d21a576 | ||
![]() |
785df0c8e1 | ||
![]() |
62805aed2b | ||
![]() |
1a2c9fd9a9 | ||
![]() |
f0a1977d2e | ||
![]() |
8b3fc107df | ||
![]() |
417ba3644b | ||
![]() |
49f060d95b | ||
![]() |
ed57d0beac | ||
![]() |
d7a36cb6a4 | ||
![]() |
887263d80e | ||
![]() |
c4737e4423 | ||
![]() |
327e6d2362 | ||
![]() |
e32044f884 | ||
![]() |
dbc3382dfb | ||
![]() |
a042703dd7 | ||
![]() |
8109c77f6a | ||
![]() |
2639602f5b | ||
![]() |
d5c26beb91 | ||
![]() |
f24843f211 | ||
![]() |
5f0bf4e2a3 | ||
![]() |
bab524f264 | ||
![]() |
ede7d13c1e | ||
![]() |
db91e9a720 | ||
![]() |
c11dd58c1d | ||
![]() |
6450ae8d28 | ||
![]() |
5730cb1e85 | ||
![]() |
91cf719588 | ||
![]() |
b70e2f7749 | ||
![]() |
52067dbfe5 | ||
![]() |
8e3c665fd3 | ||
![]() |
dcb3dc254d | ||
![]() |
d676d95901 | ||
![]() |
830981ddd6 | ||
![]() |
5523e9947d | ||
![]() |
2276be275d | ||
![]() |
7fd89b2959 | ||
![]() |
6ce5f190c1 | ||
![]() |
f0317f0d59 | ||
![]() |
257686fcfe | ||
![]() |
6c4ac71218 | ||
![]() |
dfea1c2b7c | ||
![]() |
fd72ebd733 | ||
![]() |
952a17532f | ||
![]() |
1915fee9ba | ||
![]() |
7db2fdd68c | ||
![]() |
ddfad75eb7 | ||
![]() |
c66f0e3305 | ||
![]() |
6771d4bda4 | ||
![]() |
9107e166b4 | ||
![]() |
f61627ea08 | ||
![]() |
183397e201 | ||
![]() |
87c82fb00f | ||
![]() |
0b2b486754 | ||
![]() |
f116e83b62 | ||
![]() |
1a7601ebbe | ||
![]() |
8acb4dc1b6 | ||
![]() |
7f7c3233bd | ||
![]() |
1c70cbaebd | ||
![]() |
7d1105228b | ||
![]() |
39fd5897cb | ||
![]() |
bd38fd9516 | ||
![]() |
ffb752c804 | ||
![]() |
9b785ef766 | ||
![]() |
ba91aaa28d | ||
![]() |
535e2b81ce | ||
![]() |
265f6653c3 | ||
![]() |
6c65db2036 | ||
![]() |
b932c67eb7 | ||
![]() |
c76ce76824 | ||
![]() |
1a8684e314 | ||
![]() |
5290396731 | ||
![]() |
71ddb282d2 | ||
![]() |
4b9296f4f1 | ||
![]() |
7b4b8e7516 | ||
![]() |
f166e1cc1a | ||
![]() |
f7f9331c57 | ||
![]() |
60fa02c042 | ||
![]() |
ecdb0bb46a | ||
![]() |
31bd500222 | ||
![]() |
915f5bf84e | ||
![]() |
f78199df9f | ||
![]() |
00abf49637 | ||
![]() |
6d632bd1ab | ||
![]() |
9afdc22818 | ||
![]() |
c6a3fa30f0 | ||
![]() |
deffa50142 | ||
![]() |
1944b2952c | ||
![]() |
e5d5440385 | ||
![]() |
db3a4dec33 | ||
![]() |
35293eb98b | ||
![]() |
a21990f248 | ||
![]() |
66f43ebdc5 | ||
![]() |
84fe356782 | ||
![]() |
70a0cd579d | ||
![]() |
d46dca8950 | ||
![]() |
2e4df6d2f2 | ||
![]() |
b9090452de | ||
![]() |
6393171fa4 | ||
![]() |
8a83e810b8 | ||
![]() |
f7292d5b00 | ||
![]() |
27b6325c32 | ||
![]() |
e6e190e7e2 | ||
![]() |
7b78cfc090 | ||
![]() |
1f122eb688 | ||
![]() |
18908740ca | ||
![]() |
de658f5ca0 | ||
![]() |
b85a078235 | ||
![]() |
548a73b367 | ||
![]() |
c247170c90 | ||
![]() |
d78ee96e2a | ||
![]() |
6d1876394e | ||
![]() |
fb215479d4 | ||
![]() |
db0c5bbbea | ||
![]() |
78535b99df | ||
![]() |
c6ed022cce | ||
![]() |
1b11062b27 | ||
![]() |
ba3fd4dee1 | ||
![]() |
6420cdb42b | ||
![]() |
c48b724dde | ||
![]() |
3c5772c1c6 | ||
![]() |
4a437e46aa | ||
![]() |
5087f0056c | ||
![]() |
7c85d84133 | ||
![]() |
0f4aae4128 | ||
![]() |
faea3b1634 | ||
![]() |
3155e62510 | ||
![]() |
8c26f66a57 | ||
![]() |
b75a59aad0 | ||
![]() |
e406b8d1e3 | ||
![]() |
b8b28e3ba0 | ||
![]() |
d05ba6cd92 | ||
![]() |
7d202f78f5 | ||
![]() |
d3a67cd984 | ||
![]() |
74464fd94e | ||
![]() |
3bbef476ee | ||
![]() |
55bf309d2f | ||
![]() |
9407c49819 | ||
![]() |
f4ac2b7eeb | ||
![]() |
4709e60ff6 | ||
![]() |
8c2a2e5c37 | ||
![]() |
da3e36aa3b | ||
![]() |
bd93fbe91d | ||
![]() |
031a9224fb | ||
![]() |
b60401b2b1 | ||
![]() |
1a5ad23a10 | ||
![]() |
f3864e6e2f | ||
![]() |
35be5957c3 | ||
![]() |
3018d4edb9 | ||
![]() |
e25cf7cbab | ||
![]() |
5ae45e398e | ||
![]() |
ba5aa7759d | ||
![]() |
0221207b0e | ||
![]() |
da9c42d457 | ||
![]() |
617ce994b4 | ||
![]() |
e68627af7f | ||
![]() |
c8eb62cf4e | ||
![]() |
43c1769004 | ||
![]() |
c70c2f4be4 | ||
![]() |
207adaf9cd | ||
![]() |
8877cafe0c | ||
![]() |
73debba60c | ||
![]() |
a6edfa85b1 | ||
![]() |
bb7ddddd4c | ||
![]() |
475cb7719b | ||
![]() |
9ac5bdc832 | ||
![]() |
ed8a372f4e | ||
![]() |
4e98d39106 | ||
![]() |
b3080ae005 | ||
![]() |
5925b6b912 | ||
![]() |
42b53c6349 | ||
![]() |
d26b1b370a | ||
![]() |
7369ae8c9f | ||
![]() |
6c2d1e2142 | ||
![]() |
4a5b0222ab | ||
![]() |
76f78e249b | ||
![]() |
81f582eeb7 | ||
![]() |
7f6506cfcf | ||
![]() |
d14934861e | ||
![]() |
d469626855 | ||
![]() |
9725a0daf9 | ||
![]() |
26c7ba38d0 | ||
![]() |
948bbdd2bf | ||
![]() |
eadc70ede0 | ||
![]() |
2210db4ca6 | ||
![]() |
c5585b0706 | ||
![]() |
37cfa5efb7 | ||
![]() |
a506ba94d1 | ||
![]() |
f8c7d502df | ||
![]() |
f0cb2ba005 | ||
![]() |
f7ab00a8bf | ||
![]() |
e8c38fe99e | ||
![]() |
a4f0da8286 | ||
![]() |
223f3a434b | ||
![]() |
10e43048bd | ||
![]() |
2345a2be5f | ||
![]() |
7dfb397aef | ||
![]() |
5d0c8947a1 | ||
![]() |
d654c4bc1e | ||
![]() |
b2cad2370b | ||
![]() |
6359390a78 | ||
![]() |
c8d1a7ff4f | ||
![]() |
86cf2e29b2 | ||
![]() |
1635cbb8a6 | ||
![]() |
8dffff3983 | ||
![]() |
5edcd7ef0f | ||
![]() |
83c5844c2e | ||
![]() |
9982483395 | ||
![]() |
96aba1c1a6 | ||
![]() |
adc7fc0ee4 | ||
![]() |
10dcdbf537 | ||
![]() |
d2c842ee0c | ||
![]() |
62802dd487 | ||
![]() |
835982ebe5 | ||
![]() |
d5f07ef45f | ||
![]() |
3cd4d26eb9 | ||
![]() |
1c590f8d0e | ||
![]() |
fd2edf6c0a | ||
![]() |
79eaaec1a8 | ||
![]() |
f7aad4a9e6 | ||
![]() |
425d961489 | ||
![]() |
97d17637ea | ||
![]() |
ca7355b2f3 | ||
![]() |
4553de5cbf | ||
![]() |
c0904c905d | ||
![]() |
7c8c063149 | ||
![]() |
00d0767628 | ||
![]() |
20188181f7 | ||
![]() |
775751ece5 | ||
![]() |
b97ec2cfce | ||
![]() |
fa90b0f41e | ||
![]() |
d009ff8b01 | ||
![]() |
67dfd1a86b | ||
![]() |
3478666973 | ||
![]() |
60fa63a1f0 | ||
![]() |
ed74e64f8d | ||
![]() |
579590f7c3 | ||
![]() |
244f6d8002 | ||
![]() |
48a23798d0 | ||
![]() |
920bd04099 | ||
![]() |
442005e40f | ||
![]() |
dd8bd0db5a | ||
![]() |
2bfb1e75d3 | ||
![]() |
da770df13f | ||
![]() |
da1d5fc862 | ||
![]() |
c7d533d427 | ||
![]() |
1d31def982 | ||
![]() |
8a033ee554 | ||
![]() |
6853d54050 | ||
![]() |
fe316f2233 | ||
![]() |
ce55116eb2 | ||
![]() |
b8fa065467 | ||
![]() |
a428bbfc2e | ||
![]() |
b7914582db | ||
![]() |
285ad10624 | ||
![]() |
62ea4b36cd | ||
![]() |
659d437cac | ||
![]() |
716a10e556 | ||
![]() |
589fd58137 | ||
![]() |
0c40c8465e | ||
![]() |
3d9073693c | ||
![]() |
dce5099d92 | ||
![]() |
cb0a05142d | ||
![]() |
0e41542ff3 | ||
![]() |
7f912cb669 | ||
![]() |
2464232f24 | ||
![]() |
5975974a37 | ||
![]() |
ef066626c8 | ||
![]() |
0c8e1a691d | ||
![]() |
ca2e335ab9 | ||
![]() |
383c63000e | ||
![]() |
c951c03447 | ||
![]() |
db71e8033c | ||
![]() |
7e39acda37 | ||
![]() |
c495d607d8 | ||
![]() |
a3fe120457 | ||
![]() |
1d7d7c3540 | ||
![]() |
2d766d43fc | ||
![]() |
5754e8721a | ||
![]() |
22bf1a0582 | ||
![]() |
ab6f617797 | ||
![]() |
01daae69ab | ||
![]() |
17779c5f0c | ||
![]() |
3aa6771835 | ||
![]() |
512b2af13c | ||
![]() |
d3c5b9777b | ||
![]() |
8e05df2b44 | ||
![]() |
0470ca3e76 | ||
![]() |
ebde9914f2 | ||
![]() |
337f9197bb | ||
![]() |
9b9a16e9c6 | ||
![]() |
cd175f679f | ||
![]() |
fb724472fb | ||
![]() |
f08d66741d | ||
![]() |
d14e5dc56a | ||
![]() |
8626a4888c | ||
![]() |
efca5ba554 | ||
![]() |
adf6d34d95 | ||
![]() |
55ff8e1fcb | ||
![]() |
937a26117c | ||
![]() |
776b26de3f | ||
![]() |
b9a929e63b | ||
![]() |
9c5d9344e2 | ||
![]() |
38423ad6f1 | ||
![]() |
9e4f9a88ad | ||
![]() |
e0cbbf7d57 | ||
![]() |
fd6eb61489 | ||
![]() |
3be3593ffa | ||
![]() |
5551a345ea | ||
![]() |
09ba34fb3a | ||
![]() |
63946175ea | ||
![]() |
e6504218bc | ||
![]() |
d8f1023210 | ||
![]() |
1c60597e41 | ||
![]() |
2627abb9ef | ||
![]() |
cc7e35e299 | ||
![]() |
d723a87ea2 | ||
![]() |
ab2de18f8f | ||
![]() |
956098ae3a | ||
![]() |
bdcc6c0143 | ||
![]() |
d518cf13e5 | ||
![]() |
135570acab | ||
![]() |
7c7f00a46d | ||
![]() |
727074a1a6 | ||
![]() |
99f227229e | ||
![]() |
69e588b15e | ||
![]() |
a9bc380c32 | ||
![]() |
be32db70a0 | ||
![]() |
0e29ccf069 | ||
![]() |
44acc88365 | ||
![]() |
49e69aff0c | ||
![]() |
ca2f45d466 | ||
![]() |
2f0ba154b9 | ||
![]() |
9834c1de9a | ||
![]() |
791293ca87 | ||
![]() |
98d7945521 | ||
![]() |
06d6122663 | ||
![]() |
bad9b1c95f | ||
![]() |
a0e5f016e1 | ||
![]() |
5370db4a3e | ||
![]() |
b069f92d95 | ||
![]() |
9b810dcf9f | ||
![]() |
3cfae48577 | ||
![]() |
ad53ff037e | ||
![]() |
63b5ba6b3a | ||
![]() |
d0700db7eb | ||
![]() |
e76396b184 | ||
![]() |
ebf8061117 | ||
![]() |
ced616fafa | ||
![]() |
18f3fb42c9 | ||
![]() |
bfe16e2536 | ||
![]() |
98ca71fc96 | ||
![]() |
93033e037d | ||
![]() |
cfa923252b | ||
![]() |
9d242bf45f | ||
![]() |
f248b693d7 | ||
![]() |
e4cb19f20d | ||
![]() |
6fa3078cfc | ||
![]() |
1a9c98e837 | ||
![]() |
35616e100d | ||
![]() |
054407722d | ||
![]() |
74b3c5c690 | ||
![]() |
cab30085c5 | ||
![]() |
b5f71f9ec7 | ||
![]() |
f72f95549c | ||
![]() |
9eaf326c0e | ||
![]() |
15f945c47e | ||
![]() |
02f82d04fe | ||
![]() |
a618e8d1cf | ||
![]() |
e18e12a2df | ||
![]() |
e23e71279f | ||
![]() |
100b6fd06f | ||
![]() |
4ee6f6c766 | ||
![]() |
0fdf04391b | ||
![]() |
85e782055b | ||
![]() |
d0dc4d0963 | ||
![]() |
41cb8526d1 | ||
![]() |
1b43d79717 | ||
![]() |
56e7e20904 | ||
![]() |
e652d37f29 | ||
![]() |
6ce6952a06 | ||
![]() |
99a76ef4e6 | ||
![]() |
f2cf87b0b7 | ||
![]() |
b56d25121f | ||
![]() |
b33d5fece6 | ||
![]() |
78f827697e | ||
![]() |
c1cfce116d | ||
![]() |
4e4b8de448 | ||
![]() |
4c24ff6847 | ||
![]() |
cabfbc245d | ||
![]() |
9261ad14e2 | ||
![]() |
67f7c703f4 | ||
![]() |
377f00730a | ||
![]() |
1f76abe6f4 | ||
![]() |
1db3d3c158 | ||
![]() |
8c84237e6b | ||
![]() |
cf6f0cf266 | ||
![]() |
b24f09b47e | ||
![]() |
e0d7c1440b | ||
![]() |
b20f9c40be | ||
![]() |
b27097808d | ||
![]() |
d7fa98454b | ||
![]() |
531479bf5b | ||
![]() |
3941d2c897 | ||
![]() |
c4d85ac41f | ||
![]() |
5106907571 | ||
![]() |
8fd0a1b083 | ||
![]() |
65c8da3bf1 | ||
![]() |
598a8890e9 | ||
![]() |
2d58ab0e1c | ||
![]() |
b3b5ca9b95 | ||
![]() |
f4bf8fa8f1 | ||
![]() |
a3808383d5 | ||
![]() |
8b7fae5200 | ||
![]() |
31ea00f5c7 | ||
![]() |
a4a99ce957 | ||
![]() |
87ecdfb84f | ||
![]() |
5e6735ab6d | ||
![]() |
9306e60530 | ||
![]() |
fd1f0b0efe | ||
![]() |
9b754a58f4 | ||
![]() |
b4555c8a92 | ||
![]() |
bd2fee289d | ||
![]() |
fe30c019b6 | ||
![]() |
25855a3ccb | ||
![]() |
42eb849cae | ||
![]() |
9444a474ec | ||
![]() |
47ecce4873 | ||
![]() |
d40a08958d | ||
![]() |
e6c9a82b5f | ||
![]() |
6e3c704a33 | ||
![]() |
542ab2dd76 | ||
![]() |
7b9c1c3953 | ||
![]() |
a1d632c5d1 | ||
![]() |
facdc5e862 | ||
![]() |
1546dee36e | ||
![]() |
581a045617 | ||
![]() |
26ba10f4e4 | ||
![]() |
1b05418647 | ||
![]() |
a5f8774878 | ||
![]() |
257e608c13 | ||
![]() |
a19c6fe9ff | ||
![]() |
339b95c79f | ||
![]() |
edcf0b6333 | ||
![]() |
591ffa8b68 | ||
![]() |
8d972223d8 | ||
![]() |
6c39233e00 | ||
![]() |
ce083eade9 | ||
![]() |
50827405d0 | ||
![]() |
b8a7ad916a | ||
![]() |
97e5504ddd | ||
![]() |
e924622153 | ||
![]() |
809abc1445 | ||
![]() |
4f90542394 | ||
![]() |
2a6a2fa842 | ||
![]() |
fb61e34833 | ||
![]() |
845d28255e | ||
![]() |
f5d8d41ad5 | ||
![]() |
d1347d23de | ||
![]() |
063bac1665 | ||
![]() |
42b2a462c1 | ||
![]() |
136fbaa2a8 | ||
![]() |
d73cc1eecd | ||
![]() |
dbd0c06518 | ||
![]() |
0ded0ef4ee | ||
![]() |
77c519220d | ||
![]() |
f733c43900 | ||
![]() |
0a540e1cdb | ||
![]() |
f39b2716b0 | ||
![]() |
f255a0e546 | ||
![]() |
3b381f10d3 | ||
![]() |
dc78d15abc | ||
![]() |
d8520088e7 | ||
![]() |
f0ca27fd08 | ||
![]() |
217a895b5a | ||
![]() |
b43262014f | ||
![]() |
d1f1bdebde | ||
![]() |
4a73ccb7db | ||
![]() |
3db7bdc630 | ||
![]() |
089f87c45b | ||
![]() |
d70cb8caa5 | ||
![]() |
e1771ae01e | ||
![]() |
d41144ee88 | ||
![]() |
f757d4c7da | ||
![]() |
4f1906ae3e | ||
![]() |
dc1d3f727b | ||
![]() |
5fe61ca5e7 | ||
![]() |
38984dd939 | ||
![]() |
b569cb61e9 | ||
![]() |
7d07694496 | ||
![]() |
6a52283ce0 | ||
![]() |
473d20712c | ||
![]() |
b3b235cbb7 | ||
![]() |
9fe2c08913 | ||
![]() |
97f24b855f | ||
![]() |
c0c02bf6bb |
@@ -45,6 +45,7 @@ base_platforms: &base_platforms
|
|||||||
- homeassistant/components/switch/**
|
- homeassistant/components/switch/**
|
||||||
- homeassistant/components/text/**
|
- homeassistant/components/text/**
|
||||||
- homeassistant/components/time/**
|
- homeassistant/components/time/**
|
||||||
|
- homeassistant/components/todo/**
|
||||||
- homeassistant/components/tts/**
|
- homeassistant/components/tts/**
|
||||||
- homeassistant/components/update/**
|
- homeassistant/components/update/**
|
||||||
- homeassistant/components/vacuum/**
|
- homeassistant/components/vacuum/**
|
||||||
@@ -96,8 +97,8 @@ components: &components
|
|||||||
- homeassistant/components/persistent_notification/**
|
- homeassistant/components/persistent_notification/**
|
||||||
- homeassistant/components/person/**
|
- homeassistant/components/person/**
|
||||||
- homeassistant/components/recorder/**
|
- homeassistant/components/recorder/**
|
||||||
|
- homeassistant/components/recovery_mode/**
|
||||||
- homeassistant/components/repairs/**
|
- homeassistant/components/repairs/**
|
||||||
- homeassistant/components/safe_mode/**
|
|
||||||
- homeassistant/components/script/**
|
- homeassistant/components/script/**
|
||||||
- homeassistant/components/shopping_list/**
|
- homeassistant/components/shopping_list/**
|
||||||
- homeassistant/components/ssdp/**
|
- homeassistant/components/ssdp/**
|
||||||
|
69
.coveragerc
69
.coveragerc
@@ -67,9 +67,6 @@ omit =
|
|||||||
homeassistant/components/android_ip_webcam/switch.py
|
homeassistant/components/android_ip_webcam/switch.py
|
||||||
homeassistant/components/anel_pwrctrl/switch.py
|
homeassistant/components/anel_pwrctrl/switch.py
|
||||||
homeassistant/components/anthemav/media_player.py
|
homeassistant/components/anthemav/media_player.py
|
||||||
homeassistant/components/apcupsd/__init__.py
|
|
||||||
homeassistant/components/apcupsd/binary_sensor.py
|
|
||||||
homeassistant/components/apcupsd/sensor.py
|
|
||||||
homeassistant/components/apple_tv/__init__.py
|
homeassistant/components/apple_tv/__init__.py
|
||||||
homeassistant/components/apple_tv/browse_media.py
|
homeassistant/components/apple_tv/browse_media.py
|
||||||
homeassistant/components/apple_tv/media_player.py
|
homeassistant/components/apple_tv/media_player.py
|
||||||
@@ -123,6 +120,7 @@ omit =
|
|||||||
homeassistant/components/blink/binary_sensor.py
|
homeassistant/components/blink/binary_sensor.py
|
||||||
homeassistant/components/blink/camera.py
|
homeassistant/components/blink/camera.py
|
||||||
homeassistant/components/blink/sensor.py
|
homeassistant/components/blink/sensor.py
|
||||||
|
homeassistant/components/blink/switch.py
|
||||||
homeassistant/components/blinksticklight/light.py
|
homeassistant/components/blinksticklight/light.py
|
||||||
homeassistant/components/blockchain/sensor.py
|
homeassistant/components/blockchain/sensor.py
|
||||||
homeassistant/components/bloomsky/*
|
homeassistant/components/bloomsky/*
|
||||||
@@ -144,6 +142,7 @@ omit =
|
|||||||
homeassistant/components/braviatv/coordinator.py
|
homeassistant/components/braviatv/coordinator.py
|
||||||
homeassistant/components/braviatv/media_player.py
|
homeassistant/components/braviatv/media_player.py
|
||||||
homeassistant/components/braviatv/remote.py
|
homeassistant/components/braviatv/remote.py
|
||||||
|
homeassistant/components/broadlink/climate.py
|
||||||
homeassistant/components/broadlink/light.py
|
homeassistant/components/broadlink/light.py
|
||||||
homeassistant/components/broadlink/remote.py
|
homeassistant/components/broadlink/remote.py
|
||||||
homeassistant/components/broadlink/switch.py
|
homeassistant/components/broadlink/switch.py
|
||||||
@@ -178,6 +177,8 @@ omit =
|
|||||||
homeassistant/components/comelit/cover.py
|
homeassistant/components/comelit/cover.py
|
||||||
homeassistant/components/comelit/coordinator.py
|
homeassistant/components/comelit/coordinator.py
|
||||||
homeassistant/components/comelit/light.py
|
homeassistant/components/comelit/light.py
|
||||||
|
homeassistant/components/comelit/sensor.py
|
||||||
|
homeassistant/components/comelit/switch.py
|
||||||
homeassistant/components/comfoconnect/fan.py
|
homeassistant/components/comfoconnect/fan.py
|
||||||
homeassistant/components/concord232/alarm_control_panel.py
|
homeassistant/components/concord232/alarm_control_panel.py
|
||||||
homeassistant/components/concord232/binary_sensor.py
|
homeassistant/components/concord232/binary_sensor.py
|
||||||
@@ -214,9 +215,6 @@ omit =
|
|||||||
homeassistant/components/discogs/sensor.py
|
homeassistant/components/discogs/sensor.py
|
||||||
homeassistant/components/discord/__init__.py
|
homeassistant/components/discord/__init__.py
|
||||||
homeassistant/components/discord/notify.py
|
homeassistant/components/discord/notify.py
|
||||||
homeassistant/components/discovergy/__init__.py
|
|
||||||
homeassistant/components/discovergy/sensor.py
|
|
||||||
homeassistant/components/discovergy/coordinator.py
|
|
||||||
homeassistant/components/dlib_face_detect/image_processing.py
|
homeassistant/components/dlib_face_detect/image_processing.py
|
||||||
homeassistant/components/dlib_face_identify/image_processing.py
|
homeassistant/components/dlib_face_identify/image_processing.py
|
||||||
homeassistant/components/dlink/data.py
|
homeassistant/components/dlink/data.py
|
||||||
@@ -284,9 +282,6 @@ omit =
|
|||||||
homeassistant/components/edl21/__init__.py
|
homeassistant/components/edl21/__init__.py
|
||||||
homeassistant/components/edl21/sensor.py
|
homeassistant/components/edl21/sensor.py
|
||||||
homeassistant/components/egardia/*
|
homeassistant/components/egardia/*
|
||||||
homeassistant/components/eight_sleep/__init__.py
|
|
||||||
homeassistant/components/eight_sleep/binary_sensor.py
|
|
||||||
homeassistant/components/eight_sleep/sensor.py
|
|
||||||
homeassistant/components/electric_kiwi/__init__.py
|
homeassistant/components/electric_kiwi/__init__.py
|
||||||
homeassistant/components/electric_kiwi/api.py
|
homeassistant/components/electric_kiwi/api.py
|
||||||
homeassistant/components/electric_kiwi/oauth2.py
|
homeassistant/components/electric_kiwi/oauth2.py
|
||||||
@@ -339,7 +334,6 @@ omit =
|
|||||||
homeassistant/components/epson/__init__.py
|
homeassistant/components/epson/__init__.py
|
||||||
homeassistant/components/epson/media_player.py
|
homeassistant/components/epson/media_player.py
|
||||||
homeassistant/components/epsonworkforce/sensor.py
|
homeassistant/components/epsonworkforce/sensor.py
|
||||||
homeassistant/components/eq3btsmart/climate.py
|
|
||||||
homeassistant/components/escea/__init__.py
|
homeassistant/components/escea/__init__.py
|
||||||
homeassistant/components/escea/climate.py
|
homeassistant/components/escea/climate.py
|
||||||
homeassistant/components/escea/discovery.py
|
homeassistant/components/escea/discovery.py
|
||||||
@@ -370,12 +364,14 @@ omit =
|
|||||||
homeassistant/components/faa_delays/binary_sensor.py
|
homeassistant/components/faa_delays/binary_sensor.py
|
||||||
homeassistant/components/faa_delays/coordinator.py
|
homeassistant/components/faa_delays/coordinator.py
|
||||||
homeassistant/components/familyhub/camera.py
|
homeassistant/components/familyhub/camera.py
|
||||||
homeassistant/components/fastdotcom/*
|
homeassistant/components/fastdotcom/sensor.py
|
||||||
|
homeassistant/components/fastdotcom/__init__.py
|
||||||
homeassistant/components/ffmpeg/camera.py
|
homeassistant/components/ffmpeg/camera.py
|
||||||
homeassistant/components/fibaro/__init__.py
|
homeassistant/components/fibaro/__init__.py
|
||||||
homeassistant/components/fibaro/binary_sensor.py
|
homeassistant/components/fibaro/binary_sensor.py
|
||||||
homeassistant/components/fibaro/climate.py
|
homeassistant/components/fibaro/climate.py
|
||||||
homeassistant/components/fibaro/cover.py
|
homeassistant/components/fibaro/cover.py
|
||||||
|
homeassistant/components/fibaro/event.py
|
||||||
homeassistant/components/fibaro/light.py
|
homeassistant/components/fibaro/light.py
|
||||||
homeassistant/components/fibaro/lock.py
|
homeassistant/components/fibaro/lock.py
|
||||||
homeassistant/components/fibaro/sensor.py
|
homeassistant/components/fibaro/sensor.py
|
||||||
@@ -426,9 +422,7 @@ omit =
|
|||||||
homeassistant/components/foursquare/*
|
homeassistant/components/foursquare/*
|
||||||
homeassistant/components/free_mobile/notify.py
|
homeassistant/components/free_mobile/notify.py
|
||||||
homeassistant/components/freebox/camera.py
|
homeassistant/components/freebox/camera.py
|
||||||
homeassistant/components/freebox/device_tracker.py
|
|
||||||
homeassistant/components/freebox/home_base.py
|
homeassistant/components/freebox/home_base.py
|
||||||
homeassistant/components/freebox/router.py
|
|
||||||
homeassistant/components/freebox/switch.py
|
homeassistant/components/freebox/switch.py
|
||||||
homeassistant/components/fritz/common.py
|
homeassistant/components/fritz/common.py
|
||||||
homeassistant/components/fritz/device_tracker.py
|
homeassistant/components/fritz/device_tracker.py
|
||||||
@@ -541,12 +535,6 @@ omit =
|
|||||||
homeassistant/components/hvv_departures/__init__.py
|
homeassistant/components/hvv_departures/__init__.py
|
||||||
homeassistant/components/hvv_departures/binary_sensor.py
|
homeassistant/components/hvv_departures/binary_sensor.py
|
||||||
homeassistant/components/hvv_departures/sensor.py
|
homeassistant/components/hvv_departures/sensor.py
|
||||||
homeassistant/components/hydrawise/__init__.py
|
|
||||||
homeassistant/components/hydrawise/binary_sensor.py
|
|
||||||
homeassistant/components/hydrawise/const.py
|
|
||||||
homeassistant/components/hydrawise/coordinator.py
|
|
||||||
homeassistant/components/hydrawise/sensor.py
|
|
||||||
homeassistant/components/hydrawise/switch.py
|
|
||||||
homeassistant/components/ialarm/alarm_control_panel.py
|
homeassistant/components/ialarm/alarm_control_panel.py
|
||||||
homeassistant/components/iammeter/sensor.py
|
homeassistant/components/iammeter/sensor.py
|
||||||
homeassistant/components/iaqualink/binary_sensor.py
|
homeassistant/components/iaqualink/binary_sensor.py
|
||||||
@@ -563,7 +551,6 @@ omit =
|
|||||||
homeassistant/components/ifttt/alarm_control_panel.py
|
homeassistant/components/ifttt/alarm_control_panel.py
|
||||||
homeassistant/components/iglo/light.py
|
homeassistant/components/iglo/light.py
|
||||||
homeassistant/components/ihc/*
|
homeassistant/components/ihc/*
|
||||||
homeassistant/components/imap_email_content/sensor.py
|
|
||||||
homeassistant/components/incomfort/*
|
homeassistant/components/incomfort/*
|
||||||
homeassistant/components/insteon/binary_sensor.py
|
homeassistant/components/insteon/binary_sensor.py
|
||||||
homeassistant/components/insteon/climate.py
|
homeassistant/components/insteon/climate.py
|
||||||
@@ -646,6 +633,8 @@ omit =
|
|||||||
homeassistant/components/kodi/browse_media.py
|
homeassistant/components/kodi/browse_media.py
|
||||||
homeassistant/components/kodi/media_player.py
|
homeassistant/components/kodi/media_player.py
|
||||||
homeassistant/components/kodi/notify.py
|
homeassistant/components/kodi/notify.py
|
||||||
|
homeassistant/components/komfovent/__init__.py
|
||||||
|
homeassistant/components/komfovent/climate.py
|
||||||
homeassistant/components/konnected/__init__.py
|
homeassistant/components/konnected/__init__.py
|
||||||
homeassistant/components/konnected/panel.py
|
homeassistant/components/konnected/panel.py
|
||||||
homeassistant/components/konnected/switch.py
|
homeassistant/components/konnected/switch.py
|
||||||
@@ -750,11 +739,6 @@ omit =
|
|||||||
homeassistant/components/mikrotik/hub.py
|
homeassistant/components/mikrotik/hub.py
|
||||||
homeassistant/components/mill/climate.py
|
homeassistant/components/mill/climate.py
|
||||||
homeassistant/components/mill/sensor.py
|
homeassistant/components/mill/sensor.py
|
||||||
homeassistant/components/minecraft_server/__init__.py
|
|
||||||
homeassistant/components/minecraft_server/binary_sensor.py
|
|
||||||
homeassistant/components/minecraft_server/coordinator.py
|
|
||||||
homeassistant/components/minecraft_server/entity.py
|
|
||||||
homeassistant/components/minecraft_server/sensor.py
|
|
||||||
homeassistant/components/minio/minio_helper.py
|
homeassistant/components/minio/minio_helper.py
|
||||||
homeassistant/components/mjpeg/camera.py
|
homeassistant/components/mjpeg/camera.py
|
||||||
homeassistant/components/mjpeg/util.py
|
homeassistant/components/mjpeg/util.py
|
||||||
@@ -781,9 +765,6 @@ omit =
|
|||||||
homeassistant/components/mutesync/binary_sensor.py
|
homeassistant/components/mutesync/binary_sensor.py
|
||||||
homeassistant/components/mvglive/sensor.py
|
homeassistant/components/mvglive/sensor.py
|
||||||
homeassistant/components/mycroft/*
|
homeassistant/components/mycroft/*
|
||||||
homeassistant/components/myq/__init__.py
|
|
||||||
homeassistant/components/myq/cover.py
|
|
||||||
homeassistant/components/myq/light.py
|
|
||||||
homeassistant/components/mysensors/__init__.py
|
homeassistant/components/mysensors/__init__.py
|
||||||
homeassistant/components/mysensors/climate.py
|
homeassistant/components/mysensors/climate.py
|
||||||
homeassistant/components/mysensors/cover.py
|
homeassistant/components/mysensors/cover.py
|
||||||
@@ -795,6 +776,7 @@ omit =
|
|||||||
homeassistant/components/mystrom/binary_sensor.py
|
homeassistant/components/mystrom/binary_sensor.py
|
||||||
homeassistant/components/mystrom/light.py
|
homeassistant/components/mystrom/light.py
|
||||||
homeassistant/components/mystrom/switch.py
|
homeassistant/components/mystrom/switch.py
|
||||||
|
homeassistant/components/mystrom/sensor.py
|
||||||
homeassistant/components/nad/media_player.py
|
homeassistant/components/nad/media_player.py
|
||||||
homeassistant/components/nanoleaf/__init__.py
|
homeassistant/components/nanoleaf/__init__.py
|
||||||
homeassistant/components/nanoleaf/button.py
|
homeassistant/components/nanoleaf/button.py
|
||||||
@@ -833,9 +815,7 @@ omit =
|
|||||||
homeassistant/components/nfandroidtv/__init__.py
|
homeassistant/components/nfandroidtv/__init__.py
|
||||||
homeassistant/components/nfandroidtv/notify.py
|
homeassistant/components/nfandroidtv/notify.py
|
||||||
homeassistant/components/nibe_heatpump/__init__.py
|
homeassistant/components/nibe_heatpump/__init__.py
|
||||||
homeassistant/components/nibe_heatpump/climate.py
|
|
||||||
homeassistant/components/nibe_heatpump/binary_sensor.py
|
homeassistant/components/nibe_heatpump/binary_sensor.py
|
||||||
homeassistant/components/nibe_heatpump/number.py
|
|
||||||
homeassistant/components/nibe_heatpump/select.py
|
homeassistant/components/nibe_heatpump/select.py
|
||||||
homeassistant/components/nibe_heatpump/sensor.py
|
homeassistant/components/nibe_heatpump/sensor.py
|
||||||
homeassistant/components/nibe_heatpump/switch.py
|
homeassistant/components/nibe_heatpump/switch.py
|
||||||
@@ -849,6 +829,7 @@ omit =
|
|||||||
homeassistant/components/noaa_tides/sensor.py
|
homeassistant/components/noaa_tides/sensor.py
|
||||||
homeassistant/components/nobo_hub/__init__.py
|
homeassistant/components/nobo_hub/__init__.py
|
||||||
homeassistant/components/nobo_hub/climate.py
|
homeassistant/components/nobo_hub/climate.py
|
||||||
|
homeassistant/components/nobo_hub/select.py
|
||||||
homeassistant/components/nobo_hub/sensor.py
|
homeassistant/components/nobo_hub/sensor.py
|
||||||
homeassistant/components/norway_air/air_quality.py
|
homeassistant/components/norway_air/air_quality.py
|
||||||
homeassistant/components/notify_events/notify.py
|
homeassistant/components/notify_events/notify.py
|
||||||
@@ -949,6 +930,9 @@ omit =
|
|||||||
homeassistant/components/panasonic_viera/media_player.py
|
homeassistant/components/panasonic_viera/media_player.py
|
||||||
homeassistant/components/pandora/media_player.py
|
homeassistant/components/pandora/media_player.py
|
||||||
homeassistant/components/pencom/switch.py
|
homeassistant/components/pencom/switch.py
|
||||||
|
homeassistant/components/permobil/__init__.py
|
||||||
|
homeassistant/components/permobil/coordinator.py
|
||||||
|
homeassistant/components/permobil/sensor.py
|
||||||
homeassistant/components/philips_js/__init__.py
|
homeassistant/components/philips_js/__init__.py
|
||||||
homeassistant/components/philips_js/light.py
|
homeassistant/components/philips_js/light.py
|
||||||
homeassistant/components/philips_js/media_player.py
|
homeassistant/components/philips_js/media_player.py
|
||||||
@@ -962,8 +946,7 @@ omit =
|
|||||||
homeassistant/components/pilight/light.py
|
homeassistant/components/pilight/light.py
|
||||||
homeassistant/components/pilight/switch.py
|
homeassistant/components/pilight/switch.py
|
||||||
homeassistant/components/ping/__init__.py
|
homeassistant/components/ping/__init__.py
|
||||||
homeassistant/components/ping/binary_sensor.py
|
homeassistant/components/ping/helpers.py
|
||||||
homeassistant/components/ping/device_tracker.py
|
|
||||||
homeassistant/components/pioneer/media_player.py
|
homeassistant/components/pioneer/media_player.py
|
||||||
homeassistant/components/plaato/__init__.py
|
homeassistant/components/plaato/__init__.py
|
||||||
homeassistant/components/plaato/binary_sensor.py
|
homeassistant/components/plaato/binary_sensor.py
|
||||||
@@ -1000,6 +983,7 @@ omit =
|
|||||||
homeassistant/components/pushsafer/notify.py
|
homeassistant/components/pushsafer/notify.py
|
||||||
homeassistant/components/pyload/sensor.py
|
homeassistant/components/pyload/sensor.py
|
||||||
homeassistant/components/qbittorrent/__init__.py
|
homeassistant/components/qbittorrent/__init__.py
|
||||||
|
homeassistant/components/qbittorrent/coordinator.py
|
||||||
homeassistant/components/qbittorrent/sensor.py
|
homeassistant/components/qbittorrent/sensor.py
|
||||||
homeassistant/components/qnap/__init__.py
|
homeassistant/components/qnap/__init__.py
|
||||||
homeassistant/components/qnap/coordinator.py
|
homeassistant/components/qnap/coordinator.py
|
||||||
@@ -1079,6 +1063,7 @@ omit =
|
|||||||
homeassistant/components/roomba/sensor.py
|
homeassistant/components/roomba/sensor.py
|
||||||
homeassistant/components/roomba/vacuum.py
|
homeassistant/components/roomba/vacuum.py
|
||||||
homeassistant/components/roon/__init__.py
|
homeassistant/components/roon/__init__.py
|
||||||
|
homeassistant/components/roon/event.py
|
||||||
homeassistant/components/roon/media_browser.py
|
homeassistant/components/roon/media_browser.py
|
||||||
homeassistant/components/roon/media_player.py
|
homeassistant/components/roon/media_player.py
|
||||||
homeassistant/components/roon/server.py
|
homeassistant/components/roon/server.py
|
||||||
@@ -1122,7 +1107,6 @@ omit =
|
|||||||
homeassistant/components/sesame/lock.py
|
homeassistant/components/sesame/lock.py
|
||||||
homeassistant/components/seven_segments/image_processing.py
|
homeassistant/components/seven_segments/image_processing.py
|
||||||
homeassistant/components/seventeentrack/sensor.py
|
homeassistant/components/seventeentrack/sensor.py
|
||||||
homeassistant/components/shiftr/*
|
|
||||||
homeassistant/components/shodan/sensor.py
|
homeassistant/components/shodan/sensor.py
|
||||||
homeassistant/components/sia/__init__.py
|
homeassistant/components/sia/__init__.py
|
||||||
homeassistant/components/sia/alarm_control_panel.py
|
homeassistant/components/sia/alarm_control_panel.py
|
||||||
@@ -1143,10 +1127,7 @@ omit =
|
|||||||
homeassistant/components/sky_hub/*
|
homeassistant/components/sky_hub/*
|
||||||
homeassistant/components/skybeacon/sensor.py
|
homeassistant/components/skybeacon/sensor.py
|
||||||
homeassistant/components/skybell/__init__.py
|
homeassistant/components/skybell/__init__.py
|
||||||
homeassistant/components/skybell/binary_sensor.py
|
|
||||||
homeassistant/components/skybell/camera.py
|
homeassistant/components/skybell/camera.py
|
||||||
homeassistant/components/skybell/coordinator.py
|
|
||||||
homeassistant/components/skybell/entity.py
|
|
||||||
homeassistant/components/skybell/light.py
|
homeassistant/components/skybell/light.py
|
||||||
homeassistant/components/skybell/sensor.py
|
homeassistant/components/skybell/sensor.py
|
||||||
homeassistant/components/skybell/switch.py
|
homeassistant/components/skybell/switch.py
|
||||||
@@ -1276,6 +1257,7 @@ omit =
|
|||||||
homeassistant/components/switchbot/sensor.py
|
homeassistant/components/switchbot/sensor.py
|
||||||
homeassistant/components/switchbot/switch.py
|
homeassistant/components/switchbot/switch.py
|
||||||
homeassistant/components/switchbot/lock.py
|
homeassistant/components/switchbot/lock.py
|
||||||
|
homeassistant/components/switchbot_cloud/climate.py
|
||||||
homeassistant/components/switchbot_cloud/coordinator.py
|
homeassistant/components/switchbot_cloud/coordinator.py
|
||||||
homeassistant/components/switchbot_cloud/entity.py
|
homeassistant/components/switchbot_cloud/entity.py
|
||||||
homeassistant/components/switchbot_cloud/switch.py
|
homeassistant/components/switchbot_cloud/switch.py
|
||||||
@@ -1301,8 +1283,11 @@ omit =
|
|||||||
homeassistant/components/system_bridge/__init__.py
|
homeassistant/components/system_bridge/__init__.py
|
||||||
homeassistant/components/system_bridge/binary_sensor.py
|
homeassistant/components/system_bridge/binary_sensor.py
|
||||||
homeassistant/components/system_bridge/coordinator.py
|
homeassistant/components/system_bridge/coordinator.py
|
||||||
|
homeassistant/components/system_bridge/entity.py
|
||||||
|
homeassistant/components/system_bridge/media_player.py
|
||||||
homeassistant/components/system_bridge/notify.py
|
homeassistant/components/system_bridge/notify.py
|
||||||
homeassistant/components/system_bridge/sensor.py
|
homeassistant/components/system_bridge/sensor.py
|
||||||
|
homeassistant/components/system_bridge/update.py
|
||||||
homeassistant/components/systemmonitor/sensor.py
|
homeassistant/components/systemmonitor/sensor.py
|
||||||
homeassistant/components/tado/__init__.py
|
homeassistant/components/tado/__init__.py
|
||||||
homeassistant/components/tado/binary_sensor.py
|
homeassistant/components/tado/binary_sensor.py
|
||||||
@@ -1400,6 +1385,7 @@ omit =
|
|||||||
homeassistant/components/trafikverket_weatherstation/coordinator.py
|
homeassistant/components/trafikverket_weatherstation/coordinator.py
|
||||||
homeassistant/components/trafikverket_weatherstation/sensor.py
|
homeassistant/components/trafikverket_weatherstation/sensor.py
|
||||||
homeassistant/components/transmission/__init__.py
|
homeassistant/components/transmission/__init__.py
|
||||||
|
homeassistant/components/transmission/coordinator.py
|
||||||
homeassistant/components/transmission/sensor.py
|
homeassistant/components/transmission/sensor.py
|
||||||
homeassistant/components/transmission/switch.py
|
homeassistant/components/transmission/switch.py
|
||||||
homeassistant/components/travisci/sensor.py
|
homeassistant/components/travisci/sensor.py
|
||||||
@@ -1439,6 +1425,13 @@ omit =
|
|||||||
homeassistant/components/upnp/device.py
|
homeassistant/components/upnp/device.py
|
||||||
homeassistant/components/upnp/sensor.py
|
homeassistant/components/upnp/sensor.py
|
||||||
homeassistant/components/vasttrafik/sensor.py
|
homeassistant/components/vasttrafik/sensor.py
|
||||||
|
homeassistant/components/v2c/__init__.py
|
||||||
|
homeassistant/components/v2c/binary_sensor.py
|
||||||
|
homeassistant/components/v2c/coordinator.py
|
||||||
|
homeassistant/components/v2c/entity.py
|
||||||
|
homeassistant/components/v2c/number.py
|
||||||
|
homeassistant/components/v2c/sensor.py
|
||||||
|
homeassistant/components/v2c/switch.py
|
||||||
homeassistant/components/velbus/__init__.py
|
homeassistant/components/velbus/__init__.py
|
||||||
homeassistant/components/velbus/binary_sensor.py
|
homeassistant/components/velbus/binary_sensor.py
|
||||||
homeassistant/components/velbus/button.py
|
homeassistant/components/velbus/button.py
|
||||||
@@ -1474,7 +1467,10 @@ omit =
|
|||||||
homeassistant/components/vicare/binary_sensor.py
|
homeassistant/components/vicare/binary_sensor.py
|
||||||
homeassistant/components/vicare/button.py
|
homeassistant/components/vicare/button.py
|
||||||
homeassistant/components/vicare/climate.py
|
homeassistant/components/vicare/climate.py
|
||||||
|
homeassistant/components/vicare/entity.py
|
||||||
|
homeassistant/components/vicare/number.py
|
||||||
homeassistant/components/vicare/sensor.py
|
homeassistant/components/vicare/sensor.py
|
||||||
|
homeassistant/components/vicare/utils.py
|
||||||
homeassistant/components/vicare/water_heater.py
|
homeassistant/components/vicare/water_heater.py
|
||||||
homeassistant/components/vilfo/__init__.py
|
homeassistant/components/vilfo/__init__.py
|
||||||
homeassistant/components/vilfo/sensor.py
|
homeassistant/components/vilfo/sensor.py
|
||||||
@@ -1516,7 +1512,6 @@ omit =
|
|||||||
homeassistant/components/wiffi/sensor.py
|
homeassistant/components/wiffi/sensor.py
|
||||||
homeassistant/components/wiffi/wiffi_strings.py
|
homeassistant/components/wiffi/wiffi_strings.py
|
||||||
homeassistant/components/wirelesstag/*
|
homeassistant/components/wirelesstag/*
|
||||||
homeassistant/components/withings/api.py
|
|
||||||
homeassistant/components/wolflink/__init__.py
|
homeassistant/components/wolflink/__init__.py
|
||||||
homeassistant/components/wolflink/sensor.py
|
homeassistant/components/wolflink/sensor.py
|
||||||
homeassistant/components/worldtidesinfo/sensor.py
|
homeassistant/components/worldtidesinfo/sensor.py
|
||||||
|
@@ -10,6 +10,8 @@
|
|||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": [
|
"extensions": [
|
||||||
|
"charliermarsh.ruff",
|
||||||
|
"ms-python.pylint",
|
||||||
"ms-python.vscode-pylance",
|
"ms-python.vscode-pylance",
|
||||||
"visualstudioexptteam.vscodeintellicode",
|
"visualstudioexptteam.vscodeintellicode",
|
||||||
"redhat.vscode-yaml",
|
"redhat.vscode-yaml",
|
||||||
@@ -19,14 +21,6 @@
|
|||||||
// Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json
|
// Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json
|
||||||
"settings": {
|
"settings": {
|
||||||
"python.pythonPath": "/usr/local/bin/python",
|
"python.pythonPath": "/usr/local/bin/python",
|
||||||
"python.linting.enabled": true,
|
|
||||||
"python.linting.pylintEnabled": true,
|
|
||||||
"python.formatting.blackPath": "/usr/local/bin/black",
|
|
||||||
"python.linting.pycodestylePath": "/usr/local/bin/pycodestyle",
|
|
||||||
"python.linting.pydocstylePath": "/usr/local/bin/pydocstyle",
|
|
||||||
"python.linting.mypyPath": "/usr/local/bin/mypy",
|
|
||||||
"python.linting.pylintPath": "/usr/local/bin/pylint",
|
|
||||||
"python.formatting.provider": "black",
|
|
||||||
"python.testing.pytestArgs": ["--no-cov"],
|
"python.testing.pytestArgs": ["--no-cov"],
|
||||||
"editor.formatOnPaste": false,
|
"editor.formatOnPaste": false,
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
@@ -45,7 +39,10 @@
|
|||||||
"!include_dir_list scalar",
|
"!include_dir_list scalar",
|
||||||
"!include_dir_merge_list scalar",
|
"!include_dir_merge_list scalar",
|
||||||
"!include_dir_merge_named scalar"
|
"!include_dir_merge_named scalar"
|
||||||
]
|
],
|
||||||
|
"[python]": {
|
||||||
|
"editor.defaultFormatter": "charliermarsh.ruff"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -60,7 +60,7 @@
|
|||||||
- [ ] There is no commented out code in this PR.
|
- [ ] There is no commented out code in this PR.
|
||||||
- [ ] I have followed the [development checklist][dev-checklist]
|
- [ ] I have followed the [development checklist][dev-checklist]
|
||||||
- [ ] I have followed the [perfect PR recommendations][perfect-pr]
|
- [ ] I have followed the [perfect PR recommendations][perfect-pr]
|
||||||
- [ ] The code has been formatted using Black (`black --fast homeassistant tests`)
|
- [ ] The code has been formatted using Ruff (`ruff format homeassistant tests`)
|
||||||
- [ ] Tests have been added to verify that the new code works.
|
- [ ] Tests have been added to verify that the new code works.
|
||||||
|
|
||||||
If user exposed functionality or configuration variables are added/changed:
|
If user exposed functionality or configuration variables are added/changed:
|
||||||
|
20
.github/workflows/builder.yml
vendored
20
.github/workflows/builder.yml
vendored
@@ -24,12 +24,12 @@ jobs:
|
|||||||
publish: ${{ steps.version.outputs.publish }}
|
publish: ${{ steps.version.outputs.publish }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
|
|
||||||
@@ -56,10 +56,10 @@ jobs:
|
|||||||
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
|
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ jobs:
|
|||||||
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Download nightly wheels of frontend
|
- name: Download nightly wheels of frontend
|
||||||
if: needs.init.outputs.channel == 'dev'
|
if: needs.init.outputs.channel == 'dev'
|
||||||
@@ -124,7 +124,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
if: needs.init.outputs.channel == 'dev'
|
if: needs.init.outputs.channel == 'dev'
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ jobs:
|
|||||||
- green
|
- green
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Set build additional args
|
- name: Set build additional args
|
||||||
run: |
|
run: |
|
||||||
@@ -289,7 +289,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Initialize git
|
- name: Initialize git
|
||||||
uses: home-assistant/actions/helpers/git-init@master
|
uses: home-assistant/actions/helpers/git-init@master
|
||||||
@@ -327,10 +327,10 @@ jobs:
|
|||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Install Cosign
|
- name: Install Cosign
|
||||||
uses: sigstore/cosign-installer@v3.1.2
|
uses: sigstore/cosign-installer@v3.2.0
|
||||||
with:
|
with:
|
||||||
cosign-release: "v2.0.2"
|
cosign-release: "v2.0.2"
|
||||||
|
|
||||||
|
126
.github/workflows/ci.yaml
vendored
126
.github/workflows/ci.yaml
vendored
@@ -35,20 +35,21 @@ on:
|
|||||||
env:
|
env:
|
||||||
CACHE_VERSION: 5
|
CACHE_VERSION: 5
|
||||||
PIP_CACHE_VERSION: 4
|
PIP_CACHE_VERSION: 4
|
||||||
MYPY_CACHE_VERSION: 5
|
MYPY_CACHE_VERSION: 6
|
||||||
BLACK_CACHE_VERSION: 1
|
HA_SHORT_VERSION: "2023.12"
|
||||||
HA_SHORT_VERSION: "2023.10"
|
|
||||||
DEFAULT_PYTHON: "3.11"
|
DEFAULT_PYTHON: "3.11"
|
||||||
ALL_PYTHON_VERSIONS: "['3.11']"
|
ALL_PYTHON_VERSIONS: "['3.11', '3.12']"
|
||||||
# 10.3 is the oldest supported version
|
# 10.3 is the oldest supported version
|
||||||
# - 10.3.32 is the version currently shipped with Synology (as of 17 Feb 2022)
|
# - 10.3.32 is the version currently shipped with Synology (as of 17 Feb 2022)
|
||||||
# 10.6 is the current long-term-support
|
# 10.6 is the current long-term-support
|
||||||
# - 10.6.10 is the version currently shipped with the Add-on (as of 31 Jan 2023)
|
# - 10.6.10 is the version currently shipped with the Add-on (as of 31 Jan 2023)
|
||||||
# 10.10 is the latest short-term-support
|
# 10.10 is the latest short-term-support
|
||||||
# - 10.10.3 is the latest (as of 6 Feb 2023)
|
# - 10.10.3 is the latest (as of 6 Feb 2023)
|
||||||
|
# 10.11 is the latest long-term-support
|
||||||
|
# - 10.11.2 is the version currently shipped with Synology (as of 11 Oct 2023)
|
||||||
# mysql 8.0.32 does not always behave the same as MariaDB
|
# mysql 8.0.32 does not always behave the same as MariaDB
|
||||||
# and some queries that work on MariaDB do not work on MySQL
|
# and some queries that work on MariaDB do not work on MySQL
|
||||||
MARIADB_VERSIONS: "['mariadb:10.3.32','mariadb:10.6.10','mariadb:10.10.3','mysql:8.0.32']"
|
MARIADB_VERSIONS: "['mariadb:10.3.32','mariadb:10.6.10','mariadb:10.10.3','mariadb:10.11.2','mysql:8.0.32']"
|
||||||
# 12 is the oldest supported version
|
# 12 is the oldest supported version
|
||||||
# - 12.14 is the latest (as of 9 Feb 2023)
|
# - 12.14 is the latest (as of 9 Feb 2023)
|
||||||
# 15 is the latest version
|
# 15 is the latest version
|
||||||
@@ -56,7 +57,6 @@ env:
|
|||||||
POSTGRESQL_VERSIONS: "['postgres:12.14','postgres:15.2']"
|
POSTGRESQL_VERSIONS: "['postgres:12.14','postgres:15.2']"
|
||||||
PRE_COMMIT_CACHE: ~/.cache/pre-commit
|
PRE_COMMIT_CACHE: ~/.cache/pre-commit
|
||||||
PIP_CACHE: /tmp/pip-cache
|
PIP_CACHE: /tmp/pip-cache
|
||||||
BLACK_CACHE: /tmp/black-cache
|
|
||||||
SQLALCHEMY_WARN_20: 1
|
SQLALCHEMY_WARN_20: 1
|
||||||
PYTHONASYNCIODEBUG: 1
|
PYTHONASYNCIODEBUG: 1
|
||||||
HASS_CI: 1
|
HASS_CI: 1
|
||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Generate partial Python venv restore key
|
- name: Generate partial Python venv restore key
|
||||||
id: generate_python_cache_key
|
id: generate_python_cache_key
|
||||||
run: >-
|
run: >-
|
||||||
@@ -222,10 +222,10 @@ jobs:
|
|||||||
- info
|
- info
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -259,28 +259,21 @@ jobs:
|
|||||||
. venv/bin/activate
|
. venv/bin/activate
|
||||||
pre-commit install-hooks
|
pre-commit install-hooks
|
||||||
|
|
||||||
lint-black:
|
lint-ruff-format:
|
||||||
name: Check black
|
name: Check ruff-format
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
needs:
|
needs:
|
||||||
- info
|
- info
|
||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
id: python
|
id: python
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Generate partial black restore key
|
|
||||||
id: generate-black-key
|
|
||||||
run: |
|
|
||||||
black_version=$(cat requirements_test_pre_commit.txt | grep black | cut -d '=' -f 3)
|
|
||||||
echo "version=$black_version" >> $GITHUB_OUTPUT
|
|
||||||
echo "key=black-${{ env.BLACK_CACHE_VERSION }}-$black_version-${{
|
|
||||||
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
|
|
||||||
- name: Restore base Python virtual environment
|
- name: Restore base Python virtual environment
|
||||||
id: cache-venv
|
id: cache-venv
|
||||||
uses: actions/cache/restore@v3.3.2
|
uses: actions/cache/restore@v3.3.2
|
||||||
@@ -299,33 +292,12 @@ jobs:
|
|||||||
key: >-
|
key: >-
|
||||||
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
|
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
|
||||||
needs.info.outputs.pre-commit_cache_key }}
|
needs.info.outputs.pre-commit_cache_key }}
|
||||||
- name: Restore black cache
|
- name: Run ruff-format
|
||||||
uses: actions/cache@v3.3.2
|
|
||||||
with:
|
|
||||||
path: ${{ env.BLACK_CACHE }}
|
|
||||||
key: >-
|
|
||||||
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
|
|
||||||
steps.generate-black-key.outputs.key }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-${{ steps.python.outputs.python-version }}-black-${{
|
|
||||||
env.BLACK_CACHE_VERSION }}-${{ steps.generate-black-key.outputs.version }}-${{
|
|
||||||
env.HA_SHORT_VERSION }}-
|
|
||||||
- name: Run black (fully)
|
|
||||||
if: needs.info.outputs.test_full_suite == 'true'
|
|
||||||
env:
|
|
||||||
BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
|
|
||||||
run: |
|
run: |
|
||||||
. venv/bin/activate
|
. venv/bin/activate
|
||||||
pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
|
pre-commit run --hook-stage manual ruff-format --all-files --show-diff-on-failure
|
||||||
- name: Run black (partially)
|
|
||||||
if: needs.info.outputs.test_full_suite == 'false'
|
|
||||||
shell: bash
|
|
||||||
env:
|
env:
|
||||||
BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
|
RUFF_OUTPUT_FORMAT: github
|
||||||
run: |
|
|
||||||
. venv/bin/activate
|
|
||||||
shopt -s globstar
|
|
||||||
pre-commit run --hook-stage manual black --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} --show-diff-on-failure
|
|
||||||
|
|
||||||
lint-ruff:
|
lint-ruff:
|
||||||
name: Check ruff
|
name: Check ruff
|
||||||
@@ -335,9 +307,9 @@ jobs:
|
|||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
id: python
|
id: python
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
@@ -360,22 +332,12 @@ jobs:
|
|||||||
key: >-
|
key: >-
|
||||||
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
|
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
|
||||||
needs.info.outputs.pre-commit_cache_key }}
|
needs.info.outputs.pre-commit_cache_key }}
|
||||||
- name: Register ruff problem matcher
|
- name: Run ruff
|
||||||
run: |
|
|
||||||
echo "::add-matcher::.github/workflows/matchers/ruff.json"
|
|
||||||
- name: Run ruff (fully)
|
|
||||||
if: needs.info.outputs.test_full_suite == 'true'
|
|
||||||
run: |
|
run: |
|
||||||
. venv/bin/activate
|
. venv/bin/activate
|
||||||
pre-commit run --hook-stage manual ruff --all-files --show-diff-on-failure
|
pre-commit run --hook-stage manual ruff --all-files --show-diff-on-failure
|
||||||
- name: Run ruff (partially)
|
env:
|
||||||
if: needs.info.outputs.test_full_suite == 'false'
|
RUFF_OUTPUT_FORMAT: github
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
. venv/bin/activate
|
|
||||||
shopt -s globstar
|
|
||||||
pre-commit run --hook-stage manual ruff --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} --show-diff-on-failure
|
|
||||||
|
|
||||||
lint-other:
|
lint-other:
|
||||||
name: Check other linters
|
name: Check other linters
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
@@ -384,9 +346,9 @@ jobs:
|
|||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
id: python
|
id: python
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
@@ -478,10 +440,10 @@ jobs:
|
|||||||
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
|
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -546,10 +508,10 @@ jobs:
|
|||||||
- base
|
- base
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -578,10 +540,10 @@ jobs:
|
|||||||
- base
|
- base
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -611,10 +573,10 @@ jobs:
|
|||||||
- base
|
- base
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -655,10 +617,10 @@ jobs:
|
|||||||
- base
|
- base
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -737,10 +699,10 @@ jobs:
|
|||||||
bluez \
|
bluez \
|
||||||
ffmpeg
|
ffmpeg
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -785,7 +747,7 @@ jobs:
|
|||||||
cov_params+=(--cov-report=xml)
|
cov_params+=(--cov-report=xml)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 -X dev -m pytest \
|
python3 -b -X dev -m pytest \
|
||||||
-qq \
|
-qq \
|
||||||
--timeout=9 \
|
--timeout=9 \
|
||||||
--durations=10 \
|
--durations=10 \
|
||||||
@@ -822,7 +784,7 @@ jobs:
|
|||||||
cov_params+=(--cov-report=term-missing)
|
cov_params+=(--cov-report=term-missing)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 -X dev -m pytest \
|
python3 -b -X dev -m pytest \
|
||||||
-qq \
|
-qq \
|
||||||
--timeout=9 \
|
--timeout=9 \
|
||||||
-n auto \
|
-n auto \
|
||||||
@@ -889,10 +851,10 @@ jobs:
|
|||||||
ffmpeg \
|
ffmpeg \
|
||||||
libmariadb-dev-compat
|
libmariadb-dev-compat
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -943,7 +905,7 @@ jobs:
|
|||||||
cov_params+=(--cov-report=term-missing)
|
cov_params+=(--cov-report=term-missing)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 -X dev -m pytest \
|
python3 -b -X dev -m pytest \
|
||||||
-qq \
|
-qq \
|
||||||
--timeout=20 \
|
--timeout=20 \
|
||||||
-n 1 \
|
-n 1 \
|
||||||
@@ -1013,10 +975,10 @@ jobs:
|
|||||||
ffmpeg \
|
ffmpeg \
|
||||||
postgresql-server-dev-14
|
postgresql-server-dev-14
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
id: python
|
id: python
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
@@ -1067,7 +1029,7 @@ jobs:
|
|||||||
cov_params+=(--cov-report=term-missing)
|
cov_params+=(--cov-report=term-missing)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 -X dev -m pytest \
|
python3 -b -X dev -m pytest \
|
||||||
-qq \
|
-qq \
|
||||||
--timeout=9 \
|
--timeout=9 \
|
||||||
-n 1 \
|
-n 1 \
|
||||||
@@ -1108,7 +1070,7 @@ jobs:
|
|||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code from GitHub
|
- name: Check out code from GitHub
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Download all coverage artifacts
|
- name: Download all coverage artifacts
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
- name: Upload coverage to Codecov (full coverage)
|
- name: Upload coverage to Codecov (full coverage)
|
||||||
|
39
.github/workflows/codeql.yml
vendored
Normal file
39
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- rc
|
||||||
|
- master
|
||||||
|
schedule:
|
||||||
|
- cron: "30 18 * * 4"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 360
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out code from GitHub
|
||||||
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2.22.8
|
||||||
|
with:
|
||||||
|
languages: python
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2.22.8
|
||||||
|
with:
|
||||||
|
category: "/language:python"
|
2
.github/workflows/lock.yml
vendored
2
.github/workflows/lock.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
if: github.repository_owner == 'home-assistant'
|
if: github.repository_owner == 'home-assistant'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v4.0.1
|
- uses: dessant/lock-threads@v5.0.1
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
issue-inactive-days: "30"
|
issue-inactive-days: "30"
|
||||||
|
30
.github/workflows/matchers/ruff.json
vendored
30
.github/workflows/matchers/ruff.json
vendored
@@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"problemMatcher": [
|
|
||||||
{
|
|
||||||
"owner": "ruff-error",
|
|
||||||
"severity": "error",
|
|
||||||
"pattern": [
|
|
||||||
{
|
|
||||||
"regexp": "^(.*):(\\d+):(\\d+):\\s([EF]\\d{3}\\s.*)$",
|
|
||||||
"file": 1,
|
|
||||||
"line": 2,
|
|
||||||
"column": 3,
|
|
||||||
"message": 4
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"owner": "ruff-warning",
|
|
||||||
"severity": "warning",
|
|
||||||
"pattern": [
|
|
||||||
{
|
|
||||||
"regexp": "^(.*):(\\d+):(\\d+):\\s([CDNW]\\d{3}\\s.*)$",
|
|
||||||
"file": 1,
|
|
||||||
"line": 2,
|
|
||||||
"column": 3,
|
|
||||||
"message": 4
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
4
.github/workflows/translations.yml
vendored
4
.github/workflows/translations.yml
vendored
@@ -19,10 +19,10 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||||
uses: actions/setup-python@v4.7.0
|
uses: actions/setup-python@v4.7.1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
|
|
||||||
|
51
.github/workflows/wheels.yml
vendored
51
.github/workflows/wheels.yml
vendored
@@ -10,8 +10,10 @@ on:
|
|||||||
- dev
|
- dev
|
||||||
- rc
|
- rc
|
||||||
paths:
|
paths:
|
||||||
- "requirements.txt"
|
- ".github/workflows/wheels.yml"
|
||||||
|
- "homeassistant/package_constraints.txt"
|
||||||
- "requirements_all.txt"
|
- "requirements_all.txt"
|
||||||
|
- "requirements.txt"
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref_name}}
|
group: ${{ github.workflow }}-${{ github.ref_name}}
|
||||||
@@ -26,7 +28,7 @@ jobs:
|
|||||||
architectures: ${{ steps.info.outputs.architectures }}
|
architectures: ${{ steps.info.outputs.architectures }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Get information
|
- name: Get information
|
||||||
id: info
|
id: info
|
||||||
@@ -80,11 +82,11 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
abi: ["cp311"]
|
abi: ["cp311", "cp312"]
|
||||||
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Download env_file
|
- name: Download env_file
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
@@ -97,7 +99,7 @@ jobs:
|
|||||||
name: requirements_diff
|
name: requirements_diff
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: home-assistant/wheels@2023.09.1
|
uses: home-assistant/wheels@2023.10.5
|
||||||
with:
|
with:
|
||||||
abi: ${{ matrix.abi }}
|
abi: ${{ matrix.abi }}
|
||||||
tag: musllinux_1_2
|
tag: musllinux_1_2
|
||||||
@@ -110,7 +112,7 @@ jobs:
|
|||||||
requirements-diff: "requirements_diff.txt"
|
requirements-diff: "requirements_diff.txt"
|
||||||
requirements: "requirements.txt"
|
requirements: "requirements.txt"
|
||||||
|
|
||||||
integrations_cp311:
|
integrations:
|
||||||
name: Build wheels ${{ matrix.abi }} for ${{ matrix.arch }}
|
name: Build wheels ${{ matrix.abi }} for ${{ matrix.arch }}
|
||||||
if: github.repository_owner == 'home-assistant'
|
if: github.repository_owner == 'home-assistant'
|
||||||
needs: init
|
needs: init
|
||||||
@@ -118,11 +120,11 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
abi: ["cp311"]
|
abi: ["cp311", "cp312"]
|
||||||
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Download env_file
|
- name: Download env_file
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
@@ -168,6 +170,18 @@ jobs:
|
|||||||
|
|
||||||
split -l $(expr $(expr $(cat requirements_all.txt | wc -l) + 1) / 3) requirements_all.txt requirements_all.txt
|
split -l $(expr $(expr $(cat requirements_all.txt | wc -l) + 1) / 3) requirements_all.txt requirements_all.txt
|
||||||
|
|
||||||
|
- name: Create requirements for cython<3
|
||||||
|
run: |
|
||||||
|
# Some dependencies still require 'cython<3'
|
||||||
|
# and don't yet use isolated build environments.
|
||||||
|
# Build these first.
|
||||||
|
# grpcio: https://github.com/grpc/grpc/issues/33918
|
||||||
|
# pydantic: https://github.com/pydantic/pydantic/issues/7689
|
||||||
|
|
||||||
|
touch requirements_old-cython.txt
|
||||||
|
cat homeassistant/package_constraints.txt | grep 'grpcio==' >> requirements_old-cython.txt
|
||||||
|
cat homeassistant/package_constraints.txt | grep 'pydantic==' >> requirements_old-cython.txt
|
||||||
|
|
||||||
- name: Adjust build env
|
- name: Adjust build env
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ matrix.arch }}" = "i386" ]; then
|
if [ "${{ matrix.arch }}" = "i386" ]; then
|
||||||
@@ -177,8 +191,23 @@ jobs:
|
|||||||
# Do not pin numpy in wheels building
|
# Do not pin numpy in wheels building
|
||||||
sed -i "/numpy/d" homeassistant/package_constraints.txt
|
sed -i "/numpy/d" homeassistant/package_constraints.txt
|
||||||
|
|
||||||
|
- name: Build wheels (old cython)
|
||||||
|
uses: home-assistant/wheels@2023.10.5
|
||||||
|
with:
|
||||||
|
abi: ${{ matrix.abi }}
|
||||||
|
tag: musllinux_1_2
|
||||||
|
arch: ${{ matrix.arch }}
|
||||||
|
wheels-key: ${{ secrets.WHEELS_KEY }}
|
||||||
|
env-file: true
|
||||||
|
apk: "bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev;yaml-dev;openblas-dev;fftw-dev;lapack-dev;gfortran;blas-dev;eigen-dev;freetype-dev;glew-dev;harfbuzz-dev;hdf5-dev;libdc1394-dev;libtbb-dev;mesa-dev;openexr-dev;openjpeg-dev;uchardet-dev"
|
||||||
|
skip-binary: aiohttp;charset-normalizer;grpcio;SQLAlchemy;protobuf
|
||||||
|
constraints: "homeassistant/package_constraints.txt"
|
||||||
|
requirements-diff: "requirements_diff.txt"
|
||||||
|
requirements: "requirements_old-cython.txt"
|
||||||
|
pip: "'cython<3'"
|
||||||
|
|
||||||
- name: Build wheels (part 1)
|
- name: Build wheels (part 1)
|
||||||
uses: home-assistant/wheels@2023.09.1
|
uses: home-assistant/wheels@2023.10.5
|
||||||
with:
|
with:
|
||||||
abi: ${{ matrix.abi }}
|
abi: ${{ matrix.abi }}
|
||||||
tag: musllinux_1_2
|
tag: musllinux_1_2
|
||||||
@@ -192,7 +221,7 @@ jobs:
|
|||||||
requirements: "requirements_all.txtaa"
|
requirements: "requirements_all.txtaa"
|
||||||
|
|
||||||
- name: Build wheels (part 2)
|
- name: Build wheels (part 2)
|
||||||
uses: home-assistant/wheels@2023.09.1
|
uses: home-assistant/wheels@2023.10.5
|
||||||
with:
|
with:
|
||||||
abi: ${{ matrix.abi }}
|
abi: ${{ matrix.abi }}
|
||||||
tag: musllinux_1_2
|
tag: musllinux_1_2
|
||||||
@@ -206,7 +235,7 @@ jobs:
|
|||||||
requirements: "requirements_all.txtab"
|
requirements: "requirements_all.txtab"
|
||||||
|
|
||||||
- name: Build wheels (part 3)
|
- name: Build wheels (part 3)
|
||||||
uses: home-assistant/wheels@2023.09.1
|
uses: home-assistant/wheels@2023.10.5
|
||||||
with:
|
with:
|
||||||
abi: ${{ matrix.abi }}
|
abi: ${{ matrix.abi }}
|
||||||
tag: musllinux_1_2
|
tag: musllinux_1_2
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -111,9 +111,6 @@ virtualization/vagrant/config
|
|||||||
!.vscode/tasks.json
|
!.vscode/tasks.json
|
||||||
.env
|
.env
|
||||||
|
|
||||||
# Built docs
|
|
||||||
docs/build
|
|
||||||
|
|
||||||
# Windows Explorer
|
# Windows Explorer
|
||||||
desktop.ini
|
desktop.ini
|
||||||
/home-assistant.pyproj
|
/home-assistant.pyproj
|
||||||
|
@@ -3,3 +3,4 @@ ignored:
|
|||||||
- DL3008
|
- DL3008
|
||||||
- DL3013
|
- DL3013
|
||||||
- DL3018
|
- DL3018
|
||||||
|
- DL3042
|
||||||
|
@@ -1,16 +1,11 @@
|
|||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.0.289
|
rev: v0.1.6
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
args:
|
args:
|
||||||
- --fix
|
- --fix
|
||||||
- repo: https://github.com/psf/black-pre-commit-mirror
|
- id: ruff-format
|
||||||
rev: 23.9.1
|
|
||||||
hooks:
|
|
||||||
- id: black
|
|
||||||
args:
|
|
||||||
- --quiet
|
|
||||||
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$
|
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$
|
||||||
- repo: https://github.com/codespell-project/codespell
|
- repo: https://github.com/codespell-project/codespell
|
||||||
rev: v2.2.2
|
rev: v2.2.2
|
||||||
@@ -39,7 +34,7 @@ repos:
|
|||||||
hooks:
|
hooks:
|
||||||
- id: yamllint
|
- id: yamllint
|
||||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||||
rev: v2.7.1
|
rev: v3.0.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: prettier
|
- id: prettier
|
||||||
- repo: https://github.com/cdce8p/python-typing-update
|
- repo: https://github.com/cdce8p/python-typing-update
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
*.md
|
*.md
|
||||||
.strict-typing
|
.strict-typing
|
||||||
azure-*.yml
|
azure-*.yml
|
||||||
docs/source/_templates/*
|
|
||||||
homeassistant/components/*/translations/*.json
|
homeassistant/components/*/translations/*.json
|
||||||
homeassistant/generated/*
|
homeassistant/generated/*
|
||||||
tests/components/lidarr/fixtures/initialize.js
|
tests/components/lidarr/fixtures/initialize.js
|
||||||
tests/components/lidarr/fixtures/initialize-wrong.js
|
tests/components/lidarr/fixtures/initialize-wrong.js
|
||||||
|
tests/fixtures/core/config/yaml_errors/
|
||||||
|
@@ -1,14 +0,0 @@
|
|||||||
# .readthedocs.yml
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
build:
|
|
||||||
os: ubuntu-20.04
|
|
||||||
tools:
|
|
||||||
python: "3.9"
|
|
||||||
|
|
||||||
python:
|
|
||||||
install:
|
|
||||||
- method: setuptools
|
|
||||||
path: .
|
|
||||||
- requirements: requirements_docs.txt
|
|
@@ -103,6 +103,7 @@ homeassistant.components.devolo_home_control.*
|
|||||||
homeassistant.components.devolo_home_network.*
|
homeassistant.components.devolo_home_network.*
|
||||||
homeassistant.components.dhcp.*
|
homeassistant.components.dhcp.*
|
||||||
homeassistant.components.diagnostics.*
|
homeassistant.components.diagnostics.*
|
||||||
|
homeassistant.components.discovergy.*
|
||||||
homeassistant.components.dlna_dmr.*
|
homeassistant.components.dlna_dmr.*
|
||||||
homeassistant.components.dnsip.*
|
homeassistant.components.dnsip.*
|
||||||
homeassistant.components.doorbird.*
|
homeassistant.components.doorbird.*
|
||||||
@@ -156,15 +157,7 @@ homeassistant.components.homeassistant_green.*
|
|||||||
homeassistant.components.homeassistant_hardware.*
|
homeassistant.components.homeassistant_hardware.*
|
||||||
homeassistant.components.homeassistant_sky_connect.*
|
homeassistant.components.homeassistant_sky_connect.*
|
||||||
homeassistant.components.homeassistant_yellow.*
|
homeassistant.components.homeassistant_yellow.*
|
||||||
homeassistant.components.homekit
|
homeassistant.components.homekit.*
|
||||||
homeassistant.components.homekit.accessories
|
|
||||||
homeassistant.components.homekit.aidmanager
|
|
||||||
homeassistant.components.homekit.config_flow
|
|
||||||
homeassistant.components.homekit.diagnostics
|
|
||||||
homeassistant.components.homekit.logbook
|
|
||||||
homeassistant.components.homekit.type_locks
|
|
||||||
homeassistant.components.homekit.type_triggers
|
|
||||||
homeassistant.components.homekit.util
|
|
||||||
homeassistant.components.homekit_controller
|
homeassistant.components.homekit_controller
|
||||||
homeassistant.components.homekit_controller.alarm_control_panel
|
homeassistant.components.homekit_controller.alarm_control_panel
|
||||||
homeassistant.components.homekit_controller.button
|
homeassistant.components.homekit_controller.button
|
||||||
@@ -187,6 +180,7 @@ homeassistant.components.image_upload.*
|
|||||||
homeassistant.components.imap.*
|
homeassistant.components.imap.*
|
||||||
homeassistant.components.input_button.*
|
homeassistant.components.input_button.*
|
||||||
homeassistant.components.input_select.*
|
homeassistant.components.input_select.*
|
||||||
|
homeassistant.components.input_text.*
|
||||||
homeassistant.components.integration.*
|
homeassistant.components.integration.*
|
||||||
homeassistant.components.ipp.*
|
homeassistant.components.ipp.*
|
||||||
homeassistant.components.iqvia.*
|
homeassistant.components.iqvia.*
|
||||||
@@ -208,9 +202,11 @@ homeassistant.components.ld2410_ble.*
|
|||||||
homeassistant.components.lidarr.*
|
homeassistant.components.lidarr.*
|
||||||
homeassistant.components.lifx.*
|
homeassistant.components.lifx.*
|
||||||
homeassistant.components.light.*
|
homeassistant.components.light.*
|
||||||
|
homeassistant.components.linear_garage_door.*
|
||||||
homeassistant.components.litejet.*
|
homeassistant.components.litejet.*
|
||||||
homeassistant.components.litterrobot.*
|
homeassistant.components.litterrobot.*
|
||||||
homeassistant.components.local_ip.*
|
homeassistant.components.local_ip.*
|
||||||
|
homeassistant.components.local_todo.*
|
||||||
homeassistant.components.lock.*
|
homeassistant.components.lock.*
|
||||||
homeassistant.components.logbook.*
|
homeassistant.components.logbook.*
|
||||||
homeassistant.components.logger.*
|
homeassistant.components.logger.*
|
||||||
@@ -327,6 +323,7 @@ homeassistant.components.synology_dsm.*
|
|||||||
homeassistant.components.systemmonitor.*
|
homeassistant.components.systemmonitor.*
|
||||||
homeassistant.components.tag.*
|
homeassistant.components.tag.*
|
||||||
homeassistant.components.tailscale.*
|
homeassistant.components.tailscale.*
|
||||||
|
homeassistant.components.tami4.*
|
||||||
homeassistant.components.tautulli.*
|
homeassistant.components.tautulli.*
|
||||||
homeassistant.components.tcp.*
|
homeassistant.components.tcp.*
|
||||||
homeassistant.components.text.*
|
homeassistant.components.text.*
|
||||||
@@ -343,6 +340,7 @@ homeassistant.components.trafikverket_camera.*
|
|||||||
homeassistant.components.trafikverket_ferry.*
|
homeassistant.components.trafikverket_ferry.*
|
||||||
homeassistant.components.trafikverket_train.*
|
homeassistant.components.trafikverket_train.*
|
||||||
homeassistant.components.trafikverket_weatherstation.*
|
homeassistant.components.trafikverket_weatherstation.*
|
||||||
|
homeassistant.components.transmission.*
|
||||||
homeassistant.components.trend.*
|
homeassistant.components.trend.*
|
||||||
homeassistant.components.tts.*
|
homeassistant.components.tts.*
|
||||||
homeassistant.components.twentemilieu.*
|
homeassistant.components.twentemilieu.*
|
||||||
@@ -366,6 +364,7 @@ homeassistant.components.webostv.*
|
|||||||
homeassistant.components.websocket_api.*
|
homeassistant.components.websocket_api.*
|
||||||
homeassistant.components.wemo.*
|
homeassistant.components.wemo.*
|
||||||
homeassistant.components.whois.*
|
homeassistant.components.whois.*
|
||||||
|
homeassistant.components.withings.*
|
||||||
homeassistant.components.wiz.*
|
homeassistant.components.wiz.*
|
||||||
homeassistant.components.wled.*
|
homeassistant.components.wled.*
|
||||||
homeassistant.components.worldclock.*
|
homeassistant.components.worldclock.*
|
||||||
|
6
.vscode/extensions.json
vendored
6
.vscode/extensions.json
vendored
@@ -1,3 +1,7 @@
|
|||||||
{
|
{
|
||||||
"recommendations": ["esbenp.prettier-vscode", "ms-python.python"]
|
"recommendations": [
|
||||||
|
"charliermarsh.ruff",
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"ms-python.python"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
8
.vscode/launch.json
vendored
8
.vscode/launch.json
vendored
@@ -22,6 +22,14 @@
|
|||||||
"args": ["--debug", "-c", "config", "--skip-pip"],
|
"args": ["--debug", "-c", "config", "--skip-pip"],
|
||||||
"preLaunchTask": "Compile English translations"
|
"preLaunchTask": "Compile English translations"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Home Assistant: Changed tests",
|
||||||
|
"type": "python",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "pytest",
|
||||||
|
"justMyCode": false,
|
||||||
|
"args": ["--timeout=10", "--picked"],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Debug by attaching to local Home Assistant server using Remote Python Debugger.
|
// Debug by attaching to local Home Assistant server using Remote Python Debugger.
|
||||||
// See https://www.home-assistant.io/integrations/debugpy/
|
// See https://www.home-assistant.io/integrations/debugpy/
|
||||||
|
1
.vscode/settings.default.json
vendored
1
.vscode/settings.default.json
vendored
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
// Please keep this file in sync with settings in home-assistant/.devcontainer/devcontainer.json
|
// Please keep this file in sync with settings in home-assistant/.devcontainer/devcontainer.json
|
||||||
"python.formatting.provider": "black",
|
|
||||||
// Added --no-cov to work around TypeError: message must be set
|
// Added --no-cov to work around TypeError: message must be set
|
||||||
// https://github.com/microsoft/vscode-python/issues/14067
|
// https://github.com/microsoft/vscode-python/issues/14067
|
||||||
"python.testing.pytestArgs": ["--no-cov"],
|
"python.testing.pytestArgs": ["--no-cov"],
|
||||||
|
6
.vscode/tasks.json
vendored
6
.vscode/tasks.json
vendored
@@ -16,7 +16,7 @@
|
|||||||
{
|
{
|
||||||
"label": "Pytest",
|
"label": "Pytest",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "pytest --timeout=10 tests",
|
"command": "python3 -m pytest --timeout=10 tests",
|
||||||
"dependsOn": ["Install all Test Requirements"],
|
"dependsOn": ["Install all Test Requirements"],
|
||||||
"group": {
|
"group": {
|
||||||
"kind": "test",
|
"kind": "test",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
{
|
{
|
||||||
"label": "Pytest (changed tests only)",
|
"label": "Pytest (changed tests only)",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "pytest --timeout=10 --picked",
|
"command": "python3 -m pytest --timeout=10 --picked",
|
||||||
"group": {
|
"group": {
|
||||||
"kind": "test",
|
"kind": "test",
|
||||||
"isDefault": true
|
"isDefault": true
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
"label": "Code Coverage",
|
"label": "Code Coverage",
|
||||||
"detail": "Generate code coverage report for a given integration.",
|
"detail": "Generate code coverage report for a given integration.",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "pytest ./tests/components/${input:integrationName}/ --cov=homeassistant.components.${input:integrationName} --cov-report term-missing --durations-min=1 --durations=0 --numprocesses=auto",
|
"command": "python3 -m pytest ./tests/components/${input:integrationName}/ --cov=homeassistant.components.${input:integrationName} --cov-report term-missing --durations-min=1 --durations=0 --numprocesses=auto",
|
||||||
"group": {
|
"group": {
|
||||||
"kind": "test",
|
"kind": "test",
|
||||||
"isDefault": true
|
"isDefault": true
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
ignore: |
|
ignore: |
|
||||||
azure-*.yml
|
azure-*.yml
|
||||||
|
tests/fixtures/core/config/yaml_errors/
|
||||||
rules:
|
rules:
|
||||||
braces:
|
braces:
|
||||||
level: error
|
level: error
|
||||||
|
125
CODEOWNERS
125
CODEOWNERS
@@ -100,8 +100,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/apprise/ @caronc
|
/tests/components/apprise/ @caronc
|
||||||
/homeassistant/components/aprs/ @PhilRW
|
/homeassistant/components/aprs/ @PhilRW
|
||||||
/tests/components/aprs/ @PhilRW
|
/tests/components/aprs/ @PhilRW
|
||||||
/homeassistant/components/aranet/ @aschmitz
|
/homeassistant/components/aranet/ @aschmitz @thecode
|
||||||
/tests/components/aranet/ @aschmitz
|
/tests/components/aranet/ @aschmitz @thecode
|
||||||
/homeassistant/components/arcam_fmj/ @elupus
|
/homeassistant/components/arcam_fmj/ @elupus
|
||||||
/tests/components/arcam_fmj/ @elupus
|
/tests/components/arcam_fmj/ @elupus
|
||||||
/homeassistant/components/arris_tg2492lg/ @vanbalken
|
/homeassistant/components/arris_tg2492lg/ @vanbalken
|
||||||
@@ -151,8 +151,8 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/bizkaibus/ @UgaitzEtxebarria
|
/homeassistant/components/bizkaibus/ @UgaitzEtxebarria
|
||||||
/homeassistant/components/blebox/ @bbx-a @riokuu
|
/homeassistant/components/blebox/ @bbx-a @riokuu
|
||||||
/tests/components/blebox/ @bbx-a @riokuu
|
/tests/components/blebox/ @bbx-a @riokuu
|
||||||
/homeassistant/components/blink/ @fronzbot
|
/homeassistant/components/blink/ @fronzbot @mkmer
|
||||||
/tests/components/blink/ @fronzbot
|
/tests/components/blink/ @fronzbot @mkmer
|
||||||
/homeassistant/components/bluemaestro/ @bdraco
|
/homeassistant/components/bluemaestro/ @bdraco
|
||||||
/tests/components/bluemaestro/ @bdraco
|
/tests/components/bluemaestro/ @bdraco
|
||||||
/homeassistant/components/blueprint/ @home-assistant/core
|
/homeassistant/components/blueprint/ @home-assistant/core
|
||||||
@@ -170,8 +170,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/bosch_shc/ @tschamm
|
/tests/components/bosch_shc/ @tschamm
|
||||||
/homeassistant/components/braviatv/ @bieniu @Drafteed
|
/homeassistant/components/braviatv/ @bieniu @Drafteed
|
||||||
/tests/components/braviatv/ @bieniu @Drafteed
|
/tests/components/braviatv/ @bieniu @Drafteed
|
||||||
/homeassistant/components/broadlink/ @danielhiversen @felipediel @L-I-Am
|
/homeassistant/components/broadlink/ @danielhiversen @felipediel @L-I-Am @eifinger
|
||||||
/tests/components/broadlink/ @danielhiversen @felipediel @L-I-Am
|
/tests/components/broadlink/ @danielhiversen @felipediel @L-I-Am @eifinger
|
||||||
/homeassistant/components/brother/ @bieniu
|
/homeassistant/components/brother/ @bieniu
|
||||||
/tests/components/brother/ @bieniu
|
/tests/components/brother/ @bieniu
|
||||||
/homeassistant/components/brottsplatskartan/ @gjohansson-ST
|
/homeassistant/components/brottsplatskartan/ @gjohansson-ST
|
||||||
@@ -233,8 +233,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/counter/ @fabaff
|
/tests/components/counter/ @fabaff
|
||||||
/homeassistant/components/cover/ @home-assistant/core
|
/homeassistant/components/cover/ @home-assistant/core
|
||||||
/tests/components/cover/ @home-assistant/core
|
/tests/components/cover/ @home-assistant/core
|
||||||
/homeassistant/components/cpuspeed/ @fabaff @frenck
|
/homeassistant/components/cpuspeed/ @fabaff
|
||||||
/tests/components/cpuspeed/ @fabaff @frenck
|
/tests/components/cpuspeed/ @fabaff
|
||||||
/homeassistant/components/crownstone/ @Crownstone @RicArch97
|
/homeassistant/components/crownstone/ @Crownstone @RicArch97
|
||||||
/tests/components/crownstone/ @Crownstone @RicArch97
|
/tests/components/crownstone/ @Crownstone @RicArch97
|
||||||
/homeassistant/components/cups/ @fabaff
|
/homeassistant/components/cups/ @fabaff
|
||||||
@@ -307,20 +307,18 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/eafm/ @Jc2k
|
/tests/components/eafm/ @Jc2k
|
||||||
/homeassistant/components/easyenergy/ @klaasnicolaas
|
/homeassistant/components/easyenergy/ @klaasnicolaas
|
||||||
/tests/components/easyenergy/ @klaasnicolaas
|
/tests/components/easyenergy/ @klaasnicolaas
|
||||||
/homeassistant/components/ecobee/ @marthoc @marcolivierarsenault
|
/homeassistant/components/ecobee/ @marcolivierarsenault
|
||||||
/tests/components/ecobee/ @marthoc @marcolivierarsenault
|
/tests/components/ecobee/ @marcolivierarsenault
|
||||||
/homeassistant/components/ecoforest/ @pjanuario
|
/homeassistant/components/ecoforest/ @pjanuario
|
||||||
/tests/components/ecoforest/ @pjanuario
|
/tests/components/ecoforest/ @pjanuario
|
||||||
/homeassistant/components/econet/ @vangorra @w1ll1am23
|
/homeassistant/components/econet/ @w1ll1am23
|
||||||
/tests/components/econet/ @vangorra @w1ll1am23
|
/tests/components/econet/ @w1ll1am23
|
||||||
/homeassistant/components/ecovacs/ @OverloadUT @mib1185
|
/homeassistant/components/ecovacs/ @OverloadUT @mib1185
|
||||||
/homeassistant/components/ecowitt/ @pvizeli
|
/homeassistant/components/ecowitt/ @pvizeli
|
||||||
/tests/components/ecowitt/ @pvizeli
|
/tests/components/ecowitt/ @pvizeli
|
||||||
/homeassistant/components/efergy/ @tkdrob
|
/homeassistant/components/efergy/ @tkdrob
|
||||||
/tests/components/efergy/ @tkdrob
|
/tests/components/efergy/ @tkdrob
|
||||||
/homeassistant/components/egardia/ @jeroenterheerdt
|
/homeassistant/components/egardia/ @jeroenterheerdt
|
||||||
/homeassistant/components/eight_sleep/ @mezz64 @raman325
|
|
||||||
/tests/components/eight_sleep/ @mezz64 @raman325
|
|
||||||
/homeassistant/components/electrasmart/ @jafar-atili
|
/homeassistant/components/electrasmart/ @jafar-atili
|
||||||
/tests/components/electrasmart/ @jafar-atili
|
/tests/components/electrasmart/ @jafar-atili
|
||||||
/homeassistant/components/electric_kiwi/ @mikey0000
|
/homeassistant/components/electric_kiwi/ @mikey0000
|
||||||
@@ -347,17 +345,15 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/enigma2/ @fbradyirl
|
/homeassistant/components/enigma2/ @fbradyirl
|
||||||
/homeassistant/components/enocean/ @bdurrer
|
/homeassistant/components/enocean/ @bdurrer
|
||||||
/tests/components/enocean/ @bdurrer
|
/tests/components/enocean/ @bdurrer
|
||||||
/homeassistant/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek
|
/homeassistant/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek @catsmanac
|
||||||
/tests/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek
|
/tests/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek @catsmanac
|
||||||
/homeassistant/components/entur_public_transport/ @hfurubotten
|
/homeassistant/components/entur_public_transport/ @hfurubotten
|
||||||
/homeassistant/components/environment_canada/ @gwww @michaeldavie
|
/homeassistant/components/environment_canada/ @gwww @michaeldavie
|
||||||
/tests/components/environment_canada/ @gwww @michaeldavie
|
/tests/components/environment_canada/ @gwww @michaeldavie
|
||||||
/homeassistant/components/envisalink/ @ufodone
|
|
||||||
/homeassistant/components/ephember/ @ttroy50
|
/homeassistant/components/ephember/ @ttroy50
|
||||||
/homeassistant/components/epson/ @pszafer
|
/homeassistant/components/epson/ @pszafer
|
||||||
/tests/components/epson/ @pszafer
|
/tests/components/epson/ @pszafer
|
||||||
/homeassistant/components/epsonworkforce/ @ThaStealth
|
/homeassistant/components/epsonworkforce/ @ThaStealth
|
||||||
/homeassistant/components/eq3btsmart/ @rytilahti
|
|
||||||
/homeassistant/components/escea/ @lazdavila
|
/homeassistant/components/escea/ @lazdavila
|
||||||
/tests/components/escea/ @lazdavila
|
/tests/components/escea/ @lazdavila
|
||||||
/homeassistant/components/esphome/ @OttoWinter @jesserockz @kbx81 @bdraco
|
/homeassistant/components/esphome/ @OttoWinter @jesserockz @kbx81 @bdraco
|
||||||
@@ -375,7 +371,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/faa_delays/ @ntilley905
|
/tests/components/faa_delays/ @ntilley905
|
||||||
/homeassistant/components/fan/ @home-assistant/core
|
/homeassistant/components/fan/ @home-assistant/core
|
||||||
/tests/components/fan/ @home-assistant/core
|
/tests/components/fan/ @home-assistant/core
|
||||||
/homeassistant/components/fastdotcom/ @rohankapoorcom
|
/homeassistant/components/fastdotcom/ @rohankapoorcom @erwindouna
|
||||||
|
/tests/components/fastdotcom/ @rohankapoorcom @erwindouna
|
||||||
/homeassistant/components/fibaro/ @rappenze
|
/homeassistant/components/fibaro/ @rappenze
|
||||||
/tests/components/fibaro/ @rappenze
|
/tests/components/fibaro/ @rappenze
|
||||||
/homeassistant/components/file/ @fabaff
|
/homeassistant/components/file/ @fabaff
|
||||||
@@ -423,8 +420,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/fritzbox/ @mib1185 @flabbamann
|
/tests/components/fritzbox/ @mib1185 @flabbamann
|
||||||
/homeassistant/components/fritzbox_callmonitor/ @cdce8p
|
/homeassistant/components/fritzbox_callmonitor/ @cdce8p
|
||||||
/tests/components/fritzbox_callmonitor/ @cdce8p
|
/tests/components/fritzbox_callmonitor/ @cdce8p
|
||||||
/homeassistant/components/fronius/ @nielstron @farmio
|
/homeassistant/components/fronius/ @farmio
|
||||||
/tests/components/fronius/ @nielstron @farmio
|
/tests/components/fronius/ @farmio
|
||||||
/homeassistant/components/frontend/ @home-assistant/frontend
|
/homeassistant/components/frontend/ @home-assistant/frontend
|
||||||
/tests/components/frontend/ @home-assistant/frontend
|
/tests/components/frontend/ @home-assistant/frontend
|
||||||
/homeassistant/components/frontier_silicon/ @wlcrs
|
/homeassistant/components/frontier_silicon/ @wlcrs
|
||||||
@@ -479,6 +476,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/google_mail/ @tkdrob
|
/tests/components/google_mail/ @tkdrob
|
||||||
/homeassistant/components/google_sheets/ @tkdrob
|
/homeassistant/components/google_sheets/ @tkdrob
|
||||||
/tests/components/google_sheets/ @tkdrob
|
/tests/components/google_sheets/ @tkdrob
|
||||||
|
/homeassistant/components/google_tasks/ @allenporter
|
||||||
|
/tests/components/google_tasks/ @allenporter
|
||||||
/homeassistant/components/google_travel_time/ @eifinger
|
/homeassistant/components/google_travel_time/ @eifinger
|
||||||
/tests/components/google_travel_time/ @eifinger
|
/tests/components/google_travel_time/ @eifinger
|
||||||
/homeassistant/components/govee_ble/ @bdraco @PierreAronnax
|
/homeassistant/components/govee_ble/ @bdraco @PierreAronnax
|
||||||
@@ -490,8 +489,6 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/greeneye_monitor/ @jkeljo
|
/tests/components/greeneye_monitor/ @jkeljo
|
||||||
/homeassistant/components/group/ @home-assistant/core
|
/homeassistant/components/group/ @home-assistant/core
|
||||||
/tests/components/group/ @home-assistant/core
|
/tests/components/group/ @home-assistant/core
|
||||||
/homeassistant/components/growatt_server/ @muppet3000
|
|
||||||
/tests/components/growatt_server/ @muppet3000
|
|
||||||
/homeassistant/components/guardian/ @bachya
|
/homeassistant/components/guardian/ @bachya
|
||||||
/tests/components/guardian/ @bachya
|
/tests/components/guardian/ @bachya
|
||||||
/homeassistant/components/habitica/ @ASMfreaK @leikoilja
|
/homeassistant/components/habitica/ @ASMfreaK @leikoilja
|
||||||
@@ -586,6 +583,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/image_upload/ @home-assistant/core
|
/tests/components/image_upload/ @home-assistant/core
|
||||||
/homeassistant/components/imap/ @jbouwh
|
/homeassistant/components/imap/ @jbouwh
|
||||||
/tests/components/imap/ @jbouwh
|
/tests/components/imap/ @jbouwh
|
||||||
|
/homeassistant/components/improv_ble/ @emontnemery
|
||||||
|
/tests/components/improv_ble/ @emontnemery
|
||||||
/homeassistant/components/incomfort/ @zxdavb
|
/homeassistant/components/incomfort/ @zxdavb
|
||||||
/homeassistant/components/influxdb/ @mdegat01
|
/homeassistant/components/influxdb/ @mdegat01
|
||||||
/tests/components/influxdb/ @mdegat01
|
/tests/components/influxdb/ @mdegat01
|
||||||
@@ -660,8 +659,10 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/kmtronic/ @dgomes
|
/tests/components/kmtronic/ @dgomes
|
||||||
/homeassistant/components/knx/ @Julius2342 @farmio @marvin-w
|
/homeassistant/components/knx/ @Julius2342 @farmio @marvin-w
|
||||||
/tests/components/knx/ @Julius2342 @farmio @marvin-w
|
/tests/components/knx/ @Julius2342 @farmio @marvin-w
|
||||||
/homeassistant/components/kodi/ @OnFreund @cgtobi
|
/homeassistant/components/kodi/ @OnFreund
|
||||||
/tests/components/kodi/ @OnFreund @cgtobi
|
/tests/components/kodi/ @OnFreund
|
||||||
|
/homeassistant/components/komfovent/ @ProstoSanja
|
||||||
|
/tests/components/komfovent/ @ProstoSanja
|
||||||
/homeassistant/components/konnected/ @heythisisnate
|
/homeassistant/components/konnected/ @heythisisnate
|
||||||
/tests/components/konnected/ @heythisisnate
|
/tests/components/konnected/ @heythisisnate
|
||||||
/homeassistant/components/kostal_plenticore/ @stegm
|
/homeassistant/components/kostal_plenticore/ @stegm
|
||||||
@@ -697,6 +698,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/life360/ @pnbruckner
|
/tests/components/life360/ @pnbruckner
|
||||||
/homeassistant/components/light/ @home-assistant/core
|
/homeassistant/components/light/ @home-assistant/core
|
||||||
/tests/components/light/ @home-assistant/core
|
/tests/components/light/ @home-assistant/core
|
||||||
|
/homeassistant/components/linear_garage_door/ @IceBotYT
|
||||||
|
/tests/components/linear_garage_door/ @IceBotYT
|
||||||
/homeassistant/components/linux_battery/ @fabaff
|
/homeassistant/components/linux_battery/ @fabaff
|
||||||
/homeassistant/components/litejet/ @joncar
|
/homeassistant/components/litejet/ @joncar
|
||||||
/tests/components/litejet/ @joncar
|
/tests/components/litejet/ @joncar
|
||||||
@@ -708,6 +711,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/local_calendar/ @allenporter
|
/tests/components/local_calendar/ @allenporter
|
||||||
/homeassistant/components/local_ip/ @issacg
|
/homeassistant/components/local_ip/ @issacg
|
||||||
/tests/components/local_ip/ @issacg
|
/tests/components/local_ip/ @issacg
|
||||||
|
/homeassistant/components/local_todo/ @allenporter
|
||||||
|
/tests/components/local_todo/ @allenporter
|
||||||
/homeassistant/components/lock/ @home-assistant/core
|
/homeassistant/components/lock/ @home-assistant/core
|
||||||
/tests/components/lock/ @home-assistant/core
|
/tests/components/lock/ @home-assistant/core
|
||||||
/homeassistant/components/logbook/ @home-assistant/core
|
/homeassistant/components/logbook/ @home-assistant/core
|
||||||
@@ -738,8 +743,6 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/matrix/ @PaarthShah
|
/tests/components/matrix/ @PaarthShah
|
||||||
/homeassistant/components/matter/ @home-assistant/matter
|
/homeassistant/components/matter/ @home-assistant/matter
|
||||||
/tests/components/matter/ @home-assistant/matter
|
/tests/components/matter/ @home-assistant/matter
|
||||||
/homeassistant/components/mazda/ @bdr99
|
|
||||||
/tests/components/mazda/ @bdr99
|
|
||||||
/homeassistant/components/meater/ @Sotolotl @emontnemery
|
/homeassistant/components/meater/ @Sotolotl @emontnemery
|
||||||
/tests/components/meater/ @Sotolotl @emontnemery
|
/tests/components/meater/ @Sotolotl @emontnemery
|
||||||
/homeassistant/components/medcom_ble/ @elafargue
|
/homeassistant/components/medcom_ble/ @elafargue
|
||||||
@@ -757,8 +760,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/melissa/ @kennedyshead
|
/tests/components/melissa/ @kennedyshead
|
||||||
/homeassistant/components/melnor/ @vanstinator
|
/homeassistant/components/melnor/ @vanstinator
|
||||||
/tests/components/melnor/ @vanstinator
|
/tests/components/melnor/ @vanstinator
|
||||||
/homeassistant/components/met/ @danielhiversen @thimic
|
/homeassistant/components/met/ @danielhiversen
|
||||||
/tests/components/met/ @danielhiversen @thimic
|
/tests/components/met/ @danielhiversen
|
||||||
/homeassistant/components/met_eireann/ @DylanGore
|
/homeassistant/components/met_eireann/ @DylanGore
|
||||||
/tests/components/met_eireann/ @DylanGore
|
/tests/components/met_eireann/ @DylanGore
|
||||||
/homeassistant/components/meteo_france/ @hacf-fr @oncleben31 @Quentame
|
/homeassistant/components/meteo_france/ @hacf-fr @oncleben31 @Quentame
|
||||||
@@ -809,8 +812,6 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/mutesync/ @currentoor
|
/tests/components/mutesync/ @currentoor
|
||||||
/homeassistant/components/my/ @home-assistant/core
|
/homeassistant/components/my/ @home-assistant/core
|
||||||
/tests/components/my/ @home-assistant/core
|
/tests/components/my/ @home-assistant/core
|
||||||
/homeassistant/components/myq/ @ehendrix23 @Lash-L
|
|
||||||
/tests/components/myq/ @ehendrix23 @Lash-L
|
|
||||||
/homeassistant/components/mysensors/ @MartinHjelmare @functionpointer
|
/homeassistant/components/mysensors/ @MartinHjelmare @functionpointer
|
||||||
/tests/components/mysensors/ @MartinHjelmare @functionpointer
|
/tests/components/mysensors/ @MartinHjelmare @functionpointer
|
||||||
/homeassistant/components/mystrom/ @fabaff
|
/homeassistant/components/mystrom/ @fabaff
|
||||||
@@ -927,6 +928,8 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/oru/ @bvlaicu
|
/homeassistant/components/oru/ @bvlaicu
|
||||||
/homeassistant/components/otbr/ @home-assistant/core
|
/homeassistant/components/otbr/ @home-assistant/core
|
||||||
/tests/components/otbr/ @home-assistant/core
|
/tests/components/otbr/ @home-assistant/core
|
||||||
|
/homeassistant/components/ourgroceries/ @OnFreund
|
||||||
|
/tests/components/ourgroceries/ @OnFreund
|
||||||
/homeassistant/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
|
/homeassistant/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
|
||||||
/tests/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
|
/tests/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
|
||||||
/homeassistant/components/ovo_energy/ @timmo001
|
/homeassistant/components/ovo_energy/ @timmo001
|
||||||
@@ -941,6 +944,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/peco/ @IceBotYT
|
/tests/components/peco/ @IceBotYT
|
||||||
/homeassistant/components/pegel_online/ @mib1185
|
/homeassistant/components/pegel_online/ @mib1185
|
||||||
/tests/components/pegel_online/ @mib1185
|
/tests/components/pegel_online/ @mib1185
|
||||||
|
/homeassistant/components/permobil/ @IsakNyberg
|
||||||
|
/tests/components/permobil/ @IsakNyberg
|
||||||
/homeassistant/components/persistent_notification/ @home-assistant/core
|
/homeassistant/components/persistent_notification/ @home-assistant/core
|
||||||
/tests/components/persistent_notification/ @home-assistant/core
|
/tests/components/persistent_notification/ @home-assistant/core
|
||||||
/homeassistant/components/philips_js/ @elupus
|
/homeassistant/components/philips_js/ @elupus
|
||||||
@@ -951,6 +956,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/picnic/ @corneyl
|
/tests/components/picnic/ @corneyl
|
||||||
/homeassistant/components/pilight/ @trekky12
|
/homeassistant/components/pilight/ @trekky12
|
||||||
/tests/components/pilight/ @trekky12
|
/tests/components/pilight/ @trekky12
|
||||||
|
/homeassistant/components/ping/ @jpbede
|
||||||
|
/tests/components/ping/ @jpbede
|
||||||
/homeassistant/components/plaato/ @JohNan
|
/homeassistant/components/plaato/ @JohNan
|
||||||
/tests/components/plaato/ @JohNan
|
/tests/components/plaato/ @JohNan
|
||||||
/homeassistant/components/plex/ @jjlawren
|
/homeassistant/components/plex/ @jjlawren
|
||||||
@@ -975,6 +982,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/prometheus/ @knyar
|
/tests/components/prometheus/ @knyar
|
||||||
/homeassistant/components/prosegur/ @dgomes
|
/homeassistant/components/prosegur/ @dgomes
|
||||||
/tests/components/prosegur/ @dgomes
|
/tests/components/prosegur/ @dgomes
|
||||||
|
/homeassistant/components/proximity/ @mib1185
|
||||||
|
/tests/components/proximity/ @mib1185
|
||||||
/homeassistant/components/proxmoxve/ @jhollowe @Corbeno
|
/homeassistant/components/proxmoxve/ @jhollowe @Corbeno
|
||||||
/homeassistant/components/prusalink/ @balloob
|
/homeassistant/components/prusalink/ @balloob
|
||||||
/tests/components/prusalink/ @balloob
|
/tests/components/prusalink/ @balloob
|
||||||
@@ -1035,6 +1044,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/recollect_waste/ @bachya
|
/tests/components/recollect_waste/ @bachya
|
||||||
/homeassistant/components/recorder/ @home-assistant/core
|
/homeassistant/components/recorder/ @home-assistant/core
|
||||||
/tests/components/recorder/ @home-assistant/core
|
/tests/components/recorder/ @home-assistant/core
|
||||||
|
/homeassistant/components/recovery_mode/ @home-assistant/core
|
||||||
|
/tests/components/recovery_mode/ @home-assistant/core
|
||||||
/homeassistant/components/rejseplanen/ @DarkFox
|
/homeassistant/components/rejseplanen/ @DarkFox
|
||||||
/homeassistant/components/remote/ @home-assistant/core
|
/homeassistant/components/remote/ @home-assistant/core
|
||||||
/tests/components/remote/ @home-assistant/core
|
/tests/components/remote/ @home-assistant/core
|
||||||
@@ -1046,7 +1057,7 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/reolink/ @starkillerOG
|
/tests/components/reolink/ @starkillerOG
|
||||||
/homeassistant/components/repairs/ @home-assistant/core
|
/homeassistant/components/repairs/ @home-assistant/core
|
||||||
/tests/components/repairs/ @home-assistant/core
|
/tests/components/repairs/ @home-assistant/core
|
||||||
/homeassistant/components/repetier/ @MTrab @ShadowBr0ther
|
/homeassistant/components/repetier/ @ShadowBr0ther
|
||||||
/homeassistant/components/rflink/ @javicalle
|
/homeassistant/components/rflink/ @javicalle
|
||||||
/tests/components/rflink/ @javicalle
|
/tests/components/rflink/ @javicalle
|
||||||
/homeassistant/components/rfxtrx/ @danielhiversen @elupus @RobBie1221
|
/homeassistant/components/rfxtrx/ @danielhiversen @elupus @RobBie1221
|
||||||
@@ -1055,6 +1066,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/rhasspy/ @balloob @synesthesiam
|
/tests/components/rhasspy/ @balloob @synesthesiam
|
||||||
/homeassistant/components/ridwell/ @bachya
|
/homeassistant/components/ridwell/ @bachya
|
||||||
/tests/components/ridwell/ @bachya
|
/tests/components/ridwell/ @bachya
|
||||||
|
/homeassistant/components/ring/ @sdb9696
|
||||||
|
/tests/components/ring/ @sdb9696
|
||||||
/homeassistant/components/risco/ @OnFreund
|
/homeassistant/components/risco/ @OnFreund
|
||||||
/tests/components/risco/ @OnFreund
|
/tests/components/risco/ @OnFreund
|
||||||
/homeassistant/components/rituals_perfume_genie/ @milanmeu @frenck
|
/homeassistant/components/rituals_perfume_genie/ @milanmeu @frenck
|
||||||
@@ -1065,8 +1078,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/roborock/ @humbertogontijo @Lash-L
|
/tests/components/roborock/ @humbertogontijo @Lash-L
|
||||||
/homeassistant/components/roku/ @ctalkington
|
/homeassistant/components/roku/ @ctalkington
|
||||||
/tests/components/roku/ @ctalkington
|
/tests/components/roku/ @ctalkington
|
||||||
/homeassistant/components/roomba/ @pschmitt @cyr-ius @shenxn
|
/homeassistant/components/roomba/ @pschmitt @cyr-ius @shenxn @Xitee1
|
||||||
/tests/components/roomba/ @pschmitt @cyr-ius @shenxn
|
/tests/components/roomba/ @pschmitt @cyr-ius @shenxn @Xitee1
|
||||||
/homeassistant/components/roon/ @pavoni
|
/homeassistant/components/roon/ @pavoni
|
||||||
/tests/components/roon/ @pavoni
|
/tests/components/roon/ @pavoni
|
||||||
/homeassistant/components/rpi_power/ @shenxn @swetoast
|
/homeassistant/components/rpi_power/ @shenxn @swetoast
|
||||||
@@ -1085,8 +1098,6 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/rympro/ @OnFreund @elad-bar @maorcc
|
/tests/components/rympro/ @OnFreund @elad-bar @maorcc
|
||||||
/homeassistant/components/sabnzbd/ @shaiu
|
/homeassistant/components/sabnzbd/ @shaiu
|
||||||
/tests/components/sabnzbd/ @shaiu
|
/tests/components/sabnzbd/ @shaiu
|
||||||
/homeassistant/components/safe_mode/ @home-assistant/core
|
|
||||||
/tests/components/safe_mode/ @home-assistant/core
|
|
||||||
/homeassistant/components/saj/ @fredericvl
|
/homeassistant/components/saj/ @fredericvl
|
||||||
/homeassistant/components/samsungtv/ @chemelli74 @epenet
|
/homeassistant/components/samsungtv/ @chemelli74 @epenet
|
||||||
/tests/components/samsungtv/ @chemelli74 @epenet
|
/tests/components/samsungtv/ @chemelli74 @epenet
|
||||||
@@ -1191,8 +1202,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/sonarr/ @ctalkington
|
/tests/components/sonarr/ @ctalkington
|
||||||
/homeassistant/components/songpal/ @rytilahti @shenxn
|
/homeassistant/components/songpal/ @rytilahti @shenxn
|
||||||
/tests/components/songpal/ @rytilahti @shenxn
|
/tests/components/songpal/ @rytilahti @shenxn
|
||||||
/homeassistant/components/sonos/ @cgtobi @jjlawren
|
/homeassistant/components/sonos/ @jjlawren
|
||||||
/tests/components/sonos/ @cgtobi @jjlawren
|
/tests/components/sonos/ @jjlawren
|
||||||
/homeassistant/components/soundtouch/ @kroimon
|
/homeassistant/components/soundtouch/ @kroimon
|
||||||
/tests/components/soundtouch/ @kroimon
|
/tests/components/soundtouch/ @kroimon
|
||||||
/homeassistant/components/spaceapi/ @fabaff
|
/homeassistant/components/spaceapi/ @fabaff
|
||||||
@@ -1227,8 +1238,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/stookwijzer/ @fwestenberg
|
/tests/components/stookwijzer/ @fwestenberg
|
||||||
/homeassistant/components/stream/ @hunterjm @uvjustin @allenporter
|
/homeassistant/components/stream/ @hunterjm @uvjustin @allenporter
|
||||||
/tests/components/stream/ @hunterjm @uvjustin @allenporter
|
/tests/components/stream/ @hunterjm @uvjustin @allenporter
|
||||||
/homeassistant/components/stt/ @home-assistant/core @pvizeli
|
/homeassistant/components/stt/ @home-assistant/core
|
||||||
/tests/components/stt/ @home-assistant/core @pvizeli
|
/tests/components/stt/ @home-assistant/core
|
||||||
/homeassistant/components/subaru/ @G-Two
|
/homeassistant/components/subaru/ @G-Two
|
||||||
/tests/components/subaru/ @G-Two
|
/tests/components/subaru/ @G-Two
|
||||||
/homeassistant/components/suez_water/ @ooii
|
/homeassistant/components/suez_water/ @ooii
|
||||||
@@ -1267,6 +1278,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/tag/ @balloob @dmulcahey
|
/tests/components/tag/ @balloob @dmulcahey
|
||||||
/homeassistant/components/tailscale/ @frenck
|
/homeassistant/components/tailscale/ @frenck
|
||||||
/tests/components/tailscale/ @frenck
|
/tests/components/tailscale/ @frenck
|
||||||
|
/homeassistant/components/tami4/ @Guy293
|
||||||
|
/tests/components/tami4/ @Guy293
|
||||||
/homeassistant/components/tankerkoenig/ @guillempages @mib1185
|
/homeassistant/components/tankerkoenig/ @guillempages @mib1185
|
||||||
/tests/components/tankerkoenig/ @guillempages @mib1185
|
/tests/components/tankerkoenig/ @guillempages @mib1185
|
||||||
/homeassistant/components/tapsaff/ @bazwilliams
|
/homeassistant/components/tapsaff/ @bazwilliams
|
||||||
@@ -1301,6 +1314,8 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/time_date/ @fabaff
|
/homeassistant/components/time_date/ @fabaff
|
||||||
/tests/components/time_date/ @fabaff
|
/tests/components/time_date/ @fabaff
|
||||||
/homeassistant/components/tmb/ @alemuro
|
/homeassistant/components/tmb/ @alemuro
|
||||||
|
/homeassistant/components/todo/ @home-assistant/core
|
||||||
|
/tests/components/todo/ @home-assistant/core
|
||||||
/homeassistant/components/todoist/ @boralyl
|
/homeassistant/components/todoist/ @boralyl
|
||||||
/tests/components/todoist/ @boralyl
|
/tests/components/todoist/ @boralyl
|
||||||
/homeassistant/components/tolo/ @MatthiasLohr
|
/homeassistant/components/tolo/ @MatthiasLohr
|
||||||
@@ -1309,8 +1324,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/tomorrowio/ @raman325 @lymanepp
|
/tests/components/tomorrowio/ @raman325 @lymanepp
|
||||||
/homeassistant/components/totalconnect/ @austinmroczek
|
/homeassistant/components/totalconnect/ @austinmroczek
|
||||||
/tests/components/totalconnect/ @austinmroczek
|
/tests/components/totalconnect/ @austinmroczek
|
||||||
/homeassistant/components/tplink/ @rytilahti @thegardenmonkey
|
/homeassistant/components/tplink/ @rytilahti @thegardenmonkey @bdraco
|
||||||
/tests/components/tplink/ @rytilahti @thegardenmonkey
|
/tests/components/tplink/ @rytilahti @thegardenmonkey @bdraco
|
||||||
/homeassistant/components/tplink_omada/ @MarkGodwin
|
/homeassistant/components/tplink_omada/ @MarkGodwin
|
||||||
/tests/components/tplink_omada/ @MarkGodwin
|
/tests/components/tplink_omada/ @MarkGodwin
|
||||||
/homeassistant/components/traccar/ @ludeeus
|
/homeassistant/components/traccar/ @ludeeus
|
||||||
@@ -1323,16 +1338,16 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/trafikverket_camera/ @gjohansson-ST
|
/tests/components/trafikverket_camera/ @gjohansson-ST
|
||||||
/homeassistant/components/trafikverket_ferry/ @gjohansson-ST
|
/homeassistant/components/trafikverket_ferry/ @gjohansson-ST
|
||||||
/tests/components/trafikverket_ferry/ @gjohansson-ST
|
/tests/components/trafikverket_ferry/ @gjohansson-ST
|
||||||
/homeassistant/components/trafikverket_train/ @endor-force @gjohansson-ST
|
/homeassistant/components/trafikverket_train/ @gjohansson-ST
|
||||||
/tests/components/trafikverket_train/ @endor-force @gjohansson-ST
|
/tests/components/trafikverket_train/ @gjohansson-ST
|
||||||
/homeassistant/components/trafikverket_weatherstation/ @endor-force @gjohansson-ST
|
/homeassistant/components/trafikverket_weatherstation/ @gjohansson-ST
|
||||||
/tests/components/trafikverket_weatherstation/ @endor-force @gjohansson-ST
|
/tests/components/trafikverket_weatherstation/ @gjohansson-ST
|
||||||
/homeassistant/components/transmission/ @engrbm87 @JPHutchins
|
/homeassistant/components/transmission/ @engrbm87 @JPHutchins
|
||||||
/tests/components/transmission/ @engrbm87 @JPHutchins
|
/tests/components/transmission/ @engrbm87 @JPHutchins
|
||||||
/homeassistant/components/trend/ @jpbede
|
/homeassistant/components/trend/ @jpbede
|
||||||
/tests/components/trend/ @jpbede
|
/tests/components/trend/ @jpbede
|
||||||
/homeassistant/components/tts/ @home-assistant/core @pvizeli
|
/homeassistant/components/tts/ @home-assistant/core
|
||||||
/tests/components/tts/ @home-assistant/core @pvizeli
|
/tests/components/tts/ @home-assistant/core
|
||||||
/homeassistant/components/tuya/ @Tuya @zlinoliver @frenck
|
/homeassistant/components/tuya/ @Tuya @zlinoliver @frenck
|
||||||
/tests/components/tuya/ @Tuya @zlinoliver @frenck
|
/tests/components/tuya/ @Tuya @zlinoliver @frenck
|
||||||
/homeassistant/components/twentemilieu/ @frenck
|
/homeassistant/components/twentemilieu/ @frenck
|
||||||
@@ -1367,6 +1382,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/usgs_earthquakes_feed/ @exxamalte
|
/tests/components/usgs_earthquakes_feed/ @exxamalte
|
||||||
/homeassistant/components/utility_meter/ @dgomes
|
/homeassistant/components/utility_meter/ @dgomes
|
||||||
/tests/components/utility_meter/ @dgomes
|
/tests/components/utility_meter/ @dgomes
|
||||||
|
/homeassistant/components/v2c/ @dgomes
|
||||||
|
/tests/components/v2c/ @dgomes
|
||||||
/homeassistant/components/vacuum/ @home-assistant/core
|
/homeassistant/components/vacuum/ @home-assistant/core
|
||||||
/tests/components/vacuum/ @home-assistant/core
|
/tests/components/vacuum/ @home-assistant/core
|
||||||
/homeassistant/components/vallox/ @andre-richter @slovdahl @viiru-
|
/homeassistant/components/vallox/ @andre-richter @slovdahl @viiru-
|
||||||
@@ -1376,13 +1393,13 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/velux/ @Julius2342
|
/homeassistant/components/velux/ @Julius2342
|
||||||
/homeassistant/components/venstar/ @garbled1 @jhollowe
|
/homeassistant/components/venstar/ @garbled1 @jhollowe
|
||||||
/tests/components/venstar/ @garbled1 @jhollowe
|
/tests/components/venstar/ @garbled1 @jhollowe
|
||||||
/homeassistant/components/verisure/ @frenck
|
|
||||||
/tests/components/verisure/ @frenck
|
|
||||||
/homeassistant/components/versasense/ @imstevenxyz
|
/homeassistant/components/versasense/ @imstevenxyz
|
||||||
/homeassistant/components/version/ @ludeeus
|
/homeassistant/components/version/ @ludeeus
|
||||||
/tests/components/version/ @ludeeus
|
/tests/components/version/ @ludeeus
|
||||||
/homeassistant/components/vesync/ @markperdue @webdjoe @thegardenmonkey
|
/homeassistant/components/vesync/ @markperdue @webdjoe @thegardenmonkey
|
||||||
/tests/components/vesync/ @markperdue @webdjoe @thegardenmonkey
|
/tests/components/vesync/ @markperdue @webdjoe @thegardenmonkey
|
||||||
|
/homeassistant/components/vicare/ @CFenner
|
||||||
|
/tests/components/vicare/ @CFenner
|
||||||
/homeassistant/components/vilfo/ @ManneW
|
/homeassistant/components/vilfo/ @ManneW
|
||||||
/tests/components/vilfo/ @ManneW
|
/tests/components/vilfo/ @ManneW
|
||||||
/homeassistant/components/vivotek/ @HarlemSquirrel
|
/homeassistant/components/vivotek/ @HarlemSquirrel
|
||||||
@@ -1438,8 +1455,8 @@ build.json @home-assistant/supervisor
|
|||||||
/homeassistant/components/wilight/ @leofig-rj
|
/homeassistant/components/wilight/ @leofig-rj
|
||||||
/tests/components/wilight/ @leofig-rj
|
/tests/components/wilight/ @leofig-rj
|
||||||
/homeassistant/components/wirelesstag/ @sergeymaysak
|
/homeassistant/components/wirelesstag/ @sergeymaysak
|
||||||
/homeassistant/components/withings/ @vangorra @joostlek
|
/homeassistant/components/withings/ @joostlek
|
||||||
/tests/components/withings/ @vangorra @joostlek
|
/tests/components/withings/ @joostlek
|
||||||
/homeassistant/components/wiz/ @sbidy
|
/homeassistant/components/wiz/ @sbidy
|
||||||
/tests/components/wiz/ @sbidy
|
/tests/components/wiz/ @sbidy
|
||||||
/homeassistant/components/wled/ @frenck
|
/homeassistant/components/wled/ @frenck
|
||||||
@@ -1493,8 +1510,8 @@ build.json @home-assistant/supervisor
|
|||||||
/tests/components/zerproc/ @emlove
|
/tests/components/zerproc/ @emlove
|
||||||
/homeassistant/components/zeversolar/ @kvanzuijlen
|
/homeassistant/components/zeversolar/ @kvanzuijlen
|
||||||
/tests/components/zeversolar/ @kvanzuijlen
|
/tests/components/zeversolar/ @kvanzuijlen
|
||||||
/homeassistant/components/zha/ @dmulcahey @adminiuga @puddly
|
/homeassistant/components/zha/ @dmulcahey @adminiuga @puddly @TheJulianJES
|
||||||
/tests/components/zha/ @dmulcahey @adminiuga @puddly
|
/tests/components/zha/ @dmulcahey @adminiuga @puddly @TheJulianJES
|
||||||
/homeassistant/components/zodiac/ @JulienTant
|
/homeassistant/components/zodiac/ @JulienTant
|
||||||
/tests/components/zodiac/ @JulienTant
|
/tests/components/zodiac/ @JulienTant
|
||||||
/homeassistant/components/zone/ @home-assistant/core
|
/homeassistant/components/zone/ @home-assistant/core
|
||||||
|
16
Dockerfile
16
Dockerfile
@@ -14,41 +14,29 @@ COPY requirements.txt homeassistant/
|
|||||||
COPY homeassistant/package_constraints.txt homeassistant/homeassistant/
|
COPY homeassistant/package_constraints.txt homeassistant/homeassistant/
|
||||||
RUN \
|
RUN \
|
||||||
pip3 install \
|
pip3 install \
|
||||||
--no-cache-dir \
|
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--index-url "https://wheels.home-assistant.io/musllinux-index/" \
|
|
||||||
-r homeassistant/requirements.txt
|
-r homeassistant/requirements.txt
|
||||||
|
|
||||||
COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/
|
COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/
|
||||||
RUN \
|
RUN \
|
||||||
if ls homeassistant/home_assistant_frontend*.whl 1> /dev/null 2>&1; then \
|
if ls homeassistant/home_assistant_frontend*.whl 1> /dev/null 2>&1; then \
|
||||||
pip3 install \
|
pip3 install homeassistant/home_assistant_frontend-*.whl; \
|
||||||
--no-cache-dir \
|
|
||||||
--no-index \
|
|
||||||
homeassistant/home_assistant_frontend-*.whl; \
|
|
||||||
fi \
|
fi \
|
||||||
&& if ls homeassistant/home_assistant_intents*.whl 1> /dev/null 2>&1; then \
|
&& if ls homeassistant/home_assistant_intents*.whl 1> /dev/null 2>&1; then \
|
||||||
pip3 install \
|
pip3 install homeassistant/home_assistant_intents-*.whl; \
|
||||||
--no-cache-dir \
|
|
||||||
--no-index \
|
|
||||||
homeassistant/home_assistant_intents-*.whl; \
|
|
||||||
fi \
|
fi \
|
||||||
&& \
|
&& \
|
||||||
LD_PRELOAD="/usr/local/lib/libjemalloc.so.2" \
|
LD_PRELOAD="/usr/local/lib/libjemalloc.so.2" \
|
||||||
MALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:20000,muzzy_decay_ms:20000" \
|
MALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:20000,muzzy_decay_ms:20000" \
|
||||||
pip3 install \
|
pip3 install \
|
||||||
--no-cache-dir \
|
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--index-url "https://wheels.home-assistant.io/musllinux-index/" \
|
|
||||||
-r homeassistant/requirements_all.txt
|
-r homeassistant/requirements_all.txt
|
||||||
|
|
||||||
## Setup Home Assistant Core
|
## Setup Home Assistant Core
|
||||||
COPY . homeassistant/
|
COPY . homeassistant/
|
||||||
RUN \
|
RUN \
|
||||||
pip3 install \
|
pip3 install \
|
||||||
--no-cache-dir \
|
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--index-url "https://wheels.home-assistant.io/musllinux-index/" \
|
|
||||||
-e ./homeassistant \
|
-e ./homeassistant \
|
||||||
&& python3 -m compileall \
|
&& python3 -m compileall \
|
||||||
homeassistant/homeassistant
|
homeassistant/homeassistant
|
||||||
|
@@ -5,8 +5,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|||||||
# Uninstall pre-installed formatting and linting tools
|
# Uninstall pre-installed formatting and linting tools
|
||||||
# They would conflict with our pinned versions
|
# They would conflict with our pinned versions
|
||||||
RUN \
|
RUN \
|
||||||
pipx uninstall black \
|
pipx uninstall pydocstyle \
|
||||||
&& pipx uninstall pydocstyle \
|
|
||||||
&& pipx uninstall pycodestyle \
|
&& pipx uninstall pycodestyle \
|
||||||
&& pipx uninstall mypy \
|
&& pipx uninstall mypy \
|
||||||
&& pipx uninstall pylint
|
&& pipx uninstall pylint
|
||||||
|
10
build.yaml
10
build.yaml
@@ -1,10 +1,10 @@
|
|||||||
image: ghcr.io/home-assistant/{arch}-homeassistant
|
image: ghcr.io/home-assistant/{arch}-homeassistant
|
||||||
build_from:
|
build_from:
|
||||||
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2023.09.0
|
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2023.10.1
|
||||||
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2023.09.0
|
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2023.10.1
|
||||||
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2023.09.0
|
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2023.10.1
|
||||||
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2023.09.0
|
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2023.10.1
|
||||||
i386: ghcr.io/home-assistant/i386-homeassistant-base:2023.09.0
|
i386: ghcr.io/home-assistant/i386-homeassistant-base:2023.10.1
|
||||||
codenotary:
|
codenotary:
|
||||||
signer: notary@home-assistant.io
|
signer: notary@home-assistant.io
|
||||||
base_image: notary@home-assistant.io
|
base_image: notary@home-assistant.io
|
||||||
|
230
docs/Makefile
230
docs/Makefile
@@ -1,230 +0,0 @@
|
|||||||
# Makefile for Sphinx documentation
|
|
||||||
#
|
|
||||||
|
|
||||||
# You can set these variables from the command line.
|
|
||||||
SPHINXOPTS =
|
|
||||||
SPHINXBUILD = sphinx-build
|
|
||||||
PAPER =
|
|
||||||
BUILDDIR = build
|
|
||||||
|
|
||||||
# Internal variables.
|
|
||||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
|
||||||
PAPEROPT_letter = -D latex_paper_size=letter
|
|
||||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
|
||||||
# the i18n builder cannot share the environment and doctrees with the others
|
|
||||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
|
||||||
|
|
||||||
.PHONY: help
|
|
||||||
help:
|
|
||||||
@echo "Please use \`make <target>' where <target> is one of"
|
|
||||||
@echo " html to make standalone HTML files"
|
|
||||||
@echo " livehtml to make standalone HTML files via sphinx-autobuild"
|
|
||||||
@echo " dirhtml to make HTML files named index.html in directories"
|
|
||||||
@echo " singlehtml to make a single large HTML file"
|
|
||||||
@echo " pickle to make pickle files"
|
|
||||||
@echo " json to make JSON files"
|
|
||||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
|
||||||
@echo " qthelp to make HTML files and a qthelp project"
|
|
||||||
@echo " applehelp to make an Apple Help Book"
|
|
||||||
@echo " devhelp to make HTML files and a Devhelp project"
|
|
||||||
@echo " epub to make an epub"
|
|
||||||
@echo " epub3 to make an epub3"
|
|
||||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
|
||||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
|
||||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
|
||||||
@echo " text to make text files"
|
|
||||||
@echo " man to make manual pages"
|
|
||||||
@echo " texinfo to make Texinfo files"
|
|
||||||
@echo " info to make Texinfo files and run them through makeinfo"
|
|
||||||
@echo " gettext to make PO message catalogs"
|
|
||||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
|
||||||
@echo " xml to make Docutils-native XML files"
|
|
||||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
|
||||||
@echo " linkcheck to check all external links for integrity"
|
|
||||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
|
||||||
@echo " coverage to run coverage check of the documentation (if enabled)"
|
|
||||||
@echo " dummy to check syntax errors of document sources"
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR)/*
|
|
||||||
|
|
||||||
.PHONY: html
|
|
||||||
html:
|
|
||||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
|
||||||
|
|
||||||
.PHONY: livehtml
|
|
||||||
livehtml:
|
|
||||||
sphinx-autobuild -z ../homeassistant/ --port 0 -B -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
|
||||||
|
|
||||||
.PHONY: dirhtml
|
|
||||||
dirhtml:
|
|
||||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
|
||||||
|
|
||||||
.PHONY: singlehtml
|
|
||||||
singlehtml:
|
|
||||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
|
||||||
|
|
||||||
.PHONY: pickle
|
|
||||||
pickle:
|
|
||||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the pickle files."
|
|
||||||
|
|
||||||
.PHONY: json
|
|
||||||
json:
|
|
||||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the JSON files."
|
|
||||||
|
|
||||||
.PHONY: htmlhelp
|
|
||||||
htmlhelp:
|
|
||||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
|
||||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
|
||||||
|
|
||||||
.PHONY: qthelp
|
|
||||||
qthelp:
|
|
||||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
|
||||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
|
||||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Home-Assistant.qhcp"
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Home-Assistant.qhc"
|
|
||||||
|
|
||||||
.PHONY: applehelp
|
|
||||||
applehelp:
|
|
||||||
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
|
|
||||||
@echo "N.B. You won't be able to view it unless you put it in" \
|
|
||||||
"~/Library/Documentation/Help or install it in your application" \
|
|
||||||
"bundle."
|
|
||||||
|
|
||||||
.PHONY: devhelp
|
|
||||||
devhelp:
|
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished."
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Home-Assistant"
|
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Home-Assistant"
|
|
||||||
@echo "# devhelp"
|
|
||||||
|
|
||||||
.PHONY: epub
|
|
||||||
epub:
|
|
||||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
|
||||||
|
|
||||||
.PHONY: epub3
|
|
||||||
epub3:
|
|
||||||
$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
|
|
||||||
|
|
||||||
.PHONY: latex
|
|
||||||
latex:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
|
||||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
|
||||||
"(use \`make latexpdf' here to do that automatically)."
|
|
||||||
|
|
||||||
.PHONY: latexpdf
|
|
||||||
latexpdf:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo "Running LaTeX files through pdflatex..."
|
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
|
||||||
|
|
||||||
.PHONY: latexpdfja
|
|
||||||
latexpdfja:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
|
||||||
|
|
||||||
.PHONY: text
|
|
||||||
text:
|
|
||||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
|
||||||
|
|
||||||
.PHONY: man
|
|
||||||
man:
|
|
||||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
|
||||||
|
|
||||||
.PHONY: texinfo
|
|
||||||
texinfo:
|
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
|
||||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
|
||||||
"(use \`make info' here to do that automatically)."
|
|
||||||
|
|
||||||
.PHONY: info
|
|
||||||
info:
|
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
|
||||||
@echo "Running Texinfo files through makeinfo..."
|
|
||||||
make -C $(BUILDDIR)/texinfo info
|
|
||||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
|
||||||
|
|
||||||
.PHONY: gettext
|
|
||||||
gettext:
|
|
||||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
|
||||||
|
|
||||||
.PHONY: changes
|
|
||||||
changes:
|
|
||||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
|
||||||
@echo
|
|
||||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
|
||||||
|
|
||||||
.PHONY: linkcheck
|
|
||||||
linkcheck:
|
|
||||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
|
||||||
@echo
|
|
||||||
@echo "Link check complete; look for any errors in the above output " \
|
|
||||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
|
||||||
|
|
||||||
.PHONY: doctest
|
|
||||||
doctest:
|
|
||||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
|
||||||
@echo "Testing of doctests in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/doctest/output.txt."
|
|
||||||
|
|
||||||
.PHONY: coverage
|
|
||||||
coverage:
|
|
||||||
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
|
|
||||||
@echo "Testing of coverage in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/coverage/python.txt."
|
|
||||||
|
|
||||||
.PHONY: xml
|
|
||||||
xml:
|
|
||||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
|
||||||
|
|
||||||
.PHONY: pseudoxml
|
|
||||||
pseudoxml:
|
|
||||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
|
||||||
|
|
||||||
.PHONY: dummy
|
|
||||||
dummy:
|
|
||||||
$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. Dummy builder generates no files."
|
|
0
docs/build/.empty
vendored
0
docs/build/.empty
vendored
281
docs/make.bat
281
docs/make.bat
@@ -1,281 +0,0 @@
|
|||||||
@ECHO OFF
|
|
||||||
|
|
||||||
REM Command file for Sphinx documentation
|
|
||||||
|
|
||||||
if "%SPHINXBUILD%" == "" (
|
|
||||||
set SPHINXBUILD=sphinx-build
|
|
||||||
)
|
|
||||||
set BUILDDIR=build
|
|
||||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
|
|
||||||
set I18NSPHINXOPTS=%SPHINXOPTS% source
|
|
||||||
if NOT "%PAPER%" == "" (
|
|
||||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
|
||||||
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "" goto help
|
|
||||||
|
|
||||||
if "%1" == "help" (
|
|
||||||
:help
|
|
||||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
|
||||||
echo. html to make standalone HTML files
|
|
||||||
echo. dirhtml to make HTML files named index.html in directories
|
|
||||||
echo. singlehtml to make a single large HTML file
|
|
||||||
echo. pickle to make pickle files
|
|
||||||
echo. json to make JSON files
|
|
||||||
echo. htmlhelp to make HTML files and a HTML help project
|
|
||||||
echo. qthelp to make HTML files and a qthelp project
|
|
||||||
echo. devhelp to make HTML files and a Devhelp project
|
|
||||||
echo. epub to make an epub
|
|
||||||
echo. epub3 to make an epub3
|
|
||||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
|
||||||
echo. text to make text files
|
|
||||||
echo. man to make manual pages
|
|
||||||
echo. texinfo to make Texinfo files
|
|
||||||
echo. gettext to make PO message catalogs
|
|
||||||
echo. changes to make an overview over all changed/added/deprecated items
|
|
||||||
echo. xml to make Docutils-native XML files
|
|
||||||
echo. pseudoxml to make pseudoxml-XML files for display purposes
|
|
||||||
echo. linkcheck to check all external links for integrity
|
|
||||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
|
||||||
echo. coverage to run coverage check of the documentation if enabled
|
|
||||||
echo. dummy to check syntax errors of document sources
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "clean" (
|
|
||||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
|
||||||
del /q /s %BUILDDIR%\*
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
REM Check if sphinx-build is available and fallback to Python version if any
|
|
||||||
%SPHINXBUILD% 1>NUL 2>NUL
|
|
||||||
if errorlevel 9009 goto sphinx_python
|
|
||||||
goto sphinx_ok
|
|
||||||
|
|
||||||
:sphinx_python
|
|
||||||
|
|
||||||
set SPHINXBUILD=python -m sphinx.__init__
|
|
||||||
%SPHINXBUILD% 2> nul
|
|
||||||
if errorlevel 9009 (
|
|
||||||
echo.
|
|
||||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
|
||||||
echo.installed, then set the SPHINXBUILD environment variable to point
|
|
||||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
|
||||||
echo.may add the Sphinx directory to PATH.
|
|
||||||
echo.
|
|
||||||
echo.If you don't have Sphinx installed, grab it from
|
|
||||||
echo.http://sphinx-doc.org/
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
:sphinx_ok
|
|
||||||
|
|
||||||
|
|
||||||
if "%1" == "html" (
|
|
||||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "dirhtml" (
|
|
||||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "singlehtml" (
|
|
||||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "pickle" (
|
|
||||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished; now you can process the pickle files.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "json" (
|
|
||||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished; now you can process the JSON files.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "htmlhelp" (
|
|
||||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
|
||||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "qthelp" (
|
|
||||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
|
||||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
|
||||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Home-Assistant.qhcp
|
|
||||||
echo.To view the help file:
|
|
||||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Home-Assistant.ghc
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "devhelp" (
|
|
||||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "epub" (
|
|
||||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "epub3" (
|
|
||||||
%SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The epub3 file is in %BUILDDIR%/epub3.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "latex" (
|
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "latexpdf" (
|
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
|
||||||
cd %BUILDDIR%/latex
|
|
||||||
make all-pdf
|
|
||||||
cd %~dp0
|
|
||||||
echo.
|
|
||||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "latexpdfja" (
|
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
|
||||||
cd %BUILDDIR%/latex
|
|
||||||
make all-pdf-ja
|
|
||||||
cd %~dp0
|
|
||||||
echo.
|
|
||||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "text" (
|
|
||||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "man" (
|
|
||||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "texinfo" (
|
|
||||||
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "gettext" (
|
|
||||||
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "changes" (
|
|
||||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.The overview file is in %BUILDDIR%/changes.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "linkcheck" (
|
|
||||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Link check complete; look for any errors in the above output ^
|
|
||||||
or in %BUILDDIR%/linkcheck/output.txt.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "doctest" (
|
|
||||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Testing of doctests in the sources finished, look at the ^
|
|
||||||
results in %BUILDDIR%/doctest/output.txt.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "coverage" (
|
|
||||||
%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Testing of coverage in the sources finished, look at the ^
|
|
||||||
results in %BUILDDIR%/coverage/python.txt.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "xml" (
|
|
||||||
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The XML files are in %BUILDDIR%/xml.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "pseudoxml" (
|
|
||||||
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%1" == "dummy" (
|
|
||||||
%SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy
|
|
||||||
if errorlevel 1 exit /b 1
|
|
||||||
echo.
|
|
||||||
echo.Build finished. Dummy builder generates no files.
|
|
||||||
goto end
|
|
||||||
)
|
|
||||||
|
|
||||||
:end
|
|
Binary file not shown.
Before Width: | Height: | Size: 174 KiB |
Binary file not shown.
Before Width: | Height: | Size: 226 KiB |
@@ -1,45 +0,0 @@
|
|||||||
"""Sphinx extension for ReadTheDocs-style "Edit on GitHub" links on the sidebar.
|
|
||||||
|
|
||||||
Loosely based on https://github.com/astropy/astropy/pull/347
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import warnings
|
|
||||||
|
|
||||||
__licence__ = "BSD (3 clause)"
|
|
||||||
|
|
||||||
|
|
||||||
def get_github_url(app, view, path):
|
|
||||||
"""Build the GitHub URL."""
|
|
||||||
return (
|
|
||||||
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):
|
|
||||||
"""Build the HTML page."""
|
|
||||||
if templatename != "page.html":
|
|
||||||
return
|
|
||||||
|
|
||||||
if not app.config.edit_on_github_project:
|
|
||||||
warnings.warn("edit_on_github_project not specified")
|
|
||||||
return
|
|
||||||
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)
|
|
||||||
|
|
||||||
context["show_on_github_url"] = show_url
|
|
||||||
context["edit_on_github_url"] = edit_url
|
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
|
||||||
"""Set up the 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)
|
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
Binary file not shown.
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 13 KiB |
@@ -1,6 +0,0 @@
|
|||||||
<ul>
|
|
||||||
<li><a href="https://home-assistant.io/">Homepage</a></li>
|
|
||||||
<li><a href="https://community.home-assistant.io">Community Forums</a></li>
|
|
||||||
<li><a href="https://github.com/home-assistant/core">GitHub</a></li>
|
|
||||||
<li><a href="https://discord.gg/c5DvZ4e">Discord</a></li>
|
|
||||||
</ul>
|
|
@@ -1,13 +0,0 @@
|
|||||||
{%- if show_source and has_source and sourcename %}
|
|
||||||
<h3>{{ _('This Page') }}</h3>
|
|
||||||
<ul class="this-page-menu">
|
|
||||||
{%- if show_on_github_url %}
|
|
||||||
<li><a href="{{ show_on_github_url }}"
|
|
||||||
rel="nofollow">{{ _('Show on GitHub') }}</a></li>
|
|
||||||
{%- endif %}
|
|
||||||
{%- if edit_on_github_url %}
|
|
||||||
<li><a href="{{ edit_on_github_url }}"
|
|
||||||
rel="nofollow">{{ _('Edit on GitHub') }}</a></li>
|
|
||||||
{%- endif %}
|
|
||||||
</ul>
|
|
||||||
{%- endif %}
|
|
@@ -1,29 +0,0 @@
|
|||||||
: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 +0,0 @@
|
|||||||
.. _bootstrap_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.bootstrap`
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.bootstrap
|
|
||||||
:members:
|
|
@@ -1,170 +0,0 @@
|
|||||||
: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:
|
|
@@ -1,7 +0,0 @@
|
|||||||
.. _config_entries_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.config_entries`
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.config_entries
|
|
||||||
:members:
|
|
@@ -1,7 +0,0 @@
|
|||||||
.. _core_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.core`
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.core
|
|
||||||
:members:
|
|
@@ -1,7 +0,0 @@
|
|||||||
.. _data_entry_flow_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.data_entry_flow`
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.data_entry_flow
|
|
||||||
:members:
|
|
@@ -1,7 +0,0 @@
|
|||||||
.. _exceptions_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.exceptions`
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.exceptions
|
|
||||||
:members:
|
|
@@ -1,335 +0,0 @@
|
|||||||
:mod:`homeassistant.helpers`
|
|
||||||
============================
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.aiohttp\_client
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.aiohttp_client
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.area\_registry
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.area_registry
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
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
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.config_entry_flow
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
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
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.data_entry_flow
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
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
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.device_registry
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.discovery
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.discovery
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.dispatcher
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.dispatcher
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entity
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entity
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entity\_component
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entity_component
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entity\_platform
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entity_platform
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entity\_registry
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entity_registry
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entity\_values
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entity_values
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.entityfilter
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.entityfilter
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.event
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.event
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.icon
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.icon
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
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
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.json
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.location
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.location
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.logging
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.logging
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
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
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.script
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.service
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.service
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.signal
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.signal
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.state
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.state
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.storage
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.storage
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.sun
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.sun
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.system\_info
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.system_info
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.temperature
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.temperature
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.template
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.template
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.translation
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.translation
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.typing
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.typing
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.helpers.update\_coordinator
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.helpers.update_coordinator
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
@@ -1,7 +0,0 @@
|
|||||||
.. _loader_module:
|
|
||||||
|
|
||||||
:mod:`homeassistant.loader`
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.loader
|
|
||||||
:members:
|
|
@@ -1,151 +0,0 @@
|
|||||||
:mod:`homeassistant.util`
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.util
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.util.yaml
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
.. automodule:: homeassistant.util.yaml
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
homeassistant.util.aiohttp
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
.. 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.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,438 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""Home Assistant documentation build configuration file.
|
|
||||||
|
|
||||||
This file is execfile()d with the current directory set to its
|
|
||||||
containing dir.
|
|
||||||
|
|
||||||
Note that not all possible configuration values are present in this
|
|
||||||
autogenerated file.
|
|
||||||
|
|
||||||
All configuration values have a default; values that are commented out
|
|
||||||
serve to show the default.
|
|
||||||
|
|
||||||
If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
add these directories to sys.path here. If the directory is relative to the
|
|
||||||
documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import inspect
|
|
||||||
import os
|
|
||||||
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 = 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 = 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"))
|
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
#
|
|
||||||
# needs_sphinx = '1.0'
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
||||||
# ones.
|
|
||||||
extensions = [
|
|
||||||
"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"]
|
|
||||||
|
|
||||||
# The suffix(es) of source filenames.
|
|
||||||
# You can specify multiple suffix as a list of string:
|
|
||||||
#
|
|
||||||
# source_suffix = ['.rst', '.md']
|
|
||||||
source_suffix = ".rst"
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#
|
|
||||||
# source_encoding = 'utf-8-sig'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = "index"
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
project = PROJECT_NAME
|
|
||||||
copyright = PROJECT_COPYRIGHT
|
|
||||||
author = PROJECT_AUTHOR
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
|
||||||
version = __short_version__
|
|
||||||
# The full version, including alpha/beta/rc tags.
|
|
||||||
release = __version__
|
|
||||||
|
|
||||||
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/"
|
|
||||||
|
|
||||||
|
|
||||||
def linkcode_resolve(domain, info):
|
|
||||||
"""Determine the URL corresponding to Python object."""
|
|
||||||
if domain != "py":
|
|
||||||
return None
|
|
||||||
modname = info["module"]
|
|
||||||
fullname = info["fullname"]
|
|
||||||
submod = sys.modules.get(modname)
|
|
||||||
if submod is None:
|
|
||||||
return None
|
|
||||||
obj = submod
|
|
||||||
for part in fullname.split("."):
|
|
||||||
try:
|
|
||||||
obj = getattr(obj, part)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
return None
|
|
||||||
try:
|
|
||||||
fn = inspect.getsourcefile(obj)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
fn = None
|
|
||||||
if not fn:
|
|
||||||
return None
|
|
||||||
try:
|
|
||||||
source, lineno = inspect.findsource(obj)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
lineno = None
|
|
||||||
if lineno:
|
|
||||||
linespec = "#L%d" % (lineno + 1)
|
|
||||||
else:
|
|
||||||
linespec = ""
|
|
||||||
index = fn.find("/homeassistant/")
|
|
||||||
if index == -1:
|
|
||||||
index = 0
|
|
||||||
|
|
||||||
fn = fn[index:]
|
|
||||||
|
|
||||||
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.
|
|
||||||
#
|
|
||||||
# This is also used if you do content translation via gettext catalogs.
|
|
||||||
# Usually you set "language" from the command line for these cases.
|
|
||||||
language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#
|
|
||||||
# today = ''
|
|
||||||
#
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#
|
|
||||||
# today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
# This patterns also effect to html_static_path and html_extra_path
|
|
||||||
exclude_patterns = []
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all
|
|
||||||
# documents.
|
|
||||||
#
|
|
||||||
# default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#
|
|
||||||
# add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#
|
|
||||||
# add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
#
|
|
||||||
# show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = "sphinx"
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
# modindex_common_prefix = []
|
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
||||||
# keep_warnings = False
|
|
||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
|
||||||
todo_include_todos = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
||||||
# a list of builtin themes.
|
|
||||||
#
|
|
||||||
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,
|
|
||||||
"touch_icon": "logo-apple.png",
|
|
||||||
# 'fixed_sidebar': True, # Re-enable when we have more content
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
# html_theme_path = []
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents.
|
|
||||||
# "<project> v<release> documentation" by default.
|
|
||||||
#
|
|
||||||
# html_title = 'Home-Assistant v0.27.0'
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#
|
|
||||||
# html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#
|
|
||||||
# html_logo = '_static/logo.png'
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to use as a favicon of
|
|
||||||
# the docs.
|
|
||||||
# This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#
|
|
||||||
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"]
|
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
|
||||||
# directly to the root of the documentation.
|
|
||||||
#
|
|
||||||
# html_extra_path = []
|
|
||||||
|
|
||||||
# If not None, a 'Last updated on:' timestamp is inserted at every page
|
|
||||||
# bottom, using the given strftime format.
|
|
||||||
# The empty string is equivalent to '%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.
|
|
||||||
#
|
|
||||||
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",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#
|
|
||||||
# html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
#
|
|
||||||
# html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#
|
|
||||||
# html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#
|
|
||||||
# html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
#
|
|
||||||
# html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
#
|
|
||||||
# html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#
|
|
||||||
# html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
# html_file_suffix = None
|
|
||||||
|
|
||||||
# Language to be used for generating the HTML full-text search index.
|
|
||||||
# Sphinx supports the following languages:
|
|
||||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
|
|
||||||
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh'
|
|
||||||
#
|
|
||||||
# html_search_language = 'en'
|
|
||||||
|
|
||||||
# A dictionary with options for the search language support, empty by default.
|
|
||||||
# 'ja' uses this config value.
|
|
||||||
# 'zh' user can custom change `jieba` dictionary path.
|
|
||||||
#
|
|
||||||
# html_search_options = {'type': 'default'}
|
|
||||||
|
|
||||||
# The name of a javascript file (relative to the configuration directory) that
|
|
||||||
# implements a search results scorer. If empty, the default will be used.
|
|
||||||
#
|
|
||||||
# html_search_scorer = 'scorer.js'
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = "Home-Assistantdoc"
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
|
||||||
|
|
||||||
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',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (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",
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#
|
|
||||||
# latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#
|
|
||||||
# latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
#
|
|
||||||
# latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#
|
|
||||||
# latex_show_urls = False
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#
|
|
||||||
# latex_appendices = []
|
|
||||||
|
|
||||||
# It false, will not define \strong, \code, itleref, \crossref ... but only
|
|
||||||
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
|
|
||||||
# packages.
|
|
||||||
#
|
|
||||||
# latex_keep_old_macro_names = True
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ---------------------------------------
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#
|
|
||||||
# man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output -------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree into Texinfo files. List of tuples
|
|
||||||
# (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",
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#
|
|
||||||
# texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
#
|
|
||||||
# texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
#
|
|
||||||
# texinfo_no_detailmenu = False
|
|
@@ -1,22 +0,0 @@
|
|||||||
================================
|
|
||||||
Home Assistant API Documentation
|
|
||||||
================================
|
|
||||||
|
|
||||||
Public API documentation for `Home Assistant developers`_.
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
:glob:
|
|
||||||
|
|
||||||
api/*
|
|
||||||
|
|
||||||
Indices and tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`modindex`
|
|
||||||
* :ref:`search`
|
|
||||||
|
|
||||||
.. _Home Assistant developers: https://developers.home-assistant.io/
|
|
@@ -93,7 +93,9 @@ def get_arguments() -> argparse.Namespace:
|
|||||||
help="Directory that contains the Home Assistant configuration",
|
help="Directory that contains the Home Assistant configuration",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--safe-mode", action="store_true", help="Start Home Assistant in safe mode"
|
"--recovery-mode",
|
||||||
|
action="store_true",
|
||||||
|
help="Start Home Assistant in recovery mode",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--debug", action="store_true", help="Start Home Assistant in debug mode"
|
"--debug", action="store_true", help="Start Home Assistant in debug mode"
|
||||||
@@ -183,7 +185,9 @@ def main() -> int:
|
|||||||
ensure_config_path(config_dir)
|
ensure_config_path(config_dir)
|
||||||
|
|
||||||
# pylint: disable-next=import-outside-toplevel
|
# pylint: disable-next=import-outside-toplevel
|
||||||
from . import runner
|
from . import config, runner
|
||||||
|
|
||||||
|
safe_mode = config.safe_mode_enabled(config_dir)
|
||||||
|
|
||||||
runtime_conf = runner.RuntimeConfig(
|
runtime_conf = runner.RuntimeConfig(
|
||||||
config_dir=config_dir,
|
config_dir=config_dir,
|
||||||
@@ -193,9 +197,10 @@ def main() -> int:
|
|||||||
log_no_color=args.log_no_color,
|
log_no_color=args.log_no_color,
|
||||||
skip_pip=args.skip_pip,
|
skip_pip=args.skip_pip,
|
||||||
skip_pip_packages=args.skip_pip_packages,
|
skip_pip_packages=args.skip_pip_packages,
|
||||||
safe_mode=args.safe_mode,
|
recovery_mode=args.recovery_mode,
|
||||||
debug=args.debug,
|
debug=args.debug,
|
||||||
open_ui=args.open_ui,
|
open_ui=args.open_ui,
|
||||||
|
safe_mode=safe_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
fault_file_name = os.path.join(config_dir, FAULT_LOG_FILENAME)
|
fault_file_name = os.path.join(config_dir, FAULT_LOG_FILENAME)
|
||||||
|
@@ -5,6 +5,7 @@ import asyncio
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from collections.abc import Mapping
|
from collections.abc import Mapping
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
import time
|
||||||
from typing import Any, cast
|
from typing import Any, cast
|
||||||
|
|
||||||
import jwt
|
import jwt
|
||||||
@@ -12,7 +13,6 @@ import jwt
|
|||||||
from homeassistant import data_entry_flow
|
from homeassistant import data_entry_flow
|
||||||
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
|
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
|
||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.util import dt as dt_util
|
|
||||||
|
|
||||||
from . import auth_store, jwt_wrapper, models
|
from . import auth_store, jwt_wrapper, models
|
||||||
from .const import ACCESS_TOKEN_EXPIRATION, GROUP_ID_ADMIN
|
from .const import ACCESS_TOKEN_EXPIRATION, GROUP_ID_ADMIN
|
||||||
@@ -280,7 +280,8 @@ class AuthManager:
|
|||||||
credentials=credentials,
|
credentials=credentials,
|
||||||
name=info.name,
|
name=info.name,
|
||||||
is_active=info.is_active,
|
is_active=info.is_active,
|
||||||
group_ids=[GROUP_ID_ADMIN],
|
group_ids=[GROUP_ID_ADMIN if info.group is None else info.group],
|
||||||
|
local_only=info.local_only,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.hass.bus.async_fire(EVENT_USER_ADDED, {"user_id": user.id})
|
self.hass.bus.async_fire(EVENT_USER_ADDED, {"user_id": user.id})
|
||||||
@@ -505,12 +506,13 @@ class AuthManager:
|
|||||||
|
|
||||||
self._store.async_log_refresh_token_usage(refresh_token, remote_ip)
|
self._store.async_log_refresh_token_usage(refresh_token, remote_ip)
|
||||||
|
|
||||||
now = dt_util.utcnow()
|
now = int(time.time())
|
||||||
|
expire_seconds = int(refresh_token.access_token_expiration.total_seconds())
|
||||||
return jwt.encode(
|
return jwt.encode(
|
||||||
{
|
{
|
||||||
"iss": refresh_token.id,
|
"iss": refresh_token.id,
|
||||||
"iat": now,
|
"iat": now,
|
||||||
"exp": now + refresh_token.access_token_expiration,
|
"exp": now + expire_seconds,
|
||||||
},
|
},
|
||||||
refresh_token.jwt_key,
|
refresh_token.jwt_key,
|
||||||
algorithm="HS256",
|
algorithm="HS256",
|
||||||
|
@@ -50,7 +50,7 @@ class MultiFactorAuthModule:
|
|||||||
|
|
||||||
Default is same as type
|
Default is same as type
|
||||||
"""
|
"""
|
||||||
return self.config.get(CONF_ID, self.type)
|
return self.config.get(CONF_ID, self.type) # type: ignore[no-any-return]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type(self) -> str:
|
def type(self) -> str:
|
||||||
@@ -60,7 +60,7 @@ class MultiFactorAuthModule:
|
|||||||
@property
|
@property
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
"""Return the name of the auth module."""
|
"""Return the name of the auth module."""
|
||||||
return self.config.get(CONF_NAME, self.DEFAULT_TITLE)
|
return self.config.get(CONF_NAME, self.DEFAULT_TITLE) # type: ignore[no-any-return]
|
||||||
|
|
||||||
# Implement by extending class
|
# Implement by extending class
|
||||||
|
|
||||||
|
@@ -134,3 +134,5 @@ class UserMeta(NamedTuple):
|
|||||||
|
|
||||||
name: str | None
|
name: str | None
|
||||||
is_active: bool
|
is_active: bool
|
||||||
|
group: str | None = None
|
||||||
|
local_only: bool | None = None
|
||||||
|
@@ -1,32 +1,25 @@
|
|||||||
"""Permission constants for the websocket API.
|
"""Permission for events."""
|
||||||
|
|
||||||
Separate file to avoid circular imports.
|
|
||||||
"""
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Final
|
from typing import Final
|
||||||
|
|
||||||
from homeassistant.components.frontend import EVENT_PANELS_UPDATED
|
|
||||||
from homeassistant.components.lovelace import EVENT_LOVELACE_UPDATED
|
|
||||||
from homeassistant.components.persistent_notification import (
|
|
||||||
EVENT_PERSISTENT_NOTIFICATIONS_UPDATED,
|
|
||||||
)
|
|
||||||
from homeassistant.components.recorder import (
|
|
||||||
EVENT_RECORDER_5MIN_STATISTICS_GENERATED,
|
|
||||||
EVENT_RECORDER_HOURLY_STATISTICS_GENERATED,
|
|
||||||
)
|
|
||||||
from homeassistant.components.shopping_list import EVENT_SHOPPING_LIST_UPDATED
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
EVENT_COMPONENT_LOADED,
|
EVENT_COMPONENT_LOADED,
|
||||||
EVENT_CORE_CONFIG_UPDATE,
|
EVENT_CORE_CONFIG_UPDATE,
|
||||||
|
EVENT_LOVELACE_UPDATED,
|
||||||
|
EVENT_PANELS_UPDATED,
|
||||||
|
EVENT_RECORDER_5MIN_STATISTICS_GENERATED,
|
||||||
|
EVENT_RECORDER_HOURLY_STATISTICS_GENERATED,
|
||||||
EVENT_SERVICE_REGISTERED,
|
EVENT_SERVICE_REGISTERED,
|
||||||
EVENT_SERVICE_REMOVED,
|
EVENT_SERVICE_REMOVED,
|
||||||
|
EVENT_SHOPPING_LIST_UPDATED,
|
||||||
EVENT_STATE_CHANGED,
|
EVENT_STATE_CHANGED,
|
||||||
EVENT_THEMES_UPDATED,
|
EVENT_THEMES_UPDATED,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers.area_registry import EVENT_AREA_REGISTRY_UPDATED
|
from homeassistant.helpers.area_registry import EVENT_AREA_REGISTRY_UPDATED
|
||||||
from homeassistant.helpers.device_registry import EVENT_DEVICE_REGISTRY_UPDATED
|
from homeassistant.helpers.device_registry import EVENT_DEVICE_REGISTRY_UPDATED
|
||||||
from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED
|
from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED
|
||||||
|
from homeassistant.helpers.issue_registry import EVENT_REPAIRS_ISSUE_REGISTRY_UPDATED
|
||||||
|
|
||||||
# These are events that do not contain any sensitive data
|
# These are events that do not contain any sensitive data
|
||||||
# Except for state_changed, which is handled accordingly.
|
# Except for state_changed, which is handled accordingly.
|
||||||
@@ -36,9 +29,9 @@ SUBSCRIBE_ALLOWLIST: Final[set[str]] = {
|
|||||||
EVENT_CORE_CONFIG_UPDATE,
|
EVENT_CORE_CONFIG_UPDATE,
|
||||||
EVENT_DEVICE_REGISTRY_UPDATED,
|
EVENT_DEVICE_REGISTRY_UPDATED,
|
||||||
EVENT_ENTITY_REGISTRY_UPDATED,
|
EVENT_ENTITY_REGISTRY_UPDATED,
|
||||||
|
EVENT_REPAIRS_ISSUE_REGISTRY_UPDATED,
|
||||||
EVENT_LOVELACE_UPDATED,
|
EVENT_LOVELACE_UPDATED,
|
||||||
EVENT_PANELS_UPDATED,
|
EVENT_PANELS_UPDATED,
|
||||||
EVENT_PERSISTENT_NOTIFICATIONS_UPDATED,
|
|
||||||
EVENT_RECORDER_5MIN_STATISTICS_GENERATED,
|
EVENT_RECORDER_5MIN_STATISTICS_GENERATED,
|
||||||
EVENT_RECORDER_HOURLY_STATISTICS_GENERATED,
|
EVENT_RECORDER_HOURLY_STATISTICS_GENERATED,
|
||||||
EVENT_SERVICE_REGISTERED,
|
EVENT_SERVICE_REGISTERED,
|
@@ -5,9 +5,7 @@ from collections.abc import Mapping
|
|||||||
|
|
||||||
ValueType = (
|
ValueType = (
|
||||||
# Example: entities.all = { read: true, control: true }
|
# Example: entities.all = { read: true, control: true }
|
||||||
Mapping[str, bool]
|
Mapping[str, bool] | bool | None
|
||||||
| bool
|
|
||||||
| None
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Example: entities.domains = { light: … }
|
# Example: entities.domains = { light: … }
|
||||||
|
@@ -109,4 +109,4 @@ def test_all(policy: CategoryType, key: str) -> bool:
|
|||||||
if not isinstance(all_policy, dict):
|
if not isinstance(all_policy, dict):
|
||||||
return bool(all_policy)
|
return bool(all_policy)
|
||||||
|
|
||||||
return all_policy.get(key, False)
|
return all_policy.get(key, False) # type: ignore[no-any-return]
|
||||||
|
@@ -67,7 +67,7 @@ class AuthProvider:
|
|||||||
@property
|
@property
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
"""Return the name of the auth provider."""
|
"""Return the name of the auth provider."""
|
||||||
return self.config.get(CONF_NAME, self.DEFAULT_TITLE)
|
return self.config.get(CONF_NAME, self.DEFAULT_TITLE) # type: ignore[no-any-return]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def support_mfa(self) -> bool:
|
def support_mfa(self) -> bool:
|
||||||
|
@@ -44,7 +44,11 @@ class CommandLineAuthProvider(AuthProvider):
|
|||||||
DEFAULT_TITLE = "Command Line Authentication"
|
DEFAULT_TITLE = "Command Line Authentication"
|
||||||
|
|
||||||
# which keys to accept from a program's stdout
|
# which keys to accept from a program's stdout
|
||||||
ALLOWED_META_KEYS = ("name",)
|
ALLOWED_META_KEYS = (
|
||||||
|
"name",
|
||||||
|
"group",
|
||||||
|
"local_only",
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||||||
"""Extend parent's __init__.
|
"""Extend parent's __init__.
|
||||||
@@ -118,10 +122,15 @@ class CommandLineAuthProvider(AuthProvider):
|
|||||||
) -> UserMeta:
|
) -> UserMeta:
|
||||||
"""Return extra user metadata for credentials.
|
"""Return extra user metadata for credentials.
|
||||||
|
|
||||||
Currently, only name is supported.
|
Currently, supports name, group and local_only.
|
||||||
"""
|
"""
|
||||||
meta = self._user_meta.get(credentials.data["username"], {})
|
meta = self._user_meta.get(credentials.data["username"], {})
|
||||||
return UserMeta(name=meta.get("name"), is_active=True)
|
return UserMeta(
|
||||||
|
name=meta.get("name"),
|
||||||
|
is_active=True,
|
||||||
|
group=meta.get("group"),
|
||||||
|
local_only=meta.get("local_only") == "true",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CommandLineLoginFlow(LoginFlow):
|
class CommandLineLoginFlow(LoginFlow):
|
||||||
|
@@ -10,10 +10,11 @@ from typing import Any, cast
|
|||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import async_get_hass, callback
|
||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
||||||
|
|
||||||
from ..models import Credentials, UserMeta
|
from ..models import Credentials, UserMeta
|
||||||
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
||||||
@@ -21,10 +22,28 @@ from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
|
|||||||
AUTH_PROVIDER_TYPE = "legacy_api_password"
|
AUTH_PROVIDER_TYPE = "legacy_api_password"
|
||||||
CONF_API_PASSWORD = "api_password"
|
CONF_API_PASSWORD = "api_password"
|
||||||
|
|
||||||
CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend(
|
_CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend(
|
||||||
{vol.Required(CONF_API_PASSWORD): cv.string}, extra=vol.PREVENT_EXTRA
|
{vol.Required(CONF_API_PASSWORD): cv.string}, extra=vol.PREVENT_EXTRA
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _create_repair_and_validate(config: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
async_create_issue(
|
||||||
|
async_get_hass(),
|
||||||
|
"auth",
|
||||||
|
"deprecated_legacy_api_password",
|
||||||
|
breaks_in_ha_version="2024.6.0",
|
||||||
|
is_fixable=False,
|
||||||
|
severity=IssueSeverity.WARNING,
|
||||||
|
translation_key="deprecated_legacy_api_password",
|
||||||
|
)
|
||||||
|
|
||||||
|
return _CONFIG_SCHEMA(config) # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = _create_repair_and_validate
|
||||||
|
|
||||||
|
|
||||||
LEGACY_USER_NAME = "Legacy API password user"
|
LEGACY_USER_NAME = "Legacy API password user"
|
||||||
|
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@ from homeassistant.core import callback
|
|||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.network import is_cloud_connection
|
||||||
|
|
||||||
from .. import InvalidAuthError
|
from .. import InvalidAuthError
|
||||||
from ..models import Credentials, RefreshToken, UserMeta
|
from ..models import Credentials, RefreshToken, UserMeta
|
||||||
@@ -192,11 +193,8 @@ class TrustedNetworksAuthProvider(AuthProvider):
|
|||||||
if any(ip_addr in trusted_proxy for trusted_proxy in self.trusted_proxies):
|
if any(ip_addr in trusted_proxy for trusted_proxy in self.trusted_proxies):
|
||||||
raise InvalidAuthError("Can't allow access from a proxy server")
|
raise InvalidAuthError("Can't allow access from a proxy server")
|
||||||
|
|
||||||
if "cloud" in self.hass.config.components:
|
if is_cloud_connection(self.hass):
|
||||||
from hass_nabucasa import remote # pylint: disable=import-outside-toplevel
|
raise InvalidAuthError("Can't allow access from Home Assistant Cloud")
|
||||||
|
|
||||||
if remote.is_cloud_request.get():
|
|
||||||
raise InvalidAuthError("Can't allow access from Home Assistant Cloud")
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_validate_refresh_token(
|
def async_validate_refresh_token(
|
||||||
|
279
homeassistant/backports/LICENSE.Python
Normal file
279
homeassistant/backports/LICENSE.Python
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
A. HISTORY OF THE SOFTWARE
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Python was created in the early 1990s by Guido van Rossum at Stichting
|
||||||
|
Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
|
||||||
|
as a successor of a language called ABC. Guido remains Python's
|
||||||
|
principal author, although it includes many contributions from others.
|
||||||
|
|
||||||
|
In 1995, Guido continued his work on Python at the Corporation for
|
||||||
|
National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
|
||||||
|
in Reston, Virginia where he released several versions of the
|
||||||
|
software.
|
||||||
|
|
||||||
|
In May 2000, Guido and the Python core development team moved to
|
||||||
|
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
|
||||||
|
year, the PythonLabs team moved to Digital Creations, which became
|
||||||
|
Zope Corporation. In 2001, the Python Software Foundation (PSF, see
|
||||||
|
https://www.python.org/psf/) was formed, a non-profit organization
|
||||||
|
created specifically to own Python-related Intellectual Property.
|
||||||
|
Zope Corporation was a sponsoring member of the PSF.
|
||||||
|
|
||||||
|
All Python releases are Open Source (see https://opensource.org for
|
||||||
|
the Open Source Definition). Historically, most, but not all, Python
|
||||||
|
releases have also been GPL-compatible; the table below summarizes
|
||||||
|
the various releases.
|
||||||
|
|
||||||
|
Release Derived Year Owner GPL-
|
||||||
|
from compatible? (1)
|
||||||
|
|
||||||
|
0.9.0 thru 1.2 1991-1995 CWI yes
|
||||||
|
1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
|
||||||
|
1.6 1.5.2 2000 CNRI no
|
||||||
|
2.0 1.6 2000 BeOpen.com no
|
||||||
|
1.6.1 1.6 2001 CNRI yes (2)
|
||||||
|
2.1 2.0+1.6.1 2001 PSF no
|
||||||
|
2.0.1 2.0+1.6.1 2001 PSF yes
|
||||||
|
2.1.1 2.1+2.0.1 2001 PSF yes
|
||||||
|
2.1.2 2.1.1 2002 PSF yes
|
||||||
|
2.1.3 2.1.2 2002 PSF yes
|
||||||
|
2.2 and above 2.1.1 2001-now PSF yes
|
||||||
|
|
||||||
|
Footnotes:
|
||||||
|
|
||||||
|
(1) GPL-compatible doesn't mean that we're distributing Python under
|
||||||
|
the GPL. All Python licenses, unlike the GPL, let you distribute
|
||||||
|
a modified version without making your changes open source. The
|
||||||
|
GPL-compatible licenses make it possible to combine Python with
|
||||||
|
other software that is released under the GPL; the others don't.
|
||||||
|
|
||||||
|
(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
|
||||||
|
because its license has a choice of law clause. According to
|
||||||
|
CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
|
||||||
|
is "not incompatible" with the GPL.
|
||||||
|
|
||||||
|
Thanks to the many outside volunteers who have worked under Guido's
|
||||||
|
direction to make these releases possible.
|
||||||
|
|
||||||
|
|
||||||
|
B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
Python software and documentation are licensed under the
|
||||||
|
Python Software Foundation License Version 2.
|
||||||
|
|
||||||
|
Starting with Python 3.8.6, examples, recipes, and other code in
|
||||||
|
the documentation are dual licensed under the PSF License Version 2
|
||||||
|
and the Zero-Clause BSD license.
|
||||||
|
|
||||||
|
Some software incorporated into Python is under different licenses.
|
||||||
|
The licenses are listed with code falling under that license.
|
||||||
|
|
||||||
|
|
||||||
|
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
1. This LICENSE AGREEMENT is between the Python Software Foundation
|
||||||
|
("PSF"), and the Individual or Organization ("Licensee") accessing and
|
||||||
|
otherwise using this software ("Python") in source or binary form and
|
||||||
|
its associated documentation.
|
||||||
|
|
||||||
|
2. Subject to the terms and conditions of this License Agreement, PSF hereby
|
||||||
|
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
|
||||||
|
analyze, test, perform and/or display publicly, prepare derivative works,
|
||||||
|
distribute, and otherwise use Python alone or in any derivative version,
|
||||||
|
provided, however, that PSF's License Agreement and PSF's notice of copyright,
|
||||||
|
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||||
|
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
|
||||||
|
All Rights Reserved" are retained in Python alone or in any derivative version
|
||||||
|
prepared by Licensee.
|
||||||
|
|
||||||
|
3. In the event Licensee prepares a derivative work that is based on
|
||||||
|
or incorporates Python or any part thereof, and wants to make
|
||||||
|
the derivative work available to others as provided herein, then
|
||||||
|
Licensee hereby agrees to include in any such work a brief summary of
|
||||||
|
the changes made to Python.
|
||||||
|
|
||||||
|
4. PSF is making Python available to Licensee on an "AS IS"
|
||||||
|
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||||
|
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
|
||||||
|
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||||
|
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
|
||||||
|
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||||
|
|
||||||
|
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
||||||
|
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
||||||
|
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
|
||||||
|
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||||
|
|
||||||
|
6. This License Agreement will automatically terminate upon a material
|
||||||
|
breach of its terms and conditions.
|
||||||
|
|
||||||
|
7. Nothing in this License Agreement shall be deemed to create any
|
||||||
|
relationship of agency, partnership, or joint venture between PSF and
|
||||||
|
Licensee. This License Agreement does not grant permission to use PSF
|
||||||
|
trademarks or trade name in a trademark sense to endorse or promote
|
||||||
|
products or services of Licensee, or any third party.
|
||||||
|
|
||||||
|
8. By copying, installing or otherwise using Python, Licensee
|
||||||
|
agrees to be bound by the terms and conditions of this License
|
||||||
|
Agreement.
|
||||||
|
|
||||||
|
|
||||||
|
BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
|
||||||
|
|
||||||
|
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
|
||||||
|
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
|
||||||
|
Individual or Organization ("Licensee") accessing and otherwise using
|
||||||
|
this software in source or binary form and its associated
|
||||||
|
documentation ("the Software").
|
||||||
|
|
||||||
|
2. Subject to the terms and conditions of this BeOpen Python License
|
||||||
|
Agreement, BeOpen hereby grants Licensee a non-exclusive,
|
||||||
|
royalty-free, world-wide license to reproduce, analyze, test, perform
|
||||||
|
and/or display publicly, prepare derivative works, distribute, and
|
||||||
|
otherwise use the Software alone or in any derivative version,
|
||||||
|
provided, however, that the BeOpen Python License is retained in the
|
||||||
|
Software, alone or in any derivative version prepared by Licensee.
|
||||||
|
|
||||||
|
3. BeOpen is making the Software available to Licensee on an "AS IS"
|
||||||
|
basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||||
|
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
|
||||||
|
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||||
|
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
|
||||||
|
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||||
|
|
||||||
|
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
|
||||||
|
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
|
||||||
|
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
|
||||||
|
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||||
|
|
||||||
|
5. This License Agreement will automatically terminate upon a material
|
||||||
|
breach of its terms and conditions.
|
||||||
|
|
||||||
|
6. This License Agreement shall be governed by and interpreted in all
|
||||||
|
respects by the law of the State of California, excluding conflict of
|
||||||
|
law provisions. Nothing in this License Agreement shall be deemed to
|
||||||
|
create any relationship of agency, partnership, or joint venture
|
||||||
|
between BeOpen and Licensee. This License Agreement does not grant
|
||||||
|
permission to use BeOpen trademarks or trade names in a trademark
|
||||||
|
sense to endorse or promote products or services of Licensee, or any
|
||||||
|
third party. As an exception, the "BeOpen Python" logos available at
|
||||||
|
http://www.pythonlabs.com/logos.html may be used according to the
|
||||||
|
permissions granted on that web page.
|
||||||
|
|
||||||
|
7. By copying, installing or otherwise using the software, Licensee
|
||||||
|
agrees to be bound by the terms and conditions of this License
|
||||||
|
Agreement.
|
||||||
|
|
||||||
|
|
||||||
|
CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
1. This LICENSE AGREEMENT is between the Corporation for National
|
||||||
|
Research Initiatives, having an office at 1895 Preston White Drive,
|
||||||
|
Reston, VA 20191 ("CNRI"), and the Individual or Organization
|
||||||
|
("Licensee") accessing and otherwise using Python 1.6.1 software in
|
||||||
|
source or binary form and its associated documentation.
|
||||||
|
|
||||||
|
2. Subject to the terms and conditions of this License Agreement, CNRI
|
||||||
|
hereby grants Licensee a nonexclusive, royalty-free, world-wide
|
||||||
|
license to reproduce, analyze, test, perform and/or display publicly,
|
||||||
|
prepare derivative works, distribute, and otherwise use Python 1.6.1
|
||||||
|
alone or in any derivative version, provided, however, that CNRI's
|
||||||
|
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
|
||||||
|
1995-2001 Corporation for National Research Initiatives; All Rights
|
||||||
|
Reserved" are retained in Python 1.6.1 alone or in any derivative
|
||||||
|
version prepared by Licensee. Alternately, in lieu of CNRI's License
|
||||||
|
Agreement, Licensee may substitute the following text (omitting the
|
||||||
|
quotes): "Python 1.6.1 is made available subject to the terms and
|
||||||
|
conditions in CNRI's License Agreement. This Agreement together with
|
||||||
|
Python 1.6.1 may be located on the internet using the following
|
||||||
|
unique, persistent identifier (known as a handle): 1895.22/1013. This
|
||||||
|
Agreement may also be obtained from a proxy server on the internet
|
||||||
|
using the following URL: http://hdl.handle.net/1895.22/1013".
|
||||||
|
|
||||||
|
3. In the event Licensee prepares a derivative work that is based on
|
||||||
|
or incorporates Python 1.6.1 or any part thereof, and wants to make
|
||||||
|
the derivative work available to others as provided herein, then
|
||||||
|
Licensee hereby agrees to include in any such work a brief summary of
|
||||||
|
the changes made to Python 1.6.1.
|
||||||
|
|
||||||
|
4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
|
||||||
|
basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||||
|
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
|
||||||
|
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||||
|
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
|
||||||
|
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||||
|
|
||||||
|
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
||||||
|
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
||||||
|
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
|
||||||
|
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||||
|
|
||||||
|
6. This License Agreement will automatically terminate upon a material
|
||||||
|
breach of its terms and conditions.
|
||||||
|
|
||||||
|
7. This License Agreement shall be governed by the federal
|
||||||
|
intellectual property law of the United States, including without
|
||||||
|
limitation the federal copyright law, and, to the extent such
|
||||||
|
U.S. federal law does not apply, by the law of the Commonwealth of
|
||||||
|
Virginia, excluding Virginia's conflict of law provisions.
|
||||||
|
Notwithstanding the foregoing, with regard to derivative works based
|
||||||
|
on Python 1.6.1 that incorporate non-separable material that was
|
||||||
|
previously distributed under the GNU General Public License (GPL), the
|
||||||
|
law of the Commonwealth of Virginia shall govern this License
|
||||||
|
Agreement only as to issues arising under or with respect to
|
||||||
|
Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
|
||||||
|
License Agreement shall be deemed to create any relationship of
|
||||||
|
agency, partnership, or joint venture between CNRI and Licensee. This
|
||||||
|
License Agreement does not grant permission to use CNRI trademarks or
|
||||||
|
trade name in a trademark sense to endorse or promote products or
|
||||||
|
services of Licensee, or any third party.
|
||||||
|
|
||||||
|
8. By clicking on the "ACCEPT" button where indicated, or by copying,
|
||||||
|
installing or otherwise using Python 1.6.1, Licensee agrees to be
|
||||||
|
bound by the terms and conditions of this License Agreement.
|
||||||
|
|
||||||
|
ACCEPT
|
||||||
|
|
||||||
|
|
||||||
|
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
|
||||||
|
The Netherlands. All rights reserved.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and its
|
||||||
|
documentation for any purpose and without fee is hereby granted,
|
||||||
|
provided that the above copyright notice appear in all copies and that
|
||||||
|
both that copyright notice and this permission notice appear in
|
||||||
|
supporting documentation, and that the name of Stichting Mathematisch
|
||||||
|
Centrum or CWI not be used in advertising or publicity pertaining to
|
||||||
|
distribution of the software without specific, written prior
|
||||||
|
permission.
|
||||||
|
|
||||||
|
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||||
|
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
||||||
|
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||||
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||||
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
PERFORMANCE OF THIS SOFTWARE.
|
5
homeassistant/backports/README
Normal file
5
homeassistant/backports/README
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
This package contains backports of Python functionality from future Python
|
||||||
|
versions.
|
||||||
|
|
||||||
|
Some of the backports have been copied directly from the CPython project,
|
||||||
|
and are subject to license agreement as detailed in LICENSE.Python.
|
@@ -1,4 +1,14 @@
|
|||||||
"""Functools backports from standard lib."""
|
"""Functools backports from standard lib."""
|
||||||
|
|
||||||
|
# This file contains parts of Python's module wrapper
|
||||||
|
# for the _functools C module
|
||||||
|
# to allow utilities written in Python to be added
|
||||||
|
# to the functools module.
|
||||||
|
# Written by Nick Coghlan <ncoghlan at gmail.com>,
|
||||||
|
# Raymond Hettinger <python at rcn.com>,
|
||||||
|
# and Łukasz Langa <lukasz at langa.pl>.
|
||||||
|
# Copyright © 2001-2023 Python Software Foundation; All Rights Reserved
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
@@ -68,4 +78,4 @@ class cached_property(Generic[_T]):
|
|||||||
raise TypeError(msg) from None
|
raise TypeError(msg) from None
|
||||||
return val
|
return val
|
||||||
|
|
||||||
__class_getitem__ = classmethod(GenericAlias)
|
__class_getitem__ = classmethod(GenericAlias) # type: ignore[var-annotated]
|
||||||
|
@@ -41,6 +41,7 @@ from .setup import (
|
|||||||
DATA_SETUP,
|
DATA_SETUP,
|
||||||
DATA_SETUP_STARTED,
|
DATA_SETUP_STARTED,
|
||||||
DATA_SETUP_TIME,
|
DATA_SETUP_TIME,
|
||||||
|
async_notify_setup_error,
|
||||||
async_set_domains_to_be_loaded,
|
async_set_domains_to_be_loaded,
|
||||||
async_setup_component,
|
async_setup_component,
|
||||||
)
|
)
|
||||||
@@ -120,6 +121,7 @@ async def async_setup_hass(
|
|||||||
runtime_config.log_no_color,
|
runtime_config.log_no_color,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
hass.config.safe_mode = runtime_config.safe_mode
|
||||||
hass.config.skip_pip = runtime_config.skip_pip
|
hass.config.skip_pip = runtime_config.skip_pip
|
||||||
hass.config.skip_pip_packages = runtime_config.skip_pip_packages
|
hass.config.skip_pip_packages = runtime_config.skip_pip_packages
|
||||||
if runtime_config.skip_pip or runtime_config.skip_pip_packages:
|
if runtime_config.skip_pip or runtime_config.skip_pip_packages:
|
||||||
@@ -137,14 +139,14 @@ async def async_setup_hass(
|
|||||||
config_dict = None
|
config_dict = None
|
||||||
basic_setup_success = False
|
basic_setup_success = False
|
||||||
|
|
||||||
if not (safe_mode := runtime_config.safe_mode):
|
if not (recovery_mode := runtime_config.recovery_mode):
|
||||||
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
|
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
config_dict = await conf_util.async_hass_config_yaml(hass)
|
config_dict = await conf_util.async_hass_config_yaml(hass)
|
||||||
except HomeAssistantError as err:
|
except HomeAssistantError as err:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"Failed to parse configuration.yaml: %s. Activating safe mode",
|
"Failed to parse configuration.yaml: %s. Activating recovery mode",
|
||||||
err,
|
err,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -156,24 +158,24 @@ async def async_setup_hass(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if config_dict is None:
|
if config_dict is None:
|
||||||
safe_mode = True
|
recovery_mode = True
|
||||||
|
|
||||||
elif not basic_setup_success:
|
elif not basic_setup_success:
|
||||||
_LOGGER.warning("Unable to set up core integrations. Activating safe mode")
|
_LOGGER.warning("Unable to set up core integrations. Activating recovery mode")
|
||||||
safe_mode = True
|
recovery_mode = True
|
||||||
|
|
||||||
elif (
|
elif (
|
||||||
"frontend" in hass.data.get(DATA_SETUP, {})
|
"frontend" in hass.data.get(DATA_SETUP, {})
|
||||||
and "frontend" not in hass.config.components
|
and "frontend" not in hass.config.components
|
||||||
):
|
):
|
||||||
_LOGGER.warning("Detected that frontend did not load. Activating safe mode")
|
_LOGGER.warning("Detected that frontend did not load. Activating recovery mode")
|
||||||
# Ask integrations to shut down. It's messy but we can't
|
# Ask integrations to shut down. It's messy but we can't
|
||||||
# do a clean stop without knowing what is broken
|
# do a clean stop without knowing what is broken
|
||||||
with contextlib.suppress(asyncio.TimeoutError):
|
with contextlib.suppress(asyncio.TimeoutError):
|
||||||
async with hass.timeout.async_timeout(10):
|
async with hass.timeout.async_timeout(10):
|
||||||
await hass.async_stop()
|
await hass.async_stop()
|
||||||
|
|
||||||
safe_mode = True
|
recovery_mode = True
|
||||||
old_config = hass.config
|
old_config = hass.config
|
||||||
old_logging = hass.data.get(DATA_LOGGING)
|
old_logging = hass.data.get(DATA_LOGGING)
|
||||||
|
|
||||||
@@ -187,16 +189,18 @@ async def async_setup_hass(
|
|||||||
# Setup loader cache after the config dir has been set
|
# Setup loader cache after the config dir has been set
|
||||||
loader.async_setup(hass)
|
loader.async_setup(hass)
|
||||||
|
|
||||||
if safe_mode:
|
if recovery_mode:
|
||||||
_LOGGER.info("Starting in safe mode")
|
_LOGGER.info("Starting in recovery mode")
|
||||||
hass.config.safe_mode = True
|
hass.config.recovery_mode = True
|
||||||
|
|
||||||
http_conf = (await http.async_get_last_config(hass)) or {}
|
http_conf = (await http.async_get_last_config(hass)) or {}
|
||||||
|
|
||||||
await async_from_config_dict(
|
await async_from_config_dict(
|
||||||
{"safe_mode": {}, "http": http_conf},
|
{"recovery_mode": {}, "http": http_conf},
|
||||||
hass,
|
hass,
|
||||||
)
|
)
|
||||||
|
elif hass.config.safe_mode:
|
||||||
|
_LOGGER.info("Starting in safe mode")
|
||||||
|
|
||||||
if runtime_config.open_ui:
|
if runtime_config.open_ui:
|
||||||
hass.add_job(open_hass_ui, hass)
|
hass.add_job(open_hass_ui, hass)
|
||||||
@@ -289,7 +293,8 @@ async def async_from_config_dict(
|
|||||||
try:
|
try:
|
||||||
await conf_util.async_process_ha_core_config(hass, core_config)
|
await conf_util.async_process_ha_core_config(hass, core_config)
|
||||||
except vol.Invalid as config_err:
|
except vol.Invalid as config_err:
|
||||||
conf_util.async_log_exception(config_err, "homeassistant", core_config, hass)
|
conf_util.async_log_schema_error(config_err, core.DOMAIN, core_config, hass)
|
||||||
|
async_notify_setup_error(hass, core.DOMAIN)
|
||||||
return None
|
return None
|
||||||
except HomeAssistantError:
|
except HomeAssistantError:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
@@ -395,7 +400,7 @@ def async_enable_logging(
|
|||||||
logging.getLogger("httpx").setLevel(logging.WARNING)
|
logging.getLogger("httpx").setLevel(logging.WARNING)
|
||||||
|
|
||||||
sys.excepthook = lambda *args: logging.getLogger(None).exception(
|
sys.excepthook = lambda *args: logging.getLogger(None).exception(
|
||||||
"Uncaught exception", exc_info=args # type: ignore[arg-type]
|
"Uncaught exception", exc_info=args
|
||||||
)
|
)
|
||||||
threading.excepthook = lambda args: logging.getLogger(None).exception(
|
threading.excepthook = lambda args: logging.getLogger(None).exception(
|
||||||
"Uncaught thread exception",
|
"Uncaught thread exception",
|
||||||
@@ -471,7 +476,7 @@ def _get_domains(hass: core.HomeAssistant, config: dict[str, Any]) -> set[str]:
|
|||||||
domains = {key.partition(" ")[0] for key in config if key != core.DOMAIN}
|
domains = {key.partition(" ")[0] for key in config if key != core.DOMAIN}
|
||||||
|
|
||||||
# Add config entry domains
|
# Add config entry domains
|
||||||
if not hass.config.safe_mode:
|
if not hass.config.recovery_mode:
|
||||||
domains.update(hass.config_entries.async_domains())
|
domains.update(hass.config_entries.async_domains())
|
||||||
|
|
||||||
# Make sure the Hass.io component is loaded
|
# Make sure the Hass.io component is loaded
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"domain": "eq3",
|
"domain": "eq3",
|
||||||
"name": "eQ-3",
|
"name": "eQ-3",
|
||||||
"integrations": ["eq3btsmart", "maxcube"]
|
"integrations": ["maxcube"]
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
"google_maps",
|
"google_maps",
|
||||||
"google_pubsub",
|
"google_pubsub",
|
||||||
"google_sheets",
|
"google_sheets",
|
||||||
|
"google_tasks",
|
||||||
"google_translate",
|
"google_translate",
|
||||||
"google_travel_time",
|
"google_travel_time",
|
||||||
"google_wifi",
|
"google_wifi",
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
"""Support for the Abode Security System."""
|
"""Support for the Abode Security System."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass, field
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from jaraco.abode.automation import Automation as AbodeAuto
|
from jaraco.abode.automation import Automation as AbodeAuto
|
||||||
@@ -25,7 +26,7 @@ from homeassistant.const import (
|
|||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
Platform,
|
Platform,
|
||||||
)
|
)
|
||||||
from homeassistant.core import Event, HomeAssistant, ServiceCall
|
from homeassistant.core import CALLBACK_TYPE, Event, HomeAssistant, ServiceCall
|
||||||
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
|
||||||
from homeassistant.helpers import config_validation as cv, entity
|
from homeassistant.helpers import config_validation as cv, entity
|
||||||
from homeassistant.helpers.device_registry import DeviceInfo
|
from homeassistant.helpers.device_registry import DeviceInfo
|
||||||
@@ -71,15 +72,14 @@ PLATFORMS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
class AbodeSystem:
|
class AbodeSystem:
|
||||||
"""Abode System class."""
|
"""Abode System class."""
|
||||||
|
|
||||||
def __init__(self, abode: Abode, polling: bool) -> None:
|
abode: Abode
|
||||||
"""Initialize the system."""
|
polling: bool
|
||||||
self.abode = abode
|
entity_ids: set[str | None] = field(default_factory=set)
|
||||||
self.polling = polling
|
logout_listener: CALLBACK_TYPE | None = None
|
||||||
self.entity_ids: set[str | None] = set()
|
|
||||||
self.logout_listener = None
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
|
@@ -9,5 +9,5 @@
|
|||||||
},
|
},
|
||||||
"iot_class": "cloud_push",
|
"iot_class": "cloud_push",
|
||||||
"loggers": ["jaraco.abode", "lomond"],
|
"loggers": ["jaraco.abode", "lomond"],
|
||||||
"requirements": ["jaraco.abode==3.3.0"]
|
"requirements": ["jaraco.abode==3.3.0", "jaraco.functools==3.9.0"]
|
||||||
}
|
}
|
||||||
|
@@ -8,5 +8,5 @@
|
|||||||
"iot_class": "cloud_polling",
|
"iot_class": "cloud_polling",
|
||||||
"loggers": ["accuweather"],
|
"loggers": ["accuweather"],
|
||||||
"quality_scale": "platinum",
|
"quality_scale": "platinum",
|
||||||
"requirements": ["accuweather==1.0.0"]
|
"requirements": ["accuweather==2.1.1"]
|
||||||
}
|
}
|
||||||
|
@@ -6,5 +6,5 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/adax",
|
"documentation": "https://www.home-assistant.io/integrations/adax",
|
||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"loggers": ["adax", "adax_local"],
|
"loggers": ["adax", "adax_local"],
|
||||||
"requirements": ["adax==0.2.0", "Adax-local==0.1.5"]
|
"requirements": ["adax==0.3.0", "Adax-local==0.1.5"]
|
||||||
}
|
}
|
||||||
|
@@ -7,5 +7,5 @@
|
|||||||
"integration_type": "service",
|
"integration_type": "service",
|
||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"loggers": ["adguardhome"],
|
"loggers": ["adguardhome"],
|
||||||
"requirements": ["adguardhome==0.6.1"]
|
"requirements": ["adguardhome==0.6.3"]
|
||||||
}
|
}
|
||||||
|
@@ -22,20 +22,13 @@ SCAN_INTERVAL = timedelta(seconds=300)
|
|||||||
PARALLEL_UPDATES = 4
|
PARALLEL_UPDATES = 4
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass(kw_only=True)
|
||||||
class AdGuardHomeEntityDescriptionMixin:
|
class AdGuardHomeEntityDescription(SensorEntityDescription):
|
||||||
"""Mixin for required keys."""
|
"""Describes AdGuard Home sensor entity."""
|
||||||
|
|
||||||
value_fn: Callable[[AdGuardHome], Coroutine[Any, Any, int | float]]
|
value_fn: Callable[[AdGuardHome], Coroutine[Any, Any, int | float]]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class AdGuardHomeEntityDescription(
|
|
||||||
SensorEntityDescription, AdGuardHomeEntityDescriptionMixin
|
|
||||||
):
|
|
||||||
"""Describes AdGuard Home sensor entity."""
|
|
||||||
|
|
||||||
|
|
||||||
SENSORS: tuple[AdGuardHomeEntityDescription, ...] = (
|
SENSORS: tuple[AdGuardHomeEntityDescription, ...] = (
|
||||||
AdGuardHomeEntityDescription(
|
AdGuardHomeEntityDescription(
|
||||||
key="dns_queries",
|
key="dns_queries",
|
||||||
|
@@ -10,6 +10,9 @@
|
|||||||
"username": "[%key:common::config_flow::data::username%]",
|
"username": "[%key:common::config_flow::data::username%]",
|
||||||
"ssl": "[%key:common::config_flow::data::ssl%]",
|
"ssl": "[%key:common::config_flow::data::ssl%]",
|
||||||
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"host": "The hostname or IP address of the device running your AdGuard Home."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"hassio_confirm": {
|
"hassio_confirm": {
|
||||||
|
@@ -21,22 +21,15 @@ SCAN_INTERVAL = timedelta(seconds=10)
|
|||||||
PARALLEL_UPDATES = 1
|
PARALLEL_UPDATES = 1
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass(kw_only=True)
|
||||||
class AdGuardHomeSwitchEntityDescriptionMixin:
|
class AdGuardHomeSwitchEntityDescription(SwitchEntityDescription):
|
||||||
"""Mixin for required keys."""
|
"""Describes AdGuard Home switch entity."""
|
||||||
|
|
||||||
is_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, bool]]]
|
is_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, bool]]]
|
||||||
turn_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
|
turn_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
|
||||||
turn_off_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
|
turn_off_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class AdGuardHomeSwitchEntityDescription(
|
|
||||||
SwitchEntityDescription, AdGuardHomeSwitchEntityDescriptionMixin
|
|
||||||
):
|
|
||||||
"""Describes AdGuard Home switch entity."""
|
|
||||||
|
|
||||||
|
|
||||||
SWITCHES: tuple[AdGuardHomeSwitchEntityDescription, ...] = (
|
SWITCHES: tuple[AdGuardHomeSwitchEntityDescription, ...] = (
|
||||||
AdGuardHomeSwitchEntityDescription(
|
AdGuardHomeSwitchEntityDescription(
|
||||||
key="protection",
|
key="protection",
|
||||||
|
@@ -122,9 +122,23 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
|
|||||||
if self._ac.get(ADVANTAGE_AIR_AUTOFAN):
|
if self._ac.get(ADVANTAGE_AIR_AUTOFAN):
|
||||||
self._attr_fan_modes += [FAN_AUTO]
|
self._attr_fan_modes += [FAN_AUTO]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def current_temperature(self) -> float | None:
|
||||||
|
"""Return the selected zones current temperature."""
|
||||||
|
if self._myzone:
|
||||||
|
return self._myzone["measuredTemp"]
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def target_temperature(self) -> float | None:
|
def target_temperature(self) -> float | None:
|
||||||
"""Return the current target temperature."""
|
"""Return the current target temperature."""
|
||||||
|
# If the system is in MyZone mode, and a zone is set, return that temperature instead.
|
||||||
|
if (
|
||||||
|
self._myzone
|
||||||
|
and not self._ac.get(ADVANTAGE_AIR_MYAUTO_ENABLED)
|
||||||
|
and not self._ac.get(ADVANTAGE_AIR_MYTEMP_ENABLED)
|
||||||
|
):
|
||||||
|
return self._myzone["setTemp"]
|
||||||
return self._ac["setTemp"]
|
return self._ac["setTemp"]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@@ -62,6 +62,12 @@ class AdvantageAirAcEntity(AdvantageAirEntity):
|
|||||||
def _ac(self) -> dict[str, Any]:
|
def _ac(self) -> dict[str, Any]:
|
||||||
return self.coordinator.data["aircons"][self.ac_key]["info"]
|
return self.coordinator.data["aircons"][self.ac_key]["info"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _myzone(self) -> dict[str, Any] | None:
|
||||||
|
return self.coordinator.data["aircons"][self.ac_key]["zones"].get(
|
||||||
|
f"z{self._ac['myZone']:02}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class AdvantageAirZoneEntity(AdvantageAirAcEntity):
|
class AdvantageAirZoneEntity(AdvantageAirAcEntity):
|
||||||
"""Parent class for Advantage Air Zone Entities."""
|
"""Parent class for Advantage Air Zone Entities."""
|
||||||
|
@@ -2,12 +2,13 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from aemet_opendata.exceptions import TownNotFound
|
from aemet_opendata.exceptions import AemetError, TownNotFound
|
||||||
from aemet_opendata.interface import AEMET, ConnectionOptions
|
from aemet_opendata.interface import AEMET, ConnectionOptions
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
|
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
from homeassistant.helpers import aiohttp_client
|
from homeassistant.helpers import aiohttp_client
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
@@ -37,6 +38,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
except TownNotFound as err:
|
except TownNotFound as err:
|
||||||
_LOGGER.error(err)
|
_LOGGER.error(err)
|
||||||
return False
|
return False
|
||||||
|
except AemetError as err:
|
||||||
|
raise ConfigEntryNotReady(err) from err
|
||||||
|
|
||||||
weather_coordinator = WeatherUpdateCoordinator(hass, aemet)
|
weather_coordinator = WeatherUpdateCoordinator(hass, aemet)
|
||||||
await weather_coordinator.async_config_entry_first_refresh()
|
await weather_coordinator.async_config_entry_first_refresh()
|
||||||
|
@@ -12,6 +12,18 @@ from aemet_opendata.const import (
|
|||||||
AOD_COND_RAINY,
|
AOD_COND_RAINY,
|
||||||
AOD_COND_SNOWY,
|
AOD_COND_SNOWY,
|
||||||
AOD_COND_SUNNY,
|
AOD_COND_SUNNY,
|
||||||
|
AOD_CONDITION,
|
||||||
|
AOD_FORECAST_DAILY,
|
||||||
|
AOD_FORECAST_HOURLY,
|
||||||
|
AOD_PRECIPITATION,
|
||||||
|
AOD_PRECIPITATION_PROBABILITY,
|
||||||
|
AOD_TEMP,
|
||||||
|
AOD_TEMP_MAX,
|
||||||
|
AOD_TEMP_MIN,
|
||||||
|
AOD_TIMESTAMP,
|
||||||
|
AOD_WIND_DIRECTION,
|
||||||
|
AOD_WIND_SPEED,
|
||||||
|
AOD_WIND_SPEED_MAX,
|
||||||
)
|
)
|
||||||
|
|
||||||
from homeassistant.components.weather import (
|
from homeassistant.components.weather import (
|
||||||
@@ -25,6 +37,15 @@ from homeassistant.components.weather import (
|
|||||||
ATTR_CONDITION_RAINY,
|
ATTR_CONDITION_RAINY,
|
||||||
ATTR_CONDITION_SNOWY,
|
ATTR_CONDITION_SNOWY,
|
||||||
ATTR_CONDITION_SUNNY,
|
ATTR_CONDITION_SUNNY,
|
||||||
|
ATTR_FORECAST_CONDITION,
|
||||||
|
ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||||
|
ATTR_FORECAST_NATIVE_TEMP,
|
||||||
|
ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||||
|
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||||
|
ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||||
|
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||||
|
ATTR_FORECAST_TIME,
|
||||||
|
ATTR_FORECAST_WIND_BEARING,
|
||||||
)
|
)
|
||||||
from homeassistant.const import Platform
|
from homeassistant.const import Platform
|
||||||
|
|
||||||
@@ -122,3 +143,30 @@ FORECAST_MODE_ATTR_API = {
|
|||||||
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
|
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
|
||||||
FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY,
|
FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORECAST_MAP = {
|
||||||
|
AOD_FORECAST_DAILY: {
|
||||||
|
AOD_CONDITION: ATTR_FORECAST_CONDITION,
|
||||||
|
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||||
|
AOD_TEMP_MAX: ATTR_FORECAST_NATIVE_TEMP,
|
||||||
|
AOD_TEMP_MIN: ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||||
|
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
|
||||||
|
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
|
||||||
|
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||||
|
},
|
||||||
|
AOD_FORECAST_HOURLY: {
|
||||||
|
AOD_CONDITION: ATTR_FORECAST_CONDITION,
|
||||||
|
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||||
|
AOD_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||||
|
AOD_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
||||||
|
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
|
||||||
|
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
|
||||||
|
AOD_WIND_SPEED_MAX: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||||
|
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_FORECAST_MODES = {
|
||||||
|
AOD_FORECAST_DAILY: "daily",
|
||||||
|
AOD_FORECAST_HOURLY: "hourly",
|
||||||
|
}
|
||||||
|
23
homeassistant/components/aemet/entity.py
Normal file
23
homeassistant/components/aemet/entity.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
"""Entity classes for the AEMET OpenData integration."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from aemet_opendata.helpers import dict_nested_value
|
||||||
|
|
||||||
|
from homeassistant.components.weather import Forecast
|
||||||
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||||
|
|
||||||
|
from .weather_update_coordinator import WeatherUpdateCoordinator
|
||||||
|
|
||||||
|
|
||||||
|
class AemetEntity(CoordinatorEntity[WeatherUpdateCoordinator]):
|
||||||
|
"""Define an AEMET entity."""
|
||||||
|
|
||||||
|
def get_aemet_forecast(self, forecast_mode: str) -> list[Forecast]:
|
||||||
|
"""Return AEMET entity forecast by mode."""
|
||||||
|
return self.coordinator.data["forecast"][forecast_mode]
|
||||||
|
|
||||||
|
def get_aemet_value(self, keys: list[str]) -> Any:
|
||||||
|
"""Return AEMET entity value by keys."""
|
||||||
|
return dict_nested_value(self.coordinator.data["lib"], keys)
|
@@ -6,5 +6,5 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/aemet",
|
"documentation": "https://www.home-assistant.io/integrations/aemet",
|
||||||
"iot_class": "cloud_polling",
|
"iot_class": "cloud_polling",
|
||||||
"loggers": ["aemet_opendata"],
|
"loggers": ["aemet_opendata"],
|
||||||
"requirements": ["AEMET-OpenData==0.4.5"]
|
"requirements": ["AEMET-OpenData==0.4.6"]
|
||||||
}
|
}
|
||||||
|
@@ -1,16 +1,19 @@
|
|||||||
"""Support for the AEMET OpenData service."""
|
"""Support for the AEMET OpenData service."""
|
||||||
from typing import cast
|
|
||||||
|
from aemet_opendata.const import (
|
||||||
|
AOD_CONDITION,
|
||||||
|
AOD_FORECAST_DAILY,
|
||||||
|
AOD_FORECAST_HOURLY,
|
||||||
|
AOD_HUMIDITY,
|
||||||
|
AOD_PRESSURE,
|
||||||
|
AOD_TEMP,
|
||||||
|
AOD_WEATHER,
|
||||||
|
AOD_WIND_DIRECTION,
|
||||||
|
AOD_WIND_SPEED,
|
||||||
|
AOD_WIND_SPEED_MAX,
|
||||||
|
)
|
||||||
|
|
||||||
from homeassistant.components.weather import (
|
from homeassistant.components.weather import (
|
||||||
ATTR_FORECAST_CONDITION,
|
|
||||||
ATTR_FORECAST_NATIVE_PRECIPITATION,
|
|
||||||
ATTR_FORECAST_NATIVE_TEMP,
|
|
||||||
ATTR_FORECAST_NATIVE_TEMP_LOW,
|
|
||||||
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
|
||||||
ATTR_FORECAST_NATIVE_WIND_SPEED,
|
|
||||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
|
||||||
ATTR_FORECAST_TIME,
|
|
||||||
ATTR_FORECAST_WIND_BEARING,
|
|
||||||
DOMAIN as WEATHER_DOMAIN,
|
DOMAIN as WEATHER_DOMAIN,
|
||||||
Forecast,
|
Forecast,
|
||||||
SingleCoordinatorWeatherEntity,
|
SingleCoordinatorWeatherEntity,
|
||||||
@@ -28,55 +31,16 @@ from homeassistant.helpers import entity_registry as er
|
|||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_API_CONDITION,
|
|
||||||
ATTR_API_FORECAST_CONDITION,
|
|
||||||
ATTR_API_FORECAST_PRECIPITATION,
|
|
||||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY,
|
|
||||||
ATTR_API_FORECAST_TEMP,
|
|
||||||
ATTR_API_FORECAST_TEMP_LOW,
|
|
||||||
ATTR_API_FORECAST_TIME,
|
|
||||||
ATTR_API_FORECAST_WIND_BEARING,
|
|
||||||
ATTR_API_FORECAST_WIND_MAX_SPEED,
|
|
||||||
ATTR_API_FORECAST_WIND_SPEED,
|
|
||||||
ATTR_API_HUMIDITY,
|
|
||||||
ATTR_API_PRESSURE,
|
|
||||||
ATTR_API_TEMPERATURE,
|
|
||||||
ATTR_API_WIND_BEARING,
|
|
||||||
ATTR_API_WIND_MAX_SPEED,
|
|
||||||
ATTR_API_WIND_SPEED,
|
|
||||||
ATTRIBUTION,
|
ATTRIBUTION,
|
||||||
|
CONDITIONS_MAP,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
ENTRY_NAME,
|
ENTRY_NAME,
|
||||||
ENTRY_WEATHER_COORDINATOR,
|
ENTRY_WEATHER_COORDINATOR,
|
||||||
FORECAST_MODE_ATTR_API,
|
WEATHER_FORECAST_MODES,
|
||||||
FORECAST_MODE_DAILY,
|
|
||||||
FORECAST_MODE_HOURLY,
|
|
||||||
FORECAST_MODES,
|
|
||||||
)
|
)
|
||||||
|
from .entity import AemetEntity
|
||||||
from .weather_update_coordinator import WeatherUpdateCoordinator
|
from .weather_update_coordinator import WeatherUpdateCoordinator
|
||||||
|
|
||||||
FORECAST_MAP = {
|
|
||||||
FORECAST_MODE_DAILY: {
|
|
||||||
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
|
|
||||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
|
||||||
ATTR_API_FORECAST_TEMP_LOW: ATTR_FORECAST_NATIVE_TEMP_LOW,
|
|
||||||
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
|
||||||
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
|
|
||||||
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
|
|
||||||
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
|
||||||
},
|
|
||||||
FORECAST_MODE_HOURLY: {
|
|
||||||
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
|
|
||||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
|
||||||
ATTR_API_FORECAST_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
|
|
||||||
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
|
||||||
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
|
|
||||||
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
|
|
||||||
ATTR_API_FORECAST_WIND_MAX_SPEED: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
|
||||||
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
@@ -95,11 +59,11 @@ async def async_setup_entry(
|
|||||||
if entity_registry.async_get_entity_id(
|
if entity_registry.async_get_entity_id(
|
||||||
WEATHER_DOMAIN,
|
WEATHER_DOMAIN,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
f"{config_entry.unique_id} {FORECAST_MODE_HOURLY}",
|
f"{config_entry.unique_id} {WEATHER_FORECAST_MODES[AOD_FORECAST_HOURLY]}",
|
||||||
):
|
):
|
||||||
for mode in FORECAST_MODES:
|
for mode, mode_id in WEATHER_FORECAST_MODES.items():
|
||||||
name = f"{domain_data[ENTRY_NAME]} {mode}"
|
name = f"{domain_data[ENTRY_NAME]} {mode_id}"
|
||||||
unique_id = f"{config_entry.unique_id} {mode}"
|
unique_id = f"{config_entry.unique_id} {mode_id}"
|
||||||
entities.append(AemetWeather(name, unique_id, weather_coordinator, mode))
|
entities.append(AemetWeather(name, unique_id, weather_coordinator, mode))
|
||||||
else:
|
else:
|
||||||
entities.append(
|
entities.append(
|
||||||
@@ -107,15 +71,18 @@ async def async_setup_entry(
|
|||||||
domain_data[ENTRY_NAME],
|
domain_data[ENTRY_NAME],
|
||||||
config_entry.unique_id,
|
config_entry.unique_id,
|
||||||
weather_coordinator,
|
weather_coordinator,
|
||||||
FORECAST_MODE_DAILY,
|
AOD_FORECAST_DAILY,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
async_add_entities(entities, False)
|
async_add_entities(entities, False)
|
||||||
|
|
||||||
|
|
||||||
class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
class AemetWeather(
|
||||||
"""Implementation of an AEMET OpenData sensor."""
|
AemetEntity,
|
||||||
|
SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator],
|
||||||
|
):
|
||||||
|
"""Implementation of an AEMET OpenData weather."""
|
||||||
|
|
||||||
_attr_attribution = ATTRIBUTION
|
_attr_attribution = ATTRIBUTION
|
||||||
_attr_native_precipitation_unit = UnitOfPrecipitationDepth.MILLIMETERS
|
_attr_native_precipitation_unit = UnitOfPrecipitationDepth.MILLIMETERS
|
||||||
@@ -137,7 +104,7 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
|||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
self._forecast_mode = forecast_mode
|
self._forecast_mode = forecast_mode
|
||||||
self._attr_entity_registry_enabled_default = (
|
self._attr_entity_registry_enabled_default = (
|
||||||
self._forecast_mode == FORECAST_MODE_DAILY
|
self._forecast_mode == AOD_FORECAST_DAILY
|
||||||
)
|
)
|
||||||
self._attr_name = name
|
self._attr_name = name
|
||||||
self._attr_unique_id = unique_id
|
self._attr_unique_id = unique_id
|
||||||
@@ -145,61 +112,50 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
|||||||
@property
|
@property
|
||||||
def condition(self):
|
def condition(self):
|
||||||
"""Return the current condition."""
|
"""Return the current condition."""
|
||||||
return self.coordinator.data[ATTR_API_CONDITION]
|
cond = self.get_aemet_value([AOD_WEATHER, AOD_CONDITION])
|
||||||
|
return CONDITIONS_MAP.get(cond)
|
||||||
def _forecast(self, forecast_mode: str) -> list[Forecast]:
|
|
||||||
"""Return the forecast array."""
|
|
||||||
forecasts = self.coordinator.data[FORECAST_MODE_ATTR_API[forecast_mode]]
|
|
||||||
forecast_map = FORECAST_MAP[forecast_mode]
|
|
||||||
return cast(
|
|
||||||
list[Forecast],
|
|
||||||
[
|
|
||||||
{ha_key: forecast[api_key] for api_key, ha_key in forecast_map.items()}
|
|
||||||
for forecast in forecasts
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def forecast(self) -> list[Forecast]:
|
def forecast(self) -> list[Forecast]:
|
||||||
"""Return the forecast array."""
|
"""Return the forecast array."""
|
||||||
return self._forecast(self._forecast_mode)
|
return self.get_aemet_forecast(self._forecast_mode)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_forecast_daily(self) -> list[Forecast]:
|
def _async_forecast_daily(self) -> list[Forecast]:
|
||||||
"""Return the daily forecast in native units."""
|
"""Return the daily forecast in native units."""
|
||||||
return self._forecast(FORECAST_MODE_DAILY)
|
return self.get_aemet_forecast(AOD_FORECAST_DAILY)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_forecast_hourly(self) -> list[Forecast]:
|
def _async_forecast_hourly(self) -> list[Forecast]:
|
||||||
"""Return the hourly forecast in native units."""
|
"""Return the hourly forecast in native units."""
|
||||||
return self._forecast(FORECAST_MODE_HOURLY)
|
return self.get_aemet_forecast(AOD_FORECAST_HOURLY)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def humidity(self):
|
def humidity(self):
|
||||||
"""Return the humidity."""
|
"""Return the humidity."""
|
||||||
return self.coordinator.data[ATTR_API_HUMIDITY]
|
return self.get_aemet_value([AOD_WEATHER, AOD_HUMIDITY])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_pressure(self):
|
def native_pressure(self):
|
||||||
"""Return the pressure."""
|
"""Return the pressure."""
|
||||||
return self.coordinator.data[ATTR_API_PRESSURE]
|
return self.get_aemet_value([AOD_WEATHER, AOD_PRESSURE])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_temperature(self):
|
def native_temperature(self):
|
||||||
"""Return the temperature."""
|
"""Return the temperature."""
|
||||||
return self.coordinator.data[ATTR_API_TEMPERATURE]
|
return self.get_aemet_value([AOD_WEATHER, AOD_TEMP])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def wind_bearing(self):
|
def wind_bearing(self):
|
||||||
"""Return the wind bearing."""
|
"""Return the wind bearing."""
|
||||||
return self.coordinator.data[ATTR_API_WIND_BEARING]
|
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_DIRECTION])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_wind_gust_speed(self):
|
def native_wind_gust_speed(self):
|
||||||
"""Return the wind gust speed in native units."""
|
"""Return the wind gust speed in native units."""
|
||||||
return self.coordinator.data[ATTR_API_WIND_MAX_SPEED]
|
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED_MAX])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_wind_speed(self):
|
def native_wind_speed(self):
|
||||||
"""Return the wind speed."""
|
"""Return the wind speed."""
|
||||||
return self.coordinator.data[ATTR_API_WIND_SPEED]
|
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED])
|
||||||
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
from asyncio import timeout
|
from asyncio import timeout
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Final
|
from typing import Any, Final, cast
|
||||||
|
|
||||||
from aemet_opendata.const import (
|
from aemet_opendata.const import (
|
||||||
AEMET_ATTR_DATE,
|
AEMET_ATTR_DATE,
|
||||||
@@ -31,17 +31,24 @@ from aemet_opendata.const import (
|
|||||||
AEMET_ATTR_TEMPERATURE,
|
AEMET_ATTR_TEMPERATURE,
|
||||||
AEMET_ATTR_WIND,
|
AEMET_ATTR_WIND,
|
||||||
AEMET_ATTR_WIND_GUST,
|
AEMET_ATTR_WIND_GUST,
|
||||||
|
AOD_CONDITION,
|
||||||
|
AOD_FORECAST,
|
||||||
|
AOD_FORECAST_DAILY,
|
||||||
|
AOD_FORECAST_HOURLY,
|
||||||
|
AOD_TOWN,
|
||||||
ATTR_DATA,
|
ATTR_DATA,
|
||||||
)
|
)
|
||||||
from aemet_opendata.exceptions import AemetError
|
from aemet_opendata.exceptions import AemetError
|
||||||
from aemet_opendata.forecast import ForecastValue
|
from aemet_opendata.forecast import ForecastValue
|
||||||
from aemet_opendata.helpers import (
|
from aemet_opendata.helpers import (
|
||||||
|
dict_nested_value,
|
||||||
get_forecast_day_value,
|
get_forecast_day_value,
|
||||||
get_forecast_hour_value,
|
get_forecast_hour_value,
|
||||||
get_forecast_interval_value,
|
get_forecast_interval_value,
|
||||||
)
|
)
|
||||||
from aemet_opendata.interface import AEMET
|
from aemet_opendata.interface import AEMET
|
||||||
|
|
||||||
|
from homeassistant.components.weather import Forecast
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
@@ -79,6 +86,7 @@ from .const import (
|
|||||||
ATTR_API_WIND_SPEED,
|
ATTR_API_WIND_SPEED,
|
||||||
CONDITIONS_MAP,
|
CONDITIONS_MAP,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
FORECAST_MAP,
|
||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@@ -239,6 +247,12 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
weather_response, now
|
weather_response, now
|
||||||
)
|
)
|
||||||
|
|
||||||
|
data = self.aemet.data()
|
||||||
|
forecasts: list[dict[str, Forecast]] = {
|
||||||
|
AOD_FORECAST_DAILY: self.aemet_forecast(data, AOD_FORECAST_DAILY),
|
||||||
|
AOD_FORECAST_HOURLY: self.aemet_forecast(data, AOD_FORECAST_HOURLY),
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ATTR_API_CONDITION: condition,
|
ATTR_API_CONDITION: condition,
|
||||||
ATTR_API_FORECAST_DAILY: forecast_daily,
|
ATTR_API_FORECAST_DAILY: forecast_daily,
|
||||||
@@ -261,8 +275,29 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
ATTR_API_WIND_BEARING: wind_bearing,
|
ATTR_API_WIND_BEARING: wind_bearing,
|
||||||
ATTR_API_WIND_MAX_SPEED: wind_max_speed,
|
ATTR_API_WIND_MAX_SPEED: wind_max_speed,
|
||||||
ATTR_API_WIND_SPEED: wind_speed,
|
ATTR_API_WIND_SPEED: wind_speed,
|
||||||
|
"forecast": forecasts,
|
||||||
|
"lib": data,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def aemet_forecast(
|
||||||
|
self,
|
||||||
|
data: dict[str, Any],
|
||||||
|
forecast_mode: str,
|
||||||
|
) -> list[Forecast]:
|
||||||
|
"""Return the forecast array."""
|
||||||
|
forecasts = dict_nested_value(data, [AOD_TOWN, forecast_mode, AOD_FORECAST])
|
||||||
|
forecast_map = FORECAST_MAP[forecast_mode]
|
||||||
|
forecast_list: list[dict[str, Any]] = []
|
||||||
|
for forecast in forecasts:
|
||||||
|
cur_forecast: dict[str, Any] = {}
|
||||||
|
for api_key, ha_key in forecast_map.items():
|
||||||
|
value = forecast[api_key]
|
||||||
|
if api_key == AOD_CONDITION:
|
||||||
|
value = CONDITIONS_MAP.get(value)
|
||||||
|
cur_forecast[ha_key] = value
|
||||||
|
forecast_list += [cur_forecast]
|
||||||
|
return cast(list[Forecast], forecast_list)
|
||||||
|
|
||||||
def _get_daily_forecast_from_weather_response(self, weather_response, now):
|
def _get_daily_forecast_from_weather_response(self, weather_response, now):
|
||||||
if weather_response.daily:
|
if weather_response.daily:
|
||||||
parse = False
|
parse = False
|
||||||
|
@@ -11,6 +11,7 @@ from homeassistant.const import (
|
|||||||
Platform,
|
Platform,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
@@ -50,6 +51,20 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
|
|
||||||
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
||||||
|
|
||||||
|
# Clean up unused device entries with no entities
|
||||||
|
device_registry = dr.async_get(hass)
|
||||||
|
entity_registry = er.async_get(hass)
|
||||||
|
|
||||||
|
device_entries = dr.async_entries_for_config_entry(
|
||||||
|
device_registry, config_entry_id=entry.entry_id
|
||||||
|
)
|
||||||
|
for dev in device_entries:
|
||||||
|
dev_entities = er.async_entries_for_device(
|
||||||
|
entity_registry, dev.id, include_disabled_entities=True
|
||||||
|
)
|
||||||
|
if not dev_entities:
|
||||||
|
device_registry.async_remove_device(dev.id)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,8 +9,9 @@ ATTR_API_CAT_DESCRIPTION = "Name"
|
|||||||
ATTR_API_O3 = "O3"
|
ATTR_API_O3 = "O3"
|
||||||
ATTR_API_PM25 = "PM2.5"
|
ATTR_API_PM25 = "PM2.5"
|
||||||
ATTR_API_POLLUTANT = "Pollutant"
|
ATTR_API_POLLUTANT = "Pollutant"
|
||||||
ATTR_API_REPORT_DATE = "HourObserved"
|
ATTR_API_REPORT_DATE = "DateObserved"
|
||||||
ATTR_API_REPORT_HOUR = "DateObserved"
|
ATTR_API_REPORT_HOUR = "HourObserved"
|
||||||
|
ATTR_API_REPORT_TZ = "LocalTimeZone"
|
||||||
ATTR_API_STATE = "StateCode"
|
ATTR_API_STATE = "StateCode"
|
||||||
ATTR_API_STATION = "ReportingArea"
|
ATTR_API_STATION = "ReportingArea"
|
||||||
ATTR_API_STATION_LATITUDE = "Latitude"
|
ATTR_API_STATION_LATITUDE = "Latitude"
|
||||||
|
@@ -20,6 +20,7 @@ from .const import (
|
|||||||
ATTR_API_POLLUTANT,
|
ATTR_API_POLLUTANT,
|
||||||
ATTR_API_REPORT_DATE,
|
ATTR_API_REPORT_DATE,
|
||||||
ATTR_API_REPORT_HOUR,
|
ATTR_API_REPORT_HOUR,
|
||||||
|
ATTR_API_REPORT_TZ,
|
||||||
ATTR_API_STATE,
|
ATTR_API_STATE,
|
||||||
ATTR_API_STATION,
|
ATTR_API_STATION,
|
||||||
ATTR_API_STATION_LATITUDE,
|
ATTR_API_STATION_LATITUDE,
|
||||||
@@ -83,6 +84,7 @@ class AirNowDataUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
# Copy Report Details
|
# Copy Report Details
|
||||||
data[ATTR_API_REPORT_DATE] = obv[ATTR_API_REPORT_DATE]
|
data[ATTR_API_REPORT_DATE] = obv[ATTR_API_REPORT_DATE]
|
||||||
data[ATTR_API_REPORT_HOUR] = obv[ATTR_API_REPORT_HOUR]
|
data[ATTR_API_REPORT_HOUR] = obv[ATTR_API_REPORT_HOUR]
|
||||||
|
data[ATTR_API_REPORT_TZ] = obv[ATTR_API_REPORT_TZ]
|
||||||
|
|
||||||
# Copy Station Details
|
# Copy Station Details
|
||||||
data[ATTR_API_STATE] = obv[ATTR_API_STATE]
|
data[ATTR_API_STATE] = obv[ATTR_API_STATE]
|
||||||
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from datetime import datetime
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from homeassistant.components.sensor import (
|
from homeassistant.components.sensor import (
|
||||||
@@ -13,6 +14,7 @@ from homeassistant.components.sensor import (
|
|||||||
)
|
)
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
ATTR_TIME,
|
||||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
CONCENTRATION_PARTS_PER_MILLION,
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
)
|
)
|
||||||
@@ -21,6 +23,7 @@ from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
|
|||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.typing import StateType
|
from homeassistant.helpers.typing import StateType
|
||||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||||
|
from homeassistant.util.dt import get_time_zone
|
||||||
|
|
||||||
from . import AirNowDataUpdateCoordinator
|
from . import AirNowDataUpdateCoordinator
|
||||||
from .const import (
|
from .const import (
|
||||||
@@ -29,6 +32,9 @@ from .const import (
|
|||||||
ATTR_API_AQI_LEVEL,
|
ATTR_API_AQI_LEVEL,
|
||||||
ATTR_API_O3,
|
ATTR_API_O3,
|
||||||
ATTR_API_PM25,
|
ATTR_API_PM25,
|
||||||
|
ATTR_API_REPORT_DATE,
|
||||||
|
ATTR_API_REPORT_HOUR,
|
||||||
|
ATTR_API_REPORT_TZ,
|
||||||
ATTR_API_STATION,
|
ATTR_API_STATION,
|
||||||
ATTR_API_STATION_LATITUDE,
|
ATTR_API_STATION_LATITUDE,
|
||||||
ATTR_API_STATION_LONGITUDE,
|
ATTR_API_STATION_LONGITUDE,
|
||||||
@@ -78,6 +84,12 @@ SENSOR_TYPES: tuple[AirNowEntityDescription, ...] = (
|
|||||||
extra_state_attributes_fn=lambda data: {
|
extra_state_attributes_fn=lambda data: {
|
||||||
ATTR_DESCR: data[ATTR_API_AQI_DESCRIPTION],
|
ATTR_DESCR: data[ATTR_API_AQI_DESCRIPTION],
|
||||||
ATTR_LEVEL: data[ATTR_API_AQI_LEVEL],
|
ATTR_LEVEL: data[ATTR_API_AQI_LEVEL],
|
||||||
|
ATTR_TIME: datetime.strptime(
|
||||||
|
f"{data[ATTR_API_REPORT_DATE]} {data[ATTR_API_REPORT_HOUR]}",
|
||||||
|
"%Y-%m-%d %H",
|
||||||
|
)
|
||||||
|
.replace(tzinfo=get_time_zone(data[ATTR_API_REPORT_TZ]))
|
||||||
|
.isoformat(),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
AirNowEntityDescription(
|
AirNowEntityDescription(
|
||||||
@@ -136,13 +148,14 @@ class AirNowSensor(CoordinatorEntity[AirNowDataUpdateCoordinator], SensorEntity)
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
|
|
||||||
|
_device_id = f"{coordinator.latitude}-{coordinator.longitude}"
|
||||||
|
|
||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
self._attr_unique_id = (
|
self._attr_unique_id = f"{_device_id}-{description.key.lower()}"
|
||||||
f"{coordinator.latitude}-{coordinator.longitude}-{description.key.lower()}"
|
|
||||||
)
|
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
entry_type=DeviceEntryType.SERVICE,
|
entry_type=DeviceEntryType.SERVICE,
|
||||||
identifiers={(DOMAIN, self._attr_unique_id)},
|
identifiers={(DOMAIN, _device_id)},
|
||||||
manufacturer=DEFAULT_NAME,
|
manufacturer=DEFAULT_NAME,
|
||||||
name=DEFAULT_NAME,
|
name=DEFAULT_NAME,
|
||||||
)
|
)
|
||||||
|
@@ -226,6 +226,14 @@ class AirthingsSensor(
|
|||||||
model=airthings_device.model,
|
model=airthings_device.model,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def available(self) -> bool:
|
||||||
|
"""Check if device and sensor is available in data."""
|
||||||
|
return (
|
||||||
|
super().available
|
||||||
|
and self.entity_description.key in self.coordinator.data.sensors
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_value(self) -> StateType:
|
def native_value(self) -> StateType:
|
||||||
"""Return the value reported by the sensor."""
|
"""Return the value reported by the sensor."""
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
"user": {
|
"user": {
|
||||||
"description": "[%key:component::bluetooth::config::step::user::description%]",
|
"description": "[%key:component::bluetooth::config::step::user::description%]",
|
||||||
"data": {
|
"data": {
|
||||||
"address": "[%key:component::bluetooth::config::step::user::data::address%]"
|
"address": "[%key:common::config_flow::data::device%]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bluetooth_confirm": {
|
"bluetooth_confirm": {
|
||||||
|
@@ -12,6 +12,9 @@
|
|||||||
"title": "Set up your AirTouch 4 connection details.",
|
"title": "Set up your AirTouch 4 connection details.",
|
||||||
"data": {
|
"data": {
|
||||||
"host": "[%key:common::config_flow::data::host%]"
|
"host": "[%key:common::config_flow::data::host%]"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"host": "The hostname or IP address of your AirTouch controller."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -421,7 +421,6 @@ class AirVisualEntity(CoordinatorEntity):
|
|||||||
self._entry = entry
|
self._entry = entry
|
||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
|
|
||||||
# pylint: disable-next=hass-missing-super-call
|
|
||||||
async def async_added_to_hass(self) -> None:
|
async def async_added_to_hass(self) -> None:
|
||||||
"""Register callbacks."""
|
"""Register callbacks."""
|
||||||
await super().async_added_to_hass()
|
await super().async_added_to_hass()
|
||||||
|
@@ -12,6 +12,9 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"ip_address": "[%key:common::config_flow::data::host%]",
|
"ip_address": "[%key:common::config_flow::data::host%]",
|
||||||
"password": "[%key:common::config_flow::data::password%]"
|
"password": "[%key:common::config_flow::data::password%]"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"ip_address": "The hostname or IP address of your AirVisual Pro device."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -9,7 +9,6 @@ from aioairzone.const import (
|
|||||||
AZD_BATTERY_LOW,
|
AZD_BATTERY_LOW,
|
||||||
AZD_ERRORS,
|
AZD_ERRORS,
|
||||||
AZD_FLOOR_DEMAND,
|
AZD_FLOOR_DEMAND,
|
||||||
AZD_NAME,
|
|
||||||
AZD_PROBLEMS,
|
AZD_PROBLEMS,
|
||||||
AZD_SYSTEMS,
|
AZD_SYSTEMS,
|
||||||
AZD_ZONES,
|
AZD_ZONES,
|
||||||
@@ -45,7 +44,6 @@ SYSTEM_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ..
|
|||||||
device_class=BinarySensorDeviceClass.PROBLEM,
|
device_class=BinarySensorDeviceClass.PROBLEM,
|
||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
key=AZD_PROBLEMS,
|
key=AZD_PROBLEMS,
|
||||||
name="Problem",
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -53,17 +51,16 @@ ZONE_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ...]
|
|||||||
AirzoneBinarySensorEntityDescription(
|
AirzoneBinarySensorEntityDescription(
|
||||||
device_class=BinarySensorDeviceClass.RUNNING,
|
device_class=BinarySensorDeviceClass.RUNNING,
|
||||||
key=AZD_AIR_DEMAND,
|
key=AZD_AIR_DEMAND,
|
||||||
name="Air Demand",
|
translation_key="air_demand",
|
||||||
),
|
),
|
||||||
AirzoneBinarySensorEntityDescription(
|
AirzoneBinarySensorEntityDescription(
|
||||||
device_class=BinarySensorDeviceClass.BATTERY,
|
device_class=BinarySensorDeviceClass.BATTERY,
|
||||||
key=AZD_BATTERY_LOW,
|
key=AZD_BATTERY_LOW,
|
||||||
name="Battery Low",
|
|
||||||
),
|
),
|
||||||
AirzoneBinarySensorEntityDescription(
|
AirzoneBinarySensorEntityDescription(
|
||||||
device_class=BinarySensorDeviceClass.RUNNING,
|
device_class=BinarySensorDeviceClass.RUNNING,
|
||||||
key=AZD_FLOOR_DEMAND,
|
key=AZD_FLOOR_DEMAND,
|
||||||
name="Floor Demand",
|
translation_key="floor_demand",
|
||||||
),
|
),
|
||||||
AirzoneBinarySensorEntityDescription(
|
AirzoneBinarySensorEntityDescription(
|
||||||
attributes={
|
attributes={
|
||||||
@@ -72,7 +69,6 @@ ZONE_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ...]
|
|||||||
device_class=BinarySensorDeviceClass.PROBLEM,
|
device_class=BinarySensorDeviceClass.PROBLEM,
|
||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
key=AZD_PROBLEMS,
|
key=AZD_PROBLEMS,
|
||||||
name="Problem",
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -149,7 +145,6 @@ class AirzoneSystemBinarySensor(AirzoneSystemEntity, AirzoneBinarySensor):
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator, entry, system_data)
|
super().__init__(coordinator, entry, system_data)
|
||||||
self._attr_name = f"System {system_id} {description.name}"
|
|
||||||
self._attr_unique_id = f"{self._attr_unique_id}_{system_id}_{description.key}"
|
self._attr_unique_id = f"{self._attr_unique_id}_{system_id}_{description.key}"
|
||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
self._async_update_attrs()
|
self._async_update_attrs()
|
||||||
@@ -169,7 +164,6 @@ class AirzoneZoneBinarySensor(AirzoneZoneEntity, AirzoneBinarySensor):
|
|||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
||||||
|
|
||||||
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
|
|
||||||
self._attr_unique_id = (
|
self._attr_unique_id = (
|
||||||
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
||||||
)
|
)
|
||||||
|
@@ -19,7 +19,6 @@ from aioairzone.const import (
|
|||||||
AZD_MASTER,
|
AZD_MASTER,
|
||||||
AZD_MODE,
|
AZD_MODE,
|
||||||
AZD_MODES,
|
AZD_MODES,
|
||||||
AZD_NAME,
|
|
||||||
AZD_ON,
|
AZD_ON,
|
||||||
AZD_SPEED,
|
AZD_SPEED,
|
||||||
AZD_SPEEDS,
|
AZD_SPEEDS,
|
||||||
@@ -32,6 +31,7 @@ from aioairzone.const import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from homeassistant.components.climate import (
|
from homeassistant.components.climate import (
|
||||||
|
ATTR_HVAC_MODE,
|
||||||
ATTR_TARGET_TEMP_HIGH,
|
ATTR_TARGET_TEMP_HIGH,
|
||||||
ATTR_TARGET_TEMP_LOW,
|
ATTR_TARGET_TEMP_LOW,
|
||||||
FAN_AUTO,
|
FAN_AUTO,
|
||||||
@@ -114,6 +114,7 @@ async def async_setup_entry(
|
|||||||
class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
||||||
"""Define an Airzone sensor."""
|
"""Define an Airzone sensor."""
|
||||||
|
|
||||||
|
_attr_name = None
|
||||||
_speeds: dict[int, str] = {}
|
_speeds: dict[int, str] = {}
|
||||||
_speeds_reverse: dict[str, int] = {}
|
_speeds_reverse: dict[str, int] = {}
|
||||||
|
|
||||||
@@ -127,7 +128,6 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
|||||||
"""Initialize Airzone climate entity."""
|
"""Initialize Airzone climate entity."""
|
||||||
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
||||||
|
|
||||||
self._attr_name = f"{zone_data[AZD_NAME]}"
|
|
||||||
self._attr_unique_id = f"{self._attr_unique_id}_{system_zone_id}"
|
self._attr_unique_id = f"{self._attr_unique_id}_{system_zone_id}"
|
||||||
self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
|
self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
self._attr_target_temperature_step = API_TEMPERATURE_STEP
|
self._attr_target_temperature_step = API_TEMPERATURE_STEP
|
||||||
@@ -209,7 +209,9 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
|||||||
await self._async_update_hvac_params(params)
|
await self._async_update_hvac_params(params)
|
||||||
|
|
||||||
if slave_raise:
|
if slave_raise:
|
||||||
raise HomeAssistantError(f"Mode can't be changed on slave zone {self.name}")
|
raise HomeAssistantError(
|
||||||
|
f"Mode can't be changed on slave zone {self.entity_id}"
|
||||||
|
)
|
||||||
|
|
||||||
async def async_set_temperature(self, **kwargs: Any) -> None:
|
async def async_set_temperature(self, **kwargs: Any) -> None:
|
||||||
"""Set new target temperature."""
|
"""Set new target temperature."""
|
||||||
@@ -217,10 +219,13 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
|||||||
if ATTR_TEMPERATURE in kwargs:
|
if ATTR_TEMPERATURE in kwargs:
|
||||||
params[API_SET_POINT] = kwargs[ATTR_TEMPERATURE]
|
params[API_SET_POINT] = kwargs[ATTR_TEMPERATURE]
|
||||||
if ATTR_TARGET_TEMP_LOW in kwargs and ATTR_TARGET_TEMP_HIGH in kwargs:
|
if ATTR_TARGET_TEMP_LOW in kwargs and ATTR_TARGET_TEMP_HIGH in kwargs:
|
||||||
params[API_COOL_SET_POINT] = kwargs[ATTR_TARGET_TEMP_LOW]
|
params[API_COOL_SET_POINT] = kwargs[ATTR_TARGET_TEMP_HIGH]
|
||||||
params[API_HEAT_SET_POINT] = kwargs[ATTR_TARGET_TEMP_HIGH]
|
params[API_HEAT_SET_POINT] = kwargs[ATTR_TARGET_TEMP_LOW]
|
||||||
await self._async_update_hvac_params(params)
|
await self._async_update_hvac_params(params)
|
||||||
|
|
||||||
|
if ATTR_HVAC_MODE in kwargs:
|
||||||
|
await self.async_set_hvac_mode(kwargs[ATTR_HVAC_MODE])
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _handle_coordinator_update(self) -> None:
|
def _handle_coordinator_update(self) -> None:
|
||||||
"""Update attributes when the coordinator updates."""
|
"""Update attributes when the coordinator updates."""
|
||||||
@@ -248,8 +253,8 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
|
|||||||
self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED))
|
self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED))
|
||||||
if self.supported_features & ClimateEntityFeature.TARGET_TEMPERATURE_RANGE:
|
if self.supported_features & ClimateEntityFeature.TARGET_TEMPERATURE_RANGE:
|
||||||
self._attr_target_temperature_high = self.get_airzone_value(
|
self._attr_target_temperature_high = self.get_airzone_value(
|
||||||
AZD_HEAT_TEMP_SET
|
|
||||||
)
|
|
||||||
self._attr_target_temperature_low = self.get_airzone_value(
|
|
||||||
AZD_COOL_TEMP_SET
|
AZD_COOL_TEMP_SET
|
||||||
)
|
)
|
||||||
|
self._attr_target_temperature_low = self.get_airzone_value(
|
||||||
|
AZD_HEAT_TEMP_SET
|
||||||
|
)
|
||||||
|
@@ -39,6 +39,8 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator]):
|
class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator]):
|
||||||
"""Define an Airzone entity."""
|
"""Define an Airzone entity."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
|
||||||
def get_airzone_value(self, key: str) -> Any:
|
def get_airzone_value(self, key: str) -> Any:
|
||||||
"""Return Airzone entity value by key."""
|
"""Return Airzone entity value by key."""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
@@ -62,7 +64,7 @@ class AirzoneSystemEntity(AirzoneEntity):
|
|||||||
identifiers={(DOMAIN, f"{entry.entry_id}_{self.system_id}")},
|
identifiers={(DOMAIN, f"{entry.entry_id}_{self.system_id}")},
|
||||||
manufacturer=MANUFACTURER,
|
manufacturer=MANUFACTURER,
|
||||||
model=self.get_airzone_value(AZD_MODEL),
|
model=self.get_airzone_value(AZD_MODEL),
|
||||||
name=self.get_airzone_value(AZD_FULL_NAME),
|
name=f"System {self.system_id}",
|
||||||
sw_version=self.get_airzone_value(AZD_FIRMWARE),
|
sw_version=self.get_airzone_value(AZD_FIRMWARE),
|
||||||
via_device=(DOMAIN, f"{entry.entry_id}_ws"),
|
via_device=(DOMAIN, f"{entry.entry_id}_ws"),
|
||||||
)
|
)
|
||||||
@@ -116,9 +118,7 @@ class AirzoneHotWaterEntity(AirzoneEntity):
|
|||||||
try:
|
try:
|
||||||
await self.coordinator.airzone.set_dhw_parameters(_params)
|
await self.coordinator.airzone.set_dhw_parameters(_params)
|
||||||
except AirzoneError as error:
|
except AirzoneError as error:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(f"Failed to set DHW: {error}") from error
|
||||||
f"Failed to set dhw {self.name}: {error}"
|
|
||||||
) from error
|
|
||||||
|
|
||||||
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
|
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ class AirzoneZoneEntity(AirzoneEntity):
|
|||||||
identifiers={(DOMAIN, f"{entry.entry_id}_{system_zone_id}")},
|
identifiers={(DOMAIN, f"{entry.entry_id}_{system_zone_id}")},
|
||||||
manufacturer=MANUFACTURER,
|
manufacturer=MANUFACTURER,
|
||||||
model=self.get_airzone_value(AZD_THERMOSTAT_MODEL),
|
model=self.get_airzone_value(AZD_THERMOSTAT_MODEL),
|
||||||
name=f"Airzone [{system_zone_id}] {zone_data[AZD_NAME]}",
|
name=zone_data[AZD_NAME],
|
||||||
sw_version=self.get_airzone_value(AZD_THERMOSTAT_FW),
|
sw_version=self.get_airzone_value(AZD_THERMOSTAT_FW),
|
||||||
via_device=(DOMAIN, f"{entry.entry_id}_{self.system_id}"),
|
via_device=(DOMAIN, f"{entry.entry_id}_{self.system_id}"),
|
||||||
)
|
)
|
||||||
@@ -203,7 +203,7 @@ class AirzoneZoneEntity(AirzoneEntity):
|
|||||||
await self.coordinator.airzone.set_hvac_parameters(_params)
|
await self.coordinator.airzone.set_hvac_parameters(_params)
|
||||||
except AirzoneError as error:
|
except AirzoneError as error:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to set zone {self.name}: {error}"
|
f"Failed to set zone {self.entity_id}: {error}"
|
||||||
) from error
|
) from error
|
||||||
|
|
||||||
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
|
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
|
||||||
|
@@ -11,5 +11,5 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/airzone",
|
"documentation": "https://www.home-assistant.io/integrations/airzone",
|
||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"loggers": ["aioairzone"],
|
"loggers": ["aioairzone"],
|
||||||
"requirements": ["aioairzone==0.6.8"]
|
"requirements": ["aioairzone==0.6.9"]
|
||||||
}
|
}
|
||||||
|
@@ -11,7 +11,6 @@ from aioairzone.const import (
|
|||||||
API_SLEEP,
|
API_SLEEP,
|
||||||
AZD_COLD_ANGLE,
|
AZD_COLD_ANGLE,
|
||||||
AZD_HEAT_ANGLE,
|
AZD_HEAT_ANGLE,
|
||||||
AZD_NAME,
|
|
||||||
AZD_SLEEP,
|
AZD_SLEEP,
|
||||||
AZD_ZONES,
|
AZD_ZONES,
|
||||||
)
|
)
|
||||||
@@ -60,7 +59,6 @@ ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
|
|||||||
api_param=API_COLD_ANGLE,
|
api_param=API_COLD_ANGLE,
|
||||||
entity_category=EntityCategory.CONFIG,
|
entity_category=EntityCategory.CONFIG,
|
||||||
key=AZD_COLD_ANGLE,
|
key=AZD_COLD_ANGLE,
|
||||||
name="Cold Angle",
|
|
||||||
options=list(GRILLE_ANGLE_DICT),
|
options=list(GRILLE_ANGLE_DICT),
|
||||||
options_dict=GRILLE_ANGLE_DICT,
|
options_dict=GRILLE_ANGLE_DICT,
|
||||||
translation_key="grille_angles",
|
translation_key="grille_angles",
|
||||||
@@ -69,16 +67,14 @@ ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
|
|||||||
api_param=API_HEAT_ANGLE,
|
api_param=API_HEAT_ANGLE,
|
||||||
entity_category=EntityCategory.CONFIG,
|
entity_category=EntityCategory.CONFIG,
|
||||||
key=AZD_HEAT_ANGLE,
|
key=AZD_HEAT_ANGLE,
|
||||||
name="Heat Angle",
|
|
||||||
options=list(GRILLE_ANGLE_DICT),
|
options=list(GRILLE_ANGLE_DICT),
|
||||||
options_dict=GRILLE_ANGLE_DICT,
|
options_dict=GRILLE_ANGLE_DICT,
|
||||||
translation_key="grille_angles",
|
translation_key="heat_angles",
|
||||||
),
|
),
|
||||||
AirzoneSelectDescription(
|
AirzoneSelectDescription(
|
||||||
api_param=API_SLEEP,
|
api_param=API_SLEEP,
|
||||||
entity_category=EntityCategory.CONFIG,
|
entity_category=EntityCategory.CONFIG,
|
||||||
key=AZD_SLEEP,
|
key=AZD_SLEEP,
|
||||||
name="Sleep",
|
|
||||||
options=list(SLEEP_DICT),
|
options=list(SLEEP_DICT),
|
||||||
options_dict=SLEEP_DICT,
|
options_dict=SLEEP_DICT,
|
||||||
translation_key="sleep_times",
|
translation_key="sleep_times",
|
||||||
@@ -146,7 +142,6 @@ class AirzoneZoneSelect(AirzoneZoneEntity, AirzoneBaseSelect):
|
|||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
||||||
|
|
||||||
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
|
|
||||||
self._attr_unique_id = (
|
self._attr_unique_id = (
|
||||||
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
||||||
)
|
)
|
||||||
|
@@ -6,7 +6,6 @@ from typing import Any, Final
|
|||||||
from aioairzone.const import (
|
from aioairzone.const import (
|
||||||
AZD_HOT_WATER,
|
AZD_HOT_WATER,
|
||||||
AZD_HUMIDITY,
|
AZD_HUMIDITY,
|
||||||
AZD_NAME,
|
|
||||||
AZD_TEMP,
|
AZD_TEMP,
|
||||||
AZD_TEMP_UNIT,
|
AZD_TEMP_UNIT,
|
||||||
AZD_WEBSERVER,
|
AZD_WEBSERVER,
|
||||||
@@ -54,7 +53,7 @@ WEBSERVER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
|
|||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
key=AZD_WIFI_RSSI,
|
key=AZD_WIFI_RSSI,
|
||||||
name="RSSI",
|
translation_key="rssi",
|
||||||
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
|
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
),
|
),
|
||||||
@@ -64,14 +63,12 @@ ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
|
|||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
device_class=SensorDeviceClass.TEMPERATURE,
|
device_class=SensorDeviceClass.TEMPERATURE,
|
||||||
key=AZD_TEMP,
|
key=AZD_TEMP,
|
||||||
name="Temperature",
|
|
||||||
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
|
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
device_class=SensorDeviceClass.HUMIDITY,
|
device_class=SensorDeviceClass.HUMIDITY,
|
||||||
key=AZD_HUMIDITY,
|
key=AZD_HUMIDITY,
|
||||||
name="Humidity",
|
|
||||||
native_unit_of_measurement=PERCENTAGE,
|
native_unit_of_measurement=PERCENTAGE,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
),
|
),
|
||||||
@@ -144,8 +141,6 @@ class AirzoneSensor(AirzoneEntity, SensorEntity):
|
|||||||
class AirzoneHotWaterSensor(AirzoneHotWaterEntity, AirzoneSensor):
|
class AirzoneHotWaterSensor(AirzoneHotWaterEntity, AirzoneSensor):
|
||||||
"""Define an Airzone Hot Water sensor."""
|
"""Define an Airzone Hot Water sensor."""
|
||||||
|
|
||||||
_attr_has_entity_name = True
|
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
coordinator: AirzoneUpdateCoordinator,
|
coordinator: AirzoneUpdateCoordinator,
|
||||||
@@ -176,7 +171,6 @@ class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor):
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator, entry)
|
super().__init__(coordinator, entry)
|
||||||
self._attr_name = f"WebServer {description.name}"
|
|
||||||
self._attr_unique_id = f"{self._attr_unique_id}_ws_{description.key}"
|
self._attr_unique_id = f"{self._attr_unique_id}_ws_{description.key}"
|
||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
self._async_update_attrs()
|
self._async_update_attrs()
|
||||||
@@ -196,7 +190,6 @@ class AirzoneZoneSensor(AirzoneZoneEntity, AirzoneSensor):
|
|||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
super().__init__(coordinator, entry, system_zone_id, zone_data)
|
||||||
|
|
||||||
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
|
|
||||||
self._attr_unique_id = (
|
self._attr_unique_id = (
|
||||||
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
|
||||||
)
|
)
|
||||||
|
@@ -25,8 +25,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"entity": {
|
"entity": {
|
||||||
|
"binary_sensor": {
|
||||||
|
"air_demand": {
|
||||||
|
"name": "Air demand"
|
||||||
|
},
|
||||||
|
"floor_demand": {
|
||||||
|
"name": "Floor demand"
|
||||||
|
}
|
||||||
|
},
|
||||||
"select": {
|
"select": {
|
||||||
"grille_angles": {
|
"grille_angles": {
|
||||||
|
"name": "Cold angle",
|
||||||
"state": {
|
"state": {
|
||||||
"90deg": "90°",
|
"90deg": "90°",
|
||||||
"50deg": "50°",
|
"50deg": "50°",
|
||||||
@@ -34,7 +43,17 @@
|
|||||||
"40deg": "40°"
|
"40deg": "40°"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"heat_angles": {
|
||||||
|
"name": "Heat angle",
|
||||||
|
"state": {
|
||||||
|
"90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]",
|
||||||
|
"50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]",
|
||||||
|
"45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]",
|
||||||
|
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]"
|
||||||
|
}
|
||||||
|
},
|
||||||
"sleep_times": {
|
"sleep_times": {
|
||||||
|
"name": "Sleep",
|
||||||
"state": {
|
"state": {
|
||||||
"off": "[%key:common::state::off%]",
|
"off": "[%key:common::state::off%]",
|
||||||
"30m": "30 minutes",
|
"30m": "30 minutes",
|
||||||
@@ -42,6 +61,11 @@
|
|||||||
"90m": "90 minutes"
|
"90m": "90 minutes"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"sensor": {
|
||||||
|
"rssi": {
|
||||||
|
"name": "RSSI"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,6 @@ from aioairzone.const import (
|
|||||||
API_ACS_POWER_MODE,
|
API_ACS_POWER_MODE,
|
||||||
API_ACS_SET_POINT,
|
API_ACS_SET_POINT,
|
||||||
AZD_HOT_WATER,
|
AZD_HOT_WATER,
|
||||||
AZD_NAME,
|
|
||||||
AZD_OPERATION,
|
AZD_OPERATION,
|
||||||
AZD_OPERATIONS,
|
AZD_OPERATIONS,
|
||||||
AZD_TEMP,
|
AZD_TEMP,
|
||||||
@@ -67,6 +66,7 @@ async def async_setup_entry(
|
|||||||
class AirzoneWaterHeater(AirzoneHotWaterEntity, WaterHeaterEntity):
|
class AirzoneWaterHeater(AirzoneHotWaterEntity, WaterHeaterEntity):
|
||||||
"""Define an Airzone Water Heater."""
|
"""Define an Airzone Water Heater."""
|
||||||
|
|
||||||
|
_attr_name = None
|
||||||
_attr_supported_features = (
|
_attr_supported_features = (
|
||||||
WaterHeaterEntityFeature.TARGET_TEMPERATURE
|
WaterHeaterEntityFeature.TARGET_TEMPERATURE
|
||||||
| WaterHeaterEntityFeature.ON_OFF
|
| WaterHeaterEntityFeature.ON_OFF
|
||||||
@@ -81,7 +81,6 @@ class AirzoneWaterHeater(AirzoneHotWaterEntity, WaterHeaterEntity):
|
|||||||
"""Initialize Airzone water heater entity."""
|
"""Initialize Airzone water heater entity."""
|
||||||
super().__init__(coordinator, entry)
|
super().__init__(coordinator, entry)
|
||||||
|
|
||||||
self._attr_name = self.get_airzone_value(AZD_NAME)
|
|
||||||
self._attr_unique_id = f"{self._attr_unique_id}_dhw"
|
self._attr_unique_id = f"{self._attr_unique_id}_dhw"
|
||||||
self._attr_operation_list = [
|
self._attr_operation_list = [
|
||||||
OPERATION_LIB_TO_HASS[operation]
|
OPERATION_LIB_TO_HASS[operation]
|
||||||
|
@@ -46,7 +46,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
|
|
||||||
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
"""Unload a config entry."""
|
"""Unload a config entry."""
|
||||||
|
|
||||||
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
|
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
|
||||||
hass.data[DOMAIN].pop(entry.entry_id)
|
coordinator: AirzoneUpdateCoordinator = hass.data[DOMAIN].pop(entry.entry_id)
|
||||||
|
await coordinator.airzone.logout()
|
||||||
|
|
||||||
return unload_ok
|
return unload_ok
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user