mirror of
https://github.com/home-assistant/core.git
synced 2025-10-30 05:59:29 +00:00
Compare commits
614 Commits
drop-ignor
...
2025.11.0b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95ac5c0183 | ||
|
|
40995b6d32 | ||
|
|
f64c029bd1 | ||
|
|
a050c0cd05 | ||
|
|
0c121468e0 | ||
|
|
af277651f8 | ||
|
|
ca90826478 | ||
|
|
dd4789af4e | ||
|
|
ca49b6e7e2 | ||
|
|
fdbe293483 | ||
|
|
aa67b46f6f | ||
|
|
9f21a97d39 | ||
|
|
49158fad48 | ||
|
|
dff8e5221b | ||
|
|
dbfa0aa22c | ||
|
|
ec4464d65f | ||
|
|
6c8dffd521 | ||
|
|
09763012fc | ||
|
|
aa5b970102 | ||
|
|
80912045d7 | ||
|
|
dbda31f6d5 | ||
|
|
24219dd8f7 | ||
|
|
77d0cf1573 | ||
|
|
1ea534e400 | ||
|
|
a6ba8fa69c | ||
|
|
a6c1ce86d8 | ||
|
|
fbb07e16cb | ||
|
|
1387308f48 | ||
|
|
48d371eddb | ||
|
|
c45c11574c | ||
|
|
14eb103338 | ||
|
|
2bdb258a39 | ||
|
|
5b323526b6 | ||
|
|
9d434c9403 | ||
|
|
e4103137ef | ||
|
|
d9d4cc9004 | ||
|
|
67baa2c737 | ||
|
|
f9c504fcde | ||
|
|
4b25d04326 | ||
|
|
4e3eb44e69 | ||
|
|
6c84d25024 | ||
|
|
c4dc4135e1 | ||
|
|
78bbdf108b | ||
|
|
47397fd736 | ||
|
|
2b62d2d636 | ||
|
|
350f99baab | ||
|
|
1245385371 | ||
|
|
c86852eb21 | ||
|
|
ad635d2eff | ||
|
|
cf0e2b85dd | ||
|
|
b9e7f1c628 | ||
|
|
079d65acea | ||
|
|
162737a473 | ||
|
|
d074c5b7c8 | ||
|
|
d6ae0c142e | ||
|
|
58182a344d | ||
|
|
1a1f3d6b4e | ||
|
|
71589d212f | ||
|
|
9364a40fd2 | ||
|
|
7ead8f9154 | ||
|
|
09ac47b35f | ||
|
|
404393d6fe | ||
|
|
de5a26830d | ||
|
|
c0b0ce0c16 | ||
|
|
88e27d9017 | ||
|
|
a37ba6dba4 | ||
|
|
f38c0d510e | ||
|
|
be9fa9a606 | ||
|
|
2bc6e728a3 | ||
|
|
4e4a0d1e28 | ||
|
|
c860aa1531 | ||
|
|
39c73cbbbd | ||
|
|
ca7332f597 | ||
|
|
eafedeb12a | ||
|
|
ce93de7fc6 | ||
|
|
03f339b3a3 | ||
|
|
6cfeeea1ba | ||
|
|
ccbdaabe74 | ||
|
|
dd22c78d11 | ||
|
|
1a732accdd | ||
|
|
59d663ee6e | ||
|
|
2442a96c27 | ||
|
|
f69de99501 | ||
|
|
8ce9238f7a | ||
|
|
2fe697486d | ||
|
|
0bd25dc254 | ||
|
|
ed6af953af | ||
|
|
84f65c3f77 | ||
|
|
77c024fcdd | ||
|
|
27570138e7 | ||
|
|
96f84b2b99 | ||
|
|
28bee6d1aa | ||
|
|
c9d68ddd5c | ||
|
|
ac6dddc895 | ||
|
|
f7e5dc7637 | ||
|
|
1a5f431485 | ||
|
|
faa04755e2 | ||
|
|
76584161a6 | ||
|
|
103b121868 | ||
|
|
76a6b3cea6 | ||
|
|
87e7fe6e37 | ||
|
|
c782489973 | ||
|
|
c9dbc1458c | ||
|
|
d4a33611f0 | ||
|
|
f028b7ab6e | ||
|
|
86a9df761a | ||
|
|
e3359fb62d | ||
|
|
84065767d1 | ||
|
|
e7c60f573d | ||
|
|
a59847309a | ||
|
|
3c8ac20881 | ||
|
|
6394fdbc97 | ||
|
|
a7a673d437 | ||
|
|
196d7bb8cf | ||
|
|
ce5538e615 | ||
|
|
6819b0ce5b | ||
|
|
91eb35d7cb | ||
|
|
256615644c | ||
|
|
aff6cfb032 | ||
|
|
a5d8c383c4 | ||
|
|
81df40e2b0 | ||
|
|
3e6ddda54e | ||
|
|
76c6b92910 | ||
|
|
f7db56a6b3 | ||
|
|
507645a60f | ||
|
|
7c4406265a | ||
|
|
4e6bd48416 | ||
|
|
255b1efe81 | ||
|
|
afa5093d7a | ||
|
|
a43368675e | ||
|
|
39d76a24db | ||
|
|
3e17a97422 | ||
|
|
e6e78f86bd | ||
|
|
a72fe28d7a | ||
|
|
fa7ff1d996 | ||
|
|
2cc910f4b1 | ||
|
|
b686e4d8db | ||
|
|
07493e5b3e | ||
|
|
477073da75 | ||
|
|
b59bc45ef1 | ||
|
|
da055795c7 | ||
|
|
3cd17a2b9f | ||
|
|
d689400b3b | ||
|
|
a1f024eed8 | ||
|
|
07b6358fff | ||
|
|
6fa73f7f6a | ||
|
|
3c46b40cee | ||
|
|
4c9810a10e | ||
|
|
83e9fca6a2 | ||
|
|
fc9313f7ef | ||
|
|
278f32285a | ||
|
|
8c360908ef | ||
|
|
82c5337fcf | ||
|
|
7950f9ab38 | ||
|
|
66eeb41e56 | ||
|
|
1bef707cd1 | ||
|
|
2125a4123d | ||
|
|
27516dee6a | ||
|
|
40c9e5356e | ||
|
|
2521920376 | ||
|
|
16eb8315ee | ||
|
|
2c3d65b461 | ||
|
|
7e938f4f13 | ||
|
|
c5c4cf0284 | ||
|
|
68c38ac047 | ||
|
|
f5a6fa8be1 | ||
|
|
3c751918fd | ||
|
|
a3c8760b3f | ||
|
|
7bceaf74be | ||
|
|
750f06327a | ||
|
|
98bffdb9d3 | ||
|
|
174b0f7c01 | ||
|
|
807edc9f47 | ||
|
|
9b0f67fbde | ||
|
|
27390647ff | ||
|
|
d9f6a6bf99 | ||
|
|
67be4f863f | ||
|
|
c960bd2845 | ||
|
|
447fb68085 | ||
|
|
750a7c9797 | ||
|
|
5679ab0f86 | ||
|
|
2761dcbc48 | ||
|
|
3a00d96571 | ||
|
|
c86ad896b8 | ||
|
|
9c1d8747be | ||
|
|
4a003114bd | ||
|
|
dcc3f14b1f | ||
|
|
7687d5ea48 | ||
|
|
27cc3c838a | ||
|
|
619cb91839 | ||
|
|
5e5e130d4e | ||
|
|
f6ac23cc58 | ||
|
|
244b6437b2 | ||
|
|
5dc271b201 | ||
|
|
531cc3e1ce | ||
|
|
ed7c3cb339 | ||
|
|
3b7e1a2610 | ||
|
|
16e11ed801 | ||
|
|
32a7bf4dbb | ||
|
|
856c99dc22 | ||
|
|
a50b00b3c2 | ||
|
|
1df8b1063b | ||
|
|
32cd4364f6 | ||
|
|
0828a842a5 | ||
|
|
f63a527a01 | ||
|
|
254a9ecc25 | ||
|
|
a518907b09 | ||
|
|
cd85699151 | ||
|
|
f49dfbd459 | ||
|
|
3ed70bb751 | ||
|
|
b4b1065737 | ||
|
|
7267c3c04e | ||
|
|
6ac4d2dd59 | ||
|
|
03abd5d277 | ||
|
|
66bb0db08b | ||
|
|
56ae579e83 | ||
|
|
add1915b8a | ||
|
|
18ef4af8d0 | ||
|
|
3c6788212f | ||
|
|
dbd8b1bc19 | ||
|
|
d135f1c110 | ||
|
|
c11cacbb58 | ||
|
|
d8d6490fb4 | ||
|
|
2341f53ac0 | ||
|
|
94e8ffadd2 | ||
|
|
5186c402e7 | ||
|
|
4403447d53 | ||
|
|
9a8a2bfebc | ||
|
|
a907a34f6e | ||
|
|
03b15f1dba | ||
|
|
a48b915d90 | ||
|
|
e8227baa50 | ||
|
|
4d525dee48 | ||
|
|
c38e02072e | ||
|
|
2d84bd65fe | ||
|
|
1d8eaeb8af | ||
|
|
33ed851477 | ||
|
|
a571271f6a | ||
|
|
43445f5945 | ||
|
|
3c098db35e | ||
|
|
c72072fbfb | ||
|
|
10e2c7ec95 | ||
|
|
64493ca578 | ||
|
|
5f008dcae5 | ||
|
|
80c06c689c | ||
|
|
b19070fa4b | ||
|
|
53984f7abc | ||
|
|
38620a0cda | ||
|
|
b09927bb53 | ||
|
|
11b9f7915b | ||
|
|
3ddb520693 | ||
|
|
ffc54c699d | ||
|
|
91b516d739 | ||
|
|
25a9948020 | ||
|
|
f0f420ebe2 | ||
|
|
312812dd8b | ||
|
|
e0d404456b | ||
|
|
439fc18860 | ||
|
|
774ab06206 | ||
|
|
f484db8f0e | ||
|
|
4af3c4f720 | ||
|
|
a020a32d8a | ||
|
|
1ac2ae3443 | ||
|
|
2fce7db132 | ||
|
|
6e49911e1c | ||
|
|
4215a16285 | ||
|
|
65ff4fe10e | ||
|
|
5b7675e389 | ||
|
|
3019744035 | ||
|
|
21ab630380 | ||
|
|
564ff12db0 | ||
|
|
6c919e698f | ||
|
|
5d644815fa | ||
|
|
8dfa0f2f65 | ||
|
|
f9484acbfa | ||
|
|
d0c0247086 | ||
|
|
b116619af1 | ||
|
|
a3d760156f | ||
|
|
6e194ad6ef | ||
|
|
1e2a21b69f | ||
|
|
e90fe96b4e | ||
|
|
4774ed508a | ||
|
|
8f4a4d4c47 | ||
|
|
a83bbe2332 | ||
|
|
e5b93d3275 | ||
|
|
1c024f58af | ||
|
|
fa86148df0 | ||
|
|
7c6bbb97ea | ||
|
|
a5af501da4 | ||
|
|
f23cfb5594 | ||
|
|
67a12dc007 | ||
|
|
5783b3a576 | ||
|
|
7bc43039bd | ||
|
|
23e2316c36 | ||
|
|
9e9c8f5724 | ||
|
|
11772dbc46 | ||
|
|
c12df5d776 | ||
|
|
b57ca143e6 | ||
|
|
b3e16bd4fa | ||
|
|
18d5035877 | ||
|
|
d6db50fcc7 | ||
|
|
84d9fa3bd7 | ||
|
|
b08eb3a201 | ||
|
|
c74c317922 | ||
|
|
9edc6249ca | ||
|
|
4fbcb79889 | ||
|
|
68fd5bc67e | ||
|
|
882d047bb5 | ||
|
|
5c070c8f03 | ||
|
|
854882d612 | ||
|
|
b078c0ee7e | ||
|
|
080b16a33d | ||
|
|
6a1cf9827c | ||
|
|
23e7b14eae | ||
|
|
2a5cf83f50 | ||
|
|
5dcb68cdf6 | ||
|
|
fedeca107a | ||
|
|
4fef19c7bc | ||
|
|
8c953b0c4e | ||
|
|
949544874f | ||
|
|
237407010a | ||
|
|
64e48816c7 | ||
|
|
6b76b3e729 | ||
|
|
4912280193 | ||
|
|
d4e72ad2cf | ||
|
|
711526fc6c | ||
|
|
4be428fce7 | ||
|
|
ea226806a0 | ||
|
|
bc77daf2ce | ||
|
|
acead56bd5 | ||
|
|
fd08c55b79 | ||
|
|
0c342c4750 | ||
|
|
da6986e58c | ||
|
|
2f5fbc1f0e | ||
|
|
e79c76cd35 | ||
|
|
6edafd8965 | ||
|
|
204ff5d45f | ||
|
|
591eb94515 | ||
|
|
0f3de627c5 | ||
|
|
b2699d8a03 | ||
|
|
769a770cf1 | ||
|
|
2d96e8ac4d | ||
|
|
354cacdcae | ||
|
|
d999dd05d1 | ||
|
|
81572c6a84 | ||
|
|
8165ac196f | ||
|
|
41c95247ec | ||
|
|
2eb3360e8c | ||
|
|
fcd07902b0 | ||
|
|
71f94cad97 | ||
|
|
05277aa708 | ||
|
|
9f74471d22 | ||
|
|
1c8487a7e7 | ||
|
|
3c8612b6fd | ||
|
|
f28892c526 | ||
|
|
24b7cf261c | ||
|
|
ef69e6d54b | ||
|
|
ca31a279fa | ||
|
|
e50c4c4787 | ||
|
|
3ecddda8dd | ||
|
|
af77f835a5 | ||
|
|
6de2016aa3 | ||
|
|
f1e72c1616 | ||
|
|
7af3eb638b | ||
|
|
363e5f088c | ||
|
|
5b1e3ef574 | ||
|
|
d607323731 | ||
|
|
31f595a3f8 | ||
|
|
9a27805349 | ||
|
|
477cdbb711 | ||
|
|
62b39fdd10 | ||
|
|
f806cc8b4b | ||
|
|
b6108001e4 | ||
|
|
56f33a8a5f | ||
|
|
1e91ad6e23 | ||
|
|
9032de4b26 | ||
|
|
553fcb5156 | ||
|
|
378295e1cc | ||
|
|
ff95c6235f | ||
|
|
d398a13899 | ||
|
|
10b300e573 | ||
|
|
e95c0ef3a8 | ||
|
|
3b09adb360 | ||
|
|
d2380608e1 | ||
|
|
37188a0832 | ||
|
|
3134fd75e8 | ||
|
|
861f4a0578 | ||
|
|
a82c512472 | ||
|
|
10392d9719 | ||
|
|
b7acc66153 | ||
|
|
6249cabcba | ||
|
|
84f2fd106d | ||
|
|
45cc68d3e4 | ||
|
|
7fd75c7742 | ||
|
|
9522b11042 | ||
|
|
c874c4ac73 | ||
|
|
907ef8fa15 | ||
|
|
bc93153c40 | ||
|
|
6964829699 | ||
|
|
62e59608b0 | ||
|
|
9507b3f3aa | ||
|
|
1d187abe10 | ||
|
|
0464cb8929 | ||
|
|
f410d94f80 | ||
|
|
dee3c11203 | ||
|
|
06e4b0a798 | ||
|
|
2fd55a49cb | ||
|
|
80d7224dcf | ||
|
|
9d03b1b9b4 | ||
|
|
cecdf553f3 | ||
|
|
54e6fbc042 | ||
|
|
9c098d3471 | ||
|
|
bb98ed6633 | ||
|
|
59dace572a | ||
|
|
735cf36a5b | ||
|
|
90b0f50b8f | ||
|
|
e731c07b77 | ||
|
|
2c75635e95 | ||
|
|
1f031695c2 | ||
|
|
fb279212a9 | ||
|
|
45869523d0 | ||
|
|
a753926f22 | ||
|
|
dc874ff53a | ||
|
|
3ef6865708 | ||
|
|
7f1989f9f2 | ||
|
|
97e338c760 | ||
|
|
101679c17d | ||
|
|
bc784c356e | ||
|
|
556cc57d8b | ||
|
|
eef6e96a93 | ||
|
|
56d237af7f | ||
|
|
e5d1902d2a | ||
|
|
a9a203678e | ||
|
|
7f6237cc63 | ||
|
|
5468e691ca | ||
|
|
67cbbc3522 | ||
|
|
504da54c11 | ||
|
|
cdda2ef5c8 | ||
|
|
f405f9eb4b | ||
|
|
634f71835a | ||
|
|
49bfb01fac | ||
|
|
ad8f7fdcab | ||
|
|
f82ec81062 | ||
|
|
03b0842a01 | ||
|
|
13e5cb5cc8 | ||
|
|
f18cdaf4d8 | ||
|
|
5b3bca1426 | ||
|
|
d812e9d43c | ||
|
|
fa1071b221 | ||
|
|
e48c2c6c0b | ||
|
|
bddd4100c0 | ||
|
|
70d8df2e95 | ||
|
|
08b3dd0173 | ||
|
|
6723a7c4e1 | ||
|
|
394575e4f7 | ||
|
|
effc33d0d2 | ||
|
|
7af4c337c6 | ||
|
|
4f222d7adf | ||
|
|
00f16812e4 | ||
|
|
0efaf7efe8 | ||
|
|
55643f0632 | ||
|
|
36f4723f6e | ||
|
|
03bc698936 | ||
|
|
0c1dc73422 | ||
|
|
c31537081b | ||
|
|
d13067abb3 | ||
|
|
64da32b5f9 | ||
|
|
3990fc6ab2 | ||
|
|
e4071bd305 | ||
|
|
8dda26c227 | ||
|
|
b182d5ce87 | ||
|
|
175365bdea | ||
|
|
cbe52cbfca | ||
|
|
9251dde2c6 | ||
|
|
24d77cc453 | ||
|
|
a1f98abe49 | ||
|
|
d25dde1d11 | ||
|
|
8ec483b38b | ||
|
|
bf14caca69 | ||
|
|
e5fb6b2fb2 | ||
|
|
7dfeb3a3f6 | ||
|
|
9d3b1562c4 | ||
|
|
e14407f066 | ||
|
|
67872e3746 | ||
|
|
06bd1a2003 | ||
|
|
37ea360304 | ||
|
|
25ce57424c | ||
|
|
3d46ab549d | ||
|
|
567cc9f842 | ||
|
|
b5457a5abd | ||
|
|
e4b5e35d1d | ||
|
|
12023c33b5 | ||
|
|
a28749937c | ||
|
|
3fe37d651f | ||
|
|
cb3424cdf0 | ||
|
|
a799f7ff91 | ||
|
|
34ab725b75 | ||
|
|
2dfc7f02ba | ||
|
|
c8919222bd | ||
|
|
a888264d2f | ||
|
|
ae84c7e15d | ||
|
|
415c8b490b | ||
|
|
6038f15406 | ||
|
|
a8758253c4 | ||
|
|
fa4eb2e820 | ||
|
|
58f35d0614 | ||
|
|
f72a91ca29 | ||
|
|
5d99da6e1f | ||
|
|
64746eb99c | ||
|
|
70fc6df599 | ||
|
|
8dc33ece7b | ||
|
|
3d4d8e7f20 | ||
|
|
c92d319e12 | ||
|
|
1bdba7906a | ||
|
|
40d7f2a89e | ||
|
|
13b717e2da | ||
|
|
5fcfd3ad84 | ||
|
|
324a7b5443 | ||
|
|
491ae8f72c | ||
|
|
259247892f | ||
|
|
caeda0ef64 | ||
|
|
df35c535e4 | ||
|
|
f93b9e0ed0 | ||
|
|
48a3372cf2 | ||
|
|
d84fd72428 | ||
|
|
e8cb386962 | ||
|
|
5ac726703c | ||
|
|
688649a799 | ||
|
|
c5359ade3e | ||
|
|
4e60dedc1b | ||
|
|
221d74f83a | ||
|
|
fbbb3d6415 | ||
|
|
8297019011 | ||
|
|
61715dcff3 | ||
|
|
32b822ee99 | ||
|
|
e6c2e0ad80 | ||
|
|
1314427dc5 | ||
|
|
bf499a45f7 | ||
|
|
b955e22628 | ||
|
|
1b222ff5fd | ||
|
|
f0510e703f | ||
|
|
cbe3956e15 | ||
|
|
4588e9da8d | ||
|
|
5445890fdf | ||
|
|
9b49f77f86 | ||
|
|
566c8fb786 | ||
|
|
b36150c213 | ||
|
|
809070d2ad | ||
|
|
f4339dc031 | ||
|
|
f3b37d24b0 | ||
|
|
4c8348caa7 | ||
|
|
b9e7c102ea | ||
|
|
69d9fa89b7 | ||
|
|
6f3f5a5ec1 | ||
|
|
5ecfeca90a | ||
|
|
00e0570fd4 | ||
|
|
5a5b94f3af | ||
|
|
34f00d9b33 | ||
|
|
4cabc5b368 | ||
|
|
4045125422 | ||
|
|
d7393af76f | ||
|
|
ad41386b27 | ||
|
|
62d17ea20c | ||
|
|
c4954731d0 | ||
|
|
647723d3f0 | ||
|
|
51c500e22c | ||
|
|
f6fc13c1f2 | ||
|
|
0009a7a042 | ||
|
|
a3d1aa28e7 | ||
|
|
9f53eb9b76 | ||
|
|
f53a205ff3 | ||
|
|
d08517c3df | ||
|
|
d7398a44a1 | ||
|
|
9acfc0cb88 | ||
|
|
1b3d21523a | ||
|
|
1d407d1326 | ||
|
|
013346cead | ||
|
|
5abaabc9da | ||
|
|
32481312c3 | ||
|
|
bdc9eb37d3 | ||
|
|
e0afcbc02b | ||
|
|
cd56a6a98d | ||
|
|
9d85893bbb | ||
|
|
9e8a70225f | ||
|
|
96ec795d5e | ||
|
|
65b796070d | ||
|
|
32994812e5 | ||
|
|
66ff9d63a3 | ||
|
|
b2a63d4996 | ||
|
|
f9f37b7f2a | ||
|
|
7bdd9dd38a | ||
|
|
1e8aae0a89 | ||
|
|
cf668e9dc2 | ||
|
|
2e91c8700f | ||
|
|
9d14627daa | ||
|
|
73b8283748 | ||
|
|
edeaaa2e63 | ||
|
|
d26dd8fc39 | ||
|
|
34640ea735 | ||
|
|
46a2e21ef0 | ||
|
|
508af53e72 | ||
|
|
5f7440608c | ||
|
|
0d1aa38a26 | ||
|
|
929f8c148a | ||
|
|
92db1f5a04 | ||
|
|
e66b5ce0bf | ||
|
|
1e17150e9f | ||
|
|
792902de3d | ||
|
|
04d78c3dd5 | ||
|
|
5c8d5bfb84 | ||
|
|
99bff31869 | ||
|
|
d949119fb0 | ||
|
|
e7b737ece5 | ||
|
|
fb8ddac2e8 |
@@ -33,7 +33,7 @@
|
||||
"GitHub.vscode-pull-request-github",
|
||||
"GitHub.copilot"
|
||||
],
|
||||
// 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.jsonc
|
||||
"settings": {
|
||||
"python.experiments.optOutFrom": ["pythonTestAdapter"],
|
||||
"python.defaultInterpreterPath": "/home/vscode/.local/ha-venv/bin/python",
|
||||
@@ -41,6 +41,7 @@
|
||||
"python.terminal.activateEnvInCurrentTerminal": true,
|
||||
"python.testing.pytestArgs": ["--no-cov"],
|
||||
"pylint.importStrategy": "fromEnvironment",
|
||||
"python.analysis.typeCheckingMode": "basic",
|
||||
"editor.formatOnPaste": false,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnType": true,
|
||||
@@ -62,6 +63,9 @@
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "charliermarsh.ruff"
|
||||
},
|
||||
"[json][jsonc][yaml]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["homeassistant/components/*/manifest.json"],
|
||||
|
||||
1
.github/copilot-instructions.md
vendored
1
.github/copilot-instructions.md
vendored
@@ -74,6 +74,7 @@ rules:
|
||||
- **Formatting**: Ruff
|
||||
- **Linting**: PyLint and Ruff
|
||||
- **Type Checking**: MyPy
|
||||
- **Lint/Type/Format Fixes**: Always prefer addressing the underlying issue (e.g., import the typed source, update shared stubs, align with Ruff expectations, or correct formatting at the source) before disabling a rule, adding `# type: ignore`, or skipping a formatter. Treat suppressions and `noqa` comments as a last resort once no compliant fix exists
|
||||
- **Testing**: pytest with plain functions and fixtures
|
||||
- **Language**: American English for all code, comments, and documentation (use sentence case, including titles)
|
||||
|
||||
|
||||
8
.github/workflows/builder.yml
vendored
8
.github/workflows/builder.yml
vendored
@@ -69,7 +69,7 @@ jobs:
|
||||
run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T -
|
||||
|
||||
- name: Upload translations
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||
with:
|
||||
name: translations
|
||||
path: translations.tar.gz
|
||||
@@ -175,7 +175,7 @@ jobs:
|
||||
sed -i "s|pykrakenapi|# pykrakenapi|g" requirements_all.txt
|
||||
|
||||
- name: Download translations
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
with:
|
||||
name: translations
|
||||
|
||||
@@ -326,7 +326,7 @@ jobs:
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
|
||||
- name: Install Cosign
|
||||
uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0
|
||||
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||
with:
|
||||
cosign-release: "v2.2.3"
|
||||
|
||||
@@ -464,7 +464,7 @@ jobs:
|
||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||
|
||||
- name: Download translations
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
with:
|
||||
name: translations
|
||||
|
||||
|
||||
34
.github/workflows/ci.yaml
vendored
34
.github/workflows/ci.yaml
vendored
@@ -37,7 +37,7 @@ on:
|
||||
type: boolean
|
||||
|
||||
env:
|
||||
CACHE_VERSION: 9
|
||||
CACHE_VERSION: 1
|
||||
UV_CACHE_VERSION: 1
|
||||
MYPY_CACHE_VERSION: 1
|
||||
HA_SHORT_VERSION: "2025.11"
|
||||
@@ -364,13 +364,13 @@ jobs:
|
||||
- name: Run check-json
|
||||
run: |
|
||||
. venv/bin/activate
|
||||
pre-commit run --hook-stage manual check-json --all-files
|
||||
pre-commit run --hook-stage manual check-json --all-files --show-diff-on-failure
|
||||
|
||||
- name: Run prettier (fully)
|
||||
if: needs.info.outputs.test_full_suite == 'true'
|
||||
run: |
|
||||
. venv/bin/activate
|
||||
pre-commit run --hook-stage manual prettier --all-files
|
||||
pre-commit run --hook-stage manual prettier --all-files --show-diff-on-failure
|
||||
|
||||
- name: Run prettier (partially)
|
||||
if: needs.info.outputs.test_full_suite == 'false'
|
||||
@@ -378,7 +378,7 @@ jobs:
|
||||
run: |
|
||||
. venv/bin/activate
|
||||
shopt -s globstar
|
||||
pre-commit run --hook-stage manual prettier --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*}
|
||||
pre-commit run --hook-stage manual prettier --show-diff-on-failure --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*}
|
||||
|
||||
- name: Register check executables problem matcher
|
||||
run: |
|
||||
@@ -386,7 +386,7 @@ jobs:
|
||||
- name: Run executables check
|
||||
run: |
|
||||
. venv/bin/activate
|
||||
pre-commit run --hook-stage manual check-executables-have-shebangs --all-files
|
||||
pre-commit run --hook-stage manual check-executables-have-shebangs --all-files --show-diff-on-failure
|
||||
|
||||
- name: Register codespell problem matcher
|
||||
run: |
|
||||
@@ -428,7 +428,7 @@ jobs:
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
|
||||
python-version: &matrix-python ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
steps:
|
||||
- *checkout
|
||||
- &setup-python-matrix
|
||||
@@ -514,9 +514,7 @@ jobs:
|
||||
if: steps.cache-apt-check.outputs.cache-hit != 'true'
|
||||
uses: &actions-cache-save actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||
with:
|
||||
path: |
|
||||
${{ env.APT_CACHE_DIR }}
|
||||
${{ env.APT_LIST_CACHE_DIR }}
|
||||
path: *path-apt-cache
|
||||
key: *key-apt-cache
|
||||
- name: Create Python virtual environment
|
||||
if: steps.cache-venv.outputs.cache-hit != 'true'
|
||||
@@ -537,7 +535,7 @@ jobs:
|
||||
python --version
|
||||
uv pip freeze >> pip_freeze.txt
|
||||
- name: Upload pip_freeze artifact
|
||||
uses: &actions-upload-artifact actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: &actions-upload-artifact actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||
with:
|
||||
name: pip-freeze-${{ matrix.python-version }}
|
||||
path: pip_freeze.txt
|
||||
@@ -641,7 +639,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
python-version: *matrix-python
|
||||
steps:
|
||||
- *checkout
|
||||
- *setup-python-matrix
|
||||
@@ -838,8 +836,8 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
group: ${{ fromJson(needs.info.outputs.test_groups) }}
|
||||
python-version: *matrix-python
|
||||
group: &matrix-group ${{ fromJson(needs.info.outputs.test_groups) }}
|
||||
steps:
|
||||
- *cache-restore-apt
|
||||
- name: Install additional OS dependencies
|
||||
@@ -869,7 +867,7 @@ jobs:
|
||||
run: |
|
||||
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
|
||||
- name: Download pytest_buckets
|
||||
uses: &actions-download-artifact actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
uses: &actions-download-artifact actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
with:
|
||||
name: pytest_buckets
|
||||
- &compile-english-translations
|
||||
@@ -964,7 +962,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
python-version: *matrix-python
|
||||
mariadb-group: ${{ fromJson(needs.info.outputs.mariadb_groups) }}
|
||||
steps:
|
||||
- *cache-restore-apt
|
||||
@@ -1081,7 +1079,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
python-version: *matrix-python
|
||||
postgresql-group: ${{ fromJson(needs.info.outputs.postgresql_groups) }}
|
||||
steps:
|
||||
- *cache-restore-apt
|
||||
@@ -1218,8 +1216,8 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
|
||||
group: ${{ fromJson(needs.info.outputs.test_groups) }}
|
||||
python-version: *matrix-python
|
||||
group: *matrix-group
|
||||
steps:
|
||||
- *cache-restore-apt
|
||||
- name: Install additional OS dependencies
|
||||
|
||||
4
.github/workflows/codeql.yml
vendored
4
.github/workflows/codeql.yml
vendored
@@ -24,11 +24,11 @@ jobs:
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
|
||||
uses: github/codeql-action/init@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0
|
||||
with:
|
||||
languages: python
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
|
||||
uses: github/codeql-action/analyze@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0
|
||||
with:
|
||||
category: "/language:python"
|
||||
|
||||
78
.github/workflows/wheels.yml
vendored
78
.github/workflows/wheels.yml
vendored
@@ -31,7 +31,8 @@ jobs:
|
||||
outputs:
|
||||
architectures: ${{ steps.info.outputs.architectures }}
|
||||
steps:
|
||||
- name: Checkout the repository
|
||||
- &checkout
|
||||
name: Checkout the repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
|
||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||
@@ -91,7 +92,7 @@ jobs:
|
||||
) > build_constraints.txt
|
||||
|
||||
- name: Upload env_file
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: &actions-upload-artifact actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||
with:
|
||||
name: env_file
|
||||
path: ./.env_file
|
||||
@@ -99,14 +100,14 @@ jobs:
|
||||
overwrite: true
|
||||
|
||||
- name: Upload build_constraints
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: *actions-upload-artifact
|
||||
with:
|
||||
name: build_constraints
|
||||
path: ./build_constraints.txt
|
||||
overwrite: true
|
||||
|
||||
- name: Upload requirements_diff
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: *actions-upload-artifact
|
||||
with:
|
||||
name: requirements_diff
|
||||
path: ./requirements_diff.txt
|
||||
@@ -118,7 +119,7 @@ jobs:
|
||||
python -m script.gen_requirements_all ci
|
||||
|
||||
- name: Upload requirements_all_wheels
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: *actions-upload-artifact
|
||||
with:
|
||||
name: requirements_all_wheels
|
||||
path: ./requirements_all_wheels_*.txt
|
||||
@@ -127,28 +128,41 @@ jobs:
|
||||
name: Build Core wheels ${{ matrix.abi }} for ${{ matrix.arch }} (musllinux_1_2)
|
||||
if: github.repository_owner == 'home-assistant'
|
||||
needs: init
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
abi: ["cp313"]
|
||||
matrix: &matrix-build
|
||||
abi: ["cp313", "cp314"]
|
||||
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
- arch: aarch64
|
||||
os: ubuntu-24.04-arm
|
||||
exclude:
|
||||
- abi: cp314
|
||||
arch: armv7
|
||||
- abi: cp314
|
||||
arch: armhf
|
||||
- abi: cp314
|
||||
arch: i386
|
||||
steps:
|
||||
- name: Checkout the repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
- *checkout
|
||||
|
||||
- name: Download env_file
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
- &download-env-file
|
||||
name: Download env_file
|
||||
uses: &actions-download-artifact actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
with:
|
||||
name: env_file
|
||||
|
||||
- name: Download build_constraints
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
- &download-build-constraints
|
||||
name: Download build_constraints
|
||||
uses: *actions-download-artifact
|
||||
with:
|
||||
name: build_constraints
|
||||
|
||||
- name: Download requirements_diff
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
- &download-requirements-diff
|
||||
name: Download requirements_diff
|
||||
uses: *actions-download-artifact
|
||||
with:
|
||||
name: requirements_diff
|
||||
|
||||
@@ -160,7 +174,7 @@ jobs:
|
||||
|
||||
# home-assistant/wheels doesn't support sha pinning
|
||||
- name: Build wheels
|
||||
uses: home-assistant/wheels@2025.09.1
|
||||
uses: &home-assistant-wheels home-assistant/wheels@2025.10.0
|
||||
with:
|
||||
abi: ${{ matrix.abi }}
|
||||
tag: musllinux_1_2
|
||||
@@ -177,33 +191,19 @@ jobs:
|
||||
name: Build wheels ${{ matrix.abi }} for ${{ matrix.arch }}
|
||||
if: github.repository_owner == 'home-assistant'
|
||||
needs: init
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
abi: ["cp313"]
|
||||
arch: ${{ fromJson(needs.init.outputs.architectures) }}
|
||||
matrix: *matrix-build
|
||||
steps:
|
||||
- name: Checkout the repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
- *checkout
|
||||
|
||||
- name: Download env_file
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
with:
|
||||
name: env_file
|
||||
|
||||
- name: Download build_constraints
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
with:
|
||||
name: build_constraints
|
||||
|
||||
- name: Download requirements_diff
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
with:
|
||||
name: requirements_diff
|
||||
- *download-env-file
|
||||
- *download-build-constraints
|
||||
- *download-requirements-diff
|
||||
|
||||
- name: Download requirements_all_wheels
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
uses: *actions-download-artifact
|
||||
with:
|
||||
name: requirements_all_wheels
|
||||
|
||||
@@ -221,7 +221,7 @@ jobs:
|
||||
|
||||
# home-assistant/wheels doesn't support sha pinning
|
||||
- name: Build wheels
|
||||
uses: home-assistant/wheels@2025.09.1
|
||||
uses: *home-assistant-wheels
|
||||
with:
|
||||
abi: ${{ matrix.abi }}
|
||||
tag: musllinux_1_2
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -111,6 +111,7 @@ virtualization/vagrant/config
|
||||
!.vscode/cSpell.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/settings.default.jsonc
|
||||
.env
|
||||
|
||||
# Windows Explorer
|
||||
@@ -140,4 +141,5 @@ pytest_buckets.txt
|
||||
|
||||
# AI tooling
|
||||
.claude/settings.local.json
|
||||
.serena/
|
||||
|
||||
|
||||
@@ -33,10 +33,13 @@ repos:
|
||||
rev: v1.37.1
|
||||
hooks:
|
||||
- id: yamllint
|
||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||
rev: v3.0.3
|
||||
- repo: https://github.com/rbubley/mirrors-prettier
|
||||
rev: v3.6.2
|
||||
hooks:
|
||||
- id: prettier
|
||||
additional_dependencies:
|
||||
- prettier@3.6.2
|
||||
- prettier-plugin-sort-json@4.1.1
|
||||
- repo: https://github.com/cdce8p/python-typing-update
|
||||
rev: v0.6.0
|
||||
hooks:
|
||||
|
||||
24
.prettierrc.js
Normal file
24
.prettierrc.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/** @type {import("prettier").Config} */
|
||||
module.exports = {
|
||||
overrides: [
|
||||
{
|
||||
files: "./homeassistant/**/*.json",
|
||||
options: {
|
||||
plugins: [require.resolve("prettier-plugin-sort-json")],
|
||||
jsonRecursiveSort: true,
|
||||
jsonSortOrder: JSON.stringify({ [/.*/]: "numeric" }),
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ["manifest.json", "./**/brands/*.json"],
|
||||
options: {
|
||||
// domain and name should stay at the top
|
||||
jsonSortOrder: JSON.stringify({
|
||||
domain: null,
|
||||
name: null,
|
||||
[/.*/]: "numeric",
|
||||
}),
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -182,7 +182,6 @@ homeassistant.components.efergy.*
|
||||
homeassistant.components.eheimdigital.*
|
||||
homeassistant.components.electrasmart.*
|
||||
homeassistant.components.electric_kiwi.*
|
||||
homeassistant.components.elevenlabs.*
|
||||
homeassistant.components.elgato.*
|
||||
homeassistant.components.elkm1.*
|
||||
homeassistant.components.emulated_hue.*
|
||||
@@ -279,6 +278,7 @@ homeassistant.components.imap.*
|
||||
homeassistant.components.imgw_pib.*
|
||||
homeassistant.components.immich.*
|
||||
homeassistant.components.incomfort.*
|
||||
homeassistant.components.inels.*
|
||||
homeassistant.components.input_button.*
|
||||
homeassistant.components.input_select.*
|
||||
homeassistant.components.input_text.*
|
||||
@@ -361,7 +361,6 @@ homeassistant.components.myuplink.*
|
||||
homeassistant.components.nam.*
|
||||
homeassistant.components.nanoleaf.*
|
||||
homeassistant.components.nasweb.*
|
||||
homeassistant.components.neato.*
|
||||
homeassistant.components.nest.*
|
||||
homeassistant.components.netatmo.*
|
||||
homeassistant.components.network.*
|
||||
@@ -478,6 +477,7 @@ homeassistant.components.skybell.*
|
||||
homeassistant.components.slack.*
|
||||
homeassistant.components.sleep_as_android.*
|
||||
homeassistant.components.sleepiq.*
|
||||
homeassistant.components.sma.*
|
||||
homeassistant.components.smhi.*
|
||||
homeassistant.components.smlight.*
|
||||
homeassistant.components.smtp.*
|
||||
|
||||
@@ -7,13 +7,19 @@
|
||||
"python.testing.pytestEnabled": false,
|
||||
// https://code.visualstudio.com/docs/python/linting#_general-settings
|
||||
"pylint.importStrategy": "fromEnvironment",
|
||||
// Pyright is too pedantic for Home Assistant
|
||||
"python.analysis.typeCheckingMode": "basic",
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "charliermarsh.ruff",
|
||||
},
|
||||
"[json][jsonc][yaml]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
},
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": [
|
||||
"homeassistant/components/*/manifest.json"
|
||||
],
|
||||
// This value differs between working with devcontainer and locally, therefor this value should NOT be in sync!
|
||||
"url": "./script/json_schemas/manifest_schema.json"
|
||||
}
|
||||
]
|
||||
{
|
||||
"fileMatch": ["homeassistant/components/*/manifest.json"],
|
||||
// This value differs between working with devcontainer and locally, therefore this value should NOT be in sync!
|
||||
"url": "./script/json_schemas/manifest_schema.json",
|
||||
},
|
||||
],
|
||||
}
|
||||
8
CODEOWNERS
generated
8
CODEOWNERS
generated
@@ -494,6 +494,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/filesize/ @gjohansson-ST
|
||||
/homeassistant/components/filter/ @dgomes
|
||||
/tests/components/filter/ @dgomes
|
||||
/homeassistant/components/fing/ @Lorenzo-Gasparini
|
||||
/tests/components/fing/ @Lorenzo-Gasparini
|
||||
/homeassistant/components/firefly_iii/ @erwindouna
|
||||
/tests/components/firefly_iii/ @erwindouna
|
||||
/homeassistant/components/fireservicerota/ @cyberjunky
|
||||
@@ -619,6 +621,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/greeneye_monitor/ @jkeljo
|
||||
/homeassistant/components/group/ @home-assistant/core
|
||||
/tests/components/group/ @home-assistant/core
|
||||
/homeassistant/components/growatt_server/ @johanzander
|
||||
/tests/components/growatt_server/ @johanzander
|
||||
/homeassistant/components/guardian/ @bachya
|
||||
/tests/components/guardian/ @bachya
|
||||
/homeassistant/components/habitica/ @tr4nt0r
|
||||
@@ -739,6 +743,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/improv_ble/ @emontnemery
|
||||
/homeassistant/components/incomfort/ @jbouwh
|
||||
/tests/components/incomfort/ @jbouwh
|
||||
/homeassistant/components/inels/ @epdevlab
|
||||
/tests/components/inels/ @epdevlab
|
||||
/homeassistant/components/influxdb/ @mdegat01
|
||||
/tests/components/influxdb/ @mdegat01
|
||||
/homeassistant/components/inkbird/ @bdraco
|
||||
@@ -1537,6 +1543,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/suez_water/ @ooii @jb101010-2
|
||||
/homeassistant/components/sun/ @home-assistant/core
|
||||
/tests/components/sun/ @home-assistant/core
|
||||
/homeassistant/components/sunricher_dali_center/ @niracler
|
||||
/tests/components/sunricher_dali_center/ @niracler
|
||||
/homeassistant/components/supla/ @mwegrzynek
|
||||
/homeassistant/components/surepetcare/ @benleb @danielhiversen
|
||||
/tests/components/surepetcare/ @benleb @danielhiversen
|
||||
|
||||
4
Dockerfile
generated
4
Dockerfile
generated
@@ -25,13 +25,13 @@ RUN \
|
||||
"armv7") go2rtc_suffix='arm' ;; \
|
||||
*) go2rtc_suffix=${BUILD_ARCH} ;; \
|
||||
esac \
|
||||
&& curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.9/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \
|
||||
&& curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.11/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \
|
||||
&& chmod +x /bin/go2rtc \
|
||||
# Verify go2rtc can be executed
|
||||
&& go2rtc --version
|
||||
|
||||
# Install uv
|
||||
RUN pip3 install uv==0.8.9
|
||||
RUN pip3 install uv==0.9.5
|
||||
|
||||
WORKDIR /usr/src
|
||||
|
||||
|
||||
13
build.yaml
13
build.yaml
@@ -1,13 +1,10 @@
|
||||
image: ghcr.io/home-assistant/{arch}-homeassistant
|
||||
build_from:
|
||||
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2025.10.0
|
||||
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2025.10.0
|
||||
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.0
|
||||
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.0
|
||||
i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.0
|
||||
codenotary:
|
||||
signer: notary@home-assistant.io
|
||||
base_image: notary@home-assistant.io
|
||||
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2025.10.1
|
||||
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2025.10.1
|
||||
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.1
|
||||
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.1
|
||||
i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.1
|
||||
cosign:
|
||||
base_identity: https://github.com/home-assistant/docker/.*
|
||||
identity: https://github.com/home-assistant/core/.*
|
||||
|
||||
@@ -34,6 +34,9 @@ INPUT_FIELD_CODE = "code"
|
||||
|
||||
DUMMY_SECRET = "FPPTH34D4E3MI2HG"
|
||||
|
||||
GOOGLE_AUTHENTICATOR_URL = "https://support.google.com/accounts/answer/1066447"
|
||||
AUTHY_URL = "https://authy.com/"
|
||||
|
||||
|
||||
def _generate_qr_code(data: str) -> str:
|
||||
"""Generate a base64 PNG string represent QR Code image of data."""
|
||||
@@ -229,6 +232,8 @@ class TotpSetupFlow(SetupFlow[TotpAuthModule]):
|
||||
"code": self._ota_secret,
|
||||
"url": self._url,
|
||||
"qr_code": self._image,
|
||||
"google_authenticator_url": GOOGLE_AUTHENTICATOR_URL,
|
||||
"authy_url": AUTHY_URL,
|
||||
},
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
@@ -1,70 +1,70 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Fill in your Abode login information",
|
||||
"data": {
|
||||
"username": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"mfa": {
|
||||
"title": "Enter your MFA code for Abode",
|
||||
"data": {
|
||||
"mfa_code": "MFA code (6-digits)"
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "[%key:component::abode::config::step::user::title%]",
|
||||
"data": {
|
||||
"username": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_mfa_code": "Invalid MFA code"
|
||||
},
|
||||
"abort": {
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"invalid_mfa_code": "Invalid MFA code"
|
||||
},
|
||||
"step": {
|
||||
"mfa": {
|
||||
"data": {
|
||||
"mfa_code": "MFA code (6-digits)"
|
||||
},
|
||||
"title": "Enter your MFA code for Abode"
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::email%]"
|
||||
},
|
||||
"title": "[%key:component::abode::config::step::user::title%]"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::email%]"
|
||||
},
|
||||
"title": "Fill in your Abode login information"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"capture_image": {
|
||||
"name": "Capture image",
|
||||
"description": "Requests a new image capture from a camera device.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "Entity",
|
||||
"description": "Entity ID of the camera to request an image from."
|
||||
"description": "Entity ID of the camera to request an image from.",
|
||||
"name": "Entity"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Capture image"
|
||||
},
|
||||
"change_setting": {
|
||||
"name": "Change setting",
|
||||
"description": "Changes an Abode system setting.",
|
||||
"fields": {
|
||||
"setting": {
|
||||
"name": "Setting",
|
||||
"description": "Setting to change."
|
||||
"description": "Setting to change.",
|
||||
"name": "Setting"
|
||||
},
|
||||
"value": {
|
||||
"name": "Value",
|
||||
"description": "Value of the setting."
|
||||
"description": "Value of the setting.",
|
||||
"name": "Value"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Change setting"
|
||||
},
|
||||
"trigger_automation": {
|
||||
"name": "Trigger automation",
|
||||
"description": "Triggers an Abode automation.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "Entity",
|
||||
"description": "Entity ID of the automation to trigger."
|
||||
"description": "Entity ID of the automation to trigger.",
|
||||
"name": "Entity"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Trigger automation"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
"timer_running": {
|
||||
"default": "mdi:timer",
|
||||
"state": {
|
||||
"on": "mdi:timer-play",
|
||||
"off": "mdi:timer-off"
|
||||
"off": "mdi:timer-off",
|
||||
"on": "mdi:timer-play"
|
||||
}
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"tare": {
|
||||
"default": "mdi:scale-balance"
|
||||
},
|
||||
"reset_timer": {
|
||||
"default": "mdi:timer-refresh"
|
||||
},
|
||||
"start_stop": {
|
||||
"default": "mdi:timer-play"
|
||||
},
|
||||
"tare": {
|
||||
"default": "mdi:scale-balance"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"config": {
|
||||
"flow_title": "{name}",
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
@@ -10,18 +9,19 @@
|
||||
"device_not_found": "Device could not be found.",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"bluetooth_confirm": {
|
||||
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
|
||||
},
|
||||
"user": {
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]",
|
||||
"data": {
|
||||
"address": "[%key:common::config_flow::data::device%]"
|
||||
},
|
||||
"data_description": {
|
||||
"address": "Select Acaia scale you want to set up"
|
||||
}
|
||||
},
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -32,14 +32,14 @@
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"tare": {
|
||||
"name": "Tare"
|
||||
},
|
||||
"reset_timer": {
|
||||
"name": "Reset timer"
|
||||
},
|
||||
"start_stop": {
|
||||
"name": "Start/stop timer"
|
||||
},
|
||||
"tare": {
|
||||
"name": "Tare"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,8 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"name": "[%key:common::config_flow::data::name%]",
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]"
|
||||
},
|
||||
"data_description": {
|
||||
"api_key": "API key generated in the AccuWeather APIs portal."
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]"
|
||||
},
|
||||
"data_description": {
|
||||
"api_key": "[%key:component::accuweather::config::step::user::data_description::api_key%]"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
},
|
||||
"create_entry": {
|
||||
"default": "Some sensors are not enabled by default. You can enable them in the entity registry after the integration configuration."
|
||||
@@ -29,9 +12,26 @@
|
||||
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
|
||||
"requests_exceeded": "The allowed number of requests to the AccuWeather API has been exceeded. You have to wait or change the API key."
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]"
|
||||
},
|
||||
"data_description": {
|
||||
"api_key": "[%key:component::accuweather::config::step::user::data_description::api_key%]"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]",
|
||||
"name": "[%key:common::config_flow::data::name%]"
|
||||
},
|
||||
"data_description": {
|
||||
"api_key": "API key generated in the AccuWeather APIs portal."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -120,9 +120,9 @@
|
||||
"pressure_tendency": {
|
||||
"name": "Pressure tendency",
|
||||
"state": {
|
||||
"steady": "Steady",
|
||||
"falling": "Falling",
|
||||
"rising": "Rising",
|
||||
"falling": "Falling"
|
||||
"steady": "Steady"
|
||||
},
|
||||
"state_attributes": {
|
||||
"options": {
|
||||
@@ -227,9 +227,6 @@
|
||||
"wet_bulb_temperature": {
|
||||
"name": "Wet bulb temperature"
|
||||
},
|
||||
"wind_speed": {
|
||||
"name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]"
|
||||
},
|
||||
"wind_chill_temperature": {
|
||||
"name": "Wind chill temperature"
|
||||
},
|
||||
@@ -242,6 +239,9 @@
|
||||
"wind_gust_speed_night": {
|
||||
"name": "Wind gust speed night {forecast_day}"
|
||||
},
|
||||
"wind_speed": {
|
||||
"name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]"
|
||||
},
|
||||
"wind_speed_day": {
|
||||
"name": "Wind speed day {forecast_day}"
|
||||
},
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Pick a hub to add",
|
||||
"data": {
|
||||
"id": "Host ID"
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"id": "Host ID"
|
||||
},
|
||||
"title": "Pick a hub to add"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Actron Air OAuth2 Authorization"
|
||||
},
|
||||
"timeout": {
|
||||
"title": "Authorization timeout",
|
||||
"description": "The authorization process timed out. Please try again.",
|
||||
"data": {}
|
||||
},
|
||||
"connection_error": {
|
||||
"title": "Connection error",
|
||||
"description": "Failed to connect to Actron Air. Please check your internet connection and try again.",
|
||||
"data": {}
|
||||
}
|
||||
},
|
||||
"progress": {
|
||||
"wait_for_authorization": "To authenticate, open the following URL and login at Actron Air:\n{verification_uri}\nIf the code is not automatically copied, paste the following code to authorize the integration:\n\n```{user_code}```\n\n\nThe login attempt will time out after {expires_minutes} minutes."
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"oauth2_error": "Failed to start OAuth2 flow"
|
||||
},
|
||||
"error": {
|
||||
"oauth2_error": "Failed to start OAuth2 flow. Please try again later."
|
||||
},
|
||||
"abort": {
|
||||
"oauth2_error": "Failed to start OAuth2 flow",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
|
||||
"progress": {
|
||||
"wait_for_authorization": "To authenticate, open the following URL and login at Actron Air:\n{verification_uri}\nIf the code is not automatically copied, paste the following code to authorize the integration:\n\n```{user_code}```\n\n\nThe login attempt will time out after {expires_minutes} minutes."
|
||||
},
|
||||
"step": {
|
||||
"connection_error": {
|
||||
"data": {},
|
||||
"description": "Failed to connect to Actron Air. Please check your internet connection and try again.",
|
||||
"title": "Connection error"
|
||||
},
|
||||
"timeout": {
|
||||
"data": {},
|
||||
"description": "The authorization process timed out. Please try again.",
|
||||
"title": "Authorization timeout"
|
||||
},
|
||||
"user": {
|
||||
"title": "Actron Air OAuth2 Authorization"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
"documentation": "https://www.home-assistant.io/integrations/adax",
|
||||
"iot_class": "local_polling",
|
||||
"loggers": ["adax", "adax_local"],
|
||||
"requirements": ["adax==0.4.0", "Adax-local==0.1.5"]
|
||||
"requirements": ["adax==0.4.0", "Adax-local==0.2.0"]
|
||||
}
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"connection_type": "Select connection type"
|
||||
},
|
||||
"description": "Select connection type. Local requires heaters with Bluetooth"
|
||||
},
|
||||
"local": {
|
||||
"data": {
|
||||
"wifi_ssid": "Wi-Fi SSID",
|
||||
"wifi_pswd": "Wi-Fi password"
|
||||
},
|
||||
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring heater might take some minutes."
|
||||
},
|
||||
"cloud": {
|
||||
"data": {
|
||||
"account_id": "Account ID",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"heater_not_available": "Heater not available. Try to reset the heater by pressing + and OK for some seconds.",
|
||||
"heater_not_found": "Heater not found. Try to move the heater closer to Home Assistant computer.",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"cloud": {
|
||||
"data": {
|
||||
"account_id": "Account ID",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"local": {
|
||||
"data": {
|
||||
"wifi_pswd": "Wi-Fi password",
|
||||
"wifi_ssid": "Wi-Fi SSID"
|
||||
},
|
||||
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring heater might take some minutes."
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"connection_type": "Select connection type"
|
||||
},
|
||||
"description": "Select connection type. Local requires heaters with Bluetooth"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"average_processing_speed": {
|
||||
"default": "mdi:speedometer"
|
||||
},
|
||||
"dns_queries": {
|
||||
"default": "mdi:magnify"
|
||||
},
|
||||
@@ -13,21 +16,18 @@
|
||||
"parental_control_blocked": {
|
||||
"default": "mdi:human-male-girl"
|
||||
},
|
||||
"rules_count": {
|
||||
"default": "mdi:counter"
|
||||
},
|
||||
"safe_browsing_blocked": {
|
||||
"default": "mdi:shield-half-full"
|
||||
},
|
||||
"safe_searches_enforced": {
|
||||
"default": "mdi:shield-search"
|
||||
},
|
||||
"average_processing_speed": {
|
||||
"default": "mdi:speedometer"
|
||||
},
|
||||
"rules_count": {
|
||||
"default": "mdi:counter"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"protection": {
|
||||
"filtering": {
|
||||
"default": "mdi:shield-check",
|
||||
"state": {
|
||||
"off": "mdi:shield-off"
|
||||
@@ -39,7 +39,13 @@
|
||||
"off": "mdi:shield-off"
|
||||
}
|
||||
},
|
||||
"safe_search": {
|
||||
"protection": {
|
||||
"default": "mdi:shield-check",
|
||||
"state": {
|
||||
"off": "mdi:shield-off"
|
||||
}
|
||||
},
|
||||
"query_log": {
|
||||
"default": "mdi:shield-check",
|
||||
"state": {
|
||||
"off": "mdi:shield-off"
|
||||
@@ -51,13 +57,7 @@
|
||||
"off": "mdi:shield-off"
|
||||
}
|
||||
},
|
||||
"filtering": {
|
||||
"default": "mdi:shield-check",
|
||||
"state": {
|
||||
"off": "mdi:shield-off"
|
||||
}
|
||||
},
|
||||
"query_log": {
|
||||
"safe_search": {
|
||||
"default": "mdi:shield-check",
|
||||
"state": {
|
||||
"off": "mdi:shield-off"
|
||||
@@ -69,17 +69,17 @@
|
||||
"add_url": {
|
||||
"service": "mdi:link-plus"
|
||||
},
|
||||
"remove_url": {
|
||||
"service": "mdi:link-off"
|
||||
"disable_url": {
|
||||
"service": "mdi:link-variant-off"
|
||||
},
|
||||
"enable_url": {
|
||||
"service": "mdi:link-variant"
|
||||
},
|
||||
"disable_url": {
|
||||
"service": "mdi:link-variant-off"
|
||||
},
|
||||
"refresh": {
|
||||
"service": "mdi:refresh"
|
||||
},
|
||||
"remove_url": {
|
||||
"service": "mdi:link-off"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +1,38 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "Set up your AdGuard Home instance to allow monitoring and control.",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"port": "[%key:common::config_flow::data::port%]",
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"ssl": "[%key:common::config_flow::data::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": {
|
||||
"title": "AdGuard Home via Home Assistant add-on",
|
||||
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the add-on: {addon}?"
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
|
||||
"existing_instance_updated": "Updated existing configuration."
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"existing_instance_updated": "Updated existing configuration.",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||
"step": {
|
||||
"hassio_confirm": {
|
||||
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the add-on: {addon}?",
|
||||
"title": "AdGuard Home via Home Assistant add-on"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"port": "[%key:common::config_flow::data::port%]",
|
||||
"ssl": "[%key:common::config_flow::data::ssl%]",
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the device running your AdGuard Home."
|
||||
},
|
||||
"description": "Set up your AdGuard Home instance to allow monitoring and control."
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"average_processing_speed": {
|
||||
"name": "Average processing speed"
|
||||
},
|
||||
"dns_queries": {
|
||||
"name": "DNS queries"
|
||||
},
|
||||
@@ -42,94 +45,91 @@
|
||||
"parental_control_blocked": {
|
||||
"name": "Parental control blocked"
|
||||
},
|
||||
"rules_count": {
|
||||
"name": "Rules count"
|
||||
},
|
||||
"safe_browsing_blocked": {
|
||||
"name": "Safe browsing blocked"
|
||||
},
|
||||
"safe_searches_enforced": {
|
||||
"name": "Safe searches enforced"
|
||||
},
|
||||
"average_processing_speed": {
|
||||
"name": "Average processing speed"
|
||||
},
|
||||
"rules_count": {
|
||||
"name": "Rules count"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"protection": {
|
||||
"name": "Protection"
|
||||
"filtering": {
|
||||
"name": "Filtering"
|
||||
},
|
||||
"parental": {
|
||||
"name": "Parental control"
|
||||
},
|
||||
"safe_search": {
|
||||
"name": "Safe search"
|
||||
"protection": {
|
||||
"name": "Protection"
|
||||
},
|
||||
"query_log": {
|
||||
"name": "Query log"
|
||||
},
|
||||
"safe_browsing": {
|
||||
"name": "Safe browsing"
|
||||
},
|
||||
"filtering": {
|
||||
"name": "Filtering"
|
||||
},
|
||||
"query_log": {
|
||||
"name": "Query log"
|
||||
"safe_search": {
|
||||
"name": "Safe search"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"add_url": {
|
||||
"name": "Add URL",
|
||||
"description": "Adds a new filter subscription to AdGuard Home.",
|
||||
"fields": {
|
||||
"name": {
|
||||
"name": "[%key:common::config_flow::data::name%]",
|
||||
"description": "The name of the filter subscription."
|
||||
"description": "The name of the filter subscription.",
|
||||
"name": "[%key:common::config_flow::data::name%]"
|
||||
},
|
||||
"url": {
|
||||
"name": "[%key:common::config_flow::data::url%]",
|
||||
"description": "The filter URL to subscribe to, containing the filter rules."
|
||||
"description": "The filter URL to subscribe to, containing the filter rules.",
|
||||
"name": "[%key:common::config_flow::data::url%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"remove_url": {
|
||||
"name": "Remove URL",
|
||||
"description": "Removes a filter subscription from AdGuard Home.",
|
||||
"fields": {
|
||||
"url": {
|
||||
"name": "[%key:common::config_flow::data::url%]",
|
||||
"description": "The filter subscription URL to remove."
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable_url": {
|
||||
"name": "Enable URL",
|
||||
"description": "Enables a filter subscription in AdGuard Home.",
|
||||
"fields": {
|
||||
"url": {
|
||||
"name": "[%key:common::config_flow::data::url%]",
|
||||
"description": "The filter subscription URL to enable."
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Add URL"
|
||||
},
|
||||
"disable_url": {
|
||||
"name": "Disable URL",
|
||||
"description": "Disables a filter subscription in AdGuard Home.",
|
||||
"fields": {
|
||||
"url": {
|
||||
"name": "[%key:common::config_flow::data::url%]",
|
||||
"description": "The filter subscription URL to disable."
|
||||
"description": "The filter subscription URL to disable.",
|
||||
"name": "[%key:common::config_flow::data::url%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Disable URL"
|
||||
},
|
||||
"enable_url": {
|
||||
"description": "Enables a filter subscription in AdGuard Home.",
|
||||
"fields": {
|
||||
"url": {
|
||||
"description": "The filter subscription URL to enable.",
|
||||
"name": "[%key:common::config_flow::data::url%]"
|
||||
}
|
||||
},
|
||||
"name": "Enable URL"
|
||||
},
|
||||
"refresh": {
|
||||
"name": "Refresh",
|
||||
"description": "Refreshes all filter subscriptions in AdGuard Home.",
|
||||
"fields": {
|
||||
"force": {
|
||||
"name": "Force",
|
||||
"description": "Force update (bypasses AdGuard Home throttling), omit for a regular refresh."
|
||||
"description": "Force update (bypasses AdGuard Home throttling), omit for a regular refresh.",
|
||||
"name": "Force"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Refresh"
|
||||
},
|
||||
"remove_url": {
|
||||
"description": "Removes a filter subscription from AdGuard Home.",
|
||||
"fields": {
|
||||
"url": {
|
||||
"description": "The filter subscription URL to remove.",
|
||||
"name": "[%key:common::config_flow::data::url%]"
|
||||
}
|
||||
},
|
||||
"name": "Remove URL"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"services": {
|
||||
"write_data_by_name": {
|
||||
"name": "Write data by name",
|
||||
"description": "Write a value to the connected ADS device.",
|
||||
"fields": {
|
||||
"adsvar": {
|
||||
"name": "ADS variable",
|
||||
"description": "The name of the variable to write to."
|
||||
},
|
||||
"adstype": {
|
||||
"name": "ADS type",
|
||||
"description": "The data type of the variable to write to."
|
||||
"description": "The data type of the variable to write to.",
|
||||
"name": "ADS type"
|
||||
},
|
||||
"adsvar": {
|
||||
"description": "The name of the variable to write to.",
|
||||
"name": "ADS variable"
|
||||
},
|
||||
"value": {
|
||||
"name": "Value",
|
||||
"description": "The value to write to the variable."
|
||||
"description": "The value to write to the variable.",
|
||||
"name": "Value"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Write data by name"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -19,14 +19,14 @@
|
||||
},
|
||||
"services": {
|
||||
"set_time_to": {
|
||||
"name": "Set time to",
|
||||
"description": "Controls timers to turn the system on or off after a set number of minutes.",
|
||||
"fields": {
|
||||
"minutes": {
|
||||
"name": "Minutes",
|
||||
"description": "Minutes until action."
|
||||
"description": "Minutes until action.",
|
||||
"name": "Minutes"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Set time to"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,57 +1,57 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"add_tracking": {
|
||||
"name": "Add tracking",
|
||||
"description": "Adds a new tracking number to Aftership.",
|
||||
"fields": {
|
||||
"tracking_number": {
|
||||
"name": "Tracking number",
|
||||
"description": "Tracking number for the new tracking."
|
||||
},
|
||||
"title": {
|
||||
"name": "Title",
|
||||
"description": "A custom title for the new tracking."
|
||||
},
|
||||
"slug": {
|
||||
"name": "Slug",
|
||||
"description": "Slug (carrier) of the new tracking."
|
||||
}
|
||||
}
|
||||
},
|
||||
"remove_tracking": {
|
||||
"name": "Remove tracking",
|
||||
"description": "Removes a tracking number from Aftership.",
|
||||
"fields": {
|
||||
"tracking_number": {
|
||||
"name": "[%key:component::aftership::services::add_tracking::fields::tracking_number::name%]",
|
||||
"description": "Tracking number of the tracking to remove."
|
||||
},
|
||||
"slug": {
|
||||
"name": "[%key:component::aftership::services::add_tracking::fields::slug::name%]",
|
||||
"description": "Slug (carrier) of the tracking to remove."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"issues": {
|
||||
"deprecated_yaml_import_issue_cannot_connect": {
|
||||
"title": "The {integration_title} YAML configuration import failed",
|
||||
"description": "Configuring {integration_title} using YAML is being removed but there was a connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually."
|
||||
"description": "Configuring {integration_title} using YAML is being removed but there was a connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually.",
|
||||
"title": "The {integration_title} YAML configuration import failed"
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"add_tracking": {
|
||||
"description": "Adds a new tracking number to Aftership.",
|
||||
"fields": {
|
||||
"slug": {
|
||||
"description": "Slug (carrier) of the new tracking.",
|
||||
"name": "Slug"
|
||||
},
|
||||
"title": {
|
||||
"description": "A custom title for the new tracking.",
|
||||
"name": "Title"
|
||||
},
|
||||
"tracking_number": {
|
||||
"description": "Tracking number for the new tracking.",
|
||||
"name": "Tracking number"
|
||||
}
|
||||
},
|
||||
"name": "Add tracking"
|
||||
},
|
||||
"remove_tracking": {
|
||||
"description": "Removes a tracking number from Aftership.",
|
||||
"fields": {
|
||||
"slug": {
|
||||
"description": "Slug (carrier) of the tracking to remove.",
|
||||
"name": "[%key:component::aftership::services::add_tracking::fields::slug::name%]"
|
||||
},
|
||||
"tracking_number": {
|
||||
"description": "Tracking number of the tracking to remove.",
|
||||
"name": "[%key:component::aftership::services::add_tracking::fields::tracking_number::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Remove tracking"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"services": {
|
||||
"disable_alerts": {
|
||||
"service": "mdi:bell-off"
|
||||
},
|
||||
"enable_alerts": {
|
||||
"service": "mdi:bell-alert"
|
||||
},
|
||||
"snapshot": {
|
||||
"service": "mdi:camera"
|
||||
},
|
||||
"start_recording": {
|
||||
"service": "mdi:record-rec"
|
||||
},
|
||||
"stop_recording": {
|
||||
"service": "mdi:stop"
|
||||
},
|
||||
"enable_alerts": {
|
||||
"service": "mdi:bell-alert"
|
||||
},
|
||||
"disable_alerts": {
|
||||
"service": "mdi:bell-off"
|
||||
},
|
||||
"snapshot": {
|
||||
"service": "mdi:camera"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up Agent DVR",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The IP address of the Agent DVR server."
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The IP address of the Agent DVR server."
|
||||
},
|
||||
"title": "Set up Agent DVR"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"start_recording": {
|
||||
"name": "Start recording",
|
||||
"description": "Enables continuous recording."
|
||||
},
|
||||
"stop_recording": {
|
||||
"name": "Stop recording",
|
||||
"description": "Disables continuous recording."
|
||||
"disable_alerts": {
|
||||
"description": "Disables alerts.",
|
||||
"name": "Disable alerts"
|
||||
},
|
||||
"enable_alerts": {
|
||||
"name": "Enable alerts",
|
||||
"description": "Enables alerts."
|
||||
},
|
||||
"disable_alerts": {
|
||||
"name": "Disable alerts",
|
||||
"description": "Disables alerts."
|
||||
"description": "Enables alerts.",
|
||||
"name": "Enable alerts"
|
||||
},
|
||||
"snapshot": {
|
||||
"name": "Snapshot",
|
||||
"description": "Takes a photo."
|
||||
"description": "Takes a photo.",
|
||||
"name": "Snapshot"
|
||||
},
|
||||
"start_recording": {
|
||||
"description": "Enables continuous recording.",
|
||||
"name": "Start recording"
|
||||
},
|
||||
"stop_recording": {
|
||||
"description": "Disables continuous recording.",
|
||||
"name": "Stop recording"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,9 +53,6 @@ __all__ = [
|
||||
"GenImageTaskResult",
|
||||
"async_generate_data",
|
||||
"async_generate_image",
|
||||
"async_setup",
|
||||
"async_setup_entry",
|
||||
"async_unload_entry",
|
||||
]
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
{
|
||||
"services": {
|
||||
"generate_data": {
|
||||
"name": "Generate data",
|
||||
"description": "Uses AI to run a task that generates data.",
|
||||
"fields": {
|
||||
"task_name": {
|
||||
"name": "Task name",
|
||||
"description": "Name of the task."
|
||||
},
|
||||
"instructions": {
|
||||
"name": "Instructions",
|
||||
"description": "Instructions on what needs to be done."
|
||||
"attachments": {
|
||||
"description": "List of files to attach for multi-modal AI analysis.",
|
||||
"name": "Attachments"
|
||||
},
|
||||
"entity_id": {
|
||||
"name": "Entity ID",
|
||||
"description": "Entity ID to run the task on. If not provided, the preferred entity will be used."
|
||||
"description": "Entity ID to run the task on. If not provided, the preferred entity will be used.",
|
||||
"name": "Entity ID"
|
||||
},
|
||||
"instructions": {
|
||||
"description": "Instructions on what needs to be done.",
|
||||
"name": "Instructions"
|
||||
},
|
||||
"structure": {
|
||||
"name": "Structured output",
|
||||
"description": "When set, the AI Task will output fields with this in structure. The structure is a dictionary where the keys are the field names and the values contain a 'description', a 'selector', and an optional 'required' field."
|
||||
"description": "When set, the AI Task will output fields with this in structure. The structure is a dictionary where the keys are the field names and the values contain a 'description', a 'selector', and an optional 'required' field.",
|
||||
"name": "Structured output"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "Attachments",
|
||||
"description": "List of files to attach for multi-modal AI analysis."
|
||||
"task_name": {
|
||||
"description": "Name of the task.",
|
||||
"name": "Task name"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Generate data"
|
||||
},
|
||||
"generate_image": {
|
||||
"name": "Generate image",
|
||||
"description": "Uses AI to generate image.",
|
||||
"fields": {
|
||||
"task_name": {
|
||||
"name": "Task name",
|
||||
"description": "Name of the task."
|
||||
},
|
||||
"instructions": {
|
||||
"name": "Instructions",
|
||||
"description": "Instructions that explains the image to be generated."
|
||||
"attachments": {
|
||||
"description": "List of files to attach for using as references.",
|
||||
"name": "Attachments"
|
||||
},
|
||||
"entity_id": {
|
||||
"name": "Entity ID",
|
||||
"description": "Entity ID to run the task on."
|
||||
"description": "Entity ID to run the task on.",
|
||||
"name": "Entity ID"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "Attachments",
|
||||
"description": "List of files to attach for using as references."
|
||||
"instructions": {
|
||||
"description": "Instructions that explains the image to be generated.",
|
||||
"name": "Instructions"
|
||||
},
|
||||
"task_name": {
|
||||
"description": "Name of the task.",
|
||||
"name": "Task name"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Generate image"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,14 +9,17 @@
|
||||
}
|
||||
},
|
||||
"number": {
|
||||
"led_bar_brightness": {
|
||||
"display_brightness": {
|
||||
"default": "mdi:brightness-percent"
|
||||
},
|
||||
"display_brightness": {
|
||||
"led_bar_brightness": {
|
||||
"default": "mdi:brightness-percent"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"default": "mdi:molecule-co2"
|
||||
},
|
||||
"configuration_control": {
|
||||
"default": "mdi:cloud-cog"
|
||||
},
|
||||
@@ -31,23 +34,11 @@
|
||||
},
|
||||
"voc_index_learning_time_offset": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"default": "mdi:molecule-co2"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"total_volatile_organic_component_index": {
|
||||
"default": "mdi:molecule"
|
||||
},
|
||||
"nitrogen_index": {
|
||||
"default": "mdi:molecule"
|
||||
},
|
||||
"pm003_count": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"led_bar_brightness": {
|
||||
"default": "mdi:brightness-percent"
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"default": "mdi:molecule-co2"
|
||||
},
|
||||
"display_brightness": {
|
||||
"default": "mdi:brightness-percent"
|
||||
@@ -55,17 +46,26 @@
|
||||
"display_temperature_unit": {
|
||||
"default": "mdi:thermometer-lines"
|
||||
},
|
||||
"led_bar_brightness": {
|
||||
"default": "mdi:brightness-percent"
|
||||
},
|
||||
"led_bar_mode": {
|
||||
"default": "mdi:led-strip"
|
||||
},
|
||||
"nitrogen_index": {
|
||||
"default": "mdi:molecule"
|
||||
},
|
||||
"nox_index_learning_time_offset": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"pm003_count": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"total_volatile_organic_component_index": {
|
||||
"default": "mdi:molecule"
|
||||
},
|
||||
"voc_index_learning_time_offset": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"default": "mdi:molecule-co2"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
{
|
||||
"config": {
|
||||
"flow_title": "{model}",
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the Airgradient device."
|
||||
}
|
||||
},
|
||||
"discovery_confirm": {
|
||||
"description": "Do you want to set up {model}?"
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
@@ -24,6 +10,20 @@
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "{model}",
|
||||
"step": {
|
||||
"discovery_confirm": {
|
||||
"description": "Do you want to set up {model}?"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the Airgradient device."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -36,14 +36,25 @@
|
||||
}
|
||||
},
|
||||
"number": {
|
||||
"led_bar_brightness": {
|
||||
"name": "LED bar brightness"
|
||||
},
|
||||
"display_brightness": {
|
||||
"name": "Display brightness"
|
||||
},
|
||||
"led_bar_brightness": {
|
||||
"name": "LED bar brightness"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"name": "CO2 automatic baseline duration",
|
||||
"state": {
|
||||
"0": "[%key:common::state::off%]",
|
||||
"1": "1 day",
|
||||
"8": "8 days",
|
||||
"30": "30 days",
|
||||
"90": "90 days",
|
||||
"180": "180 days"
|
||||
}
|
||||
},
|
||||
"configuration_control": {
|
||||
"name": "Configuration source",
|
||||
"state": {
|
||||
@@ -51,13 +62,6 @@
|
||||
"local": "Local"
|
||||
}
|
||||
},
|
||||
"display_temperature_unit": {
|
||||
"name": "Display temperature unit",
|
||||
"state": {
|
||||
"c": "Celsius",
|
||||
"f": "Fahrenheit"
|
||||
}
|
||||
},
|
||||
"display_pm_standard": {
|
||||
"name": "Display PM standard",
|
||||
"state": {
|
||||
@@ -65,11 +69,18 @@
|
||||
"us_aqi": "US AQI"
|
||||
}
|
||||
},
|
||||
"display_temperature_unit": {
|
||||
"name": "Display temperature unit",
|
||||
"state": {
|
||||
"c": "Celsius",
|
||||
"f": "Fahrenheit"
|
||||
}
|
||||
},
|
||||
"led_bar_mode": {
|
||||
"name": "LED bar mode",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
|
||||
"off": "[%key:common::state::off%]",
|
||||
"pm": "Particulate matter"
|
||||
}
|
||||
},
|
||||
@@ -92,37 +103,14 @@
|
||||
"360": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::360%]",
|
||||
"720": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::720%]"
|
||||
}
|
||||
},
|
||||
"co2_automatic_baseline_calibration": {
|
||||
"name": "CO2 automatic baseline duration",
|
||||
"state": {
|
||||
"1": "1 day",
|
||||
"8": "8 days",
|
||||
"30": "30 days",
|
||||
"90": "90 days",
|
||||
"180": "180 days",
|
||||
"0": "[%key:common::state::off%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"total_volatile_organic_component_index": {
|
||||
"name": "VOC index"
|
||||
"co2_automatic_baseline_calibration_days": {
|
||||
"name": "Carbon dioxide automatic baseline calibration"
|
||||
},
|
||||
"nitrogen_index": {
|
||||
"name": "NOx index"
|
||||
},
|
||||
"pm003_count": {
|
||||
"name": "PM0.3"
|
||||
},
|
||||
"raw_total_volatile_organic_component": {
|
||||
"name": "Raw VOC"
|
||||
},
|
||||
"raw_nitrogen": {
|
||||
"name": "Raw NOx"
|
||||
},
|
||||
"raw_pm02": {
|
||||
"name": "Raw PM2.5"
|
||||
"display_brightness": {
|
||||
"name": "[%key:component::airgradient::entity::number::display_brightness::name%]"
|
||||
},
|
||||
"display_pm_standard": {
|
||||
"name": "[%key:component::airgradient::entity::select::display_pm_standard::name%]",
|
||||
@@ -131,26 +119,6 @@
|
||||
"us_aqi": "[%key:component::airgradient::entity::select::display_pm_standard::state::us_aqi%]"
|
||||
}
|
||||
},
|
||||
"co2_automatic_baseline_calibration_days": {
|
||||
"name": "Carbon dioxide automatic baseline calibration"
|
||||
},
|
||||
"nox_learning_offset": {
|
||||
"name": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::name%]"
|
||||
},
|
||||
"tvoc_learning_offset": {
|
||||
"name": "[%key:component::airgradient::entity::select::voc_index_learning_time_offset::name%]"
|
||||
},
|
||||
"led_bar_mode": {
|
||||
"name": "[%key:component::airgradient::entity::select::led_bar_mode::name%]",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
|
||||
"pm": "[%key:component::airgradient::entity::select::led_bar_mode::state::pm%]"
|
||||
}
|
||||
},
|
||||
"led_bar_brightness": {
|
||||
"name": "[%key:component::airgradient::entity::number::led_bar_brightness::name%]"
|
||||
},
|
||||
"display_temperature_unit": {
|
||||
"name": "[%key:component::airgradient::entity::select::display_temperature_unit::name%]",
|
||||
"state": {
|
||||
@@ -158,8 +126,40 @@
|
||||
"f": "[%key:component::airgradient::entity::select::display_temperature_unit::state::f%]"
|
||||
}
|
||||
},
|
||||
"display_brightness": {
|
||||
"name": "[%key:component::airgradient::entity::number::display_brightness::name%]"
|
||||
"led_bar_brightness": {
|
||||
"name": "[%key:component::airgradient::entity::number::led_bar_brightness::name%]"
|
||||
},
|
||||
"led_bar_mode": {
|
||||
"name": "[%key:component::airgradient::entity::select::led_bar_mode::name%]",
|
||||
"state": {
|
||||
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
|
||||
"off": "[%key:common::state::off%]",
|
||||
"pm": "[%key:component::airgradient::entity::select::led_bar_mode::state::pm%]"
|
||||
}
|
||||
},
|
||||
"nitrogen_index": {
|
||||
"name": "NOx index"
|
||||
},
|
||||
"nox_learning_offset": {
|
||||
"name": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::name%]"
|
||||
},
|
||||
"pm003_count": {
|
||||
"name": "PM0.3"
|
||||
},
|
||||
"raw_nitrogen": {
|
||||
"name": "Raw NOx"
|
||||
},
|
||||
"raw_pm02": {
|
||||
"name": "Raw PM2.5"
|
||||
},
|
||||
"raw_total_volatile_organic_component": {
|
||||
"name": "Raw VOC"
|
||||
},
|
||||
"total_volatile_organic_component_index": {
|
||||
"name": "VOC index"
|
||||
},
|
||||
"tvoc_learning_offset": {
|
||||
"name": "[%key:component::airgradient::entity::select::voc_index_learning_time_offset::name%]"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
|
||||
@@ -1,30 +1,23 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "To generate API key go to {developer_registration_url}",
|
||||
"data": {
|
||||
"name": "[%key:common::config_flow::data::name%]",
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"wrong_location": "No Airly measuring stations in this area.",
|
||||
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
|
||||
"wrong_location": "[%key:component::airly::config::error::wrong_location%]"
|
||||
}
|
||||
},
|
||||
"system_health": {
|
||||
"info": {
|
||||
"can_reach_server": "Reach Airly server",
|
||||
"requests_remaining": "Remaining allowed requests",
|
||||
"requests_per_day": "Allowed requests per day"
|
||||
},
|
||||
"error": {
|
||||
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
|
||||
"wrong_location": "No Airly measuring stations in this area."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]",
|
||||
"name": "[%key:common::config_flow::data::name%]"
|
||||
},
|
||||
"description": "To generate API key go to {developer_registration_url}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -38,11 +31,18 @@
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"update_error": {
|
||||
"message": "An error occurred while retrieving data from the Airly API for {entry}: {error}"
|
||||
},
|
||||
"no_station": {
|
||||
"message": "An error occurred while retrieving data from the Airly API for {entry}: no measuring stations in this area"
|
||||
},
|
||||
"update_error": {
|
||||
"message": "An error occurred while retrieving data from the Airly API for {entry}: {error}"
|
||||
}
|
||||
},
|
||||
"system_health": {
|
||||
"info": {
|
||||
"can_reach_server": "Reach Airly server",
|
||||
"requests_per_day": "Allowed requests per day",
|
||||
"requests_remaining": "Remaining allowed requests"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,10 @@ from .const import DOMAIN
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Documentation URL for API key generation
|
||||
_API_KEY_URL = "https://docs.airnowapi.org/account/request/"
|
||||
|
||||
|
||||
async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> bool:
|
||||
"""Validate the user input allows us to connect.
|
||||
|
||||
@@ -114,6 +118,7 @@ class AirNowConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
),
|
||||
}
|
||||
),
|
||||
description_placeholders={"api_key_url": _API_KEY_URL},
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
"aqi": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"o3": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"pm10": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"pm25": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"o3": {
|
||||
"default": "mdi:blur"
|
||||
},
|
||||
"station": {
|
||||
"default": "mdi:blur"
|
||||
}
|
||||
|
||||
@@ -1,15 +1,7 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "To generate API key go to https://docs.airnowapi.org/account/request/",
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]",
|
||||
"radius": "Station radius (miles; optional)"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
@@ -17,16 +9,15 @@
|
||||
"invalid_location": "No results found for that location, try changing the location or station radius.",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"user": {
|
||||
"data": {
|
||||
"radius": "Station radius (miles)"
|
||||
}
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]",
|
||||
"radius": "Station radius (miles; optional)"
|
||||
},
|
||||
"description": "To generate API key go to {api_key_url}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -43,5 +34,14 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"data": {
|
||||
"radius": "Station radius (miles)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"integration_type": "device",
|
||||
"iot_class": "local_polling",
|
||||
"quality_scale": "silver",
|
||||
"requirements": ["airos==0.5.6"]
|
||||
"requirements": ["airos==0.6.0"]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"unique_id_mismatch": "Re-authentication should be used for the same device not a new one"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"key_data_missing": "Expected data not returned from the device, check the documentation for supported devices",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "Ubiquiti airOS device",
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
@@ -19,7 +31,6 @@
|
||||
},
|
||||
"sections": {
|
||||
"advanced_settings": {
|
||||
"name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]",
|
||||
"data": {
|
||||
"ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data::ssl%]",
|
||||
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
||||
@@ -27,24 +38,24 @@
|
||||
"data_description": {
|
||||
"ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::ssl%]",
|
||||
"verify_ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::verify_ssl%]"
|
||||
}
|
||||
},
|
||||
"name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::username%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "IP address or hostname of the airOS device",
|
||||
"username": "Administrator username for the airOS device, normally 'ubnt'",
|
||||
"password": "Password configured through the UISP app or web interface"
|
||||
"password": "Password configured through the UISP app or web interface",
|
||||
"username": "Administrator username for the airOS device, normally 'ubnt'"
|
||||
},
|
||||
"sections": {
|
||||
"advanced_settings": {
|
||||
"name": "Advanced settings",
|
||||
"data": {
|
||||
"ssl": "Use HTTPS",
|
||||
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
||||
@@ -52,28 +63,17 @@
|
||||
"data_description": {
|
||||
"ssl": "Whether the connection should be encrypted (required for most devices)",
|
||||
"verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates"
|
||||
}
|
||||
},
|
||||
"name": "Advanced settings"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"key_data_missing": "Expected data not returned from the device, check the documentation for supported devices",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"unique_id_mismatch": "Re-authentication should be used for the same device not a new one"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"binary_sensor": {
|
||||
"port_forwarding": {
|
||||
"name": "Port forwarding"
|
||||
"dhcp6_server": {
|
||||
"name": "DHCPv6 server"
|
||||
},
|
||||
"dhcp_client": {
|
||||
"name": "DHCP client"
|
||||
@@ -81,8 +81,8 @@
|
||||
"dhcp_server": {
|
||||
"name": "DHCP server"
|
||||
},
|
||||
"dhcp6_server": {
|
||||
"name": "DHCPv6 server"
|
||||
"port_forwarding": {
|
||||
"name": "Port forwarding"
|
||||
},
|
||||
"pppoe": {
|
||||
"name": "PPPoE link"
|
||||
@@ -99,20 +99,27 @@
|
||||
"router": "Router"
|
||||
}
|
||||
},
|
||||
"wireless_frequency": {
|
||||
"name": "Wireless frequency"
|
||||
},
|
||||
"wireless_essid": {
|
||||
"name": "Wireless SSID"
|
||||
"host_uptime": {
|
||||
"name": "Uptime"
|
||||
},
|
||||
"wireless_antenna_gain": {
|
||||
"name": "Antenna gain"
|
||||
},
|
||||
"wireless_throughput_tx": {
|
||||
"name": "Throughput transmit (actual)"
|
||||
"wireless_distance": {
|
||||
"name": "Wireless distance"
|
||||
},
|
||||
"wireless_throughput_rx": {
|
||||
"name": "Throughput receive (actual)"
|
||||
"wireless_essid": {
|
||||
"name": "Wireless SSID"
|
||||
},
|
||||
"wireless_frequency": {
|
||||
"name": "Wireless frequency"
|
||||
},
|
||||
"wireless_mode": {
|
||||
"name": "Wireless mode",
|
||||
"state": {
|
||||
"point_to_multipoint": "Point-to-multipoint",
|
||||
"point_to_point": "Point-to-point"
|
||||
}
|
||||
},
|
||||
"wireless_polling_dl_capacity": {
|
||||
"name": "Download capacity"
|
||||
@@ -123,12 +130,6 @@
|
||||
"wireless_remote_hostname": {
|
||||
"name": "Remote hostname"
|
||||
},
|
||||
"host_uptime": {
|
||||
"name": "Uptime"
|
||||
},
|
||||
"wireless_distance": {
|
||||
"name": "Wireless distance"
|
||||
},
|
||||
"wireless_role": {
|
||||
"name": "Wireless role",
|
||||
"state": {
|
||||
@@ -136,27 +137,26 @@
|
||||
"station": "Station"
|
||||
}
|
||||
},
|
||||
"wireless_mode": {
|
||||
"name": "Wireless mode",
|
||||
"state": {
|
||||
"point_to_point": "Point-to-point",
|
||||
"point_to_multipoint": "Point-to-multipoint"
|
||||
}
|
||||
"wireless_throughput_rx": {
|
||||
"name": "Throughput receive (actual)"
|
||||
},
|
||||
"wireless_throughput_tx": {
|
||||
"name": "Throughput transmit (actual)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"invalid_auth": {
|
||||
"message": "[%key:common::config_flow::error::invalid_auth%]"
|
||||
},
|
||||
"cannot_connect": {
|
||||
"message": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"key_data_missing": {
|
||||
"message": "Key data not returned from device"
|
||||
},
|
||||
"error_data_missing": {
|
||||
"message": "Data incomplete or missing"
|
||||
},
|
||||
"invalid_auth": {
|
||||
"message": "[%key:common::config_flow::error::invalid_auth%]"
|
||||
},
|
||||
"key_data_missing": {
|
||||
"message": "Key data not returned from device"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,21 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Identify the device",
|
||||
"description": "Provide the IP address or mDNS of the device and its password",
|
||||
"data": {
|
||||
"ip_address": "[%key:common::config_flow::data::ip%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"invalid_input": "[%key:common::config_flow::error::invalid_host%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"title": "Configure air-Q integration",
|
||||
"user": {
|
||||
"data": {
|
||||
"return_average": "Show values averaged by the device",
|
||||
"clip_negatives": "Clip negative values"
|
||||
"ip_address": "[%key:common::config_flow::data::ip%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"data_description": {
|
||||
"return_average": "air-Q allows to poll both the noisy sensor readings as well as the values averaged on the device (default)",
|
||||
"clip_negatives": "For baseline calibration purposes, certain sensor values may briefly become negative. The default behaviour is to clip such values to 0"
|
||||
}
|
||||
"description": "Provide the IP address or mDNS of the device and its password",
|
||||
"title": "Identify the device"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -53,8 +38,11 @@
|
||||
"bromine": {
|
||||
"name": "Bromine"
|
||||
},
|
||||
"methanethiol": {
|
||||
"name": "Methanethiol"
|
||||
"carbon_disulfide": {
|
||||
"name": "Carbon disulfide"
|
||||
},
|
||||
"carbon_monoxide": {
|
||||
"name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]"
|
||||
},
|
||||
"chlorine": {
|
||||
"name": "Chlorine"
|
||||
@@ -62,12 +50,6 @@
|
||||
"chlorine_dioxide": {
|
||||
"name": "Chlorine dioxide"
|
||||
},
|
||||
"carbon_disulfide": {
|
||||
"name": "Carbon disulfide"
|
||||
},
|
||||
"carbon_monoxide": {
|
||||
"name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]"
|
||||
},
|
||||
"dew_point": {
|
||||
"name": "Dew point"
|
||||
},
|
||||
@@ -77,36 +59,51 @@
|
||||
"ethylene": {
|
||||
"name": "Ethylene"
|
||||
},
|
||||
"formaldehyde": {
|
||||
"name": "Formaldehyde"
|
||||
},
|
||||
"fluorine": {
|
||||
"name": "Fluorine"
|
||||
},
|
||||
"hydrogen_sulfide": {
|
||||
"name": "Hydrogen sulfide"
|
||||
"formaldehyde": {
|
||||
"name": "Formaldehyde"
|
||||
},
|
||||
"health_index": {
|
||||
"name": "Health index"
|
||||
},
|
||||
"hydrochloric_acid": {
|
||||
"name": "Hydrochloric acid"
|
||||
},
|
||||
"hydrogen": {
|
||||
"name": "Hydrogen"
|
||||
},
|
||||
"hydrogen_cyanide": {
|
||||
"name": "Hydrogen cyanide"
|
||||
},
|
||||
"hydrogen_fluoride": {
|
||||
"name": "Hydrogen fluoride"
|
||||
},
|
||||
"health_index": {
|
||||
"name": "Health index"
|
||||
},
|
||||
"hydrogen": {
|
||||
"name": "Hydrogen"
|
||||
},
|
||||
"hydrogen_peroxide": {
|
||||
"name": "Hydrogen peroxide"
|
||||
},
|
||||
"hydrogen_phosphide": {
|
||||
"name": "Hydrogen phosphide"
|
||||
},
|
||||
"hydrogen_sulfide": {
|
||||
"name": "Hydrogen sulfide"
|
||||
},
|
||||
"industrial_volatile_organic_compounds": {
|
||||
"name": "VOCs (industrial)"
|
||||
},
|
||||
"maximum_noise": {
|
||||
"name": "Noise (maximum)"
|
||||
},
|
||||
"methane": {
|
||||
"name": "Methane"
|
||||
},
|
||||
"methanethiol": {
|
||||
"name": "Methanethiol"
|
||||
},
|
||||
"noise": {
|
||||
"name": "Noise"
|
||||
},
|
||||
"organic_acid": {
|
||||
"name": "Organic acid"
|
||||
},
|
||||
@@ -116,36 +113,39 @@
|
||||
"performance_index": {
|
||||
"name": "Performance index"
|
||||
},
|
||||
"hydrogen_phosphide": {
|
||||
"name": "Hydrogen phosphide"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"propane": {
|
||||
"name": "Propane"
|
||||
},
|
||||
"refigerant": {
|
||||
"name": "Refrigerant"
|
||||
},
|
||||
"silicon_hydride": {
|
||||
"name": "Silicon hydride"
|
||||
},
|
||||
"noise": {
|
||||
"name": "Noise"
|
||||
},
|
||||
"maximum_noise": {
|
||||
"name": "Noise (maximum)"
|
||||
},
|
||||
"radon": {
|
||||
"name": "Radon"
|
||||
},
|
||||
"industrial_volatile_organic_compounds": {
|
||||
"name": "VOCs (industrial)"
|
||||
"refigerant": {
|
||||
"name": "Refrigerant"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"silicon_hydride": {
|
||||
"name": "Silicon hydride"
|
||||
},
|
||||
"virus_index": {
|
||||
"name": "Virus index"
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"data": {
|
||||
"clip_negatives": "Clip negative values",
|
||||
"return_average": "Show values averaged by the device"
|
||||
},
|
||||
"data_description": {
|
||||
"clip_negatives": "For baseline calibration purposes, certain sensor values may briefly become negative. The default behavior is to clip such values to 0",
|
||||
"return_average": "air-Q allows to poll both the noisy sensor readings as well as the values averaged on the device (default)"
|
||||
},
|
||||
"title": "Configure air-Q integration"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -8,29 +16,21 @@
|
||||
},
|
||||
"description": "Log in at {url} to find your credentials"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"radon": {
|
||||
"name": "Radon"
|
||||
},
|
||||
"light": {
|
||||
"name": "Light"
|
||||
},
|
||||
"virus_risk": {
|
||||
"name": "Virus Risk"
|
||||
},
|
||||
"mold": {
|
||||
"name": "Mold"
|
||||
},
|
||||
"radon": {
|
||||
"name": "Radon"
|
||||
},
|
||||
"virus_risk": {
|
||||
"name": "Virus Risk"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
"radon_1day_avg": {
|
||||
"default": "mdi:radioactive"
|
||||
},
|
||||
"radon_longterm_avg": {
|
||||
"radon_1day_level": {
|
||||
"default": "mdi:radioactive"
|
||||
},
|
||||
"radon_1day_level": {
|
||||
"radon_longterm_avg": {
|
||||
"default": "mdi:radioactive"
|
||||
},
|
||||
"radon_longterm_level": {
|
||||
|
||||
@@ -28,5 +28,5 @@
|
||||
"dependencies": ["bluetooth_adapters"],
|
||||
"documentation": "https://www.home-assistant.io/integrations/airthings_ble",
|
||||
"iot_class": "local_polling",
|
||||
"requirements": ["airthings-ble==1.1.1"]
|
||||
"requirements": ["airthings-ble==1.2.0"]
|
||||
}
|
||||
|
||||
@@ -1,49 +1,49 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"firmware_upgrade_required": "Your device requires a firmware upgrade. Please use the Airthings app (Android/iOS) to upgrade it.",
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]",
|
||||
"unsupported_device": "Unsupported device"
|
||||
},
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"bluetooth_confirm": {
|
||||
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
|
||||
},
|
||||
"user": {
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]",
|
||||
"data": {
|
||||
"address": "[%key:common::config_flow::data::device%]"
|
||||
},
|
||||
"data_description": {
|
||||
"address": "The Airthings devices discovered via Bluetooth."
|
||||
}
|
||||
},
|
||||
"bluetooth_confirm": {
|
||||
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
|
||||
},
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]"
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"firmware_upgrade_required": "Your device requires a firmware upgrade. Please use the Airthings app (Android/iOS) to upgrade it.",
|
||||
"unsupported_device": "Unsupported device",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"radon_1day_avg": {
|
||||
"name": "Radon 1-day average"
|
||||
},
|
||||
"radon_longterm_avg": {
|
||||
"name": "Radon longterm average"
|
||||
},
|
||||
"radon_1day_level": {
|
||||
"name": "Radon 1-day level"
|
||||
},
|
||||
"radon_longterm_level": {
|
||||
"name": "Radon longterm level"
|
||||
"ambient_noise": {
|
||||
"name": "Ambient noise"
|
||||
},
|
||||
"illuminance": {
|
||||
"name": "[%key:component::sensor::entity_component::illuminance::name%]"
|
||||
},
|
||||
"ambient_noise": {
|
||||
"name": "Ambient noise"
|
||||
"radon_1day_avg": {
|
||||
"name": "Radon 1-day average"
|
||||
},
|
||||
"radon_1day_level": {
|
||||
"name": "Radon 1-day level"
|
||||
},
|
||||
"radon_longterm_avg": {
|
||||
"name": "Radon longterm average"
|
||||
},
|
||||
"radon_longterm_level": {
|
||||
"name": "Radon longterm level"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up your AirTouch 4 connection details.",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of your AirTouch controller."
|
||||
}
|
||||
},
|
||||
"title": "Set up your AirTouch 4 connection details."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -21,8 +21,8 @@
|
||||
"state_attributes": {
|
||||
"fan_mode": {
|
||||
"state": {
|
||||
"turbo": "Turbo",
|
||||
"intelligent_auto": "Intelligent Auto"
|
||||
"intelligent_auto": "Intelligent Auto",
|
||||
"turbo": "Turbo"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"pollutant_level": {
|
||||
"default": "mdi:gauge"
|
||||
},
|
||||
"pollutant_label": {
|
||||
"default": "mdi:chemical-weapon"
|
||||
},
|
||||
"pollutant_level": {
|
||||
"default": "mdi:gauge"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,54 +1,44 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
|
||||
"location_not_found": "Location not found",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"geography_by_coords": {
|
||||
"title": "Configure a geography",
|
||||
"description": "Use the AirVisual cloud API to monitor a latitude/longitude.",
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"latitude": "[%key:common::config_flow::data::latitude%]",
|
||||
"longitude": "[%key:common::config_flow::data::longitude%]"
|
||||
}
|
||||
},
|
||||
"description": "Use the AirVisual cloud API to monitor a latitude/longitude.",
|
||||
"title": "Configure a geography"
|
||||
},
|
||||
"geography_by_name": {
|
||||
"title": "[%key:component::airvisual::config::step::geography_by_coords::title%]",
|
||||
"description": "Use the AirVisual cloud API to monitor a city/state/country.",
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"city": "City",
|
||||
"state": "State",
|
||||
"country": "[%key:common::config_flow::data::country%]"
|
||||
}
|
||||
"country": "[%key:common::config_flow::data::country%]",
|
||||
"state": "State"
|
||||
},
|
||||
"description": "Use the AirVisual cloud API to monitor a city/state/country.",
|
||||
"title": "[%key:component::airvisual::config::step::geography_by_coords::title%]"
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "Re-authenticate AirVisual",
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]"
|
||||
}
|
||||
},
|
||||
"title": "Re-authenticate AirVisual"
|
||||
},
|
||||
"user": {
|
||||
"title": "Configure AirVisual",
|
||||
"description": "Pick what type of AirVisual data you want to monitor."
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]",
|
||||
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
|
||||
"location_not_found": "Location not found",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"title": "[%key:component::airvisual::config::step::user::title%]",
|
||||
"data": {
|
||||
"show_on_map": "Show monitored geography on the map"
|
||||
}
|
||||
"description": "Pick what type of AirVisual data you want to monitor.",
|
||||
"title": "Configure AirVisual"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -67,19 +57,29 @@
|
||||
"pollutant_level": {
|
||||
"state": {
|
||||
"good": "Good",
|
||||
"hazardous": "Hazardous",
|
||||
"moderate": "Moderate",
|
||||
"unhealthy": "Unhealthy",
|
||||
"unhealthy_sensitive": "Unhealthy for sensitive groups",
|
||||
"very_unhealthy": "Very unhealthy",
|
||||
"hazardous": "Hazardous"
|
||||
"very_unhealthy": "Very unhealthy"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"issues": {
|
||||
"airvisual_pro_migration": {
|
||||
"title": "{ip_address} is now part of the AirVisual Pro integration",
|
||||
"description": "AirVisual Pro units are now their own Home Assistant integration (as opposed to be included with the original AirVisual integration that uses the AirVisual cloud API). The Pro device located at `{ip_address}` has automatically been migrated.\n\nAs part of that migration, the Pro's device ID has changed from `{old_device_id}` to `{new_device_id}`. Please update these automations to use the new device ID: {device_automations_string}."
|
||||
"description": "AirVisual Pro units are now their own Home Assistant integration (as opposed to be included with the original AirVisual integration that uses the AirVisual cloud API). The Pro device located at `{ip_address}` has automatically been migrated.\n\nAs part of that migration, the Pro's device ID has changed from `{old_device_id}` to `{new_device_id}`. Please update these automations to use the new device ID: {device_automations_string}.",
|
||||
"title": "{ip_address} is now part of the AirVisual Pro integration"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"data": {
|
||||
"show_on_map": "Show monitored geography on the map"
|
||||
},
|
||||
"title": "[%key:component::airvisual::config::step::user::title%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"description": "[%key:component::airvisual_pro::config::step::user::description%]",
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"description": "[%key:component::airvisual_pro::config::step::user::description%]"
|
||||
},
|
||||
"user": {
|
||||
"description": "The password can be retrieved from the AirVisual Pro's UI.",
|
||||
"data": {
|
||||
"ip_address": "[%key:common::config_flow::data::host%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"data_description": {
|
||||
"ip_address": "The hostname or IP address of your AirVisual Pro device."
|
||||
}
|
||||
},
|
||||
"description": "The password can be retrieved from the AirVisual Pro's UI."
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"pm01": {
|
||||
"name": "PM0.1"
|
||||
},
|
||||
"outdoor_air_quality_index": {
|
||||
"name": "Outdoor air quality index"
|
||||
},
|
||||
"pm01": {
|
||||
"name": "PM0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
"documentation": "https://www.home-assistant.io/integrations/airzone",
|
||||
"iot_class": "local_polling",
|
||||
"loggers": ["aioairzone"],
|
||||
"requirements": ["aioairzone==1.0.1"]
|
||||
"requirements": ["aioairzone==1.0.2"]
|
||||
}
|
||||
|
||||
@@ -10,15 +10,15 @@
|
||||
"step": {
|
||||
"discovered_connection": {
|
||||
"data": {
|
||||
"id": "[%key:component::airzone::config::step::user::data::id%]",
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"id": "[%key:component::airzone::config::step::user::data::id%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"id": "System ID",
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"id": "System ID",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
}
|
||||
}
|
||||
@@ -37,19 +37,19 @@
|
||||
"grille_angles": {
|
||||
"name": "Cold angle",
|
||||
"state": {
|
||||
"90deg": "90°",
|
||||
"50deg": "50°",
|
||||
"40deg": "40°",
|
||||
"45deg": "45°",
|
||||
"40deg": "40°"
|
||||
"50deg": "50°",
|
||||
"90deg": "90°"
|
||||
}
|
||||
},
|
||||
"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%]",
|
||||
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]",
|
||||
"45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]",
|
||||
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]"
|
||||
"50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]",
|
||||
"90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]"
|
||||
}
|
||||
},
|
||||
"modes": {
|
||||
@@ -66,20 +66,20 @@
|
||||
"q_adapt": {
|
||||
"name": "Q-Adapt",
|
||||
"state": {
|
||||
"standard": "Standard",
|
||||
"maximum": "Maximum",
|
||||
"minimum": "Minimum",
|
||||
"power": "Power",
|
||||
"silence": "Silence",
|
||||
"minimum": "Minimum",
|
||||
"maximum": "Maximum"
|
||||
"standard": "Standard"
|
||||
}
|
||||
},
|
||||
"sleep_times": {
|
||||
"name": "Sleep",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"30m": "30 minutes",
|
||||
"60m": "60 minutes",
|
||||
"90m": "90 minutes"
|
||||
"90m": "90 minutes",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
"user": {
|
||||
"data": {
|
||||
"id": "Installation",
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::username%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,9 +32,9 @@
|
||||
"air_quality": {
|
||||
"name": "Air Quality mode",
|
||||
"state": {
|
||||
"auto": "[%key:common::state::auto%]",
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]",
|
||||
"auto": "[%key:common::state::auto%]"
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
},
|
||||
"modes": {
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"pick_implementation": {
|
||||
"title": "[%key:common::config_flow::title::oauth2_pick_implementation%]"
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "[%key:common::config_flow::title::reauth%]",
|
||||
"description": "Aladdin Connect needs to re-authenticate your account"
|
||||
},
|
||||
"oauth_discovery": {
|
||||
"description": "Home Assistant has found an Aladdin Connect device on your network. Press **Submit** to continue setting up Aladdin Connect."
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"authorize_url_timeout": "[%key:common::config_flow::abort::oauth2_authorize_url_timeout%]",
|
||||
"cloud_not_enabled": "Please make sure you run Home Assistant with `{default_config}` enabled in your configuration.yaml.",
|
||||
"missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]",
|
||||
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]",
|
||||
"oauth_error": "[%key:common::config_flow::abort::oauth2_error%]",
|
||||
"oauth_failed": "[%key:common::config_flow::abort::oauth2_failed%]",
|
||||
"oauth_timeout": "[%key:common::config_flow::abort::oauth2_timeout%]",
|
||||
"oauth_unauthorized": "[%key:common::config_flow::abort::oauth2_unauthorized%]",
|
||||
"missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]",
|
||||
"authorize_url_timeout": "[%key:common::config_flow::abort::oauth2_authorize_url_timeout%]",
|
||||
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]",
|
||||
"user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account.",
|
||||
"cloud_not_enabled": "Please make sure you run Home Assistant with `{default_config}` enabled in your configuration.yaml."
|
||||
"user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]",
|
||||
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account."
|
||||
},
|
||||
"create_entry": {
|
||||
"default": "[%key:common::config_flow::create_entry::authenticated%]"
|
||||
},
|
||||
"step": {
|
||||
"oauth_discovery": {
|
||||
"description": "Home Assistant has found an Aladdin Connect device on your network. Press **Submit** to continue setting up Aladdin Connect."
|
||||
},
|
||||
"pick_implementation": {
|
||||
"title": "[%key:common::config_flow::title::oauth2_pick_implementation%]"
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"description": "Aladdin Connect needs to re-authenticate your account",
|
||||
"title": "[%key:common::config_flow::title::reauth%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,23 +18,23 @@
|
||||
"alarm_arm_away": {
|
||||
"service": "mdi:shield-lock"
|
||||
},
|
||||
"alarm_arm_custom_bypass": {
|
||||
"service": "mdi:security"
|
||||
},
|
||||
"alarm_arm_home": {
|
||||
"service": "mdi:shield-home"
|
||||
},
|
||||
"alarm_arm_night": {
|
||||
"service": "mdi:shield-moon"
|
||||
},
|
||||
"alarm_arm_custom_bypass": {
|
||||
"service": "mdi:security"
|
||||
"alarm_arm_vacation": {
|
||||
"service": "mdi:shield-airplane"
|
||||
},
|
||||
"alarm_disarm": {
|
||||
"service": "mdi:shield-off"
|
||||
},
|
||||
"alarm_trigger": {
|
||||
"service": "mdi:bell-ring"
|
||||
},
|
||||
"alarm_arm_vacation": {
|
||||
"service": "mdi:shield-airplane"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"title": "Alarm control panel",
|
||||
"device_automation": {
|
||||
"action_type": {
|
||||
"arm_away": "Arm {entity_name} away",
|
||||
@@ -10,24 +9,24 @@
|
||||
"trigger": "Trigger {entity_name}"
|
||||
},
|
||||
"condition_type": {
|
||||
"is_triggered": "{entity_name} is triggered",
|
||||
"is_disarmed": "{entity_name} is disarmed",
|
||||
"is_armed_home": "{entity_name} is armed home",
|
||||
"is_armed_away": "{entity_name} is armed away",
|
||||
"is_armed_home": "{entity_name} is armed home",
|
||||
"is_armed_night": "{entity_name} is armed night",
|
||||
"is_armed_vacation": "{entity_name} is armed vacation"
|
||||
"is_armed_vacation": "{entity_name} is armed vacation",
|
||||
"is_disarmed": "{entity_name} is disarmed",
|
||||
"is_triggered": "{entity_name} is triggered"
|
||||
},
|
||||
"extra_fields": {
|
||||
"code": "Code",
|
||||
"for": "[%key:common::device_automation::extra_fields::for%]"
|
||||
},
|
||||
"trigger_type": {
|
||||
"triggered": "{entity_name} triggered",
|
||||
"disarmed": "{entity_name} disarmed",
|
||||
"armed_home": "{entity_name} armed home",
|
||||
"armed_away": "{entity_name} armed away",
|
||||
"armed_home": "{entity_name} armed home",
|
||||
"armed_night": "{entity_name} armed night",
|
||||
"armed_vacation": "{entity_name} armed vacation"
|
||||
"armed_vacation": "{entity_name} armed vacation",
|
||||
"disarmed": "{entity_name} disarmed",
|
||||
"triggered": "{entity_name} triggered"
|
||||
}
|
||||
},
|
||||
"entity_component": {
|
||||
@@ -35,106 +34,34 @@
|
||||
"name": "[%key:component::alarm_control_panel::title%]",
|
||||
"state": {
|
||||
"armed": "Armed",
|
||||
"disarmed": "Disarmed",
|
||||
"armed_home": "Armed home",
|
||||
"armed_away": "Armed away",
|
||||
"armed_custom_bypass": "Armed custom bypass",
|
||||
"armed_home": "Armed home",
|
||||
"armed_night": "Armed night",
|
||||
"armed_vacation": "Armed vacation",
|
||||
"armed_custom_bypass": "Armed custom bypass",
|
||||
"pending": "Pending",
|
||||
"arming": "Arming",
|
||||
"disarmed": "Disarmed",
|
||||
"disarming": "Disarming",
|
||||
"pending": "Pending",
|
||||
"triggered": "Triggered"
|
||||
},
|
||||
"state_attributes": {
|
||||
"code_format": {
|
||||
"name": "Code format",
|
||||
"state": {
|
||||
"text": "Text",
|
||||
"number": "Number"
|
||||
}
|
||||
},
|
||||
"changed_by": {
|
||||
"name": "Changed by"
|
||||
},
|
||||
"code_arm_required": {
|
||||
"name": "Code for arming",
|
||||
"state": {
|
||||
"true": "Required",
|
||||
"false": "Not required"
|
||||
"false": "Not required",
|
||||
"true": "Required"
|
||||
}
|
||||
},
|
||||
"code_format": {
|
||||
"name": "Code format",
|
||||
"state": {
|
||||
"number": "Number",
|
||||
"text": "Text"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"alarm_disarm": {
|
||||
"name": "Disarm",
|
||||
"description": "Disarms the alarm.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "Code",
|
||||
"description": "Code to disarm the alarm."
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_arm_custom_bypass": {
|
||||
"name": "Arm with custom bypass",
|
||||
"description": "Arms the alarm while allowing to bypass a custom area.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "Code to arm the alarm."
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_arm_home": {
|
||||
"name": "Arm home",
|
||||
"description": "Arms the alarm in the home mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_arm_away": {
|
||||
"name": "Arm away",
|
||||
"description": "Arms the alarm in the away mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_arm_night": {
|
||||
"name": "Arm night",
|
||||
"description": "Arms the alarm in the night mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_arm_vacation": {
|
||||
"name": "Arm vacation",
|
||||
"description": "Arms the alarm in the vacation mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alarm_trigger": {
|
||||
"name": "Trigger",
|
||||
"description": "Triggers the alarm manually.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,5 +70,78 @@
|
||||
"code_arm_required": {
|
||||
"message": "Arming requires a code but none was given for {entity_id}."
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"alarm_arm_away": {
|
||||
"description": "Arms the alarm in the away mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Arm away"
|
||||
},
|
||||
"alarm_arm_custom_bypass": {
|
||||
"description": "Arms the alarm while allowing to bypass a custom area.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "Code to arm the alarm.",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Arm with custom bypass"
|
||||
},
|
||||
"alarm_arm_home": {
|
||||
"description": "Arms the alarm in the home mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Arm home"
|
||||
},
|
||||
"alarm_arm_night": {
|
||||
"description": "Arms the alarm in the night mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Arm night"
|
||||
},
|
||||
"alarm_arm_vacation": {
|
||||
"description": "Arms the alarm in the vacation mode.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Arm vacation"
|
||||
},
|
||||
"alarm_disarm": {
|
||||
"description": "Disarms the alarm.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "Code to disarm the alarm.",
|
||||
"name": "Code"
|
||||
}
|
||||
},
|
||||
"name": "Disarm"
|
||||
},
|
||||
"alarm_trigger": {
|
||||
"description": "Triggers the alarm manually.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
|
||||
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Trigger"
|
||||
}
|
||||
},
|
||||
"title": "Alarm control panel"
|
||||
}
|
||||
|
||||
@@ -1,101 +1,101 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Choose AlarmDecoder protocol",
|
||||
"data": {
|
||||
"protocol": "Protocol"
|
||||
}
|
||||
},
|
||||
"protocol": {
|
||||
"title": "Configure connection settings",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]",
|
||||
"device_baudrate": "Device baud rate",
|
||||
"device_path": "Device path"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the AlarmDecoder device that is connected to your alarm panel.",
|
||||
"port": "The port on which AlarmDecoder is accessible (for example, 10000)"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"create_entry": {
|
||||
"default": "Successfully connected to AlarmDecoder."
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"create_entry": {
|
||||
"default": "Successfully connected to AlarmDecoder."
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
"step": {
|
||||
"protocol": {
|
||||
"data": {
|
||||
"device_baudrate": "Device baud rate",
|
||||
"device_path": "Device path",
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the AlarmDecoder device that is connected to your alarm panel.",
|
||||
"port": "The port on which AlarmDecoder is accessible (for example, 10000)"
|
||||
},
|
||||
"title": "Configure connection settings"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"protocol": "Protocol"
|
||||
},
|
||||
"title": "Choose AlarmDecoder protocol"
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"error": {
|
||||
"int": "The field below must be an integer.",
|
||||
"loop_range": "'RF loop' must be an integer between 1 and 4.",
|
||||
"loop_rfid": "'RF loop' cannot be used without 'RF serial'.",
|
||||
"relay_inclusive": "'Relay address' and 'Relay channel' are codependent and must be included together."
|
||||
},
|
||||
"step": {
|
||||
"arm_settings": {
|
||||
"data": {
|
||||
"alt_night_mode": "Alternative night mode",
|
||||
"auto_bypass": "Auto-bypass on arm",
|
||||
"code_arm_required": "Code required for arming"
|
||||
},
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]"
|
||||
},
|
||||
"init": {
|
||||
"title": "Configure AlarmDecoder",
|
||||
"description": "What would you like to edit?",
|
||||
"data": {
|
||||
"edit_selection": "Edit"
|
||||
}
|
||||
},
|
||||
"arm_settings": {
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
|
||||
"data": {
|
||||
"auto_bypass": "Auto-bypass on arm",
|
||||
"code_arm_required": "Code required for arming",
|
||||
"alt_night_mode": "Alternative night mode"
|
||||
}
|
||||
},
|
||||
"zone_select": {
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
|
||||
"description": "Enter the zone number you'd like to to add, edit, or remove.",
|
||||
"data": {
|
||||
"zone_number": "Zone number"
|
||||
}
|
||||
},
|
||||
"description": "What would you like to edit?",
|
||||
"title": "Configure AlarmDecoder"
|
||||
},
|
||||
"zone_details": {
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
|
||||
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave 'Zone name' blank.",
|
||||
"data": {
|
||||
"zone_name": "Zone name",
|
||||
"zone_type": "Zone type",
|
||||
"zone_rfid": "RF serial",
|
||||
"zone_loop": "RF loop",
|
||||
"zone_name": "Zone name",
|
||||
"zone_relayaddr": "Relay address",
|
||||
"zone_relaychan": "Relay channel"
|
||||
}
|
||||
"zone_relaychan": "Relay channel",
|
||||
"zone_rfid": "RF serial",
|
||||
"zone_type": "Zone type"
|
||||
},
|
||||
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave 'Zone name' blank.",
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]"
|
||||
},
|
||||
"zone_select": {
|
||||
"data": {
|
||||
"zone_number": "Zone number"
|
||||
},
|
||||
"description": "Enter the zone number you'd like to to add, edit, or remove.",
|
||||
"title": "[%key:component::alarmdecoder::options::step::init::title%]"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"relay_inclusive": "'Relay address' and 'Relay channel' are codependent and must be included together.",
|
||||
"int": "The field below must be an integer.",
|
||||
"loop_rfid": "'RF loop' cannot be used without 'RF serial'.",
|
||||
"loop_range": "'RF loop' must be an integer between 1 and 4."
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"alarm_keypress": {
|
||||
"name": "Key press",
|
||||
"description": "Sends custom keypresses to the alarm.",
|
||||
"fields": {
|
||||
"keypress": {
|
||||
"name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]",
|
||||
"description": "String to send to the alarm panel."
|
||||
"description": "String to send to the alarm panel.",
|
||||
"name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Key press"
|
||||
},
|
||||
"alarm_toggle_chime": {
|
||||
"name": "Toggle chime",
|
||||
"description": "Sends the alarm the toggle chime command.",
|
||||
"fields": {
|
||||
"code": {
|
||||
"name": "Code",
|
||||
"description": "Code to toggle the alarm control panel chime with."
|
||||
"description": "Code to toggle the alarm control panel chime with.",
|
||||
"name": "Code"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Toggle chime"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"title": "Alert",
|
||||
"entity_component": {
|
||||
"_": {
|
||||
"name": "[%key:component::alert::title%]",
|
||||
@@ -12,16 +11,17 @@
|
||||
},
|
||||
"services": {
|
||||
"toggle": {
|
||||
"name": "[%key:common::action::toggle%]",
|
||||
"description": "Toggles alert's notifications."
|
||||
"description": "Toggles alert's notifications.",
|
||||
"name": "[%key:common::action::toggle%]"
|
||||
},
|
||||
"turn_off": {
|
||||
"name": "[%key:common::action::turn_off%]",
|
||||
"description": "Silences alert's notifications."
|
||||
"description": "Silences alert's notifications.",
|
||||
"name": "[%key:common::action::turn_off%]"
|
||||
},
|
||||
"turn_on": {
|
||||
"name": "[%key:common::action::turn_on%]",
|
||||
"description": "Resets alert's notifications."
|
||||
"description": "Resets alert's notifications.",
|
||||
"name": "[%key:common::action::turn_on%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": "Alert"
|
||||
}
|
||||
|
||||
@@ -26,3 +26,6 @@ COUNTRY_DOMAINS = {
|
||||
"us": DEFAULT_DOMAIN,
|
||||
"za": "co.za",
|
||||
}
|
||||
|
||||
CATEGORY_SENSORS = "sensors"
|
||||
CATEGORY_NOTIFICATIONS = "notifications"
|
||||
|
||||
@@ -8,5 +8,5 @@
|
||||
"iot_class": "cloud_polling",
|
||||
"loggers": ["aioamazondevices"],
|
||||
"quality_scale": "platinum",
|
||||
"requirements": ["aioamazondevices==6.4.4"]
|
||||
"requirements": ["aioamazondevices==6.5.5"]
|
||||
}
|
||||
|
||||
@@ -4,9 +4,15 @@ from __future__ import annotations
|
||||
|
||||
from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from typing import Final
|
||||
|
||||
from aioamazondevices.api import AmazonDevice
|
||||
from aioamazondevices.const import (
|
||||
NOTIFICATION_ALARM,
|
||||
NOTIFICATION_REMINDER,
|
||||
NOTIFICATION_TIMER,
|
||||
)
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
SensorDeviceClass,
|
||||
@@ -19,6 +25,7 @@ from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
||||
from homeassistant.helpers.typing import StateType
|
||||
|
||||
from .const import CATEGORY_NOTIFICATIONS, CATEGORY_SENSORS
|
||||
from .coordinator import AmazonConfigEntry
|
||||
from .entity import AmazonEntity
|
||||
|
||||
@@ -36,6 +43,20 @@ class AmazonSensorEntityDescription(SensorEntityDescription):
|
||||
and (sensor := device.sensors.get(key)) is not None
|
||||
and sensor.error is False
|
||||
)
|
||||
category: str = CATEGORY_SENSORS
|
||||
|
||||
|
||||
@dataclass(frozen=True, kw_only=True)
|
||||
class AmazonNotificationEntityDescription(SensorEntityDescription):
|
||||
"""Amazon Devices notification entity description."""
|
||||
|
||||
native_unit_of_measurement_fn: Callable[[AmazonDevice, str], str] | None = None
|
||||
is_available_fn: Callable[[AmazonDevice, str], bool] = lambda device, key: (
|
||||
device.online
|
||||
and (notification := device.notifications.get(key)) is not None
|
||||
and notification.next_occurrence is not None
|
||||
)
|
||||
category: str = CATEGORY_NOTIFICATIONS
|
||||
|
||||
|
||||
SENSORS: Final = (
|
||||
@@ -56,6 +77,23 @@ SENSORS: Final = (
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
),
|
||||
)
|
||||
NOTIFICATIONS: Final = (
|
||||
AmazonNotificationEntityDescription(
|
||||
key=NOTIFICATION_ALARM,
|
||||
translation_key="alarm",
|
||||
device_class=SensorDeviceClass.TIMESTAMP,
|
||||
),
|
||||
AmazonNotificationEntityDescription(
|
||||
key=NOTIFICATION_REMINDER,
|
||||
translation_key="reminder",
|
||||
device_class=SensorDeviceClass.TIMESTAMP,
|
||||
),
|
||||
AmazonNotificationEntityDescription(
|
||||
key=NOTIFICATION_TIMER,
|
||||
translation_key="timer",
|
||||
device_class=SensorDeviceClass.TIMESTAMP,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
@@ -74,12 +112,18 @@ async def async_setup_entry(
|
||||
new_devices = current_devices - known_devices
|
||||
if new_devices:
|
||||
known_devices.update(new_devices)
|
||||
async_add_entities(
|
||||
sensors_list = [
|
||||
AmazonSensorEntity(coordinator, serial_num, sensor_desc)
|
||||
for sensor_desc in SENSORS
|
||||
for serial_num in new_devices
|
||||
if coordinator.data[serial_num].sensors.get(sensor_desc.key) is not None
|
||||
)
|
||||
]
|
||||
notifications_list = [
|
||||
AmazonSensorEntity(coordinator, serial_num, notification_desc)
|
||||
for notification_desc in NOTIFICATIONS
|
||||
for serial_num in new_devices
|
||||
]
|
||||
async_add_entities(sensors_list + notifications_list)
|
||||
|
||||
_check_device()
|
||||
entry.async_on_unload(coordinator.async_add_listener(_check_device))
|
||||
@@ -88,7 +132,9 @@ async def async_setup_entry(
|
||||
class AmazonSensorEntity(AmazonEntity, SensorEntity):
|
||||
"""Sensor device."""
|
||||
|
||||
entity_description: AmazonSensorEntityDescription
|
||||
entity_description: (
|
||||
AmazonSensorEntityDescription | AmazonNotificationEntityDescription
|
||||
)
|
||||
|
||||
@property
|
||||
def native_unit_of_measurement(self) -> str | None:
|
||||
@@ -101,9 +147,13 @@ class AmazonSensorEntity(AmazonEntity, SensorEntity):
|
||||
return super().native_unit_of_measurement
|
||||
|
||||
@property
|
||||
def native_value(self) -> StateType:
|
||||
def native_value(self) -> StateType | datetime:
|
||||
"""Return the state of the sensor."""
|
||||
return self.device.sensors[self.entity_description.key].value
|
||||
# Sensors
|
||||
if self.entity_description.category == CATEGORY_SENSORS:
|
||||
return self.device.sensors[self.entity_description.key].value
|
||||
# Notifications
|
||||
return self.device.notifications[self.entity_description.key].next_occurrence
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
|
||||
@@ -1,47 +1,12 @@
|
||||
{
|
||||
"common": {
|
||||
"data_code": "One-time password (OTP code)",
|
||||
"data_description_username": "The email address of your Amazon account.",
|
||||
"data_description_password": "The password of your Amazon account.",
|
||||
"data_description_code": "The one-time password to log in to your account. Currently, only tokens from OTP applications are supported.",
|
||||
"data_description_password": "The password of your Amazon account.",
|
||||
"data_description_username": "The email address of your Amazon account.",
|
||||
"device_id_description": "The ID of the device to send the command to."
|
||||
},
|
||||
"config": {
|
||||
"flow_title": "{username}",
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]"
|
||||
},
|
||||
"data_description": {
|
||||
"username": "[%key:component::alexa_devices::common::data_description_username%]",
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]"
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]"
|
||||
},
|
||||
"data_description": {
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]"
|
||||
}
|
||||
},
|
||||
"reconfigure": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]"
|
||||
},
|
||||
"data_description": {
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]",
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
@@ -55,15 +20,61 @@
|
||||
"cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "{username}",
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"data_description": {
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]",
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]"
|
||||
}
|
||||
},
|
||||
"reconfigure": {
|
||||
"data": {
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"data_description": {
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]",
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"code": "[%key:component::alexa_devices::common::data_code%]",
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::username%]"
|
||||
},
|
||||
"data_description": {
|
||||
"code": "[%key:component::alexa_devices::common::data_description_code%]",
|
||||
"password": "[%key:component::alexa_devices::common::data_description_password%]",
|
||||
"username": "[%key:component::alexa_devices::common::data_description_username%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"notify": {
|
||||
"speak": {
|
||||
"name": "Speak"
|
||||
},
|
||||
"announce": {
|
||||
"name": "Announce"
|
||||
},
|
||||
"speak": {
|
||||
"name": "Speak"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"alarm": {
|
||||
"name": "Next alarm"
|
||||
},
|
||||
"reminder": {
|
||||
"name": "Next reminder"
|
||||
},
|
||||
"timer": {
|
||||
"name": "Next timer"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
@@ -72,34 +83,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"send_sound": {
|
||||
"name": "Send sound",
|
||||
"description": "Sends a sound to a device",
|
||||
"fields": {
|
||||
"device_id": {
|
||||
"name": "Device",
|
||||
"description": "[%key:component::alexa_devices::common::device_id_description%]"
|
||||
},
|
||||
"sound": {
|
||||
"name": "Alexa Skill sound file",
|
||||
"description": "The sound file to play."
|
||||
}
|
||||
}
|
||||
"exceptions": {
|
||||
"cannot_connect_with_error": {
|
||||
"message": "Error connecting: {error}"
|
||||
},
|
||||
"send_text_command": {
|
||||
"name": "Send text command",
|
||||
"description": "Sends a text command to a device",
|
||||
"fields": {
|
||||
"text_command": {
|
||||
"name": "Alexa text command",
|
||||
"description": "The text command to send."
|
||||
},
|
||||
"device_id": {
|
||||
"name": "Device",
|
||||
"description": "[%key:component::alexa_devices::common::device_id_description%]"
|
||||
}
|
||||
}
|
||||
"cannot_retrieve_data_with_error": {
|
||||
"message": "Error retrieving data: {error}"
|
||||
},
|
||||
"device_serial_number_missing": {
|
||||
"message": "Device serial number missing: {device_id}"
|
||||
},
|
||||
"entry_not_loaded": {
|
||||
"message": "Entry not loaded: {entry}"
|
||||
},
|
||||
"invalid_device_id": {
|
||||
"message": "Invalid device ID specified: {device_id}"
|
||||
},
|
||||
"invalid_sound_value": {
|
||||
"message": "Invalid sound {sound} specified"
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
@@ -149,24 +150,34 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"cannot_connect_with_error": {
|
||||
"message": "Error connecting: {error}"
|
||||
"services": {
|
||||
"send_sound": {
|
||||
"description": "Sends a sound to a device",
|
||||
"fields": {
|
||||
"device_id": {
|
||||
"description": "[%key:component::alexa_devices::common::device_id_description%]",
|
||||
"name": "Device"
|
||||
},
|
||||
"sound": {
|
||||
"description": "The sound file to play.",
|
||||
"name": "Alexa Skill sound file"
|
||||
}
|
||||
},
|
||||
"name": "Send sound"
|
||||
},
|
||||
"cannot_retrieve_data_with_error": {
|
||||
"message": "Error retrieving data: {error}"
|
||||
},
|
||||
"device_serial_number_missing": {
|
||||
"message": "Device serial number missing: {device_id}"
|
||||
},
|
||||
"invalid_device_id": {
|
||||
"message": "Invalid device ID specified: {device_id}"
|
||||
},
|
||||
"invalid_sound_value": {
|
||||
"message": "Invalid sound {sound} specified"
|
||||
},
|
||||
"entry_not_loaded": {
|
||||
"message": "Entry not loaded: {entry}"
|
||||
"send_text_command": {
|
||||
"description": "Sends a text command to a device",
|
||||
"fields": {
|
||||
"device_id": {
|
||||
"description": "[%key:component::alexa_devices::common::device_id_description%]",
|
||||
"name": "Device"
|
||||
},
|
||||
"text_command": {
|
||||
"description": "The text command to send.",
|
||||
"name": "Alexa text command"
|
||||
}
|
||||
},
|
||||
"name": "Send text command"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
|
||||
},
|
||||
"error": {
|
||||
"no_device_found": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"discovery_confirm": {
|
||||
@@ -14,37 +21,30 @@
|
||||
},
|
||||
"description": "Fill in Altruist IP address or hostname in your local network"
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"no_device_found": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"co2": {
|
||||
"name": "{sensor_name} CO2"
|
||||
},
|
||||
"humidity": {
|
||||
"name": "{sensor_name} humidity"
|
||||
},
|
||||
"pressure": {
|
||||
"name": "{sensor_name} pressure"
|
||||
},
|
||||
"temperature": {
|
||||
"name": "{sensor_name} temperature"
|
||||
},
|
||||
"noise_max": {
|
||||
"name": "Maximum noise"
|
||||
},
|
||||
"noise_avg": {
|
||||
"name": "Average noise"
|
||||
},
|
||||
"co2": {
|
||||
"name": "{sensor_name} CO2"
|
||||
"noise_max": {
|
||||
"name": "Maximum noise"
|
||||
},
|
||||
"pressure": {
|
||||
"name": "{sensor_name} pressure"
|
||||
},
|
||||
"radiation": {
|
||||
"name": "Radiation level"
|
||||
},
|
||||
"temperature": {
|
||||
"name": "{sensor_name} temperature"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
{
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"general": {
|
||||
"default": "mdi:transmission-tower"
|
||||
},
|
||||
"controlled_load": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"feed_in": {
|
||||
"default": "mdi:solar-power"
|
||||
},
|
||||
"renewables": {
|
||||
"default": "mdi:solar-power"
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"demand_window": {
|
||||
"default": "mdi:meter-electric",
|
||||
@@ -21,6 +7,20 @@
|
||||
"off": "mdi:meter-electric-outline"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"controlled_load": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"feed_in": {
|
||||
"default": "mdi:solar-power"
|
||||
},
|
||||
"general": {
|
||||
"default": "mdi:transmission-tower"
|
||||
},
|
||||
"renewables": {
|
||||
"default": "mdi:solar-power"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
|
||||
@@ -22,40 +22,40 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"get_forecasts": {
|
||||
"name": "Get price forecasts",
|
||||
"description": "Retrieves price forecasts from Amber Electric for a site.",
|
||||
"fields": {
|
||||
"config_entry_id": {
|
||||
"description": "The config entry of the site to get forecasts for.",
|
||||
"name": "Config entry"
|
||||
},
|
||||
"channel_type": {
|
||||
"name": "Channel type",
|
||||
"description": "The channel to get forecasts for."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"channel_not_found": {
|
||||
"message": "There is no {channel_type} channel at this site."
|
||||
},
|
||||
"integration_not_found": {
|
||||
"message": "Config entry \"{target}\" not found in registry."
|
||||
},
|
||||
"not_loaded": {
|
||||
"message": "{target} is not loaded."
|
||||
},
|
||||
"channel_not_found": {
|
||||
"message": "There is no {channel_type} channel at this site."
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
"channel_type": {
|
||||
"options": {
|
||||
"general": "General",
|
||||
"controlled_load": "Controlled load",
|
||||
"feed_in": "Feed-in"
|
||||
"feed_in": "Feed-in",
|
||||
"general": "General"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"get_forecasts": {
|
||||
"description": "Retrieves price forecasts from Amber Electric for a site.",
|
||||
"fields": {
|
||||
"channel_type": {
|
||||
"description": "The channel to get forecasts for.",
|
||||
"name": "Channel type"
|
||||
},
|
||||
"config_entry_id": {
|
||||
"description": "The config entry of the site to get forecasts for.",
|
||||
"name": "Config entry"
|
||||
}
|
||||
},
|
||||
"name": "Get price forecasts"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
"last_rain": {
|
||||
"default": "mdi:water"
|
||||
},
|
||||
"lightning_distance": {
|
||||
"default": "mdi:lightning-bolt"
|
||||
},
|
||||
"lightning_strikes_per_day": {
|
||||
"default": "mdi:lightning-bolt"
|
||||
},
|
||||
"lightning_strikes_per_hour": {
|
||||
"default": "mdi:lightning-bolt"
|
||||
},
|
||||
"lightning_distance": {
|
||||
"default": "mdi:lightning-bolt"
|
||||
},
|
||||
"wind_direction": {
|
||||
"default": "mdi:compass-outline"
|
||||
}
|
||||
|
||||
@@ -1,42 +1,30 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Select region",
|
||||
"description": "Choose the region you want to survey in order to locate Ambient personal weather stations."
|
||||
},
|
||||
"station": {
|
||||
"title": "Select station",
|
||||
"description": "Select the weather station you want to add to Home Assistant.",
|
||||
"data": {
|
||||
"station": "Station"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"no_stations_found": "Did not find any stations in the selected region."
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
"step": {
|
||||
"station": {
|
||||
"data": {
|
||||
"station": "Station"
|
||||
},
|
||||
"description": "Select the weather station you want to add to Home Assistant.",
|
||||
"title": "Select station"
|
||||
},
|
||||
"user": {
|
||||
"description": "Choose the region you want to survey in order to locate Ambient personal weather stations.",
|
||||
"title": "Select region"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"pm25_24h_average": {
|
||||
"name": "PM2.5 (24 hour average)"
|
||||
},
|
||||
"pm25_aqi": {
|
||||
"name": "PM2.5 AQI"
|
||||
},
|
||||
"pm25_aqi_24h_average": {
|
||||
"name": "PM2.5 AQI (24 hour average)"
|
||||
},
|
||||
"absolute_pressure": {
|
||||
"name": "Absolute pressure"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"daily_rain": {
|
||||
"name": "Daily rain"
|
||||
},
|
||||
@@ -52,21 +40,33 @@
|
||||
"last_rain": {
|
||||
"name": "Last rain"
|
||||
},
|
||||
"lightning_distance": {
|
||||
"name": "Lightning distance"
|
||||
},
|
||||
"lightning_strikes_per_day": {
|
||||
"name": "Lightning strikes per day"
|
||||
},
|
||||
"lightning_strikes_per_hour": {
|
||||
"name": "Lightning strikes per hour"
|
||||
},
|
||||
"lightning_distance": {
|
||||
"name": "Lightning distance"
|
||||
},
|
||||
"max_daily_gust": {
|
||||
"name": "Max daily gust"
|
||||
},
|
||||
"monthly_rain": {
|
||||
"name": "Monthly rain"
|
||||
},
|
||||
"pm25_24h_average": {
|
||||
"name": "PM2.5 (24 hour average)"
|
||||
},
|
||||
"pm25_aqi": {
|
||||
"name": "PM2.5 AQI"
|
||||
},
|
||||
"pm25_aqi_24h_average": {
|
||||
"name": "PM2.5 AQI (24 hour average)"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"uv_index": {
|
||||
"name": "UV index"
|
||||
},
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Fill in your information",
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"app_key": "Application Key"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||
},
|
||||
"error": {
|
||||
"invalid_key": "[%key:common::config_flow::error::invalid_api_key%]",
|
||||
"no_devices": "No devices found in account"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]",
|
||||
"app_key": "Application Key"
|
||||
},
|
||||
"title": "Fill in your information"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -22,6 +22,9 @@
|
||||
"battery_1": {
|
||||
"name": "Battery 1"
|
||||
},
|
||||
"battery_10": {
|
||||
"name": "Battery 10"
|
||||
},
|
||||
"battery_2": {
|
||||
"name": "Battery 2"
|
||||
},
|
||||
@@ -46,59 +49,11 @@
|
||||
"battery_9": {
|
||||
"name": "Battery 9"
|
||||
},
|
||||
"battery_10": {
|
||||
"name": "Battery 10"
|
||||
},
|
||||
"interior_battery": {
|
||||
"name": "Interior battery"
|
||||
},
|
||||
"leak_detector_battery_1": {
|
||||
"name": "Leak detector battery 1"
|
||||
},
|
||||
"leak_detector_battery_2": {
|
||||
"name": "Leak detector battery 2"
|
||||
},
|
||||
"leak_detector_battery_3": {
|
||||
"name": "Leak detector battery 3"
|
||||
},
|
||||
"leak_detector_battery_4": {
|
||||
"name": "Leak detector battery 4"
|
||||
},
|
||||
"soil_monitor_battery_1": {
|
||||
"name": "Soil monitor battery 1"
|
||||
},
|
||||
"soil_monitor_battery_2": {
|
||||
"name": "Soil monitor battery 2"
|
||||
},
|
||||
"soil_monitor_battery_3": {
|
||||
"name": "Soil monitor battery 3"
|
||||
},
|
||||
"soil_monitor_battery_4": {
|
||||
"name": "Soil monitor battery 4"
|
||||
},
|
||||
"soil_monitor_battery_5": {
|
||||
"name": "Soil monitor battery 5"
|
||||
},
|
||||
"soil_monitor_battery_6": {
|
||||
"name": "Soil monitor battery 6"
|
||||
},
|
||||
"soil_monitor_battery_7": {
|
||||
"name": "Soil monitor battery 7"
|
||||
},
|
||||
"soil_monitor_battery_8": {
|
||||
"name": "Soil monitor battery 8"
|
||||
},
|
||||
"soil_monitor_battery_9": {
|
||||
"name": "Soil monitor battery 9"
|
||||
},
|
||||
"soil_monitor_battery_10": {
|
||||
"name": "Soil monitor battery 10"
|
||||
},
|
||||
"co2_battery": {
|
||||
"name": "Carbon dioxide battery"
|
||||
},
|
||||
"lightning_detector_battery": {
|
||||
"name": "Lightning detector battery"
|
||||
"interior_battery": {
|
||||
"name": "Interior battery"
|
||||
},
|
||||
"leak_detector_1": {
|
||||
"name": "Leak detector 1"
|
||||
@@ -112,15 +67,33 @@
|
||||
"leak_detector_4": {
|
||||
"name": "Leak detector 4"
|
||||
},
|
||||
"pm25_indoor_battery": {
|
||||
"name": "PM25 indoor battery"
|
||||
"leak_detector_battery_1": {
|
||||
"name": "Leak detector battery 1"
|
||||
},
|
||||
"leak_detector_battery_2": {
|
||||
"name": "Leak detector battery 2"
|
||||
},
|
||||
"leak_detector_battery_3": {
|
||||
"name": "Leak detector battery 3"
|
||||
},
|
||||
"leak_detector_battery_4": {
|
||||
"name": "Leak detector battery 4"
|
||||
},
|
||||
"lightning_detector_battery": {
|
||||
"name": "Lightning detector battery"
|
||||
},
|
||||
"pm25_battery": {
|
||||
"name": "PM25 battery"
|
||||
},
|
||||
"pm25_indoor_battery": {
|
||||
"name": "PM25 indoor battery"
|
||||
},
|
||||
"relay_1": {
|
||||
"name": "Relay 1"
|
||||
},
|
||||
"relay_10": {
|
||||
"name": "Relay 10"
|
||||
},
|
||||
"relay_2": {
|
||||
"name": "Relay 2"
|
||||
},
|
||||
@@ -145,32 +118,44 @@
|
||||
"relay_9": {
|
||||
"name": "Relay 9"
|
||||
},
|
||||
"relay_10": {
|
||||
"name": "Relay 10"
|
||||
"soil_monitor_battery_1": {
|
||||
"name": "Soil monitor battery 1"
|
||||
},
|
||||
"soil_monitor_battery_10": {
|
||||
"name": "Soil monitor battery 10"
|
||||
},
|
||||
"soil_monitor_battery_2": {
|
||||
"name": "Soil monitor battery 2"
|
||||
},
|
||||
"soil_monitor_battery_3": {
|
||||
"name": "Soil monitor battery 3"
|
||||
},
|
||||
"soil_monitor_battery_4": {
|
||||
"name": "Soil monitor battery 4"
|
||||
},
|
||||
"soil_monitor_battery_5": {
|
||||
"name": "Soil monitor battery 5"
|
||||
},
|
||||
"soil_monitor_battery_6": {
|
||||
"name": "Soil monitor battery 6"
|
||||
},
|
||||
"soil_monitor_battery_7": {
|
||||
"name": "Soil monitor battery 7"
|
||||
},
|
||||
"soil_monitor_battery_8": {
|
||||
"name": "Soil monitor battery 8"
|
||||
},
|
||||
"soil_monitor_battery_9": {
|
||||
"name": "Soil monitor battery 9"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"24_hour_rain": {
|
||||
"name": "Rain 24 hours"
|
||||
},
|
||||
"pm25_aqi": {
|
||||
"name": "PM2.5 AQI"
|
||||
},
|
||||
"pm25_aqi_24h_average": {
|
||||
"name": "PM2.5 AQI 24 hour average"
|
||||
},
|
||||
"pm25_indoor_aqi": {
|
||||
"name": "PM2.5 indoor AQI"
|
||||
},
|
||||
"pm25_indoor_aqi_24h_average": {
|
||||
"name": "PM2.5 indoor AQI"
|
||||
},
|
||||
"absolute_pressure": {
|
||||
"name": "Absolute pressure"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"daily_rain": {
|
||||
"name": "Daily rain"
|
||||
},
|
||||
@@ -186,6 +171,9 @@
|
||||
"humidity_1": {
|
||||
"name": "Humidity 1"
|
||||
},
|
||||
"humidity_10": {
|
||||
"name": "Humidity 10"
|
||||
},
|
||||
"humidity_2": {
|
||||
"name": "Humidity 2"
|
||||
},
|
||||
@@ -210,14 +198,11 @@
|
||||
"humidity_9": {
|
||||
"name": "Humidity 9"
|
||||
},
|
||||
"humidity_10": {
|
||||
"name": "Humidity 10"
|
||||
},
|
||||
"humidity_indoor": {
|
||||
"name": "Humidity indoor"
|
||||
},
|
||||
"last_rain": {
|
||||
"name": "Last rain"
|
||||
"inside_temperature": {
|
||||
"name": "Inside temperature"
|
||||
},
|
||||
"last_lightning_strike": {
|
||||
"name": "Last Lightning strike"
|
||||
@@ -225,6 +210,12 @@
|
||||
"last_lightning_strike_distance": {
|
||||
"name": "Last Lightning strike distance"
|
||||
},
|
||||
"last_rain": {
|
||||
"name": "Last rain"
|
||||
},
|
||||
"lifetime_rain": {
|
||||
"name": "Lifetime rain"
|
||||
},
|
||||
"lightning_strikes_per_day": {
|
||||
"name": "Lightning strikes per day"
|
||||
},
|
||||
@@ -240,15 +231,33 @@
|
||||
"pm25_24h_average": {
|
||||
"name": "PM2.5 24 hour average"
|
||||
},
|
||||
"pm25_aqi": {
|
||||
"name": "PM2.5 AQI"
|
||||
},
|
||||
"pm25_aqi_24h_average": {
|
||||
"name": "PM2.5 AQI 24 hour average"
|
||||
},
|
||||
"pm25_indoor": {
|
||||
"name": "PM2.5 indoor"
|
||||
},
|
||||
"pm25_indoor_24h_average": {
|
||||
"name": "PM2.5 indoor 24 hour average"
|
||||
},
|
||||
"pm25_indoor_aqi": {
|
||||
"name": "PM2.5 indoor AQI"
|
||||
},
|
||||
"pm25_indoor_aqi_24h_average": {
|
||||
"name": "PM2.5 indoor AQI"
|
||||
},
|
||||
"relative_pressure": {
|
||||
"name": "Relative pressure"
|
||||
},
|
||||
"soil_humidity_1": {
|
||||
"name": "Soil humidity 1"
|
||||
},
|
||||
"soil_humidity_10": {
|
||||
"name": "Soil humidity 10"
|
||||
},
|
||||
"soil_humidity_2": {
|
||||
"name": "Soil humidity 2"
|
||||
},
|
||||
@@ -273,12 +282,12 @@
|
||||
"soil_humidity_9": {
|
||||
"name": "Soil humidity 9"
|
||||
},
|
||||
"soil_humidity_10": {
|
||||
"name": "Soil humidity 10"
|
||||
},
|
||||
"soil_temperature_1": {
|
||||
"name": "Soil temperature 1"
|
||||
},
|
||||
"soil_temperature_10": {
|
||||
"name": "Soil temperature 10"
|
||||
},
|
||||
"soil_temperature_2": {
|
||||
"name": "Soil temperature 2"
|
||||
},
|
||||
@@ -303,12 +312,12 @@
|
||||
"soil_temperature_9": {
|
||||
"name": "Soil temperature 9"
|
||||
},
|
||||
"soil_temperature_10": {
|
||||
"name": "Soil temperature 10"
|
||||
},
|
||||
"temperature_1": {
|
||||
"name": "Temperature 1"
|
||||
},
|
||||
"temperature_10": {
|
||||
"name": "Temperature 10"
|
||||
},
|
||||
"temperature_2": {
|
||||
"name": "Temperature 2"
|
||||
},
|
||||
@@ -333,21 +342,18 @@
|
||||
"temperature_9": {
|
||||
"name": "Temperature 9"
|
||||
},
|
||||
"temperature_10": {
|
||||
"name": "Temperature 10"
|
||||
},
|
||||
"inside_temperature": {
|
||||
"name": "Inside temperature"
|
||||
},
|
||||
"lifetime_rain": {
|
||||
"name": "Lifetime rain"
|
||||
},
|
||||
"uv_index": {
|
||||
"name": "UV index"
|
||||
},
|
||||
"weekly_rain": {
|
||||
"name": "Weekly rain"
|
||||
},
|
||||
"wind_average_10m": {
|
||||
"name": "Wind average 10 minutes"
|
||||
},
|
||||
"wind_average_2m": {
|
||||
"name": "Wind average 2 minutes"
|
||||
},
|
||||
"wind_direction": {
|
||||
"name": "Wind direction"
|
||||
},
|
||||
@@ -357,17 +363,11 @@
|
||||
"wind_direction_average_2m": {
|
||||
"name": "Wind direction average 2 minutes"
|
||||
},
|
||||
"wind_gust_direction": {
|
||||
"name": "Wind gust direction"
|
||||
},
|
||||
"wind_gust": {
|
||||
"name": "Wind gust"
|
||||
},
|
||||
"wind_average_10m": {
|
||||
"name": "Wind average 10 minutes"
|
||||
},
|
||||
"wind_average_2m": {
|
||||
"name": "Wind average 2 minutes"
|
||||
"wind_gust_direction": {
|
||||
"name": "Wind gust direction"
|
||||
},
|
||||
"yearly_rain": {
|
||||
"name": "Yearly rain"
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{
|
||||
"services": {
|
||||
"enable_recording": {
|
||||
"service": "mdi:record-rec"
|
||||
"disable_audio": {
|
||||
"service": "mdi:volume-off"
|
||||
},
|
||||
"disable_motion_recording": {
|
||||
"service": "mdi:motion-sensor-off"
|
||||
},
|
||||
"disable_recording": {
|
||||
"service": "mdi:stop"
|
||||
@@ -9,18 +12,18 @@
|
||||
"enable_audio": {
|
||||
"service": "mdi:volume-high"
|
||||
},
|
||||
"disable_audio": {
|
||||
"service": "mdi:volume-off"
|
||||
},
|
||||
"enable_motion_recording": {
|
||||
"service": "mdi:motion-sensor"
|
||||
},
|
||||
"disable_motion_recording": {
|
||||
"service": "mdi:motion-sensor-off"
|
||||
"enable_recording": {
|
||||
"service": "mdi:record-rec"
|
||||
},
|
||||
"goto_preset": {
|
||||
"service": "mdi:pan"
|
||||
},
|
||||
"ptz_control": {
|
||||
"service": "mdi:pan"
|
||||
},
|
||||
"set_color_bw": {
|
||||
"service": "mdi:palette"
|
||||
},
|
||||
@@ -29,9 +32,6 @@
|
||||
},
|
||||
"stop_tour": {
|
||||
"service": "mdi:panorama-outline"
|
||||
},
|
||||
"ptz_control": {
|
||||
"service": "mdi:pan"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,130 +1,130 @@
|
||||
{
|
||||
"services": {
|
||||
"enable_recording": {
|
||||
"name": "Enable recording",
|
||||
"description": "Enables continuous recording to camera storage.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "Entity",
|
||||
"description": "Name(s) of the cameras, or 'all' for all cameras."
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable_recording": {
|
||||
"name": "Disable recording",
|
||||
"description": "Disables continuous recording to camera storage.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable_audio": {
|
||||
"name": "Enable audio",
|
||||
"description": "Enables audio stream.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable_audio": {
|
||||
"name": "Disable audio",
|
||||
"description": "Disables audio stream.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable_motion_recording": {
|
||||
"name": "Enable motion recording",
|
||||
"description": "Enables recording a clip to camera storage when motion is detected.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Disable audio"
|
||||
},
|
||||
"disable_motion_recording": {
|
||||
"name": "Disable motion recording",
|
||||
"description": "Disables recording a clip to camera storage when motion is detected.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Disable motion recording"
|
||||
},
|
||||
"disable_recording": {
|
||||
"description": "Disables continuous recording to camera storage.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Disable recording"
|
||||
},
|
||||
"enable_audio": {
|
||||
"description": "Enables audio stream.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Enable audio"
|
||||
},
|
||||
"enable_motion_recording": {
|
||||
"description": "Enables recording a clip to camera storage when motion is detected.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Enable motion recording"
|
||||
},
|
||||
"enable_recording": {
|
||||
"description": "Enables continuous recording to camera storage.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "Name(s) of the cameras, or 'all' for all cameras.",
|
||||
"name": "Entity"
|
||||
}
|
||||
},
|
||||
"name": "Enable recording"
|
||||
},
|
||||
"goto_preset": {
|
||||
"name": "Go to preset",
|
||||
"description": "Moves camera to PTZ preset.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
},
|
||||
"preset": {
|
||||
"name": "Preset",
|
||||
"description": "Preset number."
|
||||
"description": "Preset number.",
|
||||
"name": "Preset"
|
||||
}
|
||||
}
|
||||
},
|
||||
"set_color_bw": {
|
||||
"name": "Set color",
|
||||
"description": "Sets camera color mode.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
},
|
||||
"color_bw": {
|
||||
"name": "Color",
|
||||
"description": "Color mode."
|
||||
}
|
||||
}
|
||||
},
|
||||
"start_tour": {
|
||||
"name": "Start tour",
|
||||
"description": "Starts camera's PTZ tour function.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"stop_tour": {
|
||||
"name": "Stop tour",
|
||||
"description": "Stops camera's PTZ tour function.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Go to preset"
|
||||
},
|
||||
"ptz_control": {
|
||||
"name": "PTZ control",
|
||||
"description": "Moves (pan/tilt) and/or zoom a PTZ camera.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
},
|
||||
"movement": {
|
||||
"name": "Movement",
|
||||
"description": "Direction to move the camera."
|
||||
"description": "Direction to move the camera.",
|
||||
"name": "Movement"
|
||||
},
|
||||
"travel_time": {
|
||||
"name": "Travel time",
|
||||
"description": "Travel time in fractional seconds: from 0 to 1."
|
||||
"description": "Travel time in fractional seconds: from 0 to 1.",
|
||||
"name": "Travel time"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "PTZ control"
|
||||
},
|
||||
"set_color_bw": {
|
||||
"description": "Sets camera color mode.",
|
||||
"fields": {
|
||||
"color_bw": {
|
||||
"description": "Color mode.",
|
||||
"name": "Color"
|
||||
},
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Set color"
|
||||
},
|
||||
"start_tour": {
|
||||
"description": "Starts camera's PTZ tour function.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Start tour"
|
||||
},
|
||||
"stop_tour": {
|
||||
"description": "Stops camera's PTZ tour function.",
|
||||
"fields": {
|
||||
"entity_id": {
|
||||
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
|
||||
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Stop tour"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,47 +1,25 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"tracked_addons": "Add-ons",
|
||||
"tracked_integrations": "Integrations",
|
||||
"tracked_custom_integrations": "Custom integrations"
|
||||
},
|
||||
"data_description": {
|
||||
"tracked_addons": "Select the add-ons you want to track",
|
||||
"tracked_integrations": "Select the integrations you want to track",
|
||||
"tracked_custom_integrations": "Select the custom integrations you want to track"
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"error": {
|
||||
"no_integrations_selected": "You must select at least one integration to track"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
},
|
||||
"step": {
|
||||
"init": {
|
||||
"user": {
|
||||
"data": {
|
||||
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data::tracked_addons%]",
|
||||
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_integrations%]",
|
||||
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_custom_integrations%]"
|
||||
"tracked_addons": "Add-ons",
|
||||
"tracked_custom_integrations": "Custom integrations",
|
||||
"tracked_integrations": "Integrations"
|
||||
},
|
||||
"data_description": {
|
||||
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data_description::tracked_addons%]",
|
||||
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_integrations%]",
|
||||
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_custom_integrations%]"
|
||||
"tracked_addons": "Select the add-ons you want to track",
|
||||
"tracked_custom_integrations": "Select the custom integrations you want to track",
|
||||
"tracked_integrations": "Select the integrations you want to track"
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"error": {
|
||||
"no_integrations_selected": "[%key:component::analytics_insights::config::error::no_integrations_selected%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -56,5 +34,27 @@
|
||||
"name": "Total reported integrations"
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"abort": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"error": {
|
||||
"no_integrations_selected": "[%key:component::analytics_insights::config::error::no_integrations_selected%]"
|
||||
},
|
||||
"step": {
|
||||
"init": {
|
||||
"data": {
|
||||
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data::tracked_addons%]",
|
||||
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_custom_integrations%]",
|
||||
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_integrations%]"
|
||||
},
|
||||
"data_description": {
|
||||
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data_description::tracked_addons%]",
|
||||
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_custom_integrations%]",
|
||||
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_integrations%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
"torch": {
|
||||
"default": "mdi:white-balance-sunny"
|
||||
},
|
||||
"whitebalance_lock": {
|
||||
"default": "mdi:white-balance-auto"
|
||||
},
|
||||
"video_recording": {
|
||||
"default": "mdi:record-rec"
|
||||
},
|
||||
"whitebalance_lock": {
|
||||
"default": "mdi:white-balance-auto"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]",
|
||||
"username": "[%key:common::config_flow::data::username%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The IP address of the device running the Android IP Webcam app. The IP address is shown in the app once you start the server."
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"port": "[%key:common::config_flow::data::port%]",
|
||||
"username": "[%key:common::config_flow::data::username%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The IP address of the device running the Android IP Webcam app. The IP address is shown in the app once you start the server."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
"download": {
|
||||
"service": "mdi:download"
|
||||
},
|
||||
"upload": {
|
||||
"service": "mdi:upload"
|
||||
},
|
||||
"learn_sendevent": {
|
||||
"service": "mdi:remote"
|
||||
},
|
||||
"upload": {
|
||||
"service": "mdi:upload"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,112 +1,112 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"adbkey": "Path to your ADB key file (leave empty to auto generate)",
|
||||
"adb_server_ip": "IP address of the ADB server (leave empty to not use)",
|
||||
"adb_server_port": "Port of the ADB server",
|
||||
"device_class": "The type of device",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_host": "[%key:common::config_flow::error::invalid_host%]",
|
||||
"adbkey_not_file": "ADB key file not found",
|
||||
"key_and_server": "Only provide ADB Key or ADB Server",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"invalid_unique_id": "Impossible to determine a valid unique ID for the device"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"data": {
|
||||
"apps": "Configure applications list",
|
||||
"get_sources": "Retrieve the running apps as the list of sources",
|
||||
"exclude_unnamed_apps": "Exclude apps with unknown name from the sources list",
|
||||
"screencap_interval": "Interval in minutes between screen capture for album art (set 0 to disable)",
|
||||
"state_detection_rules": "Configure state detection rules",
|
||||
"turn_off_command": "ADB shell turn off command (leave empty for default)",
|
||||
"turn_on_command": "ADB shell turn on command (leave empty for default)"
|
||||
}
|
||||
},
|
||||
"apps": {
|
||||
"title": "Configure Android apps",
|
||||
"description": "Configure application ID {app_id}",
|
||||
"data": {
|
||||
"app_name": "Application name",
|
||||
"app_id": "Application ID",
|
||||
"app_delete": "Check to delete this application"
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"title": "Configure Android state detection rules",
|
||||
"description": "Configure detection rule for application ID {rule_id}",
|
||||
"data": {
|
||||
"rule_id": "[%key:component::androidtv::options::step::apps::data::app_id%]",
|
||||
"rule_values": "List of state detection rules (see documentation)",
|
||||
"rule_delete": "Check to delete this rule"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"invalid_det_rules": "Invalid state detection rules"
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"adb_command": {
|
||||
"name": "ADB command",
|
||||
"description": "Sends an ADB command to an Android / Fire TV device.",
|
||||
"fields": {
|
||||
"command": {
|
||||
"name": "Command",
|
||||
"description": "Either a key command or an ADB shell command."
|
||||
"adbkey_not_file": "ADB key file not found",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_host": "[%key:common::config_flow::error::invalid_host%]",
|
||||
"key_and_server": "Only provide ADB Key or ADB Server",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"adb_server_ip": "IP address of the ADB server (leave empty to not use)",
|
||||
"adb_server_port": "Port of the ADB server",
|
||||
"adbkey": "Path to your ADB key file (leave empty to auto generate)",
|
||||
"device_class": "The type of device",
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"download": {
|
||||
"name": "Download",
|
||||
"description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.",
|
||||
"fields": {
|
||||
"device_path": {
|
||||
"name": "Device path",
|
||||
"description": "The filepath on the Android / Fire TV device."
|
||||
},
|
||||
"local_path": {
|
||||
"name": "Local path",
|
||||
"description": "The filepath on your Home Assistant instance."
|
||||
}
|
||||
}
|
||||
},
|
||||
"upload": {
|
||||
"name": "Upload",
|
||||
"description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.",
|
||||
"fields": {
|
||||
"device_path": {
|
||||
"name": "[%key:component::androidtv::services::download::fields::device_path::name%]",
|
||||
"description": "[%key:component::androidtv::services::download::fields::device_path::description%]"
|
||||
},
|
||||
"local_path": {
|
||||
"name": "[%key:component::androidtv::services::download::fields::local_path::name%]",
|
||||
"description": "[%key:component::androidtv::services::download::fields::local_path::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"learn_sendevent": {
|
||||
"name": "Learn sendevent",
|
||||
"description": "Translates a key press on a remote into ADB 'sendevent' commands. You must press one button on the remote within 8 seconds of performing this action."
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"failed_send": {
|
||||
"message": "Failed to send command {cmd}"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"error": {
|
||||
"invalid_det_rules": "Invalid state detection rules"
|
||||
},
|
||||
"step": {
|
||||
"apps": {
|
||||
"data": {
|
||||
"app_delete": "Check to delete this application",
|
||||
"app_id": "Application ID",
|
||||
"app_name": "Application name"
|
||||
},
|
||||
"description": "Configure application ID {app_id}",
|
||||
"title": "Configure Android apps"
|
||||
},
|
||||
"init": {
|
||||
"data": {
|
||||
"apps": "Configure applications list",
|
||||
"exclude_unnamed_apps": "Exclude apps with unknown name from the sources list",
|
||||
"get_sources": "Retrieve the running apps as the list of sources",
|
||||
"screencap_interval": "Interval in minutes between screen capture for album art (set 0 to disable)",
|
||||
"state_detection_rules": "Configure state detection rules",
|
||||
"turn_off_command": "ADB shell turn off command (leave empty for default)",
|
||||
"turn_on_command": "ADB shell turn on command (leave empty for default)"
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"data": {
|
||||
"rule_delete": "Check to delete this rule",
|
||||
"rule_id": "[%key:component::androidtv::options::step::apps::data::app_id%]",
|
||||
"rule_values": "List of state detection rules (see documentation)"
|
||||
},
|
||||
"description": "Configure detection rule for application ID {rule_id}",
|
||||
"title": "Configure Android state detection rules"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"adb_command": {
|
||||
"description": "Sends an ADB command to an Android / Fire TV device.",
|
||||
"fields": {
|
||||
"command": {
|
||||
"description": "Either a key command or an ADB shell command.",
|
||||
"name": "Command"
|
||||
}
|
||||
},
|
||||
"name": "ADB command"
|
||||
},
|
||||
"download": {
|
||||
"description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.",
|
||||
"fields": {
|
||||
"device_path": {
|
||||
"description": "The filepath on the Android / Fire TV device.",
|
||||
"name": "Device path"
|
||||
},
|
||||
"local_path": {
|
||||
"description": "The filepath on your Home Assistant instance.",
|
||||
"name": "Local path"
|
||||
}
|
||||
},
|
||||
"name": "Download"
|
||||
},
|
||||
"learn_sendevent": {
|
||||
"description": "Translates a key press on a remote into ADB 'sendevent' commands. You must press one button on the remote within 8 seconds of performing this action.",
|
||||
"name": "Learn sendevent"
|
||||
},
|
||||
"upload": {
|
||||
"description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.",
|
||||
"fields": {
|
||||
"device_path": {
|
||||
"description": "[%key:component::androidtv::services::download::fields::device_path::description%]",
|
||||
"name": "[%key:component::androidtv::services::download::fields::device_path::name%]"
|
||||
},
|
||||
"local_path": {
|
||||
"description": "[%key:component::androidtv::services::download::fields::local_path::description%]",
|
||||
"name": "[%key:component::androidtv::services::download::fields::local_path::name%]"
|
||||
}
|
||||
},
|
||||
"name": "Upload"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,11 @@ APPS_NEW_ID = "add_new"
|
||||
CONF_APP_DELETE = "app_delete"
|
||||
CONF_APP_ID = "app_id"
|
||||
|
||||
_EXAMPLE_APP_ID = "com.plexapp.android"
|
||||
_EXAMPLE_APP_PLAY_STORE_URL = (
|
||||
f"https://play.google.com/store/apps/details?id={_EXAMPLE_APP_ID}"
|
||||
)
|
||||
|
||||
STEP_PAIR_DATA_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Required("pin"): str,
|
||||
@@ -355,5 +360,7 @@ class AndroidTVRemoteOptionsFlowHandler(OptionsFlowWithReload):
|
||||
data_schema=data_schema,
|
||||
description_placeholders={
|
||||
"app_id": f"`{app_id}`" if app_id != APPS_NEW_ID else "",
|
||||
"example_app_id": _EXAMPLE_APP_ID,
|
||||
"example_app_play_store_url": _EXAMPLE_APP_PLAY_STORE_URL,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -1,42 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "Enter the IP address of the Android TV you want to add to Home Assistant. It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the Android TV device."
|
||||
}
|
||||
},
|
||||
"reconfigure": {
|
||||
"description": "Update the IP address of this previously configured Android TV device.",
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the Android TV device."
|
||||
}
|
||||
},
|
||||
"zeroconf_confirm": {
|
||||
"title": "Discovered Android TV",
|
||||
"description": "Do you want to add the Android TV ({name}) to Home Assistant? It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
|
||||
},
|
||||
"pair": {
|
||||
"description": "Enter the pairing code displayed on the Android TV ({name}).",
|
||||
"data": {
|
||||
"pin": "[%key:common::config_flow::data::pin%]"
|
||||
},
|
||||
"data_description": {
|
||||
"pin": "Pairing code displayed on the Android TV device."
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "[%key:common::config_flow::title::reauth%]",
|
||||
"description": "You need to pair again with the Android TV ({name}). It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"unique_id_mismatch": "Please ensure you reconfigure against the same device."
|
||||
},
|
||||
"error": {
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
@@ -44,41 +13,42 @@
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"unique_id_mismatch": "Please ensure you reconfigure against the same device."
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"init": {
|
||||
"pair": {
|
||||
"data": {
|
||||
"apps": "Configure applications list",
|
||||
"enable_ime": "Enable IME"
|
||||
"pin": "[%key:common::config_flow::data::pin%]"
|
||||
},
|
||||
"data_description": {
|
||||
"apps": "Here you can define the list of applications, specify names and icons that will be displayed in the UI.",
|
||||
"enable_ime": "Enable this option to be able to get the current app name and send text as keyboard input. Disable it for devices that show 'Use keyboard on mobile device screen' instead of the on-screen keyboard."
|
||||
}
|
||||
"pin": "Pairing code displayed on the Android TV device."
|
||||
},
|
||||
"description": "Enter the pairing code displayed on the Android TV ({name})."
|
||||
},
|
||||
"apps": {
|
||||
"title": "Configure Android apps",
|
||||
"description": "Configure application ID {app_id}",
|
||||
"reauth_confirm": {
|
||||
"description": "You need to pair again with the Android TV ({name}). It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
|
||||
"title": "[%key:common::config_flow::title::reauth%]"
|
||||
},
|
||||
"reconfigure": {
|
||||
"data": {
|
||||
"app_name": "Application name",
|
||||
"app_id": "Application ID",
|
||||
"app_icon": "Application icon",
|
||||
"app_delete": "Check to delete this application"
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"app_name": "Name of the application as you would like it to be displayed in Home Assistant.",
|
||||
"app_id": "E.g. com.plexapp.android for https://play.google.com/store/apps/details?id=com.plexapp.android",
|
||||
"app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename",
|
||||
"app_delete": "Check this box to delete the application from the list."
|
||||
}
|
||||
"host": "The hostname or IP address of the Android TV device."
|
||||
},
|
||||
"description": "Update the IP address of this previously configured Android TV device."
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the Android TV device."
|
||||
},
|
||||
"description": "Enter the IP address of the Android TV you want to add to Home Assistant. It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
|
||||
},
|
||||
"zeroconf_confirm": {
|
||||
"description": "Do you want to add the Android TV ({name}) to Home Assistant? It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
|
||||
"title": "Discovered Android TV"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -93,6 +63,36 @@
|
||||
"message": "Invalid media type: {media_type}"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"apps": {
|
||||
"data": {
|
||||
"app_delete": "Check to delete this application",
|
||||
"app_icon": "Application icon",
|
||||
"app_id": "Application ID",
|
||||
"app_name": "Application name"
|
||||
},
|
||||
"data_description": {
|
||||
"app_delete": "Check this box to delete the application from the list.",
|
||||
"app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename",
|
||||
"app_id": "E.g. {example_app_id} for {example_app_play_store_url}",
|
||||
"app_name": "Name of the application as you would like it to be displayed in Home Assistant."
|
||||
},
|
||||
"description": "Configure application ID {app_id}",
|
||||
"title": "Configure Android apps"
|
||||
},
|
||||
"init": {
|
||||
"data": {
|
||||
"apps": "Configure applications list",
|
||||
"enable_ime": "Enable IME"
|
||||
},
|
||||
"data_description": {
|
||||
"apps": "Here you can define the list of applications, specify names and icons that will be displayed in the UI.",
|
||||
"enable_ime": "Enable this option to be able to get the current app name and send text as keyboard input. Disable it for devices that show 'Use keyboard on mobile device screen' instead of the on-screen keyboard."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
"apps": {
|
||||
"options": {
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
"cook_time": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"target_temperature": {
|
||||
"default": "mdi:thermometer"
|
||||
},
|
||||
"cook_time_remaining": {
|
||||
"default": "mdi:clock-outline"
|
||||
},
|
||||
"heater_temperature": {
|
||||
"default": "mdi:thermometer"
|
||||
},
|
||||
"target_temperature": {
|
||||
"default": "mdi:thermometer"
|
||||
},
|
||||
"triac_temperature": {
|
||||
"default": "mdi:thermometer"
|
||||
},
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"username": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"confirm": {
|
||||
"description": "[%key:common::config_flow::description::confirm_setup%]"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"confirm": {
|
||||
"description": "[%key:common::config_flow::description::confirm_setup%]"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]",
|
||||
"username": "[%key:common::config_flow::data::email%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -21,39 +21,39 @@
|
||||
"cook_time": {
|
||||
"name": "Cook time"
|
||||
},
|
||||
"state": {
|
||||
"name": "State",
|
||||
"state": {
|
||||
"preheating": "Preheating",
|
||||
"cooking": "Cooking",
|
||||
"maintaining": "Maintaining",
|
||||
"timer_expired": "Timer expired",
|
||||
"set_timer": "Set timer",
|
||||
"no_state": "No state"
|
||||
}
|
||||
},
|
||||
"mode": {
|
||||
"name": "[%key:common::config_flow::data::mode%]",
|
||||
"state": {
|
||||
"startup": "Startup",
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"cook": "Cooking",
|
||||
"low_water": "Low water",
|
||||
"ota": "OTA update",
|
||||
"provisioning": "Provisioning",
|
||||
"high_temp": "High temperature",
|
||||
"device_failure": "Device failure"
|
||||
}
|
||||
},
|
||||
"target_temperature": {
|
||||
"name": "Target temperature"
|
||||
},
|
||||
"cook_time_remaining": {
|
||||
"name": "Cook time remaining"
|
||||
},
|
||||
"heater_temperature": {
|
||||
"name": "Heater temperature"
|
||||
},
|
||||
"mode": {
|
||||
"name": "[%key:common::config_flow::data::mode%]",
|
||||
"state": {
|
||||
"cook": "Cooking",
|
||||
"device_failure": "Device failure",
|
||||
"high_temp": "High temperature",
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"low_water": "Low water",
|
||||
"ota": "OTA update",
|
||||
"provisioning": "Provisioning",
|
||||
"startup": "Startup"
|
||||
}
|
||||
},
|
||||
"state": {
|
||||
"name": "State",
|
||||
"state": {
|
||||
"cooking": "Cooking",
|
||||
"maintaining": "Maintaining",
|
||||
"no_state": "No state",
|
||||
"preheating": "Preheating",
|
||||
"set_timer": "Set timer",
|
||||
"timer_expired": "Timer expired"
|
||||
}
|
||||
},
|
||||
"target_temperature": {
|
||||
"name": "Target temperature"
|
||||
},
|
||||
"triac_temperature": {
|
||||
"name": "Triac temperature"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"cannot_receive_deviceinfo": "Failed to retrieve MAC address. Make sure the device is turned on"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -7,13 +14,6 @@
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"cannot_receive_deviceinfo": "Failed to retrieve MAC address. Make sure the device is turned on"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||
},
|
||||
"error": {
|
||||
"authentication_error": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"timeout_connect": "[%key:common::config_flow::error::timeout_connect%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"api_key": "[%key:common::config_flow::data::api_key%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"timeout_connect": "[%key:common::config_flow::error::timeout_connect%]",
|
||||
"authentication_error": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||
}
|
||||
},
|
||||
"config_subentries": {
|
||||
"conversation": {
|
||||
"initiate_flow": {
|
||||
"user": "Add conversation agent",
|
||||
"reconfigure": "Reconfigure conversation agent"
|
||||
"abort": {
|
||||
"entry_not_loaded": "Cannot add things while the configuration is disabled.",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]"
|
||||
},
|
||||
"entry_type": "Conversation agent",
|
||||
|
||||
"error": {
|
||||
"thinking_budget_too_large": "Maximum tokens must be greater than the thinking budget.",
|
||||
"web_search_unsupported_model": "Web search is not supported by the selected model. Please choose a compatible model or disable web search."
|
||||
},
|
||||
"initiate_flow": {
|
||||
"reconfigure": "Reconfigure conversation agent",
|
||||
"user": "Add conversation agent"
|
||||
},
|
||||
"step": {
|
||||
"set_options": {
|
||||
"data": {
|
||||
"chat_model": "[%key:common::generic::model%]",
|
||||
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
|
||||
"max_tokens": "Maximum tokens to return in response",
|
||||
"name": "[%key:common::config_flow::data::name%]",
|
||||
"prompt": "[%key:common::config_flow::data::prompt%]",
|
||||
"chat_model": "[%key:common::generic::model%]",
|
||||
"max_tokens": "Maximum tokens to return in response",
|
||||
"temperature": "Temperature",
|
||||
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
|
||||
"recommended": "Recommended model settings",
|
||||
"temperature": "Temperature",
|
||||
"thinking_budget": "Thinking budget",
|
||||
"user_location": "Include home location",
|
||||
"web_search": "Enable web search",
|
||||
"web_search_max_uses": "Maximum web searches",
|
||||
"user_location": "Include home location"
|
||||
"web_search_max_uses": "Maximum web searches"
|
||||
},
|
||||
"data_description": {
|
||||
"prompt": "Instruct how the LLM should respond. This can be a template.",
|
||||
"thinking_budget": "The number of tokens the model can use to think about the response out of the total maximum number of tokens. Set to 1024 or greater to enable extended thinking.",
|
||||
"user_location": "Localize search results based on home location",
|
||||
"web_search": "The web search tool gives Claude direct access to real-time web content, allowing it to answer questions with up-to-date information beyond its knowledge cutoff",
|
||||
"web_search_max_uses": "Limit the number of searches performed per response",
|
||||
"user_location": "Localize search results based on home location"
|
||||
"web_search_max_uses": "Limit the number of searches performed per response"
|
||||
}
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"entry_not_loaded": "Cannot add things while the configuration is disabled."
|
||||
},
|
||||
"error": {
|
||||
"thinking_budget_too_large": "Maximum tokens must be greater than the thinking budget.",
|
||||
"web_search_unsupported_model": "Web search is not supported by the selected model. Please choose a compatible model or disable web search."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/aosmith",
|
||||
"iot_class": "cloud_polling",
|
||||
"requirements": ["py-aosmith==1.0.14"]
|
||||
"requirements": ["py-aosmith==1.0.15"]
|
||||
}
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
},
|
||||
"error": {
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"description": "Please update your password for {email}",
|
||||
"title": "[%key:common::config_flow::title::reauth%]"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"description": "Please enter your A. O. Smith credentials."
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"description": "Please update your password for {email}",
|
||||
"title": "[%key:common::config_flow::title::reauth%]",
|
||||
"data": {
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -30,19 +30,19 @@
|
||||
"hot_water_plus_level": {
|
||||
"name": "Hot Water+ level",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"level1": "Level 1",
|
||||
"level2": "Level 2",
|
||||
"level3": "Level 3"
|
||||
"level3": "Level 3",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"hot_water_availability": {
|
||||
"name": "Hot water availability"
|
||||
},
|
||||
"energy_usage": {
|
||||
"name": "Energy usage"
|
||||
},
|
||||
"hot_water_availability": {
|
||||
"name": "Hot water availability"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,11 +9,14 @@
|
||||
"alarm_delay": {
|
||||
"default": "mdi:alarm"
|
||||
},
|
||||
"apc_model": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"apc_status": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"apc_model": {
|
||||
"default": "mdi:information-outline"
|
||||
"apparent_power": {
|
||||
"default": "mdi:gauge"
|
||||
},
|
||||
"bad_batteries": {
|
||||
"default": "mdi:information-outline"
|
||||
@@ -27,30 +30,18 @@
|
||||
"cable_type": {
|
||||
"default": "mdi:ethernet-cable"
|
||||
},
|
||||
"total_time_on_battery": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"date": {
|
||||
"default": "mdi:calendar-clock"
|
||||
},
|
||||
"date_and_time": {
|
||||
"default": "mdi:calendar-clock"
|
||||
},
|
||||
"dip_switch_settings": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"low_battery_signal": {
|
||||
"default": "mdi:clock-alert"
|
||||
},
|
||||
"driver": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"shutdown_delay": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"wake_delay": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"date_and_time": {
|
||||
"default": "mdi:calendar-clock"
|
||||
},
|
||||
"external_batteries": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
@@ -72,8 +63,8 @@
|
||||
"load_capacity": {
|
||||
"default": "mdi:gauge"
|
||||
},
|
||||
"apparent_power": {
|
||||
"default": "mdi:gauge"
|
||||
"low_battery_signal": {
|
||||
"default": "mdi:clock-alert"
|
||||
},
|
||||
"manufacture_date": {
|
||||
"default": "mdi:calendar"
|
||||
@@ -81,20 +72,20 @@
|
||||
"master_update": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"max_time": {
|
||||
"default": "mdi:timer-off-outline"
|
||||
},
|
||||
"max_battery_charge": {
|
||||
"default": "mdi:battery-alert"
|
||||
},
|
||||
"max_time": {
|
||||
"default": "mdi:timer-off-outline"
|
||||
},
|
||||
"min_time": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"model": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"transfer_count": {
|
||||
"default": "mdi:counter"
|
||||
"online_status": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"register_1_fault": {
|
||||
"default": "mdi:information-outline"
|
||||
@@ -108,6 +99,9 @@
|
||||
"restore_capacity": {
|
||||
"default": "mdi:battery-alert"
|
||||
},
|
||||
"self_test_interval": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"self_test_result": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
@@ -117,24 +111,33 @@
|
||||
"serial_number": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"shutdown_delay": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"startup_time": {
|
||||
"default": "mdi:calendar-clock"
|
||||
},
|
||||
"online_status": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"status": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"self_test_interval": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"time_left": {
|
||||
"default": "mdi:clock-alert"
|
||||
},
|
||||
"time_on_battery": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"total_time_on_battery": {
|
||||
"default": "mdi:timer-outline"
|
||||
},
|
||||
"transfer_count": {
|
||||
"default": "mdi:counter"
|
||||
},
|
||||
"transfer_from_battery": {
|
||||
"default": "mdi:transfer"
|
||||
},
|
||||
"transfer_to_battery": {
|
||||
"default": "mdi:transfer"
|
||||
},
|
||||
"ups_mode": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
@@ -144,11 +147,8 @@
|
||||
"version": {
|
||||
"default": "mdi:information-outline"
|
||||
},
|
||||
"transfer_from_battery": {
|
||||
"default": "mdi:transfer"
|
||||
},
|
||||
"transfer_to_battery": {
|
||||
"default": "mdi:transfer"
|
||||
"wake_delay": {
|
||||
"default": "mdi:timer-outline"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,24 +2,13 @@
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"wrong_apcupsd_daemon": "The reconfigured APC UPS Daemon is not the same as the one already configured.",
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]"
|
||||
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
||||
"wrong_apcupsd_daemon": "The reconfigured APC UPS Daemon is not the same as the one already configured."
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the APC UPS Daemon",
|
||||
"port": "The port the APC UPS Daemon is listening on"
|
||||
},
|
||||
"description": "Enter the host and port on which the apcupsd NIS is being served."
|
||||
},
|
||||
"reconfigure": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
@@ -30,6 +19,17 @@
|
||||
"port": "[%key:component::apcupsd::config::step::user::data_description::port%]"
|
||||
},
|
||||
"description": "[%key:component::apcupsd::config::step::user::description%]"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "[%key:common::config_flow::data::host%]",
|
||||
"port": "[%key:common::config_flow::data::port%]"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "The hostname or IP address of the APC UPS Daemon",
|
||||
"port": "The port the APC UPS Daemon is listening on"
|
||||
},
|
||||
"description": "Enter the host and port on which the apcupsd NIS is being served."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -46,15 +46,21 @@
|
||||
"ambient_temperature": {
|
||||
"name": "Ambient temperature"
|
||||
},
|
||||
"apc_status": {
|
||||
"name": "Status data"
|
||||
},
|
||||
"apc_model": {
|
||||
"name": "Model"
|
||||
},
|
||||
"apc_status": {
|
||||
"name": "Status data"
|
||||
},
|
||||
"apparent_power": {
|
||||
"name": "Load apparent power"
|
||||
},
|
||||
"bad_batteries": {
|
||||
"name": "Bad batteries"
|
||||
},
|
||||
"battery_nominal_voltage": {
|
||||
"name": "Battery nominal voltage"
|
||||
},
|
||||
"battery_replacement_date": {
|
||||
"name": "Battery replaced"
|
||||
},
|
||||
@@ -67,45 +73,36 @@
|
||||
"cable_type": {
|
||||
"name": "Cable type"
|
||||
},
|
||||
"total_time_on_battery": {
|
||||
"name": "Total time on battery"
|
||||
},
|
||||
"date": {
|
||||
"name": "Status date"
|
||||
},
|
||||
"date_and_time": {
|
||||
"name": "Date and time"
|
||||
},
|
||||
"dip_switch_settings": {
|
||||
"name": "DIP switch settings"
|
||||
},
|
||||
"low_battery_signal": {
|
||||
"name": "Low battery signal"
|
||||
},
|
||||
"driver": {
|
||||
"name": "Driver"
|
||||
},
|
||||
"shutdown_delay": {
|
||||
"name": "Shutdown delay"
|
||||
},
|
||||
"wake_delay": {
|
||||
"name": "Wake delay"
|
||||
},
|
||||
"date_and_time": {
|
||||
"name": "Date and time"
|
||||
},
|
||||
"external_batteries": {
|
||||
"name": "External batteries"
|
||||
},
|
||||
"firmware_version": {
|
||||
"name": "Firmware version"
|
||||
},
|
||||
"transfer_high": {
|
||||
"name": "Transfer high"
|
||||
},
|
||||
"hostname": {
|
||||
"name": "Hostname"
|
||||
},
|
||||
"humidity": {
|
||||
"name": "Ambient humidity"
|
||||
},
|
||||
"input_voltage_high": {
|
||||
"name": "Input voltage high"
|
||||
},
|
||||
"input_voltage_low": {
|
||||
"name": "Input voltage low"
|
||||
},
|
||||
"internal_temperature": {
|
||||
"name": "Internal temperature"
|
||||
},
|
||||
@@ -127,11 +124,8 @@
|
||||
"load_capacity": {
|
||||
"name": "Load"
|
||||
},
|
||||
"apparent_power": {
|
||||
"name": "Load apparent power"
|
||||
},
|
||||
"transfer_low": {
|
||||
"name": "Transfer low"
|
||||
"low_battery_signal": {
|
||||
"name": "Low battery signal"
|
||||
},
|
||||
"manufacture_date": {
|
||||
"name": "Manufacture date"
|
||||
@@ -139,17 +133,11 @@
|
||||
"master_update": {
|
||||
"name": "Master update"
|
||||
},
|
||||
"input_voltage_high": {
|
||||
"name": "Input voltage high"
|
||||
},
|
||||
"max_time": {
|
||||
"name": "Battery timeout"
|
||||
},
|
||||
"max_battery_charge": {
|
||||
"name": "Battery shutdown"
|
||||
},
|
||||
"input_voltage_low": {
|
||||
"name": "Input voltage low"
|
||||
"max_time": {
|
||||
"name": "Battery timeout"
|
||||
},
|
||||
"min_time": {
|
||||
"name": "Shutdown time"
|
||||
@@ -157,23 +145,20 @@
|
||||
"model": {
|
||||
"name": "Model"
|
||||
},
|
||||
"battery_nominal_voltage": {
|
||||
"name": "Battery nominal voltage"
|
||||
"nominal_apparent_power": {
|
||||
"name": "Nominal apparent power"
|
||||
},
|
||||
"nominal_input_voltage": {
|
||||
"name": "Nominal input voltage"
|
||||
},
|
||||
"nominal_output_voltage": {
|
||||
"name": "Nominal output voltage"
|
||||
},
|
||||
"nominal_output_power": {
|
||||
"name": "Nominal output power"
|
||||
},
|
||||
"nominal_apparent_power": {
|
||||
"name": "Nominal apparent power"
|
||||
"nominal_output_voltage": {
|
||||
"name": "Nominal output voltage"
|
||||
},
|
||||
"transfer_count": {
|
||||
"name": "Transfer count"
|
||||
"online_status": {
|
||||
"name": "Status flag"
|
||||
},
|
||||
"output_current": {
|
||||
"name": "Output current"
|
||||
@@ -193,6 +178,9 @@
|
||||
"restore_capacity": {
|
||||
"name": "Restore requirement"
|
||||
},
|
||||
"self_test_interval": {
|
||||
"name": "Self-test interval"
|
||||
},
|
||||
"self_test_result": {
|
||||
"name": "Self-test result"
|
||||
},
|
||||
@@ -202,24 +190,39 @@
|
||||
"serial_number": {
|
||||
"name": "Serial number"
|
||||
},
|
||||
"shutdown_delay": {
|
||||
"name": "Shutdown delay"
|
||||
},
|
||||
"startup_time": {
|
||||
"name": "Startup time"
|
||||
},
|
||||
"online_status": {
|
||||
"name": "Status flag"
|
||||
},
|
||||
"status": {
|
||||
"name": "Status"
|
||||
},
|
||||
"self_test_interval": {
|
||||
"name": "Self-test interval"
|
||||
},
|
||||
"time_left": {
|
||||
"name": "Time left"
|
||||
},
|
||||
"time_on_battery": {
|
||||
"name": "Time on battery"
|
||||
},
|
||||
"total_time_on_battery": {
|
||||
"name": "Total time on battery"
|
||||
},
|
||||
"transfer_count": {
|
||||
"name": "Transfer count"
|
||||
},
|
||||
"transfer_from_battery": {
|
||||
"name": "Transfer from battery"
|
||||
},
|
||||
"transfer_high": {
|
||||
"name": "Transfer high"
|
||||
},
|
||||
"transfer_low": {
|
||||
"name": "Transfer low"
|
||||
},
|
||||
"transfer_to_battery": {
|
||||
"name": "Transfer to battery"
|
||||
},
|
||||
"ups_mode": {
|
||||
"name": "Mode"
|
||||
},
|
||||
@@ -229,11 +232,8 @@
|
||||
"version": {
|
||||
"name": "Daemon version"
|
||||
},
|
||||
"transfer_from_battery": {
|
||||
"name": "Transfer from battery"
|
||||
},
|
||||
"transfer_to_battery": {
|
||||
"name": "Transfer to battery"
|
||||
"wake_delay": {
|
||||
"name": "Wake delay"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -17,40 +17,40 @@
|
||||
"_appletv-v2._tcp.local.",
|
||||
"_hscp._tcp.local.",
|
||||
{
|
||||
"type": "_airplay._tcp.local.",
|
||||
"properties": {
|
||||
"model": "appletv*"
|
||||
}
|
||||
},
|
||||
"type": "_airplay._tcp.local."
|
||||
},
|
||||
{
|
||||
"type": "_airplay._tcp.local.",
|
||||
"properties": {
|
||||
"model": "audioaccessory*"
|
||||
}
|
||||
},
|
||||
"type": "_airplay._tcp.local."
|
||||
},
|
||||
{
|
||||
"type": "_airplay._tcp.local.",
|
||||
"properties": {
|
||||
"am": "airport*"
|
||||
}
|
||||
},
|
||||
"type": "_airplay._tcp.local."
|
||||
},
|
||||
{
|
||||
"type": "_raop._tcp.local.",
|
||||
"properties": {
|
||||
"am": "appletv*"
|
||||
}
|
||||
},
|
||||
"type": "_raop._tcp.local."
|
||||
},
|
||||
{
|
||||
"type": "_raop._tcp.local.",
|
||||
"properties": {
|
||||
"am": "audioaccessory*"
|
||||
}
|
||||
},
|
||||
"type": "_raop._tcp.local."
|
||||
},
|
||||
{
|
||||
"type": "_raop._tcp.local.",
|
||||
"properties": {
|
||||
"am": "airport*"
|
||||
}
|
||||
},
|
||||
"type": "_raop._tcp.local."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,74 +1,74 @@
|
||||
{
|
||||
"config": {
|
||||
"flow_title": "{name} ({type})",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up a new Apple TV",
|
||||
"description": "Start by entering the device name (e.g. Kitchen or Bedroom) or IP address of the Apple TV you want to add.\n\nIf you cannot see your device or experience any issues, try specifying the device IP address.",
|
||||
"data": {
|
||||
"device_input": "[%key:common::config_flow::data::device%]"
|
||||
}
|
||||
},
|
||||
"restore_device": {
|
||||
"title": "Device reconfiguration",
|
||||
"description": "Reconfigure this device to restore its functionality."
|
||||
},
|
||||
"pair_with_pin": {
|
||||
"title": "Pairing",
|
||||
"description": "Pairing is required for the `{protocol}` protocol. Please enter the PIN code displayed on screen. Leading zeros shall be omitted, i.e. enter 123 if the displayed code is 0123.",
|
||||
"data": {
|
||||
"pin": "[%key:common::config_flow::data::pin%]"
|
||||
}
|
||||
},
|
||||
"pair_no_pin": {
|
||||
"title": "Pairing",
|
||||
"description": "Pairing is required for the `{protocol}` service. Please enter PIN {pin} on your device to continue."
|
||||
},
|
||||
"protocol_disabled": {
|
||||
"title": "Pairing not possible",
|
||||
"description": "Pairing is required for `{protocol}` but it is disabled on the device. Please review potential access restrictions (e.g. allow all devices on the local network to connect) on the device.\n\nYou may continue without pairing this protocol, but some functionality will be limited."
|
||||
},
|
||||
"confirm": {
|
||||
"title": "Confirm adding Apple TV",
|
||||
"description": "You are about to add `{name}` of type `{type}` to Home Assistant.\n\n**To complete the process, you may have to enter multiple PIN codes.**\n\nPlease note that you will *not* be able to power off your Apple TV with this integration. Only the media player in Home Assistant will turn off!"
|
||||
},
|
||||
"service_problem": {
|
||||
"title": "Failed to add service",
|
||||
"description": "A problem occurred while pairing protocol `{protocol}`. It will be ignored."
|
||||
},
|
||||
"password": {
|
||||
"title": "Password required",
|
||||
"description": "A password is required by `{protocol}`. This is not yet supported, please disable password to continue."
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"backoff": "Device does not accept pairing requests at this time (you might have entered an invalid PIN code too many times), try again later.",
|
||||
"device_did_not_pair": "No attempt to finish pairing process was made from the device.",
|
||||
"device_not_found": "Device was not found during discovery, please try adding it again.",
|
||||
"inconsistent_device": "Expected protocols were not found during discovery. This normally indicates a problem with multicast DNS (Zeroconf). Please try adding the device again.",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"ipv6_not_supported": "IPv6 is not supported.",
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"setup_failed": "Failed to set up device.",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"error": {
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
|
||||
},
|
||||
"abort": {
|
||||
"ipv6_not_supported": "IPv6 is not supported.",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"device_did_not_pair": "No attempt to finish pairing process was made from the device.",
|
||||
"backoff": "Device does not accept pairing requests at this time (you might have entered an invalid PIN code too many times), try again later.",
|
||||
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]",
|
||||
"setup_failed": "Failed to set up device.",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"device_not_found": "Device was not found during discovery, please try adding it again.",
|
||||
"inconsistent_device": "Expected protocols were not found during discovery. This normally indicates a problem with multicast DNS (Zeroconf). Please try adding the device again."
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "{name} ({type})",
|
||||
"step": {
|
||||
"confirm": {
|
||||
"description": "You are about to add `{name}` of type `{type}` to Home Assistant.\n\n**To complete the process, you may have to enter multiple PIN codes.**\n\nPlease note that you will *not* be able to power off your Apple TV with this integration. Only the media player in Home Assistant will turn off!",
|
||||
"title": "Confirm adding Apple TV"
|
||||
},
|
||||
"pair_no_pin": {
|
||||
"description": "Pairing is required for the `{protocol}` service. Please enter PIN {pin} on your device to continue.",
|
||||
"title": "Pairing"
|
||||
},
|
||||
"pair_with_pin": {
|
||||
"data": {
|
||||
"pin": "[%key:common::config_flow::data::pin%]"
|
||||
},
|
||||
"description": "Pairing is required for the `{protocol}` protocol. Please enter the PIN code displayed on screen. Leading zeros shall be omitted, i.e. enter 123 if the displayed code is 0123.",
|
||||
"title": "Pairing"
|
||||
},
|
||||
"password": {
|
||||
"description": "A password is required by `{protocol}`. This is not yet supported, please disable password to continue.",
|
||||
"title": "Password required"
|
||||
},
|
||||
"protocol_disabled": {
|
||||
"description": "Pairing is required for `{protocol}` but it is disabled on the device. Please review potential access restrictions (e.g. allow all devices on the local network to connect) on the device.\n\nYou may continue without pairing this protocol, but some functionality will be limited.",
|
||||
"title": "Pairing not possible"
|
||||
},
|
||||
"restore_device": {
|
||||
"description": "Reconfigure this device to restore its functionality.",
|
||||
"title": "Device reconfiguration"
|
||||
},
|
||||
"service_problem": {
|
||||
"description": "A problem occurred while pairing protocol `{protocol}`. It will be ignored.",
|
||||
"title": "Failed to add service"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"device_input": "[%key:common::config_flow::data::device%]"
|
||||
},
|
||||
"description": "Start by entering the device name (e.g. Kitchen or Bedroom) or IP address of the Apple TV you want to add.\n\nIf you cannot see your device or experience any issues, try specifying the device IP address.",
|
||||
"title": "Set up a new Apple TV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"step": {
|
||||
"init": {
|
||||
"description": "Configure general device settings",
|
||||
"data": {
|
||||
"start_off": "Do not turn device on when starting Home Assistant"
|
||||
}
|
||||
},
|
||||
"description": "Configure general device settings"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"connection_failed": "Connection failed. Please check that the host and port is correct."
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -10,12 +16,6 @@
|
||||
"port": "Usually 7000 or 8000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"connection_failed": "Connection failed. Please check that the host and port is correct."
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -25,96 +25,96 @@
|
||||
}
|
||||
},
|
||||
"humidifier": {
|
||||
"humidifier": {
|
||||
"name": "[%key:component::humidifier::title%]"
|
||||
},
|
||||
"dehumidifier": {
|
||||
"name": "[%key:component::humidifier::entity_component::dehumidifier::name%]"
|
||||
},
|
||||
"humidifier": {
|
||||
"name": "[%key:component::humidifier::title%]"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"air_cleaning_event": {
|
||||
"name": "Air cleaning event",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"allergies": "Allergies (24 hour)",
|
||||
"event_clean": "Event clean (3 hour)",
|
||||
"allergies": "Allergies (24 hour)"
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"air_cleaning_mode": {
|
||||
"name": "Air cleaning mode",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"automatic": "Automatic",
|
||||
"constant_clean": "Constant clean",
|
||||
"automatic": "Automatic"
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"fresh_air_event": {
|
||||
"name": "Fresh air event",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"3hour": "3 hour event",
|
||||
"24hour": "24 hour event"
|
||||
"24hour": "24 hour event",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"fresh_air_mode": {
|
||||
"name": "Fresh air mode",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]"
|
||||
"automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"indoor_humidity_controlling_sensor": {
|
||||
"name": "Indoor humidity controlling sensor"
|
||||
},
|
||||
"outdoor_humidity_controlling_sensor": {
|
||||
"name": "Outdoor humidity controlling sensor"
|
||||
},
|
||||
"indoor_temperature_controlling_sensor": {
|
||||
"name": "Indoor temperature controlling sensor"
|
||||
},
|
||||
"outdoor_temperature_controlling_sensor": {
|
||||
"name": "Outdoor temperature controlling sensor"
|
||||
"air_cleaning_status": {
|
||||
"name": "Air cleaning status",
|
||||
"state": {
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
},
|
||||
"dehumidification_status": {
|
||||
"name": "Dehumidification status",
|
||||
"state": {
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"on": "[%key:common::state::on%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
},
|
||||
"fan_status": {
|
||||
"name": "Fan status",
|
||||
"state": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
},
|
||||
"humidification_status": {
|
||||
"name": "Humidification status",
|
||||
"state": {
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"on": "[%key:common::state::on%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
},
|
||||
"indoor_humidity_controlling_sensor": {
|
||||
"name": "Indoor humidity controlling sensor"
|
||||
},
|
||||
"indoor_temperature_controlling_sensor": {
|
||||
"name": "Indoor temperature controlling sensor"
|
||||
},
|
||||
"outdoor_humidity_controlling_sensor": {
|
||||
"name": "Outdoor humidity controlling sensor"
|
||||
},
|
||||
"outdoor_temperature_controlling_sensor": {
|
||||
"name": "Outdoor temperature controlling sensor"
|
||||
},
|
||||
"ventilation_status": {
|
||||
"name": "Ventilation status",
|
||||
"state": {
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"on": "[%key:common::state::on%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"air_cleaning_status": {
|
||||
"name": "Air cleaning status",
|
||||
"state": {
|
||||
"idle": "[%key:common::state::idle%]",
|
||||
"on": "[%key:common::state::on%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"fan_status": {
|
||||
"name": "Fan status",
|
||||
"state": {
|
||||
"on": "[%key:common::state::on%]",
|
||||
"off": "[%key:common::state::off%]"
|
||||
"off": "[%key:common::state::off%]",
|
||||
"on": "[%key:common::state::on%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
@@ -10,39 +16,29 @@
|
||||
"port": "The integration will default to 8050, if not set, which should be suitable for most installs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"binary_sensor": {
|
||||
"off_grid_status": {
|
||||
"name": "Off-grid status"
|
||||
},
|
||||
"dc_1_short_circuit_error_status": {
|
||||
"name": "DC 1 short circuit error status"
|
||||
},
|
||||
"dc_2_short_circuit_error_status": {
|
||||
"name": "DC 2 short circuit error status"
|
||||
},
|
||||
"off_grid_status": {
|
||||
"name": "Off-grid status"
|
||||
},
|
||||
"output_fault_status": {
|
||||
"name": "Output fault status"
|
||||
}
|
||||
},
|
||||
"number": {
|
||||
"max_output": {
|
||||
"name": "Max output"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"total_power": {
|
||||
"name": "Total power"
|
||||
},
|
||||
"total_power_p1": {
|
||||
"name": "Power of P1"
|
||||
},
|
||||
"total_power_p2": {
|
||||
"name": "Power of P2"
|
||||
},
|
||||
"lifetime_production": {
|
||||
"name": "Total lifetime production"
|
||||
},
|
||||
@@ -60,11 +56,15 @@
|
||||
},
|
||||
"today_production_p2": {
|
||||
"name": "Production of today from P2"
|
||||
}
|
||||
},
|
||||
"number": {
|
||||
"max_output": {
|
||||
"name": "Max output"
|
||||
},
|
||||
"total_power": {
|
||||
"name": "Total power"
|
||||
},
|
||||
"total_power_p1": {
|
||||
"name": "Power of P1"
|
||||
},
|
||||
"total_power_p2": {
|
||||
"name": "Power of P2"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
"wi_fi_strength": {
|
||||
"default": "mdi:wifi",
|
||||
"state": {
|
||||
"high": "mdi:wifi-strength-4",
|
||||
"low": "mdi:wifi-strength-1",
|
||||
"medium": "mdi:wifi-strength-2",
|
||||
"high": "mdi:wifi-strength-4"
|
||||
"medium": "mdi:wifi-strength-2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "Select the brand of the softener and fill in your softener mobile app credentials",
|
||||
"data": {
|
||||
"brand": "Brand",
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"brand": "Brand",
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
},
|
||||
"description": "Select the brand of the softener and fill in your softener mobile app credentials"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -27,21 +27,21 @@
|
||||
"salt_left_side_percentage": {
|
||||
"name": "Salt left side percentage"
|
||||
},
|
||||
"salt_right_side_percentage": {
|
||||
"name": "Salt right side percentage"
|
||||
},
|
||||
"salt_left_side_time_remaining": {
|
||||
"name": "Salt left side time remaining"
|
||||
},
|
||||
"salt_right_side_percentage": {
|
||||
"name": "Salt right side percentage"
|
||||
},
|
||||
"salt_right_side_time_remaining": {
|
||||
"name": "Salt right side time remaining"
|
||||
},
|
||||
"wi_fi_strength": {
|
||||
"name": "Wi-Fi strength",
|
||||
"state": {
|
||||
"high": "[%key:common::state::high%]",
|
||||
"low": "[%key:common::state::low%]",
|
||||
"medium": "[%key:common::state::medium%]",
|
||||
"high": "[%key:common::state::high%]"
|
||||
"medium": "[%key:common::state::medium%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"radiation_total": {
|
||||
"radiation_rate": {
|
||||
"default": "mdi:radioactive"
|
||||
},
|
||||
"radiation_rate": {
|
||||
"radiation_total": {
|
||||
"default": "mdi:radioactive"
|
||||
},
|
||||
"radon_concentration": {
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
"name": "Aranet",
|
||||
"bluetooth": [
|
||||
{
|
||||
"connectable": false,
|
||||
"manufacturer_id": 1794,
|
||||
"service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c",
|
||||
"connectable": false
|
||||
"service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c"
|
||||
},
|
||||
{
|
||||
"connectable": false,
|
||||
"manufacturer_id": 1794,
|
||||
"service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb",
|
||||
"connectable": false
|
||||
"service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb"
|
||||
}
|
||||
],
|
||||
"codeowners": ["@aschmitz", "@thecode", "@anrijs"],
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]",
|
||||
"data": {
|
||||
"address": "[%key:common::config_flow::data::device%]"
|
||||
}
|
||||
},
|
||||
"bluetooth_confirm": {
|
||||
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
|
||||
}
|
||||
},
|
||||
"flow_title": "{name}",
|
||||
"error": {
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"integrations_disabled": "This device doesn't have integrations enabled. Please enable smart home integrations using the app and try again.",
|
||||
"no_devices_found": "No unconfigured Aranet devices found.",
|
||||
"outdated_version": "This device is using outdated firmware. Please update it to at least v1.2.0 and try again."
|
||||
},
|
||||
"error": {
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"flow_title": "{name}",
|
||||
"step": {
|
||||
"bluetooth_confirm": {
|
||||
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"address": "[%key:common::config_flow::data::device%]"
|
||||
},
|
||||
"description": "[%key:component::bluetooth::config::step::user::description%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -28,8 +28,8 @@
|
||||
"state": {
|
||||
"error": "[%key:common::state::error%]",
|
||||
"green": "Green",
|
||||
"yellow": "Yellow",
|
||||
"red": "Red"
|
||||
"red": "Red",
|
||||
"yellow": "Yellow"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"description": "Set up your Arve device",
|
||||
"data": {
|
||||
"access_token": "Arve token",
|
||||
"client_secret": "Arve customer token"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"access_token": "Arve token",
|
||||
"client_secret": "Arve customer token"
|
||||
},
|
||||
"description": "Set up your Arve device"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"unique_id_mismatch": "The user identifier does not match the previous identifier"
|
||||
},
|
||||
"error": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
|
||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
|
||||
"unique_id_mismatch": "The user identifier does not match the previous identifier"
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"email": "[%key:common::config_flow::data::email%]",
|
||||
"password": "[%key:common::config_flow::data::password%]"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
|
||||
@@ -41,6 +41,8 @@ from .pipeline import (
|
||||
async_setup_pipeline_store,
|
||||
async_update_pipeline,
|
||||
)
|
||||
from .select import AssistPipelineSelect, VadSensitivitySelect
|
||||
from .vad import VadSensitivity
|
||||
from .websocket_api import async_register_websocket_api
|
||||
|
||||
__all__ = (
|
||||
@@ -51,16 +53,18 @@ __all__ = (
|
||||
"SAMPLE_CHANNELS",
|
||||
"SAMPLE_RATE",
|
||||
"SAMPLE_WIDTH",
|
||||
"AssistPipelineSelect",
|
||||
"AudioSettings",
|
||||
"Pipeline",
|
||||
"PipelineEvent",
|
||||
"PipelineEventType",
|
||||
"PipelineNotFound",
|
||||
"VadSensitivity",
|
||||
"VadSensitivitySelect",
|
||||
"WakeWordSettings",
|
||||
"async_create_default_pipeline",
|
||||
"async_get_pipelines",
|
||||
"async_pipeline_from_audio_stream",
|
||||
"async_setup",
|
||||
"async_update_pipeline",
|
||||
)
|
||||
|
||||
|
||||
@@ -19,7 +19,14 @@ import wave
|
||||
import hass_nabucasa
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components import conversation, stt, tts, wake_word, websocket_api
|
||||
from homeassistant.components import (
|
||||
conversation,
|
||||
media_player,
|
||||
stt,
|
||||
tts,
|
||||
wake_word,
|
||||
websocket_api,
|
||||
)
|
||||
from homeassistant.const import ATTR_SUPPORTED_FEATURES, MATCH_ALL
|
||||
from homeassistant.core import Context, HomeAssistant, callback
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
@@ -130,7 +137,10 @@ SAVE_DELAY = 10
|
||||
@callback
|
||||
def _async_local_fallback_intent_filter(result: RecognizeResult) -> bool:
|
||||
"""Filter out intents that are not local fallback."""
|
||||
return result.intent.name in (intent.INTENT_GET_STATE)
|
||||
return result.intent.name in (
|
||||
intent.INTENT_GET_STATE,
|
||||
media_player.INTENT_MEDIA_SEARCH_AND_PLAY,
|
||||
)
|
||||
|
||||
|
||||
@callback
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
"vad_sensitivity": {
|
||||
"name": "Finished speaking detection",
|
||||
"state": {
|
||||
"default": "Default",
|
||||
"aggressive": "Aggressive",
|
||||
"default": "Default",
|
||||
"relaxed": "Relaxed"
|
||||
}
|
||||
}
|
||||
@@ -24,14 +24,14 @@
|
||||
},
|
||||
"issues": {
|
||||
"assist_in_progress_deprecated": {
|
||||
"title": "{integration_name} in progress binary sensors are deprecated",
|
||||
"fix_flow": {
|
||||
"step": {
|
||||
"confirm_disable_entity": {
|
||||
"description": "The {integration_name} in progress binary sensor `{entity_id}` is deprecated.\n\nMigrate your configuration to use the corresponding `{assist_satellite_domain}` entity and then click SUBMIT to disable the in progress binary sensor and fix this issue."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": "{integration_name} in progress binary sensors are deprecated"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
"announce": {
|
||||
"service": "mdi:bullhorn"
|
||||
},
|
||||
"start_conversation": {
|
||||
"service": "mdi:forum"
|
||||
},
|
||||
"ask_question": {
|
||||
"service": "mdi:microphone-question"
|
||||
},
|
||||
"start_conversation": {
|
||||
"service": "mdi:forum"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user