Compare commits
2681 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e667aa2c82 | ||
|
|
33b966c356 | ||
|
|
1325055d13 | ||
|
|
9ea9f626dd | ||
|
|
7d2db5e606 | ||
|
|
0af27acb91 | ||
|
|
0497417939 | ||
|
|
7b406d85f1 | ||
|
|
7ffaba6ef1 | ||
|
|
ddf92517b8 | ||
|
|
7f260a3108 | ||
|
|
ea603a46c7 | ||
|
|
5987abae14 | ||
|
|
e9a35a4aec | ||
|
|
ead60e7a82 | ||
|
|
35dc8aa3b5 | ||
|
|
43fd89a679 | ||
|
|
720e5c3a15 | ||
|
|
02c8168667 | ||
|
|
c37d2695a7 | ||
|
|
96986dcecd | ||
|
|
450810a222 | ||
|
|
6331f247b5 | ||
|
|
c9338404ba | ||
|
|
db578c34bf | ||
|
|
3e51445c62 | ||
|
|
eac6dd1cf7 | ||
|
|
1d247db8e8 | ||
|
|
c0d9d70c58 | ||
|
|
61bdaf0fa3 | ||
|
|
c4b91b8ea0 | ||
|
|
72d4cd4b01 | ||
|
|
bd4a8d5946 | ||
|
|
163e28c6fd | ||
|
|
9063030ba2 | ||
|
|
fe26e30a06 | ||
|
|
85e207914c | ||
|
|
baef06fadf | ||
|
|
79253683f9 | ||
|
|
1c43b8a874 | ||
|
|
fdae613124 | ||
|
|
4e329cb58c | ||
|
|
0654a54730 | ||
|
|
376a9c2c0b | ||
|
|
29baa6c808 | ||
|
|
e20c4d2af2 | ||
|
|
6278cd739e | ||
|
|
edd1d3fdb8 | ||
|
|
1cbb5c17d7 | ||
|
|
075ec9f7fb | ||
|
|
66c5e58c02 | ||
|
|
403f69c25c | ||
|
|
6021afc0f4 | ||
|
|
d0152de676 | ||
|
|
78cf4333f1 | ||
|
|
fcc1b54b6c | ||
|
|
d106243bd5 | ||
|
|
a44b1750ba | ||
|
|
9cdaca8371 | ||
|
|
0c634cfc55 | ||
|
|
52be1226e5 | ||
|
|
8be27ae04b | ||
|
|
4b049312da | ||
|
|
246f301490 | ||
|
|
6c10d13a28 | ||
|
|
2b7287e89d | ||
|
|
8026ee1846 | ||
|
|
2f26b759da | ||
|
|
da98f9570d | ||
|
|
02b0b25cae | ||
|
|
e3605eab5d | ||
|
|
5c867d1653 | ||
|
|
822b6dab97 | ||
|
|
5206898c98 | ||
|
|
5274b97551 | ||
|
|
544b2bc9cf | ||
|
|
c9be4d2422 | ||
|
|
a5092a5939 | ||
|
|
62bd8eed17 | ||
|
|
6276551560 | ||
|
|
ca10827074 | ||
|
|
ddea304d1b | ||
|
|
85d6abae93 | ||
|
|
6c2c9ab5bd | ||
|
|
acf96d4f30 | ||
|
|
a6f62a053c | ||
|
|
94d51c4b49 | ||
|
|
7da53ef510 | ||
|
|
8a60a15682 | ||
|
|
e265acfcf1 | ||
|
|
40eae7c065 | ||
|
|
2f562cdd72 | ||
|
|
d1d0a124b1 | ||
|
|
d59361f937 | ||
|
|
f0f64738ef | ||
|
|
2a0f92d548 | ||
|
|
60078bd680 | ||
|
|
3b2a6b7554 | ||
|
|
f76eccd06d | ||
|
|
359c9ed4f0 | ||
|
|
2378e171d0 | ||
|
|
53aeb3e1ec | ||
|
|
f93c4d8d47 | ||
|
|
a4fb6324d4 | ||
|
|
89f95899a1 | ||
|
|
ba1e074bf8 | ||
|
|
0529e39c31 | ||
|
|
178b940b46 | ||
|
|
dcde6ce3fb | ||
|
|
3f28641903 | ||
|
|
9cb230fd5f | ||
|
|
1cdd417340 | ||
|
|
77f9cf66f1 | ||
|
|
b5784187ae | ||
|
|
94ad0211e0 | ||
|
|
706864a4da | ||
|
|
b07f88b5db | ||
|
|
f3a67bb3d3 | ||
|
|
d3ec9a2a2f | ||
|
|
9babe8984d | ||
|
|
4ad2619108 | ||
|
|
36d0027845 | ||
|
|
9e52f7f39d | ||
|
|
86d5859045 | ||
|
|
47fb10ed1b | ||
|
|
9e5fb231cb | ||
|
|
4cb526b8cc | ||
|
|
9ac00037ae | ||
|
|
1e90d63b94 | ||
|
|
bed4c7dad0 | ||
|
|
4ad14d5e0f | ||
|
|
dc8fdbc44e | ||
|
|
64489159ac | ||
|
|
6acd5c945b | ||
|
|
fc0f727d83 | ||
|
|
bc590b9ccf | ||
|
|
a3c707b4e3 | ||
|
|
6f4e1f610f | ||
|
|
99a86408a2 | ||
|
|
34889bac3b | ||
|
|
4477fe9e50 | ||
|
|
94018819f0 | ||
|
|
c7f7e0c7c3 | ||
|
|
ff6a21df39 | ||
|
|
2f45083db5 | ||
|
|
cd4fef6870 | ||
|
|
c64132d7b5 | ||
|
|
376d91aa5a | ||
|
|
b8d8252c19 | ||
|
|
75c35399f1 | ||
|
|
694ab4f98f | ||
|
|
896f86ddab | ||
|
|
12837077da | ||
|
|
70c11efd96 | ||
|
|
10e0a47b6f | ||
|
|
88cca0d1bf | ||
|
|
c727fcd17b | ||
|
|
6be727d4af | ||
|
|
3a2dd23f86 | ||
|
|
e1e157a2b8 | ||
|
|
c6d4929a53 | ||
|
|
ca7dcd92a9 | ||
|
|
593f05feb9 | ||
|
|
b30ba76960 | ||
|
|
c98f50543d | ||
|
|
019efade79 | ||
|
|
a96ac51ed6 | ||
|
|
ea6b8bc1b3 | ||
|
|
bf508ae8cb | ||
|
|
610563f80d | ||
|
|
cc787deba0 | ||
|
|
05a4b1363b | ||
|
|
113984a7e3 | ||
|
|
314a0a8eab | ||
|
|
d75d559a1e | ||
|
|
e4b00d5e71 | ||
|
|
e98a6a45a3 | ||
|
|
6f432a54fd | ||
|
|
0eb8654663 | ||
|
|
d368cb2239 | ||
|
|
9920d23477 | ||
|
|
93b3281e6e | ||
|
|
03b993a83c | ||
|
|
8bb708b448 | ||
|
|
185c6f5d65 | ||
|
|
674c3d909d | ||
|
|
fba844f261 | ||
|
|
2f697923cc | ||
|
|
5fbae3128f | ||
|
|
d1b973847e | ||
|
|
c58dbc3516 | ||
|
|
61aa97f64e | ||
|
|
0ca7b9fcc7 | ||
|
|
1718d9d6cf | ||
|
|
aafbc722fd | ||
|
|
41b2dc0d58 | ||
|
|
25885620b6 | ||
|
|
b66d78bcbd | ||
|
|
c0e34f284d | ||
|
|
a5ab52653c | ||
|
|
5db3f59679 | ||
|
|
96b0e0a6c6 | ||
|
|
fddaf9bc6e | ||
|
|
2542386c2d | ||
|
|
140cbdd409 | ||
|
|
3bb4bdd49f | ||
|
|
a78a282b41 | ||
|
|
0e6853f3bf | ||
|
|
b0d4d22404 | ||
|
|
d09680b87c | ||
|
|
9b3f64835d | ||
|
|
d9d7e66bbf | ||
|
|
49170c1b6a | ||
|
|
8a80839aec | ||
|
|
4ede301ffa | ||
|
|
54b87d3d6a | ||
|
|
53113a26d9 | ||
|
|
7eed2adcc6 | ||
|
|
6632404c4d | ||
|
|
f46ea5dc14 | ||
|
|
6e0137bcec | ||
|
|
59f9b1ffb5 | ||
|
|
1f835c5a48 | ||
|
|
f2eabcf059 | ||
|
|
2e802607bb | ||
|
|
29c5e8eea5 | ||
|
|
d0fe64fd67 | ||
|
|
c20f88a3ee | ||
|
|
fdec06482d | ||
|
|
913d43959b | ||
|
|
e40aa6d1ca | ||
|
|
235a5b2970 | ||
|
|
c9d2f0d846 | ||
|
|
bedd30c68f | ||
|
|
18e9458a57 | ||
|
|
e61f78fdcf | ||
|
|
22e655d0e3 | ||
|
|
3b12a95ae0 | ||
|
|
a2870f9080 | ||
|
|
b044561e11 | ||
|
|
2b00485249 | ||
|
|
bf2ce54279 | ||
|
|
58c158a426 | ||
|
|
f3100081a4 | ||
|
|
2580eeb668 | ||
|
|
5cdadc79ce | ||
|
|
e49657230d | ||
|
|
0b0e0a4982 | ||
|
|
0248a825e1 | ||
|
|
720f640ec0 | ||
|
|
4e421bdc23 | ||
|
|
7fc9214667 | ||
|
|
072e1c6bd5 | ||
|
|
aad0c3daf1 | ||
|
|
383d5d3d52 | ||
|
|
60c9bfc072 | ||
|
|
2d895f8ae8 | ||
|
|
6f9090a866 | ||
|
|
0fccde0385 | ||
|
|
410d4b789d | ||
|
|
887c3155c2 | ||
|
|
87d292496a | ||
|
|
f0d1b9a7aa | ||
|
|
c7bfe4096a | ||
|
|
8531a49621 | ||
|
|
6a93083eb7 | ||
|
|
2393834ae8 | ||
|
|
0e089b292b | ||
|
|
89bda1e0c4 | ||
|
|
a7574100f0 | ||
|
|
29effe36f8 | ||
|
|
af055283f7 | ||
|
|
e5c6f25181 | ||
|
|
530697642e | ||
|
|
684e6e24a5 | ||
|
|
9d48e766b3 | ||
|
|
c281a037c2 | ||
|
|
1718bd55f6 | ||
|
|
c51ca1bd06 | ||
|
|
41aa61c76e | ||
|
|
77d7d7ee23 | ||
|
|
2fd5881c66 | ||
|
|
f03f825df8 | ||
|
|
d039c04a95 | ||
|
|
ff6e524548 | ||
|
|
565df092d4 | ||
|
|
c6f692b0f9 | ||
|
|
acba8b053e | ||
|
|
840554ae8e | ||
|
|
2eeda11841 | ||
|
|
f6f032ae22 | ||
|
|
f304a5c078 | ||
|
|
41c320a3d6 | ||
|
|
bf0aa0f8fb | ||
|
|
c3d55a284e | ||
|
|
ae05f133e1 | ||
|
|
c74eabbe95 | ||
|
|
cbd341a784 | ||
|
|
67892fb6ed | ||
|
|
63dd57d7f3 | ||
|
|
5d102472a1 | ||
|
|
e1dd490d4f | ||
|
|
6c52b16ed1 | ||
|
|
27b458ae2c | ||
|
|
f964620f57 | ||
|
|
a00e87b147 | ||
|
|
cb1f214179 | ||
|
|
ab04f7a86d | ||
|
|
ea5e349d7a | ||
|
|
653b525bf0 | ||
|
|
a665abd22c | ||
|
|
cccbdd96fd | ||
|
|
ea459c8bf4 | ||
|
|
386d39d85a | ||
|
|
37cf913c0b | ||
|
|
48f60c7f99 | ||
|
|
ec74ebcc79 | ||
|
|
c2ad0e9669 | ||
|
|
04ae094baf | ||
|
|
b85883993f | ||
|
|
39d41914f4 | ||
|
|
5df7602fc8 | ||
|
|
ccecd91f6f | ||
|
|
53781082e6 | ||
|
|
071007124b | ||
|
|
dd844d1d3c | ||
|
|
fe7eae4191 | ||
|
|
801324744c | ||
|
|
e338d130e5 | ||
|
|
47d8425683 | ||
|
|
844cc0ec4e | ||
|
|
c27a097a5d | ||
|
|
efdd18995d | ||
|
|
82ceca57a7 | ||
|
|
942bd84874 | ||
|
|
cf4b2b8f3c | ||
|
|
808db53981 | ||
|
|
d62623eef7 | ||
|
|
eb640fb09d | ||
|
|
7e9118a3ce | ||
|
|
f7459b0148 | ||
|
|
5f5b7cb36c | ||
|
|
1c61acbb63 | ||
|
|
9b2f7bd2b8 | ||
|
|
dd9e0ec79e | ||
|
|
a012b17653 | ||
|
|
4d7e4da594 | ||
|
|
d5a0bde06c | ||
|
|
7db6e4598d | ||
|
|
3fb8343246 | ||
|
|
d2b924b355 | ||
|
|
dbf57053db | ||
|
|
d35c2a77ba | ||
|
|
64b72ca2d5 | ||
|
|
6d5af5a6e0 | ||
|
|
69bf13326c | ||
|
|
72fa7abb2a | ||
|
|
772ede7f48 | ||
|
|
1b8c1265e9 | ||
|
|
fddf3bda9f | ||
|
|
ad8cc7788b | ||
|
|
a3f54d5c43 | ||
|
|
828a07a636 | ||
|
|
5e5476f6e2 | ||
|
|
231c9aa426 | ||
|
|
7455df28e8 | ||
|
|
e263047b15 | ||
|
|
a85f6fb6c3 | ||
|
|
fc9017b3c6 | ||
|
|
98aae56235 | ||
|
|
ff9de5bf26 | ||
|
|
2f47ffc42b | ||
|
|
6af2ddac99 | ||
|
|
a647c69f53 | ||
|
|
e2c639a32d | ||
|
|
7a18b75204 | ||
|
|
e0415c35cd | ||
|
|
7fda931f67 | ||
|
|
b1412f1d12 | ||
|
|
94782bf9fc | ||
|
|
3dbf577a92 | ||
|
|
ce43a31242 | ||
|
|
cc756fda35 | ||
|
|
f28a02fd5d | ||
|
|
5f850ae6a3 | ||
|
|
4e7bbef1a0 | ||
|
|
447a07c65b | ||
|
|
480848558f | ||
|
|
8f52de210c | ||
|
|
54a4e7775f | ||
|
|
9059b20773 | ||
|
|
8226ea6a5b | ||
|
|
3f39dbcad8 | ||
|
|
56813c795b | ||
|
|
9c807f288d | ||
|
|
271362511f | ||
|
|
7fca55361c | ||
|
|
16b5ce4b0b | ||
|
|
114ea35e55 | ||
|
|
a9dae8fd08 | ||
|
|
27bd854bd5 | ||
|
|
ac3be262fd | ||
|
|
01e99b2f72 | ||
|
|
9cd8f6121f | ||
|
|
d28ab920c8 | ||
|
|
9e6fb6eb85 | ||
|
|
0d4293b6e4 | ||
|
|
59d4c09857 | ||
|
|
05f7932d04 | ||
|
|
05bb498e34 | ||
|
|
79573eb541 | ||
|
|
4a52b06704 | ||
|
|
bac85239d0 | ||
|
|
218c551c3e | ||
|
|
153a906215 | ||
|
|
efee51ea3d | ||
|
|
3d1baba9cb | ||
|
|
7e00837d8b | ||
|
|
fb8448fb7d | ||
|
|
7829382653 | ||
|
|
61c2c93c40 | ||
|
|
2e4b7f2a87 | ||
|
|
55ed3775d1 | ||
|
|
fc53bfc8d8 | ||
|
|
cd19e9174b | ||
|
|
1179f94ae2 | ||
|
|
7ce40bc4b7 | ||
|
|
37232e19a0 | ||
|
|
afbeb7a816 | ||
|
|
9db404c099 | ||
|
|
45c5453c2f | ||
|
|
28eb2d064e | ||
|
|
c1f4eef816 | ||
|
|
8603bb9687 | ||
|
|
5f2045ff95 | ||
|
|
904937f06f | ||
|
|
40a75fe4fe | ||
|
|
9e14c2f5d8 | ||
|
|
3980458fcc | ||
|
|
c0a0d2b96b | ||
|
|
79363673d3 | ||
|
|
ce04dd7b99 | ||
|
|
0dc3d86d2e | ||
|
|
fe27f8c619 | ||
|
|
0be79ea5c4 | ||
|
|
6e57b20edf | ||
|
|
6b3fe0cf84 | ||
|
|
8be3f8a177 | ||
|
|
57fee3c1c6 | ||
|
|
82341613df | ||
|
|
5bc1e7db96 | ||
|
|
bd7c6590f7 | ||
|
|
16097a5c1d | ||
|
|
b00798b6ae | ||
|
|
05edda7ceb | ||
|
|
acb3b7f82e | ||
|
|
dd6dd172e2 | ||
|
|
1d95198312 | ||
|
|
585d3142ae | ||
|
|
953d0b6139 | ||
|
|
4f21cb442a | ||
|
|
f49aadd51e | ||
|
|
72f74ddbe4 | ||
|
|
c6be70c7f2 | ||
|
|
9151358284 | ||
|
|
d90c180d91 | ||
|
|
1fb11564d6 | ||
|
|
fc2bd3d40b | ||
|
|
b02f3c080a | ||
|
|
bfe27f0693 | ||
|
|
4ff219075e | ||
|
|
0e8c98e798 | ||
|
|
6fd55ce65d | ||
|
|
5288cf68b6 | ||
|
|
e3fb149b58 | ||
|
|
7422704fcc | ||
|
|
358c363077 | ||
|
|
427604712d | ||
|
|
083ed5bc61 | ||
|
|
0c83264750 | ||
|
|
8af43c2bcc | ||
|
|
33fd9dfd38 | ||
|
|
619c18fddc | ||
|
|
b26f10fc03 | ||
|
|
04d7be368c | ||
|
|
b41caf73be | ||
|
|
edd3e3532d | ||
|
|
9bd6b4504d | ||
|
|
45994f3c0b | ||
|
|
d61e71a605 | ||
|
|
356d799f92 | ||
|
|
c8bb294e5e | ||
|
|
5ab53b794e | ||
|
|
8af0802c2d | ||
|
|
2fb273a4cf | ||
|
|
e39489e6ad | ||
|
|
1045ce1860 | ||
|
|
8342532536 | ||
|
|
92940d82f2 | ||
|
|
4545174cf1 | ||
|
|
e9aa032f66 | ||
|
|
8191762c51 | ||
|
|
299633ebf9 | ||
|
|
1e3ba659cf | ||
|
|
c8686cc379 | ||
|
|
f2f137789d | ||
|
|
8b45ec7a85 | ||
|
|
79a82f764a | ||
|
|
e79dad99c8 | ||
|
|
9b0faffbf2 | ||
|
|
9da0744d80 | ||
|
|
599d05ec7d | ||
|
|
0b6d8e0fd1 | ||
|
|
19ecf80f45 | ||
|
|
78ee28bc6d | ||
|
|
191d1227b9 | ||
|
|
10f928a92d | ||
|
|
78f5804730 | ||
|
|
03f5b74849 | ||
|
|
3314280297 | ||
|
|
ee600264c6 | ||
|
|
1e072a05b3 | ||
|
|
053db917bf | ||
|
|
7fc66610dc | ||
|
|
d328307793 | ||
|
|
5e9bbb455f | ||
|
|
acd57abdf6 | ||
|
|
a47c70ae80 | ||
|
|
26c5a42914 | ||
|
|
32e9246ace | ||
|
|
1d52396e96 | ||
|
|
fa8ee066ac | ||
|
|
6042d3ea94 | ||
|
|
48a4b3edbf | ||
|
|
ae090a2481 | ||
|
|
2ebc92439c | ||
|
|
33c3d55879 | ||
|
|
70edd8e5e8 | ||
|
|
f17b82d350 | ||
|
|
9f24df32c4 | ||
|
|
631516f7c6 | ||
|
|
940f1d90fe | ||
|
|
1c367f5269 | ||
|
|
b633ac1fe3 | ||
|
|
2caf2cced4 | ||
|
|
6d829a7104 | ||
|
|
b796760c81 | ||
|
|
56ff12be12 | ||
|
|
6cca648fc9 | ||
|
|
0bff5fc99f | ||
|
|
24c6d4d5c0 | ||
|
|
9370f1f3fe | ||
|
|
39662deb91 | ||
|
|
f02a6d6b51 | ||
|
|
5fbfa2c3d0 | ||
|
|
536410615e | ||
|
|
c272d56219 | ||
|
|
b79e657809 | ||
|
|
695d4a8583 | ||
|
|
393ae9443e | ||
|
|
acff2efd21 | ||
|
|
71c2d712dd | ||
|
|
e830501e97 | ||
|
|
8e71c9b52e | ||
|
|
38006f256b | ||
|
|
a7b51ee3c7 | ||
|
|
e689c26915 | ||
|
|
35caab3659 | ||
|
|
68fcf691a7 | ||
|
|
1df8e1c6ef | ||
|
|
748aff12e8 | ||
|
|
f076e7bf03 | ||
|
|
f0503412b2 | ||
|
|
9a6ad742f7 | ||
|
|
fb7b477f5d | ||
|
|
ca6c2db015 | ||
|
|
9c03569925 | ||
|
|
0a904068cb | ||
|
|
fb09556f7c | ||
|
|
4bc176d01f | ||
|
|
75495eac93 | ||
|
|
2d6ba06800 | ||
|
|
a3df5f97a6 | ||
|
|
87051d8241 | ||
|
|
149b7bc753 | ||
|
|
141244140b | ||
|
|
569a2cf702 | ||
|
|
0127bcd8d6 | ||
|
|
f5cb3f6b6e | ||
|
|
79d17012c5 | ||
|
|
22dd4b0c89 | ||
|
|
755ced3130 | ||
|
|
df6a565254 | ||
|
|
45700b5fef | ||
|
|
975fc4bd74 | ||
|
|
83007112ed | ||
|
|
9819f52d27 | ||
|
|
fccf3ef6bf | ||
|
|
0eccb542b4 | ||
|
|
6347205d05 | ||
|
|
a587b07359 | ||
|
|
6f1a6107c9 | ||
|
|
fa7b321134 | ||
|
|
77f6dacbc1 | ||
|
|
d56baef68d | ||
|
|
8c8521dc23 | ||
|
|
af6ef8f859 | ||
|
|
c2d2bb4fe2 | ||
|
|
185737e1eb | ||
|
|
9ff59624e0 | ||
|
|
f819c1fe33 | ||
|
|
455e1f06e4 | ||
|
|
f88e8c4afa | ||
|
|
ea474098c8 | ||
|
|
d5f5a3eaaf | ||
|
|
89876fdfcf | ||
|
|
46a71dd10a | ||
|
|
ae48ec0bf1 | ||
|
|
05ce94a7d7 | ||
|
|
28f18fe806 | ||
|
|
9d9ab4c08d | ||
|
|
8793b0f5fd | ||
|
|
d369cd8d23 | ||
|
|
d94e98ee63 | ||
|
|
d00d082d45 | ||
|
|
4b90515425 | ||
|
|
9487ca9fe0 | ||
|
|
16e9b899d6 | ||
|
|
692e145162 | ||
|
|
f2a1f27e0c | ||
|
|
abd55b4bc0 | ||
|
|
d66aa59b35 | ||
|
|
751daac8ca | ||
|
|
ec7e97650e | ||
|
|
741d2802bd | ||
|
|
5e29988209 | ||
|
|
9da8a02d2c | ||
|
|
93369d62ec | ||
|
|
68c2410feb | ||
|
|
13a1822c6e | ||
|
|
6467f666f3 | ||
|
|
718ec12e3c | ||
|
|
f640f00d82 | ||
|
|
e8d127681c | ||
|
|
b3043facad | ||
|
|
e37cb6dbfd | ||
|
|
38b2da0976 | ||
|
|
384e7d4c29 | ||
|
|
158a28befc | ||
|
|
55ea00b50a | ||
|
|
677bebcafc | ||
|
|
7f09156414 | ||
|
|
32909c0f2a | ||
|
|
c184559cff | ||
|
|
64563dc0c7 | ||
|
|
975dfe87af | ||
|
|
29a22ad8dd | ||
|
|
96dc528237 | ||
|
|
02d571703f | ||
|
|
b96ef8fde2 | ||
|
|
3a4ebfdf02 | ||
|
|
3c27ec3638 | ||
|
|
01005b5863 | ||
|
|
dc12a64724 | ||
|
|
8088ebbf88 | ||
|
|
9a2a2a4273 | ||
|
|
9b1e652040 | ||
|
|
7d640907ac | ||
|
|
f53ea8792e | ||
|
|
3be0a56ac7 | ||
|
|
7d8bb128c2 | ||
|
|
1497c94061 | ||
|
|
7be80f9de3 | ||
|
|
4965a2b2bc | ||
|
|
99693bada7 | ||
|
|
421f6dd905 | ||
|
|
15ed97dc06 | ||
|
|
88888d0f38 | ||
|
|
cfd0c51bfe | ||
|
|
5bc202ed81 | ||
|
|
2b3d64c6e4 | ||
|
|
22998feb31 | ||
|
|
7480aab072 | ||
|
|
ed0b739821 | ||
|
|
5074187120 | ||
|
|
de14a0275d | ||
|
|
5f1f6c14f6 | ||
|
|
beb1b327bd | ||
|
|
c485ec1f17 | ||
|
|
8bc2c20969 | ||
|
|
85a39c683c | ||
|
|
38f6e66b85 | ||
|
|
7c63d276cc | ||
|
|
898213eec5 | ||
|
|
3f04b6a1d4 | ||
|
|
3e330f0369 | ||
|
|
b8f747b8a1 | ||
|
|
eb83666496 | ||
|
|
4b3e0dd4dd | ||
|
|
88a03996b7 | ||
|
|
fc025b1333 | ||
|
|
fe4aad6f6b | ||
|
|
bb1c9343a4 | ||
|
|
e09a57688b | ||
|
|
61516584c8 | ||
|
|
19b1ec5a0b | ||
|
|
945df79e7f | ||
|
|
144f9c2a58 | ||
|
|
e80df1a63d | ||
|
|
544880459a | ||
|
|
a5bb903f5f | ||
|
|
9c7172c4d5 | ||
|
|
b933becf1a | ||
|
|
ee45d68146 | ||
|
|
49d249334e | ||
|
|
f12bc58db9 | ||
|
|
1ff97bf75f | ||
|
|
3d933cd76d | ||
|
|
92585eb06e | ||
|
|
e394151369 | ||
|
|
91f6f443e4 | ||
|
|
b81729a140 | ||
|
|
7c91fa64ea | ||
|
|
530c074ce1 | ||
|
|
4bb878a02b | ||
|
|
f8945a076d | ||
|
|
d4c7306b7a | ||
|
|
7901cbf278 | ||
|
|
2e202d5935 | ||
|
|
67476989e3 | ||
|
|
f1ba44ce25 | ||
|
|
65d37d7403 | ||
|
|
01161b9f25 | ||
|
|
f453bcffd4 | ||
|
|
32457fcbff | ||
|
|
7179c21bd8 | ||
|
|
34a69def42 | ||
|
|
e1ddf3e43a | ||
|
|
76155b3b1d | ||
|
|
5c8fd6301a | ||
|
|
41613e2af1 | ||
|
|
edf8c22409 | ||
|
|
aa760968c4 | ||
|
|
c0430b4410 | ||
|
|
dc4a5f43e1 | ||
|
|
67e358b526 | ||
|
|
fbfdaa6d3b | ||
|
|
d411a207cb | ||
|
|
776dc0918e | ||
|
|
3fa3552768 | ||
|
|
c82ea7761a | ||
|
|
04248847a5 | ||
|
|
5324c4f4b3 | ||
|
|
716c5c38f3 | ||
|
|
a73b756f51 | ||
|
|
a59fbac4cd | ||
|
|
3370f309b6 | ||
|
|
5cd0455e3d | ||
|
|
97133cea0b | ||
|
|
579a67feac | ||
|
|
668aad4bb2 | ||
|
|
a952750a8b | ||
|
|
7e1f8318ce | ||
|
|
da58286a44 | ||
|
|
5a5e963321 | ||
|
|
eec369dbe6 | ||
|
|
14121f20d4 | ||
|
|
855e606bc8 | ||
|
|
0565f5a997 | ||
|
|
a52a7cee55 | ||
|
|
156dbf8345 | ||
|
|
1c8c90d6de | ||
|
|
fd5c7e2a73 | ||
|
|
7282c23ffd | ||
|
|
cd6eb12e6e | ||
|
|
05bdd410cc | ||
|
|
5111fdb3f1 | ||
|
|
b7c500fef1 | ||
|
|
a0796a66fc | ||
|
|
81bbffe43a | ||
|
|
8dbb83c6d9 | ||
|
|
d062b542d3 | ||
|
|
9c88dd27ea | ||
|
|
2143f4ae27 | ||
|
|
e1666fab40 | ||
|
|
73e82bbfe5 | ||
|
|
d1d19ffb06 | ||
|
|
f85844d4dd | ||
|
|
a0e37e811e | ||
|
|
4750a22ddf | ||
|
|
7e70e7c3c1 | ||
|
|
c60f4e97ce | ||
|
|
1e036a204c | ||
|
|
27b7317070 | ||
|
|
0b8ac56521 | ||
|
|
b02be58888 | ||
|
|
e552d1c2b1 | ||
|
|
02deba2380 | ||
|
|
4378acacfa | ||
|
|
7dfe5af6bf | ||
|
|
a45d421c01 | ||
|
|
604705d9b6 | ||
|
|
64ab3fa4b9 | ||
|
|
7629fa086b | ||
|
|
6b03d7c44f | ||
|
|
9cae2b3d9f | ||
|
|
e73cfb731d | ||
|
|
52e3dd174c | ||
|
|
b94461b39f | ||
|
|
730fc62643 | ||
|
|
bbb49e189b | ||
|
|
083936b1a5 | ||
|
|
b14cdf6678 | ||
|
|
0f19d91e49 | ||
|
|
4b1de06991 | ||
|
|
f70e08cc8f | ||
|
|
31cd798f6f | ||
|
|
309f97626c | ||
|
|
e5776e948c | ||
|
|
70e98495a2 | ||
|
|
cbf2c8d904 | ||
|
|
51d450a2dc | ||
|
|
9d88d84faf | ||
|
|
74ea1ebb0e | ||
|
|
a01486b454 | ||
|
|
a5a7c280b7 | ||
|
|
d4e5e75c9a | ||
|
|
8404a6e62c | ||
|
|
8e17dfe122 | ||
|
|
505714c6f3 | ||
|
|
443dfa57c0 | ||
|
|
edae578cbf | ||
|
|
77fea5df53 | ||
|
|
8bca15ae66 | ||
|
|
8145b61b4f | ||
|
|
cc5c1dde78 | ||
|
|
f73f4eba53 | ||
|
|
51f2df89bd | ||
|
|
b3f440985d | ||
|
|
1492d1b0c0 | ||
|
|
8bf92697e7 | ||
|
|
d1d91ae1f2 | ||
|
|
499dbca170 | ||
|
|
d646644663 | ||
|
|
06c2a338eb | ||
|
|
5403776b9a | ||
|
|
b1b2eef001 | ||
|
|
95abb02b5a | ||
|
|
e5329338df | ||
|
|
da3e1d57d1 | ||
|
|
81a2597ced | ||
|
|
68f3452990 | ||
|
|
8cf35ac632 | ||
|
|
d5c21adec3 | ||
|
|
79fb4ff0ca | ||
|
|
905d57f3ca | ||
|
|
a09cc9382f | ||
|
|
a58a7f5443 | ||
|
|
0af730fd5a | ||
|
|
4abd37d981 | ||
|
|
cd73bbec88 | ||
|
|
bccb7c86af | ||
|
|
98c6cf9849 | ||
|
|
1c2cbb9fd2 | ||
|
|
eb9ddcc790 | ||
|
|
922caf3ca9 | ||
|
|
ebf89ac078 | ||
|
|
319b6c0349 | ||
|
|
eed29a2360 | ||
|
|
49c6c34b12 | ||
|
|
36c6df726b | ||
|
|
6171699d8c | ||
|
|
ea0839ee26 | ||
|
|
d704de853a | ||
|
|
ce049f5c8e | ||
|
|
4d4c869f45 | ||
|
|
cb01aeb5ab | ||
|
|
20cb5224c7 | ||
|
|
9bde7edd59 | ||
|
|
67a103df25 | ||
|
|
4bd1104d42 | ||
|
|
bb46aa9722 | ||
|
|
452bf9c282 | ||
|
|
d7363e950b | ||
|
|
4d73312b18 | ||
|
|
f26afa06a8 | ||
|
|
8849afbbb0 | ||
|
|
9c3b301aa0 | ||
|
|
f5f2c05550 | ||
|
|
eb2f5c987a | ||
|
|
51639e43ae | ||
|
|
9acc00c6df | ||
|
|
7b5af70a4f | ||
|
|
1c49bc046d | ||
|
|
e1b7c4242d | ||
|
|
6df5ad0578 | ||
|
|
cf25bb380b | ||
|
|
2473816f34 | ||
|
|
b94b9ffd2e | ||
|
|
13110f9949 | ||
|
|
52aaea3bb5 | ||
|
|
01f5ba93a1 | ||
|
|
c1a0c0991e | ||
|
|
1a20b0cc42 | ||
|
|
a9c36239d8 | ||
|
|
c281a68bee | ||
|
|
52b65d1536 | ||
|
|
9a761dbc71 | ||
|
|
ccf139fa5f | ||
|
|
57c1576cc5 | ||
|
|
af64a7ba40 | ||
|
|
979f09a673 | ||
|
|
4b585b672d | ||
|
|
0e35bae534 | ||
|
|
01c898b98c | ||
|
|
4bd63e0673 | ||
|
|
6a64ae5592 | ||
|
|
071a13076f | ||
|
|
29087e2ca0 | ||
|
|
dd3f3457c4 | ||
|
|
9c68166098 | ||
|
|
9a501c45a2 | ||
|
|
759e49bdf2 | ||
|
|
3db3985c03 | ||
|
|
f34a6b4c1d | ||
|
|
519a8b48fb | ||
|
|
59cc6a536e | ||
|
|
c34018c021 | ||
|
|
d55366e3fb | ||
|
|
89c5cf227d | ||
|
|
02b0e8a340 | ||
|
|
6dd4733b4b | ||
|
|
4cdd80550f | ||
|
|
17c200da53 | ||
|
|
284aa843b4 | ||
|
|
0fbe9bce0f | ||
|
|
43c78b76f8 | ||
|
|
a2eea277bc | ||
|
|
edb2fb4a2e | ||
|
|
a6338b173f | ||
|
|
2765efa3ca | ||
|
|
b46ab6a6d2 | ||
|
|
a1a2a897c6 | ||
|
|
e0c6fb9810 | ||
|
|
aae12d0be7 | ||
|
|
a820723f44 | ||
|
|
9d6285633c | ||
|
|
7ed8bd60a4 | ||
|
|
33a0e418be | ||
|
|
83016ec605 | ||
|
|
13e725be02 | ||
|
|
6e8ca96e4f | ||
|
|
b3543af0b7 | ||
|
|
45a56a4340 | ||
|
|
a2bc755b89 | ||
|
|
40efe3d7b3 | ||
|
|
878cf6a58c | ||
|
|
008016a3d6 | ||
|
|
286123f9c7 | ||
|
|
f0a817fff6 | ||
|
|
126e5c0d7b | ||
|
|
217b456e75 | ||
|
|
08d44d4064 | ||
|
|
ae80c7f1ed | ||
|
|
df2c7cff28 | ||
|
|
73def31fce | ||
|
|
8122516ceb | ||
|
|
7b40f31599 | ||
|
|
a81be28085 | ||
|
|
f74dc421e4 | ||
|
|
0ac153dd56 | ||
|
|
327de69a6f | ||
|
|
1036182bd2 | ||
|
|
6bda8a56ea | ||
|
|
dc1f836684 | ||
|
|
f0216982e0 | ||
|
|
007fb1f70d | ||
|
|
7b1557894b | ||
|
|
8b4e3ea4c9 | ||
|
|
1e570dc18e | ||
|
|
66b1e0b3e7 | ||
|
|
982453109a | ||
|
|
4cb2142b83 | ||
|
|
221c6a38b2 | ||
|
|
be1266dd24 | ||
|
|
c57ae981db | ||
|
|
e7d6e19cf4 | ||
|
|
5b099b9c63 | ||
|
|
a03e348a90 | ||
|
|
2fdc32285f | ||
|
|
9f5e162b11 | ||
|
|
1c76d8eb7b | ||
|
|
e06cd0d464 | ||
|
|
03114ac80c | ||
|
|
ca8f49a24d | ||
|
|
8f94bdae58 | ||
|
|
ec95810e21 | ||
|
|
019c420024 | ||
|
|
3b160f4d63 | ||
|
|
9aa17c29a3 | ||
|
|
1fa7e348be | ||
|
|
3dd70c3be1 | ||
|
|
0606196d29 | ||
|
|
82dd4cb833 | ||
|
|
56d1e2e407 | ||
|
|
47e67d2d4b | ||
|
|
db0cd22193 | ||
|
|
d1328cde66 | ||
|
|
78839a1396 | ||
|
|
ec140bf55d | ||
|
|
a1e50237fb | ||
|
|
1ce2efd25f | ||
|
|
a705964468 | ||
|
|
126e9fb946 | ||
|
|
ff3bde78e4 | ||
|
|
37450c5643 | ||
|
|
6bf36ded89 | ||
|
|
ce9d45504c | ||
|
|
36eea7c483 | ||
|
|
f50994d4bc | ||
|
|
1059528825 | ||
|
|
0c6f62f9b8 | ||
|
|
3e75c94031 | ||
|
|
c62ad5454b | ||
|
|
f8fee99972 | ||
|
|
cb840c53a8 | ||
|
|
c7fd545701 | ||
|
|
35f09a5582 | ||
|
|
287a49f617 | ||
|
|
0a2970eb7f | ||
|
|
755e69388f | ||
|
|
03d1aa477c | ||
|
|
ff42959751 | ||
|
|
c642da6c3c | ||
|
|
06b0ccfd10 | ||
|
|
dc4312c302 | ||
|
|
45c3eafece | ||
|
|
cc976ec820 | ||
|
|
c8d84a6458 | ||
|
|
e906fc76b9 | ||
|
|
f53f1fb30c | ||
|
|
a1e23fc4be | ||
|
|
948124927d | ||
|
|
1078125b98 | ||
|
|
9dc93d8969 | ||
|
|
7c46f5d1f0 | ||
|
|
e5fcd218e5 | ||
|
|
abf90eec4a | ||
|
|
945732b51a | ||
|
|
8c70f3b94d | ||
|
|
f9777209e3 | ||
|
|
1fc0b22f44 | ||
|
|
a9ef296fb2 | ||
|
|
315d982029 | ||
|
|
ff5894fa68 | ||
|
|
b9c66a33a6 | ||
|
|
02615c0cd0 | ||
|
|
dc2c777580 | ||
|
|
d010cf4b28 | ||
|
|
33cce61147 | ||
|
|
973d8ec37a | ||
|
|
a520d0773c | ||
|
|
869c8160d4 | ||
|
|
4bc3fdb28b | ||
|
|
d71a1e1fe8 | ||
|
|
cded65a9ec | ||
|
|
f24ba9739d | ||
|
|
86acccc36b | ||
|
|
cfb8352f85 | ||
|
|
a056106a9f | ||
|
|
2bc47b41d6 | ||
|
|
eff58b978a | ||
|
|
649bc9ff0d | ||
|
|
c50a6cc5e4 | ||
|
|
c8be47b2e5 | ||
|
|
940477b1a9 | ||
|
|
6ddac2d53f | ||
|
|
b304be171d | ||
|
|
1e65a7ef05 | ||
|
|
4590c9e1c7 | ||
|
|
d17206c57d | ||
|
|
10b323c2d6 | ||
|
|
88d84a8bbd | ||
|
|
8c4c06b067 | ||
|
|
6f5ebab2ed | ||
|
|
2422400a28 | ||
|
|
c77758b0f2 | ||
|
|
ef434eb3b6 | ||
|
|
11deb78613 | ||
|
|
56be238c65 | ||
|
|
df1434fd34 | ||
|
|
27ca231442 | ||
|
|
8b2ed460b6 | ||
|
|
e86919afec | ||
|
|
9a8ff1159b | ||
|
|
fd3b67288c | ||
|
|
68d921c1ee | ||
|
|
a259d354b3 | ||
|
|
02b7420798 | ||
|
|
5470794a17 | ||
|
|
f410a205e9 | ||
|
|
706c600c5c | ||
|
|
bed6d63c7a | ||
|
|
f77657fabb | ||
|
|
d4949d16d7 | ||
|
|
9686a62619 | ||
|
|
1896e4fc68 | ||
|
|
f12d4c1eea | ||
|
|
d235ddb4ac | ||
|
|
4d540a8b94 | ||
|
|
daa9142f7f | ||
|
|
a617a84dc7 | ||
|
|
c0ffb0896c | ||
|
|
03d04fcd6b | ||
|
|
75c2ff88b7 | ||
|
|
3b1a704b36 | ||
|
|
c35808b560 | ||
|
|
9c0958dc51 | ||
|
|
de3ec8e3d9 | ||
|
|
f69b48df52 | ||
|
|
371803dcf3 | ||
|
|
bcc8794b19 | ||
|
|
c3b11eb581 | ||
|
|
ddbe7d9723 | ||
|
|
216f6f3102 | ||
|
|
db8e204fa6 | ||
|
|
afea2518ce | ||
|
|
484fc4ba8c | ||
|
|
d158a801ad | ||
|
|
5268e214a3 | ||
|
|
71e33527a5 | ||
|
|
671145a56b | ||
|
|
65dc1cdf25 | ||
|
|
e766b8ccb9 | ||
|
|
bba6eb2aa6 | ||
|
|
ad2edfd905 | ||
|
|
716845bd0b | ||
|
|
8e70389fc4 | ||
|
|
c08c133a15 | ||
|
|
70e6a88638 | ||
|
|
469a84492c | ||
|
|
099f530947 | ||
|
|
f6b400aafa | ||
|
|
dae5d5b574 | ||
|
|
f0661f0a6c | ||
|
|
8f200fbd0a | ||
|
|
195105e1f6 | ||
|
|
0cc4c4fddb | ||
|
|
d099d45eae | ||
|
|
b5115df38e | ||
|
|
797698ed4f | ||
|
|
0d4c2a012b | ||
|
|
763693c2ca | ||
|
|
bc6be10462 | ||
|
|
cbb08dc747 | ||
|
|
c4c65ebf34 | ||
|
|
622279c732 | ||
|
|
76738b6c61 | ||
|
|
173fb22fd7 | ||
|
|
8de24eafa1 | ||
|
|
d3388f2f01 | ||
|
|
4416605d85 | ||
|
|
f28f4b59d6 | ||
|
|
ded74c787f | ||
|
|
3916649e73 | ||
|
|
c293b3b2ec | ||
|
|
ca47631472 | ||
|
|
e19520e7df | ||
|
|
37f2606aed | ||
|
|
f77c7efbd6 | ||
|
|
0cc3e4fe6d | ||
|
|
b620f543a2 | ||
|
|
32b29f140f | ||
|
|
0467fed532 | ||
|
|
24eb593a29 | ||
|
|
57e2106baa | ||
|
|
8cbe6181f1 | ||
|
|
d694867474 | ||
|
|
f178c45d16 | ||
|
|
348763d4d6 | ||
|
|
9f4b571ddf | ||
|
|
77a2ab7c46 | ||
|
|
fe124dfe9c | ||
|
|
8f46a44cca | ||
|
|
7414d116fd | ||
|
|
602bc03d02 | ||
|
|
e0d821a7ed | ||
|
|
795e23aba6 | ||
|
|
4979fe856e | ||
|
|
beae026a0b | ||
|
|
3ba64b6108 | ||
|
|
ffa34d67bd | ||
|
|
5be3692ab6 | ||
|
|
10eed8723e | ||
|
|
1afbb79402 | ||
|
|
289eb8e395 | ||
|
|
30ed450a4f | ||
|
|
00d8cc9c94 | ||
|
|
cb4edd2a0f | ||
|
|
04ea3398f9 | ||
|
|
295ee0e81e | ||
|
|
adca6a7039 | ||
|
|
9c755d453a | ||
|
|
a1fa64fdfb | ||
|
|
522c8bb8cc | ||
|
|
4ab62f817d | ||
|
|
e98e2612bf | ||
|
|
e45d07cfd7 | ||
|
|
07fda78fdc | ||
|
|
64f4399382 | ||
|
|
98fc65debd | ||
|
|
7cf66890fd | ||
|
|
e3509453cd | ||
|
|
944f3bf221 | ||
|
|
a89a54bbac | ||
|
|
f09021d859 | ||
|
|
35b0c23be8 | ||
|
|
d32bf23ebe | ||
|
|
e02ee95198 | ||
|
|
05ab9a8664 | ||
|
|
33a0a34938 | ||
|
|
00640bd360 | ||
|
|
e361284c4c | ||
|
|
a49a8fc7ba | ||
|
|
501855e777 | ||
|
|
ad08c45352 | ||
|
|
d7d249308a | ||
|
|
a929d88dc4 | ||
|
|
faed4a9111 | ||
|
|
73fba3b449 | ||
|
|
18abbaf506 | ||
|
|
7fb322d4d8 | ||
|
|
2528d3506e | ||
|
|
60a56aade2 | ||
|
|
801fc83986 | ||
|
|
27bdc3272b | ||
|
|
c15179b215 | ||
|
|
357572d401 | ||
|
|
4ad5457b0f | ||
|
|
29fface258 | ||
|
|
ee76e3bd87 | ||
|
|
c5c04ae262 | ||
|
|
c708b37b76 | ||
|
|
eef2053a23 | ||
|
|
4621e73ec9 | ||
|
|
4b70d69397 | ||
|
|
f251935ec6 | ||
|
|
2dba0277f3 | ||
|
|
bc2b9e8d04 | ||
|
|
c5155ceafa | ||
|
|
fa85b8129a | ||
|
|
0f94c3e3d3 | ||
|
|
12d3ef937e | ||
|
|
666b1a2214 | ||
|
|
379dbfbed7 | ||
|
|
48c4cf9a89 | ||
|
|
8da2360798 | ||
|
|
143b61bfe1 | ||
|
|
26d3d12236 | ||
|
|
2a0968e786 | ||
|
|
4f645903b2 | ||
|
|
38489aa117 | ||
|
|
e01b298e05 | ||
|
|
e8d41675ae | ||
|
|
3f5e75ab45 | ||
|
|
096b932daa | ||
|
|
bf60bb50ae | ||
|
|
8569a1b85b | ||
|
|
040477a8c3 | ||
|
|
ce0035cd76 | ||
|
|
af9e081643 | ||
|
|
cfa16bc8e2 | ||
|
|
fd0edd28f6 | ||
|
|
f3dc79a66f | ||
|
|
2646e89a25 | ||
|
|
65c3761ff8 | ||
|
|
ced41b50e3 | ||
|
|
0164de9aaa | ||
|
|
0210488fe9 | ||
|
|
482fe16e75 | ||
|
|
a7c5533121 | ||
|
|
3ff0c394ce | ||
|
|
1b13be1eaa | ||
|
|
88a49b00e4 | ||
|
|
052fc9551c | ||
|
|
32d969ed3e | ||
|
|
9f570eddd7 | ||
|
|
a6466b3c75 | ||
|
|
a2727e77f4 | ||
|
|
626550a082 | ||
|
|
41a4be4bb5 | ||
|
|
7baff2c54c | ||
|
|
647fe27bc0 | ||
|
|
6e55c61032 | ||
|
|
5877af3493 | ||
|
|
346897ac94 | ||
|
|
e8e483a92a | ||
|
|
9d68ecb5ab | ||
|
|
a84c428ab8 | ||
|
|
98d3a9189c | ||
|
|
25567fa381 | ||
|
|
03f7315ab8 | ||
|
|
540a27e7cc | ||
|
|
4f8a69d2e7 | ||
|
|
75c9246c5e | ||
|
|
83c641deef | ||
|
|
286e98ecef | ||
|
|
d432a88a8e | ||
|
|
bbbbb6b967 | ||
|
|
ffd657db9f | ||
|
|
aa56ae21d5 | ||
|
|
d5ea5318e0 | ||
|
|
1a4dbb2b55 | ||
|
|
8204c40a05 | ||
|
|
540227aff8 | ||
|
|
98eacf5bf5 | ||
|
|
a608348424 | ||
|
|
e812a4e738 | ||
|
|
dda34e021c | ||
|
|
b086ccc16d | ||
|
|
a1e488c72f | ||
|
|
0e8736586b | ||
|
|
773de2bd51 | ||
|
|
c97be551c0 | ||
|
|
b38829ae32 | ||
|
|
e45e848501 | ||
|
|
9bac2c1ca8 | ||
|
|
9146147438 | ||
|
|
68158d96a3 | ||
|
|
85febce168 | ||
|
|
07d5f63d7c | ||
|
|
e9fcc39470 | ||
|
|
a3b55e341f | ||
|
|
5f1c289f5b | ||
|
|
b5c8069e21 | ||
|
|
278baa44f9 | ||
|
|
eb28c98da9 | ||
|
|
857cda0552 | ||
|
|
5999a984ba | ||
|
|
d5c7f7dc4f | ||
|
|
b7e4a46476 | ||
|
|
3483f4e411 | ||
|
|
5c0eb29f21 | ||
|
|
a2dc5913fa | ||
|
|
bd99afa14b | ||
|
|
1b14e70df0 | ||
|
|
d6c9d97d08 | ||
|
|
975bbb08a1 | ||
|
|
b495fc75f0 | ||
|
|
8eaec1682e | ||
|
|
22ed24a058 | ||
|
|
884bef9774 | ||
|
|
a070626ee1 | ||
|
|
f644adbb1b | ||
|
|
f1cf3aa3f2 | ||
|
|
d29c6382f7 | ||
|
|
17115e09cc | ||
|
|
c8d805e174 | ||
|
|
54638c619c | ||
|
|
6239149ec6 | ||
|
|
31ff6b4716 | ||
|
|
36cad5ee4c | ||
|
|
dc305d210c | ||
|
|
f445be86ab | ||
|
|
15d5b4cf17 | ||
|
|
ee98aed55d | ||
|
|
07cff9da83 | ||
|
|
0cbb0b248a | ||
|
|
a864feec10 | ||
|
|
f81c170e2c | ||
|
|
39670e378f | ||
|
|
6e3edc96ac | ||
|
|
983f3d86a7 | ||
|
|
4a45b8966a | ||
|
|
972dba5774 | ||
|
|
ff46e167df | ||
|
|
12a119e20e | ||
|
|
671b1127ec | ||
|
|
6c23adcf6c | ||
|
|
eadedd1401 | ||
|
|
f282f0203f | ||
|
|
dd014127df | ||
|
|
0ef83e9ba8 | ||
|
|
77bd6addc4 | ||
|
|
970f65092a | ||
|
|
d06a15f132 | ||
|
|
2794bf3c6b | ||
|
|
0fe251f881 | ||
|
|
6bc57455ea | ||
|
|
74ed612c15 | ||
|
|
f480869992 | ||
|
|
022baa8727 | ||
|
|
6af9994c0c | ||
|
|
89e566c932 | ||
|
|
cf79e467b3 | ||
|
|
db814c1ab0 | ||
|
|
1b3ccfb2db | ||
|
|
4f0b3728cb | ||
|
|
83972256ed | ||
|
|
336698cb72 | ||
|
|
ceb669dfc8 | ||
|
|
588de3bc03 | ||
|
|
cd34f1885c | ||
|
|
61d061d69e | ||
|
|
07304a2dcc | ||
|
|
ae6ad884f7 | ||
|
|
65408e3a44 | ||
|
|
5780b7208a | ||
|
|
8541b221ad | ||
|
|
a94d3a19c8 | ||
|
|
c94a8d5f9a | ||
|
|
34d9432651 | ||
|
|
c57e4165d0 | ||
|
|
be1c8a264e | ||
|
|
f6d8d069cc | ||
|
|
2909ce6cc8 | ||
|
|
ba6f0264a6 | ||
|
|
15e1976715 | ||
|
|
88bb6ff176 | ||
|
|
cbdc47170f | ||
|
|
5cb2a193c6 | ||
|
|
cf4d0f9393 | ||
|
|
a0a17bcfa1 | ||
|
|
ae40f651be | ||
|
|
3df926cfc1 | ||
|
|
304233218a | ||
|
|
642c680cae | ||
|
|
da4b64ed95 | ||
|
|
0565f5f522 | ||
|
|
7d5b2b8d30 | ||
|
|
019a882fe9 | ||
|
|
978df5ad75 | ||
|
|
02b94979b3 | ||
|
|
c1a513610b | ||
|
|
961b2c3f4d | ||
|
|
bdd1726328 | ||
|
|
f37ae5b1ce | ||
|
|
6a957a9099 | ||
|
|
f7de15d369 | ||
|
|
b5ca2c8b60 | ||
|
|
4be2a84315 | ||
|
|
647c56920e | ||
|
|
f1c5ae505e | ||
|
|
6f857e6077 | ||
|
|
b975869e1f | ||
|
|
29e0e4b8ce | ||
|
|
2c4a366d7b | ||
|
|
cc10cfe0c5 | ||
|
|
98187fe4a4 | ||
|
|
19e4e9d5b6 | ||
|
|
72ab301a2a | ||
|
|
67706293d3 | ||
|
|
99616d4e79 | ||
|
|
bc677e6c21 | ||
|
|
309da77301 | ||
|
|
849e75bb6c | ||
|
|
9de99bcca2 | ||
|
|
7caac2e62c | ||
|
|
1126fa03b4 | ||
|
|
8469c5e6da | ||
|
|
5e9abec9dd | ||
|
|
2b9283b336 | ||
|
|
90a073bb39 | ||
|
|
f357a58b9e | ||
|
|
55f254e7a2 | ||
|
|
58d86aeb86 | ||
|
|
53b3d131b6 | ||
|
|
ec35a07f52 | ||
|
|
d81a15195b | ||
|
|
58cffafefc | ||
|
|
58b82b8a30 | ||
|
|
629bf0aad1 | ||
|
|
a60ad3abd3 | ||
|
|
66c80a490b | ||
|
|
657512a470 | ||
|
|
239406053f | ||
|
|
93050ae34b | ||
|
|
da357eed7a | ||
|
|
ee50d69f03 | ||
|
|
06f145a11c | ||
|
|
819ba1fe04 | ||
|
|
4965c4ce59 | ||
|
|
adf356ae33 | ||
|
|
c4543a73af | ||
|
|
5f688a6949 | ||
|
|
d93199968d | ||
|
|
c7f9fb09a0 | ||
|
|
20e8694566 | ||
|
|
60b14d5315 | ||
|
|
48c5453f0a | ||
|
|
8f3fc8c081 | ||
|
|
578c38c418 | ||
|
|
cb945041be | ||
|
|
4096c1cf67 | ||
|
|
0ecc8ac016 | ||
|
|
0a3b201ee7 | ||
|
|
0584b07275 | ||
|
|
dc6bc5d04f | ||
|
|
8b5d7bfb05 | ||
|
|
18078ca1c0 | ||
|
|
feacca7391 | ||
|
|
c6141b97f6 | ||
|
|
be37fc3941 | ||
|
|
3f9f0c00de | ||
|
|
fc4ff29533 | ||
|
|
12d5d88204 | ||
|
|
47927abc8e | ||
|
|
a34992c61e | ||
|
|
a0bc982d69 | ||
|
|
7dcce35087 | ||
|
|
16d2906ff6 | ||
|
|
dba0aa2ee2 | ||
|
|
c9947bc42c | ||
|
|
3db5b990ce | ||
|
|
04057654f9 | ||
|
|
960157cace | ||
|
|
ec3024d132 | ||
|
|
bddfe706de | ||
|
|
0199e867a8 | ||
|
|
786f7795ed | ||
|
|
9ff6e42e8e | ||
|
|
0bdbb6e736 | ||
|
|
6dcf47f4db | ||
|
|
b259b34768 | ||
|
|
a1d0343352 | ||
|
|
88d047201e | ||
|
|
37e7ff8498 | ||
|
|
67d8d941ba | ||
|
|
17b11937c3 | ||
|
|
5184ed6ccb | ||
|
|
8e9c536b7c | ||
|
|
f0a684d7e1 | ||
|
|
2bfb7c7aab | ||
|
|
cbbc24636c | ||
|
|
118e6874cd | ||
|
|
543005bd37 | ||
|
|
ce68bb730e | ||
|
|
78aa2ee84b | ||
|
|
f349f19550 | ||
|
|
f9ff2edcd6 | ||
|
|
9268961556 | ||
|
|
5e5c1726ed | ||
|
|
7bf9e333c5 | ||
|
|
2656b1709e | ||
|
|
36d1ea7a05 | ||
|
|
6025da2850 | ||
|
|
bd14d7aa42 | ||
|
|
84edfcb8ea | ||
|
|
bf96235054 | ||
|
|
0578c961a1 | ||
|
|
61a62ba452 | ||
|
|
86a35de57c | ||
|
|
528c0814fb | ||
|
|
848db89b1a | ||
|
|
1f5a7c3a5f | ||
|
|
45a8f7f61e | ||
|
|
e2f8a62f44 | ||
|
|
9e24d2d4db | ||
|
|
c93f32837d | ||
|
|
42db0b8502 | ||
|
|
7d2fde6e03 | ||
|
|
7d73841907 | ||
|
|
e68d542ad2 | ||
|
|
bab945b242 | ||
|
|
7cac47d279 | ||
|
|
b9e23bf855 | ||
|
|
a0f749d4ab | ||
|
|
a466d04810 | ||
|
|
42ef838819 | ||
|
|
7f9fd4c819 | ||
|
|
06ac511ae6 | ||
|
|
d6cc901937 | ||
|
|
40282b2e14 | ||
|
|
55b9b9728b | ||
|
|
d549f79aba | ||
|
|
cef5191233 | ||
|
|
ba2df603c3 | ||
|
|
6f4ef58d2b | ||
|
|
7b4f6ac9f0 | ||
|
|
c8cf7b8046 | ||
|
|
035ebd64dc | ||
|
|
1857be65c2 | ||
|
|
69a13a9745 | ||
|
|
25efb93877 | ||
|
|
889aa4fd43 | ||
|
|
eb3a643f76 | ||
|
|
da37740ef3 | ||
|
|
9d06a7f55a | ||
|
|
649c891881 | ||
|
|
860cc815fb | ||
|
|
e03922ef13 | ||
|
|
ea89da4cc6 | ||
|
|
3c3542c7d0 | ||
|
|
0299014ca1 | ||
|
|
f209be7487 | ||
|
|
a8199ee756 | ||
|
|
dab2bb9c55 | ||
|
|
732109ed1f | ||
|
|
ad34c51d9d | ||
|
|
2616e4d5d1 | ||
|
|
e4e4c3f468 | ||
|
|
a59ff2495c | ||
|
|
63903f6d1c | ||
|
|
d2f4e01d30 | ||
|
|
d7a0aa0c04 | ||
|
|
0db04942d6 | ||
|
|
44ab4adc43 | ||
|
|
e439953fdb | ||
|
|
dbc61f9ecb | ||
|
|
6ecf19e935 | ||
|
|
c56f482516 | ||
|
|
65f33e40d5 | ||
|
|
0660ef0228 | ||
|
|
137539e85c | ||
|
|
f0394bb5bc | ||
|
|
bc93bc523f | ||
|
|
85ca25069d | ||
|
|
24d2ff71b2 | ||
|
|
c838216c1f | ||
|
|
eb03d33edd | ||
|
|
3dea13c354 | ||
|
|
e9ba75b967 | ||
|
|
9d32e0d027 | ||
|
|
31560787e3 | ||
|
|
6b9a6dc97f | ||
|
|
5060947d16 | ||
|
|
e434667ad3 | ||
|
|
e3a6368efa | ||
|
|
f85f87f3e6 | ||
|
|
ce814af3d3 | ||
|
|
039e5e56b7 | ||
|
|
b679693203 | ||
|
|
c45ce32742 | ||
|
|
8f128ac6b5 | ||
|
|
8184ada7a1 | ||
|
|
0a26861444 | ||
|
|
fdc8b81fd0 | ||
|
|
94db496d30 | ||
|
|
5a782bbe45 | ||
|
|
a80a2b7985 | ||
|
|
53e4dd7b81 | ||
|
|
955a7fbd8b | ||
|
|
9fa172ef36 | ||
|
|
ffce653d16 | ||
|
|
852ba63038 | ||
|
|
58132cb189 | ||
|
|
e96329f976 | ||
|
|
88cf4af2a7 | ||
|
|
fce2c5e4be | ||
|
|
b105d83b12 | ||
|
|
25cf9f1bb9 | ||
|
|
88f287aa0d | ||
|
|
34142c510f | ||
|
|
4701885a59 | ||
|
|
09275f1414 | ||
|
|
bfc18fd307 | ||
|
|
92d7fd429a | ||
|
|
007a25bb94 | ||
|
|
d27dc1eb4f | ||
|
|
661e2ba8c5 | ||
|
|
5fcb1e0785 | ||
|
|
2a526f3cea | ||
|
|
ff917d663e | ||
|
|
8bf2b9e4cc | ||
|
|
5446400eee | ||
|
|
0f8c2f87be | ||
|
|
9aba74877e | ||
|
|
137229a3ca | ||
|
|
af15ec6b79 | ||
|
|
280f090a67 | ||
|
|
8bdfe1855d | ||
|
|
62e755042c | ||
|
|
a2fab582d5 | ||
|
|
b1b88e75e4 | ||
|
|
4daf567f44 | ||
|
|
6e57a2a316 | ||
|
|
c9ff45f2b9 | ||
|
|
d89aa90d12 | ||
|
|
d9325787a0 | ||
|
|
5a0c04dc69 | ||
|
|
95f321d590 | ||
|
|
ef7b1520ff | ||
|
|
7f0657ae8f | ||
|
|
35394d5d22 | ||
|
|
4d90adc36d | ||
|
|
471684ad8c | ||
|
|
f7bf764458 | ||
|
|
de4bd9dcdd | ||
|
|
a1f1a8a31d | ||
|
|
44b7eee5ee | ||
|
|
6e4e4aff7e | ||
|
|
7ba1265d55 | ||
|
|
297107da28 | ||
|
|
0336390a8e | ||
|
|
b575e77563 | ||
|
|
3a165886c8 | ||
|
|
6ba3706458 | ||
|
|
0b6cf684dc | ||
|
|
290140524e | ||
|
|
ce2fefa5b3 | ||
|
|
03395131d8 | ||
|
|
15cc5b9486 | ||
|
|
f255df3af2 | ||
|
|
b11baf8860 | ||
|
|
954699e87f | ||
|
|
1af0894820 | ||
|
|
f3a17959be | ||
|
|
effc26672f | ||
|
|
2b16753f6b | ||
|
|
ff57a39d24 | ||
|
|
f635e76154 | ||
|
|
119b4a6eb3 | ||
|
|
73aeec2edb | ||
|
|
d5a73a0a60 | ||
|
|
c703b832e2 | ||
|
|
b92d6d459a | ||
|
|
597b1b2abd | ||
|
|
725797b5fa | ||
|
|
5a9f1c1c31 | ||
|
|
b591944a76 | ||
|
|
93194d0f8f | ||
|
|
303f5361ec | ||
|
|
189b3e7dcd | ||
|
|
d7116c0c68 | ||
|
|
742e2a243d | ||
|
|
b6a5ea76c0 | ||
|
|
a7aafdb348 | ||
|
|
dff7e39b07 | ||
|
|
e0a7cd903b | ||
|
|
985d6b5161 | ||
|
|
83fccfe83b | ||
|
|
201428da47 | ||
|
|
4830b58b13 | ||
|
|
fa04f50c9d | ||
|
|
f9a24fc43e | ||
|
|
9283b4561d | ||
|
|
421dc71274 | ||
|
|
5ea3036921 | ||
|
|
0f9c691717 | ||
|
|
853b7d9885 | ||
|
|
f2c6900d7e | ||
|
|
112e52f3d4 | ||
|
|
f72a1038cd | ||
|
|
4c738bbc51 | ||
|
|
d355002da3 | ||
|
|
09630570e6 | ||
|
|
be6df9bb30 | ||
|
|
210ee0c70e | ||
|
|
63d37695e4 | ||
|
|
c0396766ac | ||
|
|
bf56ecdcff | ||
|
|
e61efba78c | ||
|
|
26f67d7792 | ||
|
|
eaea820658 | ||
|
|
a424c8c17b | ||
|
|
a87fc341f2 | ||
|
|
b5d81026cd | ||
|
|
91a1cca29c | ||
|
|
b3a335dedd | ||
|
|
b7cd36fbdf | ||
|
|
610ba939fa | ||
|
|
84d7f71f59 | ||
|
|
b3c0fe3dd0 | ||
|
|
327b40ecd8 | ||
|
|
12f6bd75b5 | ||
|
|
bf05419946 | ||
|
|
4bdfca3b5f | ||
|
|
3029671d53 | ||
|
|
e31362aac4 | ||
|
|
17c14e9ab0 | ||
|
|
1065fe0568 | ||
|
|
6ad844a9d8 | ||
|
|
83baeaacf0 | ||
|
|
b8c2fb9971 | ||
|
|
91a77ae201 | ||
|
|
b7e9f1b1e8 | ||
|
|
05dfd69cda | ||
|
|
eda6852309 | ||
|
|
1096efe312 | ||
|
|
2eefe6c8c6 | ||
|
|
a42feafa8c | ||
|
|
e8b6d155f7 | ||
|
|
06078396c9 | ||
|
|
c375a93d8e | ||
|
|
4b66528894 | ||
|
|
d4d0e19d2f | ||
|
|
a1c4f065a2 | ||
|
|
44aa752e70 | ||
|
|
627e0b63e7 | ||
|
|
c747ea17d5 | ||
|
|
be493eed1f | ||
|
|
aed0fbf45a | ||
|
|
4649924c04 | ||
|
|
25ff9a0267 | ||
|
|
1d4fafd7c5 | ||
|
|
0af0d2fbaf | ||
|
|
67fb8f2eda | ||
|
|
2715d32d15 | ||
|
|
b215f1779d | ||
|
|
d08bddd72e | ||
|
|
88f296c90e | ||
|
|
1a4cb27e01 | ||
|
|
9c4aad8db0 | ||
|
|
6cbe43eb59 | ||
|
|
a653d47e3c | ||
|
|
4a37de57e4 | ||
|
|
5158fa86d3 | ||
|
|
8f6ebd62e1 | ||
|
|
ee5ccd0bff | ||
|
|
8859d8b229 | ||
|
|
61bf1fbcd7 | ||
|
|
88ed2ad2f6 | ||
|
|
8c37001cfc | ||
|
|
0a1a0a811a | ||
|
|
873eef75ca | ||
|
|
8362447dac | ||
|
|
60c47ff82c | ||
|
|
581808a123 | ||
|
|
189cbdd645 | ||
|
|
c279dd7932 | ||
|
|
f9872700d9 | ||
|
|
f705401896 | ||
|
|
30a0404c4a | ||
|
|
00d888817f | ||
|
|
20b672085e | ||
|
|
22ba572d75 | ||
|
|
aeb25f21ff | ||
|
|
c098ea4ecf | ||
|
|
d4f9926079 | ||
|
|
59b5687420 | ||
|
|
813f0c4800 | ||
|
|
1e566ce990 | ||
|
|
cf2d6e7cb3 | ||
|
|
450c5f161c | ||
|
|
b8294b63e0 | ||
|
|
21fb3fc395 | ||
|
|
dd2c360780 | ||
|
|
e8193c2bb7 | ||
|
|
76a9520557 | ||
|
|
c2d94ce183 | ||
|
|
21e099bb5f | ||
|
|
1597a2aaad | ||
|
|
29f9b24592 | ||
|
|
96ae6987cb | ||
|
|
d1638863a4 | ||
|
|
a836462df1 | ||
|
|
95e1bbc439 | ||
|
|
db86e701e4 | ||
|
|
7ba90fe741 | ||
|
|
81d16343a7 | ||
|
|
39a5fcf434 | ||
|
|
e1a078fea5 | ||
|
|
7452dfd2bb | ||
|
|
f1e3dc49e6 | ||
|
|
8129e59250 | ||
|
|
beb123cd19 | ||
|
|
605de42f67 | ||
|
|
591c7aa69b | ||
|
|
796968122b | ||
|
|
6e65ea3d03 | ||
|
|
c1bdd7da54 | ||
|
|
b5bb42c68d | ||
|
|
5ed58d8f24 | ||
|
|
3620113a71 | ||
|
|
43803dab12 | ||
|
|
680d85f1bc | ||
|
|
0af51083b2 | ||
|
|
626aedb18a | ||
|
|
6f51c67828 | ||
|
|
071ee7f39a | ||
|
|
205a8cee2f | ||
|
|
63905025bf | ||
|
|
c632d32b87 | ||
|
|
4fe8633978 | ||
|
|
fec2824464 | ||
|
|
8eaead0ef5 | ||
|
|
c819bbec9c | ||
|
|
f8cf178440 | ||
|
|
79f921e99c | ||
|
|
067c173995 | ||
|
|
f093126726 | ||
|
|
086a30c18a | ||
|
|
e505438203 | ||
|
|
fcddc2778f | ||
|
|
f0c72e663c | ||
|
|
188f565409 | ||
|
|
3a2da38c6f | ||
|
|
4668073522 | ||
|
|
066cd31616 | ||
|
|
1c1cf8e959 | ||
|
|
7097d9bf84 | ||
|
|
7f6b5a7115 | ||
|
|
3523ad8756 | ||
|
|
56f21880ba | ||
|
|
d3098a7f40 | ||
|
|
c2ecffd775 | ||
|
|
ba166ac55b | ||
|
|
d569956ff2 | ||
|
|
1d43f75318 | ||
|
|
0518531f02 | ||
|
|
806883ca34 | ||
|
|
20ef25ecb5 | ||
|
|
9563dba722 | ||
|
|
1dfd0e6f9a | ||
|
|
45eef605ae | ||
|
|
41c3b01769 | ||
|
|
6c7afe5bfe | ||
|
|
5cc19470f7 | ||
|
|
cc9caa7017 | ||
|
|
98da0d4c6e | ||
|
|
b134a37408 | ||
|
|
ef130e4c15 | ||
|
|
4d255c1df4 | ||
|
|
2e33d94955 | ||
|
|
52dddb800c | ||
|
|
0a3babfbce | ||
|
|
0265dd8826 | ||
|
|
f4f80f667b | ||
|
|
3345394bb4 | ||
|
|
836cd1a047 | ||
|
|
ba5db23ae6 | ||
|
|
32b62adc96 | ||
|
|
7642088db0 | ||
|
|
17072c4144 | ||
|
|
204f66a9bf | ||
|
|
960c055fb5 | ||
|
|
646152d3e1 | ||
|
|
b134eaa88a | ||
|
|
4748739155 | ||
|
|
f29eeda845 | ||
|
|
44f233fa26 | ||
|
|
b5614bb3d8 | ||
|
|
97109f4ba5 | ||
|
|
0f49eb2f8c | ||
|
|
46a4b6929e | ||
|
|
15b453c3ab | ||
|
|
8989a65f03 | ||
|
|
62d297c8a5 | ||
|
|
71250e3d92 | ||
|
|
ab99a48f0a | ||
|
|
49b9ebe128 | ||
|
|
1638e2e3af | ||
|
|
99b8b0ac11 | ||
|
|
9cfd27ebf1 | ||
|
|
a907ff5004 | ||
|
|
27fc5c3e89 | ||
|
|
1ad3d7ef4b | ||
|
|
f399d757e5 | ||
|
|
c389c5b20b | ||
|
|
b83c513093 | ||
|
|
2edfeef095 | ||
|
|
3975806078 | ||
|
|
99759008c8 | ||
|
|
e96e342975 | ||
|
|
a339ef3c8f | ||
|
|
be9b189a61 | ||
|
|
d8e181fdda | ||
|
|
ad8e7e09c3 | ||
|
|
10698fa666 | ||
|
|
fcc0477593 | ||
|
|
cb0e2aaa4b | ||
|
|
6964af008b | ||
|
|
a4b201a2fa | ||
|
|
326746552a | ||
|
|
680a5439ff | ||
|
|
9157854799 | ||
|
|
da6d8c1c5e | ||
|
|
186447109b | ||
|
|
eddba39d4a | ||
|
|
96b3a375b0 | ||
|
|
028a8c4a6f | ||
|
|
ebe1e7243e | ||
|
|
1965bedf3a | ||
|
|
e98ca4c8d4 | ||
|
|
62bdb576ab | ||
|
|
9556262880 | ||
|
|
f1456dba3a | ||
|
|
8650b0814c | ||
|
|
55f84b400d | ||
|
|
4971b7518b | ||
|
|
9979058faf | ||
|
|
21822dae37 | ||
|
|
f7fb050e1d | ||
|
|
7ad95a66d8 | ||
|
|
669ead9e79 | ||
|
|
dc787c5b0d | ||
|
|
cab3404645 | ||
|
|
9aa8421117 | ||
|
|
496392a382 | ||
|
|
6ed378b8e0 | ||
|
|
d329d92713 | ||
|
|
2594df56ad | ||
|
|
66e028f950 | ||
|
|
637b7b0477 | ||
|
|
7d607f9936 | ||
|
|
e3efb4dbe5 | ||
|
|
cbf00fec5e | ||
|
|
a118536f4a | ||
|
|
c2ab8caeff | ||
|
|
7104cbf0e9 | ||
|
|
9c3ae7a4f5 | ||
|
|
f25ca0934c | ||
|
|
64659f3794 | ||
|
|
58a4575ab9 | ||
|
|
661e51671a | ||
|
|
d1c1dc018b | ||
|
|
ba8257e958 | ||
|
|
3a95d5916e | ||
|
|
1287ff69ac | ||
|
|
157472ee67 | ||
|
|
ec99b83817 | ||
|
|
8f81311203 | ||
|
|
2f6463b30a | ||
|
|
491472a364 | ||
|
|
3aca4c64d2 | ||
|
|
ec48fbd335 | ||
|
|
3b5fefe9fc | ||
|
|
d018756673 | ||
|
|
ef7f3f1fa8 | ||
|
|
fe3c1ebda1 | ||
|
|
f483a52242 | ||
|
|
822157f2e6 | ||
|
|
2d2b11f4fc | ||
|
|
9c6bcc07ae | ||
|
|
5ff5d35833 | ||
|
|
6dd6397fde | ||
|
|
26e41f0fc2 | ||
|
|
33539e8bbd | ||
|
|
fe7c7ead18 | ||
|
|
2f44dd1d7c | ||
|
|
c211d3f435 | ||
|
|
10da9a65c6 | ||
|
|
47daf651e6 | ||
|
|
f0b52a9e4d | ||
|
|
ae98178075 | ||
|
|
36286bc457 | ||
|
|
a47d8c3fbb | ||
|
|
2b62a770f7 | ||
|
|
e2c17c8716 | ||
|
|
0bce4c79b3 | ||
|
|
913dc39156 | ||
|
|
d722e115a8 | ||
|
|
5cfed28caf | ||
|
|
74c1e22610 | ||
|
|
575bda2955 | ||
|
|
c1ef9eb92b | ||
|
|
4cb8bbe72e | ||
|
|
25f6afcb8f | ||
|
|
b9bf5b95fa | ||
|
|
8c9b135dc1 | ||
|
|
cc1f6999cc | ||
|
|
6219ecdc79 | ||
|
|
0878696b79 | ||
|
|
ab067bd20c | ||
|
|
3b4cc94518 | ||
|
|
94d3157c4d | ||
|
|
0e48d65549 | ||
|
|
89e55a20d4 | ||
|
|
5298a0a032 | ||
|
|
410255ba37 | ||
|
|
5463e54926 | ||
|
|
3e0cd4a9bd | ||
|
|
864abd24fc | ||
|
|
72705d9806 | ||
|
|
14283c0776 | ||
|
|
e5a702e541 | ||
|
|
8f80e1fb84 | ||
|
|
5063b4a4c0 | ||
|
|
f0549e2660 | ||
|
|
d038bcc0d5 | ||
|
|
a28f1fb586 | ||
|
|
8ad3beb72f | ||
|
|
1a46c85e6e | ||
|
|
3a5f562c20 | ||
|
|
70d62f51f8 | ||
|
|
c3acffd829 | ||
|
|
4688608ba1 | ||
|
|
221e3a168f | ||
|
|
bfbd95f9c1 | ||
|
|
45725dc820 | ||
|
|
e55db10b70 | ||
|
|
ba82e08470 | ||
|
|
eee2bb7295 | ||
|
|
91dab53a59 | ||
|
|
15aab73376 | ||
|
|
fc8108fc2c | ||
|
|
0c5940c341 | ||
|
|
666cd14789 | ||
|
|
0370c8143e | ||
|
|
b20e80b840 | ||
|
|
adb4c8c12f | ||
|
|
b856619331 | ||
|
|
3f8b5ad3aa | ||
|
|
8b06ce15aa | ||
|
|
6bb54394a0 | ||
|
|
0bd3200155 | ||
|
|
8d22fdb41c | ||
|
|
3a08cfc583 | ||
|
|
7677934244 | ||
|
|
13726fa08e | ||
|
|
f609e92c0d | ||
|
|
085842a8e9 | ||
|
|
89ad6426ed | ||
|
|
f3cfa2c8ed | ||
|
|
a34f51e6b6 | ||
|
|
222ae92d36 | ||
|
|
b05633aae5 | ||
|
|
32b98e09f6 | ||
|
|
c78ea43ea2 | ||
|
|
355a643ff7 | ||
|
|
a252ddf74e | ||
|
|
8ca88755c1 | ||
|
|
32f297353a | ||
|
|
41d6acdf36 | ||
|
|
19e6374e03 | ||
|
|
374502c6d8 | ||
|
|
f9776463c1 | ||
|
|
f48a58a76a | ||
|
|
d7944855ad | ||
|
|
9ef8287be7 | ||
|
|
c750971b0e | ||
|
|
36a0811776 | ||
|
|
508dbd01a8 | ||
|
|
ebb37b85c8 | ||
|
|
8e04a34e41 | ||
|
|
8a510086b1 | ||
|
|
f01f3d5e4e | ||
|
|
e78b77de9e | ||
|
|
42766724fa | ||
|
|
2cf447f660 | ||
|
|
b18f2848f4 | ||
|
|
a1d1bac49f | ||
|
|
37cda13162 | ||
|
|
1a1b190e5e | ||
|
|
633f58d074 | ||
|
|
624fd832e3 | ||
|
|
60c43e99bd | ||
|
|
cf5829af8f | ||
|
|
6de0c44b14 | ||
|
|
736c2c777a | ||
|
|
eb748457df | ||
|
|
e597ad5c59 | ||
|
|
ec68abb7e3 | ||
|
|
38272052d7 | ||
|
|
d23f53b9d2 | ||
|
|
c031cfee22 | ||
|
|
12200c80c8 | ||
|
|
6e4e5ab817 | ||
|
|
d9de15be10 | ||
|
|
576c08c658 | ||
|
|
d29517c127 | ||
|
|
642a78364a | ||
|
|
2627d993c1 | ||
|
|
9d822e7ee9 | ||
|
|
03c05ff084 | ||
|
|
5604235ded | ||
|
|
53b7d9af6f | ||
|
|
433e83d931 | ||
|
|
5d523eabd6 | ||
|
|
cfb076a01b | ||
|
|
1d2138fefd | ||
|
|
e1b1543a25 | ||
|
|
13d4156ef1 | ||
|
|
877dc316ff | ||
|
|
b0ea3ef63d | ||
|
|
76abf9611d | ||
|
|
27d1846c2b | ||
|
|
56f27d1a86 | ||
|
|
95ff13d831 | ||
|
|
59727e294d | ||
|
|
1ea041c731 | ||
|
|
3134f07671 | ||
|
|
36d2cf2f21 | ||
|
|
adbe6a4dc6 | ||
|
|
6397053d25 | ||
|
|
f5781d48b3 | ||
|
|
cf1ed9aa66 | ||
|
|
03498a2b79 | ||
|
|
cee264d769 | ||
|
|
c931e551c8 | ||
|
|
f4e8d3b006 | ||
|
|
4fc9f98ce8 | ||
|
|
5a0715064d | ||
|
|
124b9d87d5 | ||
|
|
84c9f073bd | ||
|
|
05f68816c6 | ||
|
|
25315afe11 | ||
|
|
fde287199d | ||
|
|
a595600669 | ||
|
|
246eed6df3 | ||
|
|
db4ffb9c17 | ||
|
|
79c2b1533a | ||
|
|
9def80eae6 | ||
|
|
fa2ef5173b | ||
|
|
342a5ae1b8 | ||
|
|
92753d5ca4 | ||
|
|
0eef377ca9 | ||
|
|
a831d189d8 | ||
|
|
2a5f3124d5 | ||
|
|
f871ef84e9 | ||
|
|
383835d710 | ||
|
|
601568b6f0 | ||
|
|
60afcf60cc | ||
|
|
a351eece0b | ||
|
|
10a9e417ea | ||
|
|
787f337220 | ||
|
|
44aaea74ec | ||
|
|
4a346ce2d2 | ||
|
|
4ead4382a2 | ||
|
|
1e64e134f9 | ||
|
|
68190ece4b | ||
|
|
81d0bcf304 | ||
|
|
94364d711e | ||
|
|
2953942fbd | ||
|
|
51173352d2 | ||
|
|
1bec2b1160 | ||
|
|
4921453a1b | ||
|
|
95a4447eeb | ||
|
|
350b3f4ca7 | ||
|
|
a8172a1b06 | ||
|
|
df10d09736 | ||
|
|
4f31326b8e | ||
|
|
f0e557b5e4 | ||
|
|
80d19b1da1 | ||
|
|
df0855862f | ||
|
|
12f22554d8 | ||
|
|
d23fe9616c | ||
|
|
76fee43d3b | ||
|
|
e8fd5e2020 | ||
|
|
89faeb3ec1 | ||
|
|
a006af2654 | ||
|
|
4ea23c7cf5 | ||
|
|
1e7ead8e46 | ||
|
|
d88290474e | ||
|
|
75f17f0d3e | ||
|
|
8a21f88df9 | ||
|
|
5a01431670 | ||
|
|
7c90677d99 | ||
|
|
fe65530eb5 | ||
|
|
ecd806b1c5 | ||
|
|
72e59947b6 | ||
|
|
8869eb2f67 | ||
|
|
c7c54261cb | ||
|
|
27185ea88c | ||
|
|
bfe2c65bfd | ||
|
|
45dafc3d0d | ||
|
|
c9c31bba57 | ||
|
|
485e5cc8d2 | ||
|
|
175c927ee8 | ||
|
|
4392bf251b | ||
|
|
9616ea4c8f | ||
|
|
2a9162e809 | ||
|
|
df976b0a90 | ||
|
|
220b5fb02b | ||
|
|
a0a0d16af7 | ||
|
|
f97b298d00 | ||
|
|
6feba8a56d | ||
|
|
0ff61a2e4a | ||
|
|
aee6e7bb57 | ||
|
|
602a58cc40 | ||
|
|
5e45641687 | ||
|
|
8b2beec50c | ||
|
|
3278de673a | ||
|
|
3cf5fb3eeb | ||
|
|
d53a34b83f | ||
|
|
e4f0dba8fa | ||
|
|
3ea33a6dfa | ||
|
|
6b11ffb7cf | ||
|
|
3047204272 | ||
|
|
61af338a96 | ||
|
|
729414944b | ||
|
|
22dbd2814b | ||
|
|
44836d1e4d | ||
|
|
881c50dd1f | ||
|
|
ce7dfb1423 | ||
|
|
c45bd4057f | ||
|
|
3401340563 | ||
|
|
7f7d496beb | ||
|
|
c7ec9f97b7 | ||
|
|
3c58a29e73 | ||
|
|
7fd5658630 | ||
|
|
81f6783ca1 | ||
|
|
cf430fc1a8 | ||
|
|
7f6c9c696b | ||
|
|
7580a38b4f | ||
|
|
14532444bc | ||
|
|
f2a424027d | ||
|
|
f038eaed87 | ||
|
|
3f00773927 | ||
|
|
7e63a4cb18 | ||
|
|
e6fd475947 | ||
|
|
1869f8023d | ||
|
|
860f5ddbba | ||
|
|
218ef94c9c | ||
|
|
730e0acd99 | ||
|
|
c8afa129b5 | ||
|
|
ee0c21128d | ||
|
|
1aed46b71f | ||
|
|
4e38a928fc | ||
|
|
d58ba87dbb | ||
|
|
640e245cf8 | ||
|
|
f056dace88 | ||
|
|
3211f44770 | ||
|
|
bd5b1303f2 | ||
|
|
8ff0cad379 | ||
|
|
fdcd37c6d0 | ||
|
|
6a464325d7 | ||
|
|
3af0c20670 | ||
|
|
7ee10d4ca6 | ||
|
|
884c8d91e6 | ||
|
|
07b8e99b01 | ||
|
|
d74b70f864 | ||
|
|
e70fcd54eb | ||
|
|
ea5b80e3b8 | ||
|
|
b5cd83240f | ||
|
|
7d241d1400 | ||
|
|
ee2e1d53d2 | ||
|
|
36e0344345 | ||
|
|
eb6eebfd46 | ||
|
|
0de7850c39 | ||
|
|
5f1d2b9d10 | ||
|
|
0abd5531cb | ||
|
|
0fdcd088ec | ||
|
|
29df75263b | ||
|
|
5035b89956 | ||
|
|
9de5abff25 | ||
|
|
a113e0cd43 | ||
|
|
a2f5e69b76 | ||
|
|
0e41a87659 | ||
|
|
f6a6a7adb0 | ||
|
|
8abfee7b54 | ||
|
|
70038014a2 | ||
|
|
268c6a7e23 | ||
|
|
133165e79e | ||
|
|
99f2b2815d | ||
|
|
d6f0958652 | ||
|
|
6704e320da | ||
|
|
d0d09b93a4 | ||
|
|
155ab33086 | ||
|
|
55ed836400 | ||
|
|
6ac6a25803 | ||
|
|
26844cd290 | ||
|
|
7dc0f49809 | ||
|
|
71cd913135 | ||
|
|
dfa3ee901a | ||
|
|
f7131aaca0 | ||
|
|
fefb1374fd | ||
|
|
8f5165bd1b | ||
|
|
94a51da6fe | ||
|
|
e422a158ca | ||
|
|
b43d83291b | ||
|
|
e751938cdd | ||
|
|
b8321807dc | ||
|
|
3a42c12c00 | ||
|
|
d552fb458b | ||
|
|
a7b96d8582 | ||
|
|
18f188bb32 | ||
|
|
f44d3fd8d1 | ||
|
|
a0b8697a4f | ||
|
|
de8f463968 | ||
|
|
6642a46a04 | ||
|
|
0b856cbb83 | ||
|
|
e41c02e883 | ||
|
|
6f3dc4a010 | ||
|
|
d46eecc57c | ||
|
|
7223103905 | ||
|
|
547338c5b1 | ||
|
|
811aca8cfa | ||
|
|
0465a9eb8b | ||
|
|
45907e1ce5 | ||
|
|
3ff82ef8cd | ||
|
|
5f6cc373fe | ||
|
|
4801f6c6b9 | ||
|
|
02b4f6e178 | ||
|
|
b0161d41f8 | ||
|
|
d1702ccacf | ||
|
|
281be927a7 | ||
|
|
c352047991 | ||
|
|
c058fd4fb1 | ||
|
|
e4e5cb0f51 | ||
|
|
da611e384a | ||
|
|
5292bbff8b | ||
|
|
a22311c4e8 | ||
|
|
0d250fb56b | ||
|
|
5ba5d2fb08 | ||
|
|
51170c514d | ||
|
|
53cf4f1371 | ||
|
|
6ab6892f5b | ||
|
|
a38948ad2f | ||
|
|
0f56e859db | ||
|
|
365f863fc2 | ||
|
|
cf2e648a21 | ||
|
|
b7c077faad | ||
|
|
44d65c3cd7 | ||
|
|
069cece05e | ||
|
|
276524686a | ||
|
|
a46b3ad20b | ||
|
|
295096a9d7 | ||
|
|
0c6b994161 | ||
|
|
63e1ab4947 | ||
|
|
9ec2bac284 | ||
|
|
6fdbec1486 | ||
|
|
f11215c097 | ||
|
|
7ec5bb6a04 | ||
|
|
aae9bd8d8a | ||
|
|
cdf980ee8f | ||
|
|
7b23050791 | ||
|
|
faaa698e46 | ||
|
|
4b5c10a68e | ||
|
|
b00720d465 | ||
|
|
c4cf3049b2 | ||
|
|
f7e76bdbd8 | ||
|
|
4294fb39b2 | ||
|
|
eb2f810161 | ||
|
|
17e11063e3 | ||
|
|
70e2f724f7 | ||
|
|
f3787c812a | ||
|
|
a056a13f0b | ||
|
|
13d5b7a1d2 | ||
|
|
2c8a45153b | ||
|
|
be12633af1 | ||
|
|
81e4149b11 | ||
|
|
4b98f4a80a | ||
|
|
d83f37962d | ||
|
|
33b0d0674a | ||
|
|
b7f2c18c85 | ||
|
|
cda0e0c1d6 | ||
|
|
42eb9b5d71 | ||
|
|
35be40fb93 | ||
|
|
1d5c40d7a8 | ||
|
|
c1ea2e1810 | ||
|
|
f9562d495a | ||
|
|
58ad89ee4e | ||
|
|
b4a0800929 | ||
|
|
e27c92ef0e | ||
|
|
936c152ca6 | ||
|
|
fadd725662 | ||
|
|
ab5d30d0ce | ||
|
|
12ecc30e1f | ||
|
|
985cf69f0b | ||
|
|
ffa9deaf54 | ||
|
|
8613208b5f | ||
|
|
7b1bbb704a | ||
|
|
5acbdef022 | ||
|
|
96f855e930 | ||
|
|
c504ade7d4 | ||
|
|
5941b6dab4 | ||
|
|
33416b498c | ||
|
|
beb8941c80 | ||
|
|
33d8487adf | ||
|
|
cb5e9a2afe | ||
|
|
802a089c16 | ||
|
|
edad480e4f | ||
|
|
6181cbca97 | ||
|
|
572fb9e934 | ||
|
|
52dabed6ee | ||
|
|
d12d8fbd86 | ||
|
|
b0d57e63e3 | ||
|
|
baf3ff4e95 | ||
|
|
c061c0bae1 | ||
|
|
797c7d1a32 | ||
|
|
b1b63b11cd | ||
|
|
2ac8305eff | ||
|
|
eb9d9e0f1e | ||
|
|
9a1b447087 | ||
|
|
7fb8480138 | ||
|
|
ad26272524 | ||
|
|
147cf0f497 | ||
|
|
fa08f6b54a | ||
|
|
0f2d5fbd29 | ||
|
|
d645f4c02e | ||
|
|
f0af3f1562 | ||
|
|
b78699c9d5 | ||
|
|
c3f2ddd499 | ||
|
|
6f962ebfd0 | ||
|
|
7f768ced45 | ||
|
|
37e287d253 | ||
|
|
298e67a29d | ||
|
|
f1af69581e | ||
|
|
351b84ad96 | ||
|
|
e050bce77e | ||
|
|
01de27059d | ||
|
|
7407a2841b | ||
|
|
2f1a947cfc | ||
|
|
f26e5e33cc | ||
|
|
5a040cbd8e | ||
|
|
d2c383ef82 | ||
|
|
ffc89d07e9 | ||
|
|
2bae66f6fe | ||
|
|
09aaabf4c5 | ||
|
|
5de8c739f8 | ||
|
|
1220715e9b | ||
|
|
8cb194b3b9 | ||
|
|
dd4f6c3b9e | ||
|
|
1f6eabeeee | ||
|
|
0309dec38d | ||
|
|
143b80f630 | ||
|
|
6001ab425c | ||
|
|
817d187dd8 | ||
|
|
ab0e622dd9 | ||
|
|
1541c07e99 | ||
|
|
a823bf9739 | ||
|
|
ec79ccf008 | ||
|
|
bd5fb7adc6 | ||
|
|
5e80691b3e | ||
|
|
fbbb10b4e8 | ||
|
|
593a9f8592 | ||
|
|
45f3ab2f13 | ||
|
|
3422a49973 | ||
|
|
e70a661f2f | ||
|
|
7380a485fd | ||
|
|
ddbdf6fcab | ||
|
|
e3e7b16b6a | ||
|
|
4fc051acda | ||
|
|
281d284f67 | ||
|
|
f1a0cd3086 | ||
|
|
773b39f7e5 | ||
|
|
8608b3b397 | ||
|
|
8bbeace1b2 | ||
|
|
cb9ba1a2ff | ||
|
|
204d574457 | ||
|
|
21a8598f87 | ||
|
|
53dabf89fe | ||
|
|
512189af4e | ||
|
|
491b5cb23e | ||
|
|
8ae14a4cff | ||
|
|
c3de9950ac | ||
|
|
3b32ae3754 | ||
|
|
471eab4e93 | ||
|
|
d44ced1cd5 | ||
|
|
2d0212b2f8 | ||
|
|
b018c22922 | ||
|
|
bacfe4bec9 | ||
|
|
8295284b65 | ||
|
|
03842f1a42 | ||
|
|
9363ee3b48 | ||
|
|
42ed489a1c | ||
|
|
4993695a73 | ||
|
|
a56db0170c | ||
|
|
0ac19e4096 | ||
|
|
14328846a7 | ||
|
|
b3648e947d | ||
|
|
ca736ac139 | ||
|
|
cf7f943d82 | ||
|
|
e6e286edd0 | ||
|
|
6c86ed1f7f | ||
|
|
3a4c3fe37d | ||
|
|
ec67e93af0 | ||
|
|
88472c7de1 | ||
|
|
c0e8a46865 | ||
|
|
a7aa574d8c | ||
|
|
e32df95471 | ||
|
|
c19cdd3703 | ||
|
|
1fafff21b9 | ||
|
|
bf11e4c6e6 | ||
|
|
37750c642b | ||
|
|
9340e3c6cd | ||
|
|
280f88de2e | ||
|
|
5b8f19b425 | ||
|
|
fe7da90f30 | ||
|
|
2b1cf79f46 | ||
|
|
5513f1d1ab | ||
|
|
fae2f043e7 | ||
|
|
8e9aa4efc1 | ||
|
|
3871a97d8a | ||
|
|
3f634e3eb5 | ||
|
|
e0455e1635 | ||
|
|
71935d37f8 | ||
|
|
34f057dba4 | ||
|
|
7c42431143 | ||
|
|
cd766c2cad | ||
|
|
1d12f87a5e | ||
|
|
1305284855 | ||
|
|
24a415f773 | ||
|
|
d6d8de0b8e | ||
|
|
50e53ae596 | ||
|
|
92f52be4f1 | ||
|
|
3d01355b75 | ||
|
|
fffc70e733 | ||
|
|
79427157a8 | ||
|
|
942bacdc28 | ||
|
|
415465ee62 | ||
|
|
a21dc7524c | ||
|
|
0e417e5e91 | ||
|
|
1a36d9bf36 | ||
|
|
3d7564b003 | ||
|
|
7bebb0e8bf | ||
|
|
34daabcaad | ||
|
|
817aa011cf | ||
|
|
7f2ecd360e | ||
|
|
f259e202bd | ||
|
|
045c1ed939 | ||
|
|
532f0f5ffe | ||
|
|
805317e865 | ||
|
|
a1e420e2cf | ||
|
|
549a978736 | ||
|
|
184f25cb3f | ||
|
|
dd14d6f88c | ||
|
|
7a4f9f6f70 | ||
|
|
e7df0e5099 | ||
|
|
bda5a311c6 | ||
|
|
e5c44c9510 | ||
|
|
387376a36b | ||
|
|
4c53f18d5b | ||
|
|
919a4fe707 | ||
|
|
d30557a3a6 | ||
|
|
bc453a917f | ||
|
|
e0a1117a4a | ||
|
|
62a73ad255 | ||
|
|
55de07ecde | ||
|
|
c60aca7e54 | ||
|
|
d8cf4fbd2b | ||
|
|
795260ccaf | ||
|
|
5d1ab726ae | ||
|
|
c3b4eb8a87 | ||
|
|
46582e3010 | ||
|
|
592200e7d6 | ||
|
|
dcd60b8cc4 | ||
|
|
a63c4f1412 | ||
|
|
b1579c7ea9 | ||
|
|
f5b9b1714a | ||
|
|
95ad152139 | ||
|
|
fbc35f697f | ||
|
|
8513dd20a8 | ||
|
|
97a728d7ab | ||
|
|
86efacc40b | ||
|
|
e2944af7e7 | ||
|
|
9f5acb35ba | ||
|
|
5d6c64943c | ||
|
|
32c4ccbbef | ||
|
|
47ac25b446 | ||
|
|
5804383c2b | ||
|
|
4efeb2d937 | ||
|
|
a19f35262f | ||
|
|
7e6612e69e | ||
|
|
ec54777aeb | ||
|
|
5c655fd0b7 | ||
|
|
c6a36e84ff | ||
|
|
29ea6d8915 | ||
|
|
c1e051a80a | ||
|
|
c84d2e6c20 | ||
|
|
2d329387ad | ||
|
|
d67c136830 | ||
|
|
ef6985de03 | ||
|
|
8a440ee8b3 | ||
|
|
aad610cf17 | ||
|
|
05463fa11b | ||
|
|
05d18daa8e | ||
|
|
62ccc1820e | ||
|
|
44170c919a | ||
|
|
8ebe91899a | ||
|
|
696e53513e | ||
|
|
c48347ffe8 | ||
|
|
eb2c16d559 | ||
|
|
e34cce9730 | ||
|
|
87df765987 | ||
|
|
0c38297b7c | ||
|
|
46fd56b9a8 | ||
|
|
b0615fc491 | ||
|
|
578f6703e4 | ||
|
|
ddec4e5bb5 | ||
|
|
0e57210f37 | ||
|
|
07cac5ea68 | ||
|
|
7477a31ed8 | ||
|
|
8ceb618371 | ||
|
|
82f9d97e82 | ||
|
|
16c56df970 | ||
|
|
f63ba79128 | ||
|
|
0eb1ca04b2 | ||
|
|
5ed3166e61 | ||
|
|
4d78d7fa10 | ||
|
|
96f58f40dc | ||
|
|
7b3b83f96b | ||
|
|
ebfa90bf93 | ||
|
|
57c062d9de | ||
|
|
769d0c1b7a | ||
|
|
511089b4da | ||
|
|
bef5a814e4 | ||
|
|
e2d994f2ed | ||
|
|
46731705ca | ||
|
|
16f131685a |
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: # Replace with a single Open Collective username
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||||
|
custom: https://www.paypal.com/donate/?hosted_button_id=S974SWQMB8PB2
|
||||||
136
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
136
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
description: If something isn't working as expected, let us know here.
|
||||||
|
title: "`Bug` "
|
||||||
|
labels: [Bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out a bug report!
|
||||||
|
|
||||||
|
We aim to keep everything working perfectly, so your detailed reports are crucial.
|
||||||
|
|
||||||
|
Report only one specific issue per submission. If you encounter another issue, create a new report for effective tracking and resolution.
|
||||||
|
|
||||||
|
The more detail you provide, the quicker we can help.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Omit any private or sensitive information, as this bug report will be publicly visible.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Version Information
|
||||||
|
Provide version numbers for TFT, ESPHome, and Blueprint. These can be found on your device's boot screen and in the automation where the blueprint is set.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: TFT Version
|
||||||
|
description: Enter the TFT version number.
|
||||||
|
placeholder: e.g., 4.3.2
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: ESPHome Version
|
||||||
|
description: Enter the ESPHome version number.
|
||||||
|
placeholder: e.g., 4.3.2
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Blueprint Version
|
||||||
|
description: Enter the Blueprint version number.
|
||||||
|
placeholder: e.g., 4.3.2
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Panel Model
|
||||||
|
description: Select your NSPanel model.
|
||||||
|
options:
|
||||||
|
- EU
|
||||||
|
- US
|
||||||
|
- US (Landscape)
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Bug Details
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: What is the bug?
|
||||||
|
description: Describe the bug clearly and concisely.
|
||||||
|
placeholder: e.g., When I try this, I get this result, but I expected that...
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to Reproduce
|
||||||
|
description: Detail the steps to reproduce the behavior. Include screenshots or other relevant information.
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. See error on '...'
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Additional Information (Optional)
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Your Panel's YAML
|
||||||
|
description: Provide your panel's YAML configuration.
|
||||||
|
render: yaml
|
||||||
|
placeholder: |
|
||||||
|
# Example YAML configuration
|
||||||
|
# ...
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: ESPHome Logs
|
||||||
|
description: >
|
||||||
|
Access these logs via the **Logs** button on the ESPHome Dashboard.
|
||||||
|
These logs are crucial for diagnosing issues with your device.
|
||||||
|
|
||||||
|
|
||||||
|
Please follow the guidelines below to ensure the logs are comprehensive:
|
||||||
|
|
||||||
|
- **Boot Issues**: If the problem occurs during boot, capture the logs from the start of your device to a minute or two after the boot completes.
|
||||||
|
Look for errors or unusual messages during this period.
|
||||||
|
|
||||||
|
- **TFT File Update Issues**: For problems related to TFT file updates,
|
||||||
|
include logs from the moment you press the **Update TFT Display** button until a few seconds after the device restarts.
|
||||||
|
Pay attention to any error messages or warnings during the update process.
|
||||||
|
|
||||||
|
- **Other Issues**: For other types of problems, include logs that encompass the issue's onset and continue for a short duration thereafter.
|
||||||
|
This will help in pinpointing the exact moment and nature of the issue.
|
||||||
|
|
||||||
|
|
||||||
|
Remember, the more detailed the logs, the easier it is to identify and resolve the problem.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Home Assistant Logs
|
||||||
|
description: >
|
||||||
|
To access Home Assistant logs, navigate to **Settings** > **System** > [**Logs**](https://my.home-assistant.io/redirect/logs/).
|
||||||
|
|
||||||
|
|
||||||
|
When reporting an issue, please focus on providing logs specifically relevant to the problem:
|
||||||
|
|
||||||
|
- **NSPanel Blueprint Automation**: If your issue is related to automation using the NSPanel blueprint, include only those logs that directly pertain to this process.
|
||||||
|
|
||||||
|
- **Panel and ESPHome**: For issues involving your panel and ESPHome, carefully select and share logs that show interactions or errors between these components.
|
||||||
|
|
||||||
|
- **Relevancy is Key**: To expedite troubleshooting, avoid including logs that are not related to the issue at hand. This helps in focusing on the pertinent information.
|
||||||
|
|
||||||
|
|
||||||
|
Your attention to sharing targeted and relevant log data is greatly appreciated and aids in efficient problem resolution.
|
||||||
|
...
|
||||||
20
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
20
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
blank_issues_enabled: false
|
||||||
|
|
||||||
|
contact_links:
|
||||||
|
- name: Questions & General Discussions
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions
|
||||||
|
about: Join our Discussions for community chats, questions, idea sharing, and collaboration. Use Issues for reporting bugs or requesting enhancements.
|
||||||
|
|
||||||
|
- name: Troubleshooting TFT Transfer Issues
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/tft_upload.md
|
||||||
|
about: Having trouble transferring a TFT file? Our guide might have the solution.
|
||||||
|
|
||||||
|
- name: Resolve Compiling Errors
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/error_compiling.md
|
||||||
|
about: Check this guide if you're experiencing compile errors.
|
||||||
|
|
||||||
|
- name: Getting Started Guide
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/install.md
|
||||||
|
about: New to NSPanel HA Blueprint? Start here for installation and setup instructions.
|
||||||
|
...
|
||||||
32
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
32
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: Enhancement Request
|
||||||
|
description: Suggest an idea for this project
|
||||||
|
title: "`Enhancement` "
|
||||||
|
labels: [Enhancement]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: "Thank you for taking the time to suggest an enhancement!"
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Enhancement Summary
|
||||||
|
description: A brief summary of the enhancement.
|
||||||
|
placeholder: e.g., Add support for XYZ feature...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Detailed Description
|
||||||
|
description: Please provide a detailed description of the enhancement. Include any specific use cases or functionality you envision.
|
||||||
|
placeholder: "Describe the enhancement in detail..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional Context
|
||||||
|
description: "Provide any additional context or screenshots that might help us understand the enhancement better."
|
||||||
|
placeholder: "Add any other context or screenshots about the enhancement request here."
|
||||||
|
...
|
||||||
32
.github/workflows/release_tag.yml
vendored
Normal file
32
.github/workflows/release_tag.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: Update Tags
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-tags:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
|
||||||
|
- name: Set up Git
|
||||||
|
run: |
|
||||||
|
git config --local user.email "action@github.com"
|
||||||
|
git config --local user.name "GitHub Action"
|
||||||
|
|
||||||
|
- name: Move and push stable tag
|
||||||
|
run: |
|
||||||
|
git tag -f stable ${{ github.event.release.tag_name }}
|
||||||
|
git push -f origin stable
|
||||||
|
|
||||||
|
- name: Move and push latest tag
|
||||||
|
run: |
|
||||||
|
git tag -f latest ${{ github.event.release.tag_name }}
|
||||||
|
git push -f origin latest
|
||||||
|
...
|
||||||
24
.github/workflows/validate_blueprint.yml
vendored
Normal file
24
.github/workflows/validate_blueprint.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
name: Validate Blueprint YAML
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "nspanel_blueprint.yaml"
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "nspanel_blueprint.yaml"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code_scan:
|
||||||
|
name: Validate Blueprint YAML
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Validate nspanel_blueprint.yaml
|
||||||
|
run: yamllint -c "./.rules/yamllint.yml" nspanel_blueprint.yaml
|
||||||
|
...
|
||||||
26
.github/workflows/validate_clang_format.yml
vendored
Normal file
26
.github/workflows/validate_clang_format.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
name: Validate C++ (Clang Format)
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**/*.h'
|
||||||
|
- '**/*.c'
|
||||||
|
- '**/*.cpp'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**/*.h'
|
||||||
|
- '**/*.c'
|
||||||
|
- '**/*.cpp'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clang-format-checking:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
- uses: RafikFarhad/clang-format-github-action@v3
|
||||||
|
with:
|
||||||
|
sources: "components/nspanel_ha_blueprint/*.h,components/nspanel_ha_blueprint/*.cpp,components/nspanel_ha_blueprint_upload_tft/*.h,components/nspanel_ha_blueprint_upload_tft/*.cpp"
|
||||||
|
...
|
||||||
373
.github/workflows/validate_esphome.yml
vendored
Normal file
373
.github/workflows/validate_esphome.yml
vendored
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
---
|
||||||
|
name: Validate and Build ESPHome
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "nspanel_esphome*.yaml"
|
||||||
|
- "esphome/nspanel_esphome*.yaml"
|
||||||
|
- "prebuilt/nspanel_esphome*.yaml"
|
||||||
|
- "prebuilt/wall_display*.yaml"
|
||||||
|
- ".test/*.yaml"
|
||||||
|
- "*.h"
|
||||||
|
- "*.c"
|
||||||
|
- "*.cpp"
|
||||||
|
- "*.py"
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "nspanel_esphome*.yaml"
|
||||||
|
- "esphome/nspanel_esphome*.yaml"
|
||||||
|
- "prebuilt/nspanel_esphome*.yaml"
|
||||||
|
- "prebuilt/wall_display*.yaml"
|
||||||
|
- ".test/*.yaml"
|
||||||
|
- "*.h"
|
||||||
|
- "*.c"
|
||||||
|
- "*.cpp"
|
||||||
|
- "*.py"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
setup_dependencies:
|
||||||
|
name: Setup & Cache Dependencies
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
cache-hit-idf-v4: ${{ steps.cache-idf-v4.outputs.cache-hit }}
|
||||||
|
cache-hit-idf-v5: ${{ steps.cache-idf-v5.outputs.cache-hit }}
|
||||||
|
cache-hit-arduino: ${{ steps.cache-arduino.outputs.cache-hit }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Cache ESP-IDF v4 Dependencies
|
||||||
|
id: cache-idf-v4
|
||||||
|
uses: actions/cache@main
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.esphome/cache
|
||||||
|
~/.platformio/packages
|
||||||
|
~/.platformio/platforms
|
||||||
|
key: ${{ runner.os }}-esp-idf-v4-${{ hashFiles('**/esphome_idf_basic.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-esp-idf-v4-
|
||||||
|
|
||||||
|
- name: Cache ESP-IDF v5 Dependencies
|
||||||
|
id: cache-idf-v5
|
||||||
|
uses: actions/cache@main
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.esphome/cache
|
||||||
|
~/.platformio/packages
|
||||||
|
~/.platformio/platforms
|
||||||
|
key: ${{ runner.os }}-esp-idf-v5-${{ hashFiles('**/esphome_idf5_basic.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-esp-idf-v5-
|
||||||
|
|
||||||
|
- name: Cache Arduino Dependencies
|
||||||
|
id: cache-arduino
|
||||||
|
uses: actions/cache@main
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.esphome/cache
|
||||||
|
~/.platformio/packages
|
||||||
|
~/.platformio/platforms
|
||||||
|
key: ${{ runner.os }}-arduino-${{ hashFiles('**/esphome_ard_basic.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-arduino-
|
||||||
|
|
||||||
|
code_scan:
|
||||||
|
name: Code scan (YAML)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs: setup_dependencies
|
||||||
|
steps:
|
||||||
|
- name: Checkout Code
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@main
|
||||||
|
with:
|
||||||
|
python-version: '3.8'
|
||||||
|
|
||||||
|
- name: Install Yamllint
|
||||||
|
run: pip install yamllint
|
||||||
|
|
||||||
|
- name: Validate YAML files
|
||||||
|
run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} +
|
||||||
|
|
||||||
|
build_cores:
|
||||||
|
name: Core
|
||||||
|
needs: [code_scan, setup_dependencies]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_basic.yaml"
|
||||||
|
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-idf-v4 }}
|
||||||
|
- id: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_basic.yaml"
|
||||||
|
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-idf-v5 }}
|
||||||
|
- id: ard
|
||||||
|
yaml_file: ".test/esphome_ard_basic.yaml"
|
||||||
|
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-arduino }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Firmware
|
||||||
|
if: steps.matrix.outputs.cache-hit != 'true'
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_advanced:
|
||||||
|
name: Advanced
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_advanced.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_advanced.yaml"
|
||||||
|
- id: ard
|
||||||
|
base: ard
|
||||||
|
yaml_file: ".test/esphome_ard_advanced.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Advanced Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_ble_tracker:
|
||||||
|
name: BLE Tracker
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_ble_tracker.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_ble_tracker.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build BLE Tracker Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_bluetooth_proxy:
|
||||||
|
name: Bluetooth Proxy
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_bluetooth_proxy.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_bluetooth_proxy.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Bluetooth Proxy Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_climate_cool:
|
||||||
|
name: Climate Cool
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_climate_cool.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_climate_cool.yaml"
|
||||||
|
- id: ard
|
||||||
|
base: ard
|
||||||
|
yaml_file: ".test/esphome_ard_climate_cool.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Climate Cool Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_climate_heat:
|
||||||
|
name: Climate Heat
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_climate_heat.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_climate_heat.yaml"
|
||||||
|
- id: ard
|
||||||
|
base: ard
|
||||||
|
yaml_file: ".test/esphome_ard_climate_heat.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Climate Heat Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_climate_dual:
|
||||||
|
name: Climate Dual
|
||||||
|
needs: build_cores
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_climate_dual.yaml"
|
||||||
|
- id: idf_v5
|
||||||
|
base: idf_v5
|
||||||
|
yaml_file: ".test/esphome_idf5_climate_dual.yaml"
|
||||||
|
- id: ard
|
||||||
|
base: ard
|
||||||
|
yaml_file: ".test/esphome_ard_climate_dual.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Climate Dial Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_customizations:
|
||||||
|
name: Customizations
|
||||||
|
needs:
|
||||||
|
- build_advanced
|
||||||
|
- build_climate_heat
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_advanced_climate_heat_customizations.yaml"
|
||||||
|
- id: ard
|
||||||
|
base: ard
|
||||||
|
yaml_file: ".test/esphome_ard_advanced_climate_heat_customizations.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Customizations Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_climate_ble_proxy:
|
||||||
|
name: Climate Cool + Bluetooth Proxy
|
||||||
|
needs:
|
||||||
|
- build_climate_cool
|
||||||
|
- build_bluetooth_proxy
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- id: idf_v4
|
||||||
|
base: idf_v4
|
||||||
|
yaml_file: ".test/esphome_idf_climate_cool_bluetooth_proxy.yaml"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build Customizations Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: ${{ matrix.yaml_file }}
|
||||||
|
|
||||||
|
build_prebuilt_firmware:
|
||||||
|
name: Prebuilt Firmware
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: code_scan
|
||||||
|
if: github.ref == 'refs/heads/dev' || github.base_ref == 'dev'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
|
||||||
|
- name: Build ESPHome Prebuilt Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: prebuilt/nspanel_esphome_prebuilt.yaml
|
||||||
|
|
||||||
|
- name: Move and Rename Firmware File - nspanel_esphome_prebuilt
|
||||||
|
run: |
|
||||||
|
mkdir -p prebuilt
|
||||||
|
cp prebuilt/.esphome/build/nspanel/.pioenvs/nspanel/firmware.bin prebuilt/nspanel_esphome_prebuilt.bin || true
|
||||||
|
cp prebuilt/.esphome/build/nspanel/.pioenvs/nspanel/firmware-factory.bin prebuilt/nspanel_esphome_prebuilt-factory.bin || true
|
||||||
|
|
||||||
|
- name: Build ESPHome Prebuilt Wall Display Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: prebuilt/wall_display.yaml
|
||||||
|
|
||||||
|
- name: Move and Rename Firmware File - wall_display
|
||||||
|
run: |
|
||||||
|
mkdir -p prebuilt
|
||||||
|
cp prebuilt/.esphome/build/nspanel/.pioenvs/nspanel/firmware.bin prebuilt/wall_display.bin || true
|
||||||
|
cp prebuilt/.esphome/build/nspanel/.pioenvs/nspanel/firmware-factory.bin prebuilt/wall_display-factory.bin || true
|
||||||
|
|
||||||
|
- name: Generate checksum for Firmware Files
|
||||||
|
run: |
|
||||||
|
md5sum prebuilt/nspanel_esphome_prebuilt.bin > prebuilt/nspanel_esphome_prebuilt.bin.md5
|
||||||
|
md5sum prebuilt/nspanel_esphome_prebuilt-factory.bin > prebuilt/nspanel_esphome_prebuilt-factory.bin.md5
|
||||||
|
md5sum prebuilt/wall_display.bin > prebuilt/wall_display.bin.md5
|
||||||
|
md5sum prebuilt/wall_display-factory.bin > prebuilt/wall_display-factory.bin.md5
|
||||||
|
|
||||||
|
- name: Commit and Push Firmware Files
|
||||||
|
run: |
|
||||||
|
git config --global user.name 'GitHub Actions'
|
||||||
|
git config --global user.email 'actions@github.com'
|
||||||
|
git add prebuilt/*.bin prebuilt/*.md5
|
||||||
|
git commit -m "Pre-built firmware update: ${{ github.run_id }}"
|
||||||
|
git push
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
...
|
||||||
198
.github/workflows/validate_esphome_beta.yml
vendored
Normal file
198
.github/workflows/validate_esphome_beta.yml
vendored
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
---
|
||||||
|
name: Validate ESPHome (beta)
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# yamllint disable-line rule:line-length
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code_scan:
|
||||||
|
name: Code scan (YAML)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Validate nspanel_esphome.yaml
|
||||||
|
run: yamllint -c "./.rules/yamllint.yml" nspanel_esphome.yaml
|
||||||
|
|
||||||
|
build_core:
|
||||||
|
name: Core
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- code_scan
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_basic.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_advanced:
|
||||||
|
name: Advanced
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_core
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+advanced
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_advanced.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_heat:
|
||||||
|
name: Climate (heat)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_core
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+climate_heat
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_climate_heat.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_cool:
|
||||||
|
name: Climate (cool)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_core
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+climate_cool
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_climate_cool.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_dual:
|
||||||
|
name: Climate (dual)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_core
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+climate_dual
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_climate_dual.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_heat_advanced:
|
||||||
|
name: Advanced+climate (heat)
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_climate_heat
|
||||||
|
- build_advanced
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+advanced+climate_heat
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_advanced_climate_heat.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_cool_advanced_arduino:
|
||||||
|
name: Arduino
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_climate_cool
|
||||||
|
- build_advanced
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+advanced+climate_cool+arduino
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_advanced_climate_cool_arduino.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_dual_esp_idf5:
|
||||||
|
name: esp-idf v5 & Climate Dual & Bluetooth proxy
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_advanced
|
||||||
|
- build_climate_dual
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+climate_dual+bt_proxy+esp_idf5
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_advanced_climate_dual_esp_idf5.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_heat_advanced_customization:
|
||||||
|
name: Customizations
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- code_scan
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+advanced+climate_heat+customizations
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_advanced_climate_heat_customizations.yaml"
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_prebuilt_firmware:
|
||||||
|
name: Prebuilt Firmware
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: code_scan
|
||||||
|
if: github.ref == 'refs/heads/dev' || github.base_ref == 'dev'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
|
||||||
|
- name: Build ESPHome Prebuilt Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: prebuilt/nspanel_esphome_prebuilt.yaml
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
- name: Build ESPHome Prebuilt Wall Display Firmware
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: prebuilt/wall_display.yaml
|
||||||
|
version: beta
|
||||||
|
|
||||||
|
build_climate_cool_bluetooth_proxy:
|
||||||
|
name: Climate cool & BLE proxy
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
needs:
|
||||||
|
- build_climate_cool
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Build core+climate_cool+bluetooth_proxy
|
||||||
|
uses: barndawgie/build-action@v1.9.0
|
||||||
|
with:
|
||||||
|
yaml_file: "./.test/esphome_climate_cool_bluetooth_proxy.yaml"
|
||||||
|
version: beta
|
||||||
|
...
|
||||||
58
.github/workflows/validate_markdown.yml
vendored
Normal file
58
.github/workflows/validate_markdown.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
name: Validate Markdown
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**/*.md'
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**/*.md'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
markdown-lint:
|
||||||
|
name: Markdown Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
|
||||||
|
# https://github.com/marketplace/actions/markdownlint-cli2-action
|
||||||
|
- name: Identify changed files
|
||||||
|
uses: tj-actions/changed-files@v41
|
||||||
|
id: changed-files
|
||||||
|
with:
|
||||||
|
files: '**/*.md'
|
||||||
|
separator: ","
|
||||||
|
# https://github.com/marketplace/actions/markdownlint-cli2-action
|
||||||
|
- name: Markdown Lint
|
||||||
|
uses: DavidAnson/markdownlint-cli2-action@v14
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
with:
|
||||||
|
globs: ${{ steps.changed-files.outputs.all_changed_files }}
|
||||||
|
separator: ","
|
||||||
|
config: '.rules/.markdownlint.jsonc'
|
||||||
|
fix: true
|
||||||
|
|
||||||
|
markdown-links:
|
||||||
|
name: Check links
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
|
||||||
|
# https://github.com/gaurav-nelson/github-action-markdown-link-check
|
||||||
|
- name: Markdown links
|
||||||
|
uses: gaurav-nelson/github-action-markdown-link-check@v1
|
||||||
|
with:
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
check-modified-files-only: yes
|
||||||
|
config-file: '.rules/mlc_config.json'
|
||||||
|
base-branch: 'main'
|
||||||
|
...
|
||||||
30
.github/workflows/validate_python.yml
vendored
Normal file
30
.github/workflows/validate_python.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
name: Validate Python (flake8)
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '*.py'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '*.py'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flake8-lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Lint
|
||||||
|
steps:
|
||||||
|
- name: Check out source repository
|
||||||
|
uses: actions/checkout@main
|
||||||
|
- name: Set up Python environment
|
||||||
|
uses: actions/setup-python@main
|
||||||
|
with:
|
||||||
|
python-version: "3.11"
|
||||||
|
- name: flake8 Lint
|
||||||
|
uses: py-actions/flake8@v2
|
||||||
|
with:
|
||||||
|
max-line-length: "200"
|
||||||
|
path: "components/nspanel_ha_blueprint"
|
||||||
|
...
|
||||||
49
.github/workflows/validate_yamllint.yml
vendored
Normal file
49
.github/workflows/validate_yamllint.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
name: Validate YAML (secondary files)
|
||||||
|
|
||||||
|
# yamllint disable-line rule:truthy
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**/*.yml'
|
||||||
|
- '**/*.yaml'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**/*.yml'
|
||||||
|
- '**/*.yaml'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code_scan:
|
||||||
|
name: Validate YAML
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@main
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
|
||||||
|
- name: Identify changed files
|
||||||
|
uses: tj-actions/changed-files@v41
|
||||||
|
id: changed-files
|
||||||
|
with:
|
||||||
|
files: '**/*.y*ml'
|
||||||
|
separator: ","
|
||||||
|
|
||||||
|
- name: Validate YAML
|
||||||
|
if: steps.changed-files.outputs.any_changed == 'true'
|
||||||
|
run: |
|
||||||
|
IFS=',' read -ra FILES <<< "${{ steps.changed-files.outputs.all_changed_files }}"
|
||||||
|
for file in "${FILES[@]}"; do
|
||||||
|
if [[ "$file" =~ ^nspanel_esphome.*\.yaml$ ]] || \
|
||||||
|
[[ "$file" =~ ^esphome/nspanel_esphome.*\.yaml$ ]] || \
|
||||||
|
[[ "$file" =~ ^prebuilt/nspanel_esphome.*\.yaml$ ]] || \
|
||||||
|
[[ "$file" == "nspanel_blueprint.yaml" ]]; then
|
||||||
|
echo "Skipping $file"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "::group::Validating $file"
|
||||||
|
yamllint -c "./.rules/yamllint.yml" "$file"
|
||||||
|
echo "::endgroup::"
|
||||||
|
done
|
||||||
|
...
|
||||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -1,3 +1,13 @@
|
|||||||
# Ignore Mac DS_Store files
|
# Ignore Mac DS_Store files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
|
|
||||||
|
Nextion2Text.*
|
||||||
|
*.cmd
|
||||||
|
*.bat
|
||||||
|
|
||||||
|
# Ignore IntelliJ IDEA project directory
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Ignore dev folder
|
||||||
|
dev
|
||||||
|
|||||||
4
.rules/.markdownlint.jsonc
Normal file
4
.rules/.markdownlint.jsonc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"MD013": { "line_length": 200 }
|
||||||
|
}
|
||||||
|
|
||||||
2
.rules/markdownlint.yml
Normal file
2
.rules/markdownlint.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
MD013:
|
||||||
|
line_length: 200
|
||||||
13
.rules/mlc_config.json
Normal file
13
.rules/mlc_config.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"ignorePatterns": [
|
||||||
|
{
|
||||||
|
"pattern": "^http://homeassistant\\.local.*$"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pattern": "^https://sonoff.tech/product/central-control-panel/nspanel/$"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pattern": "^https://sonoff.tech/wp-content/uploads/2021/11/%E4%BA%A7%E5%93%81%E5%8F%82%E6%95%B0%E8%A1%A8-NSPanel-20210831.pdf$"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
42
.rules/yamllint.yml
Normal file
42
.rules/yamllint.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# https://yamllint.readthedocs.io/en/stable/configuration.html#default-configuration
|
||||||
|
---
|
||||||
|
yaml-files:
|
||||||
|
- '*.yaml'
|
||||||
|
- '*.yml'
|
||||||
|
- '.yamllint'
|
||||||
|
|
||||||
|
rules:
|
||||||
|
anchors:
|
||||||
|
forbid-undeclared-aliases: true
|
||||||
|
forbid-duplicated-anchors: true
|
||||||
|
braces: enable
|
||||||
|
brackets: enable
|
||||||
|
colons: enable
|
||||||
|
commas: enable
|
||||||
|
comments:
|
||||||
|
level: warning
|
||||||
|
comments-indentation:
|
||||||
|
level: warning
|
||||||
|
document-end:
|
||||||
|
level: warning
|
||||||
|
document-start:
|
||||||
|
level: warning
|
||||||
|
empty-lines: enable
|
||||||
|
empty-values: disable
|
||||||
|
float-values:
|
||||||
|
level: warning
|
||||||
|
hyphens: enable
|
||||||
|
indentation: enable
|
||||||
|
key-duplicates: enable
|
||||||
|
key-ordering: disable
|
||||||
|
line-length:
|
||||||
|
max: 200
|
||||||
|
new-line-at-end-of-file: enable
|
||||||
|
new-lines: enable
|
||||||
|
octal-values:
|
||||||
|
level: warning
|
||||||
|
quoted-strings: disable
|
||||||
|
trailing-spaces: enable
|
||||||
|
truthy:
|
||||||
|
level: warning
|
||||||
|
...
|
||||||
15
.test/esphome_ard_advanced.yaml
Normal file
15
.test/esphome_ard_advanced.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
240
.test/esphome_ard_advanced_climate_heat_customizations.yaml
Normal file
240
.test/esphome_ard_advanced_climate_heat_customizations.yaml
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_blank_url: "http://homeassistant.local:8123/local/nspanel_blank.tft"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
|
||||||
|
##### Customizations from Wiki #####
|
||||||
|
api:
|
||||||
|
# Encrypt the communication between ESPHome and Home Assistant
|
||||||
|
encryption:
|
||||||
|
key: !secret api_encryption_key
|
||||||
|
# Reboot if HA is not connected for 15 minutes
|
||||||
|
reboot_timeout: 15min
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
# Is display awake?
|
||||||
|
- name: ${device_name} Display state
|
||||||
|
id: display_state
|
||||||
|
platform: template
|
||||||
|
lambda: |-
|
||||||
|
return (current_page->state != "screensaver");
|
||||||
|
|
||||||
|
button:
|
||||||
|
# Adds a button to put the panel to sleep
|
||||||
|
- name: ${device_name} Sleep
|
||||||
|
id: force_sleep
|
||||||
|
platform: template
|
||||||
|
icon: mdi:sleep
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Sleep pressed
|
||||||
|
- lambda: |-
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
# Adds a button to wake-up the panel (similar to the existing service)
|
||||||
|
- name: ${device_name} Wake-up
|
||||||
|
id: force_wake_up
|
||||||
|
platform: template
|
||||||
|
icon: mdi:alarm
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Wake-up pressed
|
||||||
|
- lambda: |-
|
||||||
|
if (current_page->state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str());
|
||||||
|
// timer_page->execute(); // enable this if you want page timeout to be reset
|
||||||
|
timer_sleep->execute();
|
||||||
|
timer_dim->execute();
|
||||||
|
|
||||||
|
# Add custom presets to your climate (heat in this example)
|
||||||
|
climate:
|
||||||
|
- id: !extend thermostat_embedded
|
||||||
|
heat_deadband: 0.3
|
||||||
|
heat_overrun: 0.0
|
||||||
|
default_preset: "Home"
|
||||||
|
preset:
|
||||||
|
- name: "Off"
|
||||||
|
default_target_temperature_low: ${temp_min} ${temp_units}
|
||||||
|
mode: "off"
|
||||||
|
- name: Home
|
||||||
|
default_target_temperature_low: 21 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Away
|
||||||
|
default_target_temperature_low: 16.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Sleep
|
||||||
|
default_target_temperature_low: 17.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
# change OTA password, remove after flashing
|
||||||
|
on_boot:
|
||||||
|
- priority: 601.0
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
id(my_ota).set_auth_password("New password");
|
||||||
|
# Limit the amount of resources used for compiling
|
||||||
|
compile_process_limit: 1
|
||||||
|
|
||||||
|
light:
|
||||||
|
# Add the display as a light in Home Assistant
|
||||||
|
- name: ${device_name} Display
|
||||||
|
id: display_light
|
||||||
|
icon: mdi:tablet-dashboard
|
||||||
|
platform: monochromatic
|
||||||
|
output: display_output
|
||||||
|
default_transition_length: 0s
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-on");
|
||||||
|
if (current_page->state == "screensaver") disp1->goto_page(wakeup_page_name->state.c_str());
|
||||||
|
timer_reset_all->execute();
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-off");
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
logger:
|
||||||
|
# Enable hardware UART serial logging
|
||||||
|
baud_rate: 115200
|
||||||
|
|
||||||
|
ota:
|
||||||
|
# change OTA password, remove after flashing
|
||||||
|
password: !secret wifi_password
|
||||||
|
id: my_ota
|
||||||
|
|
||||||
|
output:
|
||||||
|
# Output required by `display_light` to send the commands to Nextion
|
||||||
|
- id: display_output
|
||||||
|
platform: template
|
||||||
|
type: float
|
||||||
|
write_action:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGV("output.display_output", "state: %f", state);
|
||||||
|
uint8_t current_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("output.display_output", "current_brightness: %i%%", current_brightness);
|
||||||
|
set_brightness->execute(current_brightness);
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Updates the existing `page_changed` script to update the `display_light` status when a page changes
|
||||||
|
- id: !extend page_changed
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.page_changed(custom)", "page: %s", current_page->state.c_str());
|
||||||
|
ESP_LOGV("script.page_changed(custom)", "is_on(): %s", display_light->current_values.is_on() ? "True" : "False");
|
||||||
|
if (current_page->state == "screensaver" and display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.perform();
|
||||||
|
} else if (current_page->state != "screensaver" and (not display_light->current_values.is_on())) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
|
||||||
|
# Updates the existing `set_brightness` script to update the `display_light` status when a new brightness level is set
|
||||||
|
- id: !extend set_brightness
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.set_brightness(custom)", "brightness: %.0f%%", brightness);
|
||||||
|
uint8_t current_light_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("script.set_brightness(custom)", "current_light_brightness: %i%%", current_light_brightness);
|
||||||
|
if (brightness != current_light_brightness) {
|
||||||
|
if (current_page->state != "screensaver" and brightness > 0) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.set_brightness(current_brightness->state / 100.0f);
|
||||||
|
call.perform();
|
||||||
|
} else if (display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.set_brightness(0);
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
timezone: "America/Cancun"
|
||||||
|
# Use my own local network time server
|
||||||
|
platform: sntp
|
||||||
|
servers:
|
||||||
|
- !secret mysntpserver
|
||||||
|
- europe.pool.ntp.org
|
||||||
|
- 0.pool.ntp.org
|
||||||
|
# Scheduled relay
|
||||||
|
on_time:
|
||||||
|
- hours: 7
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 12
|
||||||
|
minutes: 15
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
- hours: 19
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 23
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
# Scheduled climate
|
||||||
|
- hours: 7
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 22°C
|
||||||
|
- hours: 19
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 20°C
|
||||||
|
- hours: 23
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 18°C
|
||||||
|
|
||||||
|
web_server:
|
||||||
|
# Custom web server credentials
|
||||||
|
auth:
|
||||||
|
username: !secret web_server_username
|
||||||
|
password: !secret web_server_password
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- id: !extend wifi_default
|
||||||
|
# Set IP address manually
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.0.123
|
||||||
|
gateway: 192.168.0.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
# Set dual network
|
||||||
|
priority: 10
|
||||||
|
- ssid: !secret wifi_ssid_backup
|
||||||
|
password: !secret wifi_password_backup
|
||||||
|
priority: 0
|
||||||
|
...
|
||||||
14
.test/esphome_ard_basic.yaml
Normal file
14
.test/esphome_ard_basic.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Basic package
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
15
.test/esphome_ard_climate_cool.yaml
Normal file
15
.test/esphome_ard_climate_cool.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_cool: !include ../esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
15
.test/esphome_ard_climate_dual.yaml
Normal file
15
.test/esphome_ard_climate_dual.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_dual: !include ../esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
15
.test/esphome_ard_climate_heat.yaml
Normal file
15
.test/esphome_ard_climate_heat.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_advanced.yaml
Normal file
17
.test/esphome_idf5_advanced.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
16
.test/esphome_idf5_basic.yaml
Normal file
16
.test/esphome_idf5_basic.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Basic package
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_ble_tracker.yaml
Normal file
17
.test/esphome_idf5_ble_tracker.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_ble_tracker: !include ../esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_bluetooth_proxy.yaml
Normal file
17
.test/esphome_idf5_bluetooth_proxy.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_bluetooth_proxy: !include ../esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_climate_cool.yaml
Normal file
17
.test/esphome_idf5_climate_cool.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_cool: !include ../esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_climate_dual.yaml
Normal file
17
.test/esphome_idf5_climate_dual.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_dual: !include ../esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
17
.test/esphome_idf5_climate_heat.yaml
Normal file
17
.test/esphome_idf5_climate_heat.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.0.2
|
||||||
|
platform_version: 6.3.2
|
||||||
|
...
|
||||||
11
.test/esphome_idf_advanced.yaml
Normal file
11
.test/esphome_idf_advanced.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
...
|
||||||
14
.test/esphome_idf_advanced_climate_heat.yaml
Normal file
14
.test/esphome_idf_advanced_climate_heat.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# addon_climate_cold: !include ../esphome/nspanel_esphome_addon_climate_cold.yaml
|
||||||
|
# addon_climate_dual: !include ../esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
...
|
||||||
238
.test/esphome_idf_advanced_climate_heat_customizations.yaml
Normal file
238
.test/esphome_idf_advanced_climate_heat_customizations.yaml
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_blank_url: "http://homeassistant.local:8123/local/nspanel_blank.tft"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
advanced_package: !include ../esphome/nspanel_esphome_advanced.yaml
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# addon_climate_cold: !include ../esphome/nspanel_esphome_addon_climate_cold.yaml
|
||||||
|
# addon_climate_dual: !include ../esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
|
||||||
|
##### Customizations from Wiki #####
|
||||||
|
api:
|
||||||
|
# Encrypt the communication between ESPHome and Home Assistant
|
||||||
|
encryption:
|
||||||
|
key: !secret api_encryption_key
|
||||||
|
# Reboot if HA is not connected for 15 minutes
|
||||||
|
reboot_timeout: 15min
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
# Is display awake?
|
||||||
|
- name: ${device_name} Display state
|
||||||
|
id: display_state
|
||||||
|
platform: template
|
||||||
|
lambda: |-
|
||||||
|
return (current_page->state != "screensaver");
|
||||||
|
|
||||||
|
button:
|
||||||
|
# Adds a button to put the panel to sleep
|
||||||
|
- name: ${device_name} Sleep
|
||||||
|
id: force_sleep
|
||||||
|
platform: template
|
||||||
|
icon: mdi:sleep
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Sleep pressed
|
||||||
|
- lambda: |-
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
# Adds a button to wake-up the panel (similar to the existing service)
|
||||||
|
- name: ${device_name} Wake-up
|
||||||
|
id: force_wake_up
|
||||||
|
platform: template
|
||||||
|
icon: mdi:alarm
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Wake-up pressed
|
||||||
|
- lambda: |-
|
||||||
|
if (current_page->state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str());
|
||||||
|
// timer_page->execute(); // enable this if you want page timeout to be reset
|
||||||
|
timer_sleep->execute();
|
||||||
|
timer_dim->execute();
|
||||||
|
|
||||||
|
# Add custom presets to your climate (heat in this example)
|
||||||
|
climate:
|
||||||
|
- id: !extend thermostat_embedded
|
||||||
|
heat_deadband: 0.3
|
||||||
|
heat_overrun: 0.0
|
||||||
|
default_preset: "Home"
|
||||||
|
preset:
|
||||||
|
- name: "Off"
|
||||||
|
default_target_temperature_low: ${temp_min} ${temp_units}
|
||||||
|
mode: "off"
|
||||||
|
- name: Home
|
||||||
|
default_target_temperature_low: 21 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Away
|
||||||
|
default_target_temperature_low: 16.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Sleep
|
||||||
|
default_target_temperature_low: 17.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
# change OTA password, remove after flashing
|
||||||
|
on_boot:
|
||||||
|
- priority: 601.0
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
id(my_ota).set_auth_password("New password");
|
||||||
|
# Limit the amount of resources used for compiling
|
||||||
|
compile_process_limit: 1
|
||||||
|
|
||||||
|
light:
|
||||||
|
# Add the display as a light in Home Assistant
|
||||||
|
- name: ${device_name} Display
|
||||||
|
id: display_light
|
||||||
|
icon: mdi:tablet-dashboard
|
||||||
|
platform: monochromatic
|
||||||
|
output: display_output
|
||||||
|
default_transition_length: 0s
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-on");
|
||||||
|
if (current_page->state == "screensaver") disp1->goto_page(wakeup_page_name->state.c_str());
|
||||||
|
timer_reset_all->execute();
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-off");
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
logger:
|
||||||
|
# Enable hardware UART serial logging
|
||||||
|
baud_rate: 115200
|
||||||
|
|
||||||
|
ota:
|
||||||
|
# change OTA password, remove after flashing
|
||||||
|
password: !secret wifi_password
|
||||||
|
id: my_ota
|
||||||
|
|
||||||
|
output:
|
||||||
|
# Output required by `display_light` to send the commands to Nextion
|
||||||
|
- id: display_output
|
||||||
|
platform: template
|
||||||
|
type: float
|
||||||
|
write_action:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGV("output.display_output", "state: %f", state);
|
||||||
|
uint8_t current_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("output.display_output", "current_brightness: %i%%", current_brightness);
|
||||||
|
set_brightness->execute(current_brightness);
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Updates the existing `page_changed` script to update the `display_light` status when a page changes
|
||||||
|
- id: !extend page_changed
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.page_changed(custom)", "page: %s", current_page->state.c_str());
|
||||||
|
ESP_LOGV("script.page_changed(custom)", "is_on(): %s", display_light->current_values.is_on() ? "True" : "False");
|
||||||
|
if (current_page->state == "screensaver" and display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.perform();
|
||||||
|
} else if (current_page->state != "screensaver" and (not display_light->current_values.is_on())) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
|
||||||
|
# Updates the existing `set_brightness` script to update the `display_light` status when a new brightness level is set
|
||||||
|
- id: !extend set_brightness
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.set_brightness(custom)", "brightness: %.0f%%", brightness);
|
||||||
|
uint8_t current_light_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("script.set_brightness(custom)", "current_light_brightness: %i%%", current_light_brightness);
|
||||||
|
if (brightness != current_light_brightness) {
|
||||||
|
if (current_page->state != "screensaver" and brightness > 0) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.set_brightness(current_brightness->state / 100.0f);
|
||||||
|
call.perform();
|
||||||
|
} else if (display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.set_brightness(0);
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
timezone: "America/Cancun"
|
||||||
|
# Use my own local network time server
|
||||||
|
platform: sntp
|
||||||
|
servers:
|
||||||
|
- !secret mysntpserver
|
||||||
|
- europe.pool.ntp.org
|
||||||
|
- 0.pool.ntp.org
|
||||||
|
# Scheduled relay
|
||||||
|
on_time:
|
||||||
|
- hours: 7
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 12
|
||||||
|
minutes: 15
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
- hours: 19
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 23
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
# Scheduled climate
|
||||||
|
- hours: 7
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 22°C
|
||||||
|
- hours: 19
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 20°C
|
||||||
|
- hours: 23
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 18°C
|
||||||
|
|
||||||
|
web_server:
|
||||||
|
# Custom web server credentials
|
||||||
|
auth:
|
||||||
|
username: !secret web_server_username
|
||||||
|
password: !secret web_server_password
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- id: !extend wifi_default
|
||||||
|
# Set IP address manually
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.0.123
|
||||||
|
gateway: 192.168.0.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
# Set dual network
|
||||||
|
priority: 10
|
||||||
|
- ssid: !secret wifi_ssid_backup
|
||||||
|
password: !secret wifi_password_backup
|
||||||
|
priority: 0
|
||||||
|
...
|
||||||
10
.test/esphome_idf_basic.yaml
Normal file
10
.test/esphome_idf_basic.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Basic package
|
||||||
|
...
|
||||||
11
.test/esphome_idf_ble_tracker.yaml
Normal file
11
.test/esphome_idf_ble_tracker.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_ble_tracker: !include ../esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
...
|
||||||
11
.test/esphome_idf_bluetooth_proxy.yaml
Normal file
11
.test/esphome_idf_bluetooth_proxy.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_bluetooth_proxy: !include ../esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
...
|
||||||
11
.test/esphome_idf_climate_cool.yaml
Normal file
11
.test/esphome_idf_climate_cool.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_cool: !include ../esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
...
|
||||||
12
.test/esphome_idf_climate_cool_bluetooth_proxy.yaml
Normal file
12
.test/esphome_idf_climate_cool_bluetooth_proxy.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_cool: !include ../esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
addon_bluetooth_proxy: !include ../esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
...
|
||||||
11
.test/esphome_idf_climate_dual.yaml
Normal file
11
.test/esphome_idf_climate_dual.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_dual: !include ../esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
...
|
||||||
11
.test/esphome_idf_climate_heat.yaml
Normal file
11
.test/esphome_idf_climate_heat.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
device_name: nspanel
|
||||||
|
wifi_ssid: "nspanel"
|
||||||
|
wifi_password: "NSPanel_HA_Blueprint"
|
||||||
|
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||||
|
|
||||||
|
packages:
|
||||||
|
basic_package: !include ../nspanel_esphome.yaml # Core package
|
||||||
|
addon_climate_heat: !include ../esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
...
|
||||||
9
.test/secrets.yaml
Normal file
9
.test/secrets.yaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
api_encryption_key: MSANehPIH8kCp/vGcpPcKPSkYnv3zchyxkXCleXJinM=
|
||||||
|
mysntpserver: 192.168.0.1
|
||||||
|
web_server_password: NotASecret01
|
||||||
|
web_server_username: NotASecret01
|
||||||
|
wifi_password: NotASecret01
|
||||||
|
wifi_password_backup: NotASecret01
|
||||||
|
wifi_ssid_backup: NotASecret01
|
||||||
|
...
|
||||||
253
README.md
253
README.md
@@ -1,152 +1,225 @@
|
|||||||
# NSPanel Custom with HA Blueprint
|
# NSPanel Custom with HA Blueprint
|
||||||
This project allows you to configure your complete NSPanel via a Blueprint with UI.
|
|
||||||
### *That means you don't have to customize any code or change any lines in the code.*
|
|
||||||
|
|
||||||
So you have a nice graphical interface where you can build your NSPanel.
|
This innovative solution is designed to revolutionize how you interact with your Sonoff NSPanel.
|
||||||
And the best thing is, the installation takes only a few minutes.
|
Our goal? To make the customization of your NSPanel seamless, intuitive, and completely code-free!
|
||||||
|
|
||||||
The goal was to create a version that allows everyone to use the NSpanel fully local without having to deal with programming or reading hours of documentation - *AND YES WE DID IT!!!!* ;)
|
*Are you happy with our version for NSPanel? Please consider supporting us with a donation.*
|
||||||
|
|
||||||
📕 Full documentation and installation is available here [NSPanel Configuration, Setup and HowTo ](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki). (coming soon)
|
[](https://www.paypal.com/donate/?hosted_button_id=S974SWQMB8PB2)
|
||||||
|
|
||||||
|
[](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2FBlackymas%2FNSPanel_HA_Blueprint%2Fblob%2Fmain%2Fnspanel_blueprint.yaml)
|
||||||
|
|
||||||
ℹ️ Version 2.0.0
|
## Table of Contents
|
||||||
|
|
||||||
|
1. [Project Highlights](#-project-highlights)
|
||||||
|
2. [Documentation & Resources](#-documentation--resources)
|
||||||
|
3. [Features](#-features)
|
||||||
|
4. [Pages Overview](#-pages-overview)
|
||||||
|
5. [Contributing](#-contributing)
|
||||||
|
6. [Community & Support](#-community--support)
|
||||||
|
7. [Acknowledgements](#-acknowledgements)
|
||||||
|
8. [Donations](#-donations)
|
||||||
|
|
||||||
## NSPanel:
|
## 🌟 Project Highlights
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Home and Buttonpage)
|
- **No Coding Required:** Customize your NSPanel without touching a single line of code. It's all about intuitive, user-friendly experiences!
|
||||||
|
- **Quick Setup:** Get your NSPanel up and running in minutes with our easy-to-follow graphical interface.
|
||||||
|
- **Local Control:** Embrace full local control of your NSPanel, steering clear of cloud dependencies.
|
||||||
|
- **Community-Driven:** A project for the users, by the users. Your contributions shape the future of this project!
|
||||||
|
|
||||||
|
## 📚 Documentation & Resources
|
||||||
|
|
||||||

|
- **Getting Started:** Dive into our comprehensive [Documentation and Setup Guide](docs/README.md) for detailed instructions.
|
||||||

|
- **Video Tutorial:** Prefer visual learning? Check out our [Step-by-Step Setup Video](docs/README.md).
|
||||||
|
- **Troubleshooting:** Encounter an issue? Here's how to report it: [WIKI HowTo](docs/README.md).
|
||||||
|
- **Feature Requests:** Got ideas? Share them [here](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/new%20feature%20request).
|
||||||
|
- **What's Next?:** Discover what's next and what we are working on right now in our [Milestones](https://github.com/Blackymas/NSPanel_HA_Blueprint/milestones?direction=asc&sort=due_date)
|
||||||
|
|
||||||
(Lightsettings - Brightness and TEMP Color)
|
## 🚀 Features
|
||||||
|
|
||||||
|
- Easy to use and simple configuration via Blueprint - no change in the code is necessary
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Colorwheel and Thermostat)
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Coversetting and Weather Forcast)
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
(NSPanel Settings)
|
|
||||||
|
|
||||||
|
|
||||||
## Blueprint:
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Features:
|
|
||||||
- easy to use and simple configuration via Blueprint - no change in the code is necessary
|
|
||||||
- 32 buttons on 4 button pages with long press function for settings (more buttons are also possible)
|
- 32 buttons on 4 button pages with long press function for settings (more buttons are also possible)
|
||||||
- Button design is automatically generated based on the selected entity
|
- Button design is automatically generated based on the selected entity
|
||||||
- Buttons show current brightness and cover position in the button itself
|
- Buttons show current brightness and cover position in the button itself
|
||||||
- Buttons label can be assigned via blueprint
|
- Buttons label can be assigned via blueprint
|
||||||
- Weather + 5 days weather forcast
|
- Weather + 5 days weather forecast
|
||||||
- Thermostat + Touch + Relay control for floor heating
|
- Thermostat + Touch + [Relay control for floor heating](docs/addon_climate.md)
|
||||||
- Light control (brightness-slider, colorwheel, TempColor-slider) - via Long Press
|
- Light control (brightness, color and temperature) - via long Press
|
||||||
- Cover control (open, close, position-slider) - via long press
|
- Cover control (open, close and position) - via long press
|
||||||
- Settings page (display brightness, display dim brightness, auto-dim, sleep mode, reboot NSPanel)
|
- Settings page (display brightness, display dim brightness, sleep mode, reboot NSPanel)
|
||||||
- Swipe between pages
|
- Swipe between pages
|
||||||
- Top menu with 10 icons for specific states
|
- Top menu with 10 icons for specific states
|
||||||
- Heating control (hot water)
|
- Heating control (hot water)
|
||||||
- modern design - design easy to change via Adobe Express (free + design template)
|
- Modern design - design easy to change via Adobe Express (free + design template)
|
||||||
- 2 pysical switches
|
- 2 physical switches with optional fallback mode
|
||||||
- and much more ;)
|
- and much more ;)
|
||||||
|
|
||||||
|
## 📖 Pages Overview
|
||||||
|
|
||||||
# Pages
|
### Home
|
||||||
|
|
||||||
## Home
|

|
||||||
- current weather with button to Weather Forcast page
|
|
||||||
|

|
||||||
|
|
||||||
|
- Current weather with button to Weather Forcast page
|
||||||
- Hardware buttons can be freely assigned
|
- Hardware buttons can be freely assigned
|
||||||
- Hardware button label or without label
|
- Hardware button label (optional)
|
||||||
- Blue line indicates on or off of the entity
|
- Blue line indicates the entity's states (`on` or `off`)
|
||||||
- Temperature outside
|
- Outside temperature
|
||||||
- Status icons at the top
|
- Status icons at the top
|
||||||
- Room temperature with button to thermostat page
|
- Room temperature with button to thermostat page
|
||||||
- Room humidity
|
- Room humidity
|
||||||
- Hot water temperature
|
- Up to 3 user's selectable entities
|
||||||
- Button to display settings page
|
|
||||||
|
|
||||||
|
### Buttons Pages
|
||||||
|
|
||||||
## Button Page
|

|
||||||
- 32 Button
|

|
||||||
- 4 Button pages
|
|
||||||
|
- Up to 8 buttons per page, across 4 different pages, totaling 32 buttons
|
||||||
- Button design is automatically generated based on the selected entity
|
- Button design is automatically generated based on the selected entity
|
||||||
- Buttons show current brightness and cover position in the button itself
|
- Buttons display current brightness and cover position directly on the button
|
||||||
- Buttons label can be assigned via blueprint
|
- Button labels can be assigned via blueprint
|
||||||
- all buttons with long press function
|
- All buttons feature a long-press function
|
||||||
- automatic detection by long press if it is a light or cover for submenu
|
- Automatic detection of light, cover, fan, media player, alarm or climate entities for submenus through long press
|
||||||
- swipe between all pages
|
- Swipe between all pages
|
||||||
- swipe also down and up for fast access to certain pages
|
- Swipe up and down for quick access to specific pages
|
||||||
|
|
||||||
|
### Entities Pages
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Up to 8 entities per page, across 4 different pages, totaling 32 entities
|
||||||
|
- Icons and labels can be individually configured via blueprint or automatically detected for each entity
|
||||||
|
- Flexible alignment options for values as per user preference
|
||||||
|
|
||||||
|
### Light Settings
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
## Light Settings
|
|
||||||
- Light current state
|
- Light current state
|
||||||
- Brightness Slider
|
- Brightness slider
|
||||||
- Colorwheel
|
- RGB color wheel
|
||||||
- TempColor slider
|
- Color temperature slider
|
||||||
- Jump back to the right button page
|
- Jump back to the right button page
|
||||||
|
|
||||||
|
### Cover Settings
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Cover Settings
|
|
||||||
- Open and close cover
|
- Open and close cover
|
||||||
- Cover position via slider
|
- Cover position via slider
|
||||||
- Cover battery value if available (I use Ikea roller blind)
|
- Cover battery value (when available)
|
||||||
- jump back to the right button page
|
- jump back to the right button page
|
||||||
|
|
||||||
|
### Thermostat / Climate
|
||||||
|
|
||||||
## Thermostat
|
- Target temperature control slider
|
||||||
- Touch Temp control
|
- Current temperature
|
||||||
- Outside temperature
|
- 4 user's selectable values (for water and external temperatures, etc.)
|
||||||
- Hot water
|
- All the standard climate controls from Home Assistant (`heat`, `fan`, `cool`, `auto`, `dry`)
|
||||||
- heating on, off and idle
|
- 2 user's selectable buttons
|
||||||
- Hot water button
|
- [Can be used for local control (even when Wi-Fi is unavailable) when your panel's relays are used to control your cooler/heater](docs/addon_climate.md)
|
||||||
|
|
||||||
|
### Fan speed
|
||||||
|
|
||||||
## Weather Forcast
|
- Turn-on and turn-off fan
|
||||||
- 5 days Weather Forcast via swipe (Integration Accuweather - but should also go with another integration)
|
- Set speed via slider or buttons
|
||||||
- Lowest and highest temperature outside
|
- jump back to the right button page
|
||||||
|
|
||||||
|
### Alarm
|
||||||
|
|
||||||
|
- Arm/disarm an alarm (standard modes supported by Home Assistant)
|
||||||
|
- Support to numeric pin for arming or disarming
|
||||||
|
|
||||||
|
### Weather Forecast
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- 5 days weather forecast via swipe (supports most used weather integrations)
|
||||||
|
- Min and max outside temperatures
|
||||||
- Date
|
- Date
|
||||||
|
- Other weather parameters (when provided by your integration):
|
||||||
- Rain probability
|
- Rain probability
|
||||||
- Sunshine hours
|
- Sunshine hours
|
||||||
- Sun pressure
|
- UV index
|
||||||
- Thunderstorm probability
|
- Thunderstorm probability
|
||||||
- Wind speed
|
- Wind speed
|
||||||
- Night thunderstorm probability and wind speed
|
|
||||||
|
|
||||||
|
### Display Settings
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Display Settings
|
|
||||||
- Restart NSPanel
|
- Restart NSPanel
|
||||||
- Sleep mode - display off after time X
|
|
||||||
- Display brightness slider
|
- Display brightness slider
|
||||||
- Display dim brightness slider
|
- Display dim brightness slider
|
||||||
- Status Brightness in %
|
|
||||||
|
|
||||||
|
### Boot
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Thanks to:
|
## Home Assistant interface
|
||||||
SmartHome Yourself: https://www.youtube.com/c/SmarthomeyourselfDe_DIY
|
|
||||||
|
|
||||||
Masto: https://github.com/masto/NSPanel-Demo-Files
|
## Device's page
|
||||||
|
|
||||||
Marcfager: https://github.com/marcfager/nspanel-mf
|
On the device's page under "Devices & Services" you can set the global configuration of your device and see the value of it's sensors and relays:
|
||||||
|
|
||||||
lovejoy77: https://github.com/lovejoy777/NSpanel
|

|
||||||
|
|
||||||
Hellis81: https://github.com/Hellis81/NS-panel
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Automation (Blueprint)
|
||||||
|
|
||||||
|
In your automations you use the blueprint's inputs to define what will be shown on your panel and how it should behave:
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## 🚀 Contributing
|
||||||
|
|
||||||
|
- **Pull Requests:** Please direct all pull requests to the `DEV` branch, not the `main` branch.
|
||||||
|
- **Join Our Team:** We're on the lookout for enthusiasts in programming, documentation, and translation. Interested? Please let us know.
|
||||||
|
|
||||||
|
## 🌍 Community & Support
|
||||||
|
|
||||||
|
Join our vibrant community! Whether you're seeking support, wanting to contribute, or just looking to share your NSPanel journey, we're here for you.
|
||||||
|
|
||||||
|
- **[Issues & Feature requests](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues)**
|
||||||
|
- **[Discussion Forum](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions)**
|
||||||
|
- **[Home Assistant Community](https://community.home-assistant.io/t/sonoff-nspanel-blueprint-configure-your-own-custom-nspanel-easy-via-a-blueprint/500577)**
|
||||||
|
|
||||||
|
## 🎉 Acknowledgements
|
||||||
|
|
||||||
|
A huge thank you to everyone who has contributed to making this project a reality. Your support, feedback, and contributions have been invaluable.
|
||||||
|
|
||||||
|
And special thanks for the other projects which inspired us:
|
||||||
|
|
||||||
|
- [Hellis81](https://github.com/Hellis81/NS-panel)
|
||||||
|
- [Jimmyboy83](https://github.com/Jimmyboy83/nspanel)
|
||||||
|
- [joBr99](https://github.com/joBr99/Generate-HASP-Fonts)
|
||||||
|
- [lovejoy77](https://github.com/lovejoy777/NSpanel)
|
||||||
|
- [Marcfager](https://github.com/marcfager/nspanel-mf)
|
||||||
|
- [Masto](https://github.com/masto/NSPanel-Demo-Files)
|
||||||
|
- [sairon](https://github.com/sairon/esphome-nspanel-lovelace-ui)
|
||||||
|
- [SmartHome Yourself](https://www.youtube.com/c/SmarthomeyourselfDe_DIY)
|
||||||
|
|
||||||
|
## 💖 Donations
|
||||||
|
|
||||||
|
Are you happy with our version for NSPanel? Please consider supporting us with a donation.
|
||||||
|
|
||||||
|
[](https://www.paypal.com/donate/?hosted_button_id=S974SWQMB8PB2)
|
||||||
|
|||||||
834
ReleaseNotes.md
Normal file
834
ReleaseNotes.md
Normal file
@@ -0,0 +1,834 @@
|
|||||||
|
# v4.3 - Welcome to Framework ESP-IDF, an Utilities Dashboard and Enhanced Localization
|
||||||
|
## General
|
||||||
|
This milestone release is not just about adopting a new technical foundation;
|
||||||
|
it's about enhancing the capabilities and experiences of our users through significant performance improvements,
|
||||||
|
more comprehensive API documentation, customizable user interfaces and improved localization.
|
||||||
|
|
||||||
|
And with a nice Utilities Dashboard as a bonus!!
|
||||||
|
|
||||||
|
Our dedication to refining the user experience and expanding customization options continues, with this release featuring:
|
||||||
|
|
||||||
|
- **Utilities Dashboard**: A new addition, offering a customizable overview for essential utility metrics such as solar production,
|
||||||
|
wind energy, EV charging status, battery levels, and water or gas consumption.
|
||||||
|
|
||||||
|
- **Comprehensive API Documentation**: Simplifying customization and integration for developers and users, enabling tailored experiences with detailed service documentation.
|
||||||
|
|
||||||
|
- **Localization and Personalization**: Advances in user-defined settings, like decimal separators and value translations, contribute to a more intuitive interface.
|
||||||
|
We’ve also streamlined the display to exclude empty pages, making navigation more efficient.
|
||||||
|
|
||||||
|
- **Performance and Functionality**: The shift to the ESP-IDF framework not only boosts performance but also paves the way for future enhancements,
|
||||||
|
keeping NSPanel at the forefront of smart control technology.
|
||||||
|
|
||||||
|
As we embrace the ESP-IDF framework, we're excited to explore the new horizons it brings to the NSPanel firmware. Dive into v4.3 and discover the advancements that await.
|
||||||
|
|
||||||
|
## ESP-IDF Framework Transition
|
||||||
|
With this release, we've officially transitioned to the **ESP-IDF** framework.
|
||||||
|
This move is part of our ongoing efforts to enhance the memory capacity and expand the features available on the ESP, facilitating broader customization and new functionalities.
|
||||||
|
|
||||||
|
For users updating to this version:
|
||||||
|
- **Flashing Required**: To adopt the ESP-IDF framework, flashing your device using a serial cable is necessary. This step mirrors the initial custom firmware setup process.
|
||||||
|
- **Arduino Framework Still Available**: For those who prefer the `arduino` framework or require Over-The-Air (OTA) updates, it remains an option.
|
||||||
|
Detailed guidance on how to choose your framework is provided in our [customization documentation](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/customization.md#frameworks).
|
||||||
|
|
||||||
|
This transition is a significant milestone for us, promising a robust platform for our community.
|
||||||
|
We're here to help with any questions or assistance needed during this change.
|
||||||
|
For more details and support, visit our [community discussion](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions/1756).
|
||||||
|
|
||||||
|
## Updating
|
||||||
|
Please review your settings post-update to ensure compatibility.
|
||||||
|
Refer to the update procedures [here](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/howto.md#update-blueprint).
|
||||||
|
|
||||||
|
## Breaking Changes and Guidance
|
||||||
|
With this release, we're implementing several important changes.
|
||||||
|
While we strive to improve the panel, we understand that changes can affect your setups.
|
||||||
|
Here's a detailed overview and guidance for a smooth transition:
|
||||||
|
|
||||||
|
1. **Home Assistant v2024.3.0 is required**. You can see the full version compatibility list [here](docs/version_compatibility.md).
|
||||||
|
|
||||||
|
2. **Transition to ESP-IDF Framework**: This release marks the official switch to the ESP-IDF framework, enhancing performance and allowing for more complex features.
|
||||||
|
- **What to Do**: You'll need to flash your device with the new firmware using a serial connection.
|
||||||
|
Detailed instructions are available in our [installation guide](docs/install.md#flashing-the-device-for-the-first-time).
|
||||||
|
- **Support for Arduino Framework**: If you're not ready to make the switch or prefer the Arduino framework, it's still supported for OTA updates.
|
||||||
|
See our [framework customization documentation](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/customization.md#frameworks) for details on how to select your preferred framework.
|
||||||
|
|
||||||
|
3. **Several Services Changed**: In our pursuit to enhance integration capabilities and future-proof our services, we've undertaken a comprehensive restructuring of our API.
|
||||||
|
This change is aimed at improving functionality and compatibility but may require adjustments to your current automations.
|
||||||
|
- **What to Do**: We strongly encourage you to review our updated [API documentation](docs/api.md).
|
||||||
|
This resource has been meticulously updated to assist you in updating your automation scripts accordingly.
|
||||||
|
Pay special attention to the examples section, which offers valuable insights and practical guidance for adapting your existing setups seamlessly.
|
||||||
|
|
||||||
|
4. **15s Hardware Button Press No Longer Restarts the Device**: This feature was removed to repurpose the hardware button for more versatile uses.
|
||||||
|
- **What to Do**: If you relied on this feature, see our [customization guide](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/customization.md#restart-with-15s-button-press) for alternatives.
|
||||||
|
Additionally, the reset pin remains an option for manual resets.
|
||||||
|
|
||||||
|
5. **Relay Fallback Switches Removed**: These switches were deprecated and have now been removed to streamline the firmware and reduce memory usage.
|
||||||
|
- **What to Do**: For users who utilized customizations to expose these switches, refer to our updated customization guide.
|
||||||
|
Alternatively, use the `esphome.xxxxx_init_hardware` service for a similar functionality without the memory overhead.
|
||||||
|
|
||||||
|
6. **Home Page Redesign**: We've redesigned the Home page layout to incorporate an additional value (sensor) and a utilities button, resulting in a minor repositioning of some components.
|
||||||
|
This change enhances the page's functionality, offering you a broader overview of your smart home at a glance.
|
||||||
|
While adjusting to the new layout, you might find some of your usual indicators or controls have shifted places, but they're all still readily accessible, designed with intuitive interaction in mind.
|
||||||
|
|
||||||
|
We appreciate your understanding and patience during this transition.
|
||||||
|
Our goal is to ensure NSPanel continues to evolve in a way that enhances your experience and meets future needs.
|
||||||
|
Our community and support channels are open for any questions or assistance you may require.
|
||||||
|
|
||||||
|
## Overview of noteworthy changes
|
||||||
|
- [Transition to ESP-IDF as Default Framework](#transition-to-esp-idf-as-default-framework)
|
||||||
|
- [New API documentation](#new-api-documentation)
|
||||||
|
- [Selectable font size for screensaver time display](#selectable-font-size-for-screensaver-time-display)
|
||||||
|
- [Enhanced Visibility of Hardware Button Bars Across Pages](#enhanced-visibility-of-hardware-button-bars-across-pages)
|
||||||
|
- [User-Defined Decimal Separator](#user-defined-decimal-separator)
|
||||||
|
- [Page Light with Power Button](#page-light-with-power-button)
|
||||||
|
- [Page Fan with Oscillate Button](#page-fan-with-oscillate-button)
|
||||||
|
- [Streamlined Interface: No More Empty Pages](#streamlined-interface-no-more-empty-pages)
|
||||||
|
- [Enhanced Localization: Translated Values](#enhanced-localization-translated-values)
|
||||||
|
- [Expanded Entity Selection for Home and Climate Pages](#expanded-entity-selection-for-home-and-climate-pages)
|
||||||
|
- [Introducing the Utilities Dashboard](#introducing-the-utilities-dashboard)
|
||||||
|
- [Expanded Support for "Lock" Entities on Buttons and Chips](#expanded-support-for-lock-entities-on-buttons-and-chips)
|
||||||
|
- [Additional Value on Home Page](#additional-value-on-home-page)
|
||||||
|
- [Automatic Font Size Adjustment for Entity Page Values](#automatic-font-size-adjustment-for-entity-page-values)
|
||||||
|
|
||||||
|
## Details of noteworthy changes
|
||||||
|
### Transition to ESP-IDF as Default Framework
|
||||||
|
We've transitioned to ESP-IDF, enhancing our platform's performance and capabilities.
|
||||||
|
This change promises new possibilities for your projects.
|
||||||
|
Those continuing with the Arduino framework can find instructions for setting framework preferences.
|
||||||
|
|
||||||
|
For more information, visit our [discussion](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions/1756).
|
||||||
|
|
||||||
|
### New API documentation
|
||||||
|
Now all the services available are listed in a comprehensive documentation, making easier for people who want to customize their systems,
|
||||||
|
integrate to other automations and to encourage new collaborators to our repository.
|
||||||
|
|
||||||
|
For more details, please visit our [API documentation](docs/api.md).
|
||||||
|
|
||||||
|
### Selectable font size for screensaver time display
|
||||||
|
Now you can chose the font size for your clock display in the screen saver. There are 3 sizes available:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 72px
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### 112px
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### 192px
|
||||||
|

|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> For this time to be displayed you must select a brightness higher than 0 on the device's page (under **Settings** > **Devices & Services** > **ESPHome**).
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Some fonts may not support all the languages.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Bigger fonts may not fit well on your display and the selected time format.
|
||||||
|
> Please select a different font in that case.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### Enhanced Visibility of Hardware Button Bars Across Pages
|
||||||
|
The hardware button bars, which display the status of entities linked to physical buttons, are now configurable to appear across all pages,
|
||||||
|
including the screensaver, providing a constant visual reference to your system's status.
|
||||||
|
This update introduces a new setting within the blueprint, allowing you to customize the visibility of these bars according to your preferences.
|
||||||
|
Whether you need continuous monitoring on certain pages or want to maintain a cleaner look on others, this flexibility enhances your control.
|
||||||
|
|
||||||
|
Additionally, we've introduced the option to personalize the color of these bars, offering further customization to match your panel's aesthetic or to signify different statuses at a glance.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This feature enhances the NSPanel's functionality by ensuring important status indicators are always within view, tailored precisely to how you use your smart home.
|
||||||
|
|
||||||
|
### User-Defined Decimal Separator
|
||||||
|
You can now select the decimal separator for displaying numbers on your NSPanel.
|
||||||
|
This feature allows for consistency with your regional number format preferences, improving the clarity of numerical information.
|
||||||
|
Simply go to the settings to choose between the dot (.) and comma (,) as your decimal separator for a display that matches your preference.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This update aims to enhance the flexibility and usability of the NSPanel interface for users worldwide.
|
||||||
|
|
||||||
|
### Page Light with Power Button
|
||||||
|
The page Light has been updated to include a power button, simplifying the process of toggling your light on or off.
|
||||||
|
This intuitive addition allows for quick adjustments directly from the page Light, enhancing the user experience by providing a straightforward control mechanism.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This enhancement streamlines light management, making it more accessible and convenient for everyday use.
|
||||||
|
|
||||||
|
### Page Fan with Oscillate Button
|
||||||
|
The Fan page now features an oscillate button, making it easier to control your fan's oscillation settings.
|
||||||
|
This convenient update enables users to activate or deactivate the oscillation function with a single tap, directly from the Fan page itself.
|
||||||
|
It's designed to improve the user experience by offering a simple and effective control option.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This update simplifies fan operation, enhancing accessibility and usability for all users.
|
||||||
|
|
||||||
|
### Streamlined Interface: No More Empty Pages
|
||||||
|
We've improved the NSPanel interface by ensuring that only populated pages are displayed, both for button and entities pages.
|
||||||
|
This update creates a more intuitive and clutter-free experience, automatically hiding any pages without assigned entities.
|
||||||
|
There's no need for additional setup; if a page has no entities linked to it, it simply won't appear on your panel, making navigation smoother and more efficient.
|
||||||
|
|
||||||
|
### Enhanced Localization: Translated Values
|
||||||
|
In a significant step towards a more localized user experience, the values displayed on the NSPanel are now translated using Home Assistant's `state_translated` function, introduced in HA v2024.3.0.
|
||||||
|
This means that not only are the project's strings translated, but also values provided by Home Assistant, such as those from text sensors or binary sensors.
|
||||||
|
This enhancement simplifies readability and usability for users interacting with the panel in different languages.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The translations are managed by Home Assistant and will correspond to the language settings
|
||||||
|
> specified under [**Settings** > **System** > **General**](https://my.home-assistant.io/redirect/general/).
|
||||||
|
|
||||||
|
### Expanded Entity Selection for Home and Climate Pages
|
||||||
|
With the latest update, we've significantly broadened the range of entities that can be incorporated into the Home and Climate pages,
|
||||||
|
aligning these sections with the extensive capabilities of the Entities pages.
|
||||||
|
This enhancement enables a more versatile and detailed representation of your smart home's metrics directly on your NSPanel,
|
||||||
|
from environmental sensors to energy monitors, offering a tailored view of your home's status at a glance.
|
||||||
|
|
||||||
|
When combined with the [Translated Values](#enhanced-localization-translated-values),
|
||||||
|
this expanded entity selection not only allows for a more personalized dashboard but also ensures that the information displayed is accessible and understandable,
|
||||||
|
regardless of your preferred language.
|
||||||
|
Together, these features elevate the NSPanel's functionality, providing you with a richer, more contextually relevant interface that adapts to your specific monitoring needs and preferences.
|
||||||
|
|
||||||
|
### Introducing the Utilities Dashboard
|
||||||
|
The "Utilities Dashboard" is a versatile feature tailored to offer a straightforward overview of your chosen utility metrics.
|
||||||
|
It's designed for flexibility, allowing you to customize up to six data points, such as solar production, wind energy, EV charging status,
|
||||||
|
battery levels, water, and gas consumption, according to what's relevant to your home.
|
||||||
|
This customization ensures that the dashboard only displays the utilities you're monitoring, maintaining a clean and uncluttered interface.
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Expanded Support for "Lock" Entities on Buttons and Chips
|
||||||
|
We're enhancing the NSPanel's integration capabilities by extending support for "lock" entities to both buttons and chips.
|
||||||
|
This development significantly broadens your ability to interact with and control lock mechanisms directly from the NSPanel.
|
||||||
|
Whether securing your home or managing access to different areas, these updates streamline the control process, integrating seamlessly with your smart home's security setup.
|
||||||
|
|
||||||
|
### Additional Value on Home Page
|
||||||
|
In our continuous effort to enhance the NSPanel's utility and efficiency, we're pleased to announce that the Home page now accommodates a fourth value, complete with its icon.
|
||||||
|
This addition allows for a more comprehensive at-a-glance view of your essential metrics directly from the home screen, ensuring that crucial information is always just a glance away.
|
||||||
|
|
||||||
|
### Automatic Font Size Adjustment for Entity Page Values
|
||||||
|
We've enhanced the entities pages with an automatic font size adjustment feature to improve the display of values, especially for longer strings or values with lengthy units.
|
||||||
|
This smart adjustment reduces the occurrence of truncated values by dynamically resizing the font based on the string length.
|
||||||
|
While the selection of fonts for the panel remains limited, this automatic resizing significantly enhances readability,
|
||||||
|
ensuring that all displayed information is clear and fully visible at a glance.
|
||||||
|
|
||||||
|
## v4.3.1 - Ensuring Compatibility with ESPHome v2024.3.0 and Enhancing Stability
|
||||||
|
Patch v4.3.1 focuses primarily on ensuring full compatibility with the latest ESPHome v2024.3.0 IP address format changes, crucial for the smooth compilation and operation of the NSPanel project.
|
||||||
|
This timely update addresses critical compatibility issues, alongside implementing key bug fixes and optimizations.
|
||||||
|
It underscores our ongoing commitment to enhancing stability and ensuring a reliable experience for all NSPanel users, keeping pace with the evolving ESPHome ecosystem.
|
||||||
|
|
||||||
|
### Support for ESPHome v2024.3.0 IP Address Format
|
||||||
|
- **Criticality:** Critical (required for compiling with ESPHome 2024.3.0)
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** This update introduces necessary adjustments to accommodate the new IP address format introduced by ESPHome v2024.3.0,
|
||||||
|
ensuring uninterrupted project compilation and enhancing compatibility.
|
||||||
|
This critical update is the cornerstone of patch v4.3.1, deployed simultaneously with ESPHome to ensure NSPanel users experience no disruption in service.
|
||||||
|
This adaptation ensures that NSPanel firmware remains fully functional and up-to-date with ESPHome's latest advancements,
|
||||||
|
reaffirming our commitment to providing a seamless and stable user experience.
|
||||||
|
|
||||||
|
### Button Bars Visibility Enhancement and Configuration Change
|
||||||
|
- **Criticality:** Breaking Change (with Enhancement)
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** The visibility of button bars, indicating the status of entities linked to hardware buttons,
|
||||||
|
has been updated to be visible across all pages by default, including the screensaver.
|
||||||
|
This enhancement improves the accessibility of crucial status information.
|
||||||
|
Users who previously customized the visibility settings for button bars will need to review and adjust their configurations to align with the new default behavior.
|
||||||
|
This change enables users to selectively exclude button bars from specific pages if desired, providing greater flexibility and control over the interface's appearance.
|
||||||
|
|
||||||
|
### Service `hw_button_state` Update
|
||||||
|
- **Criticality:** Breaking Change (with Enhancement)
|
||||||
|
- **Affected Components:** Blueprint and ESPHome
|
||||||
|
- **Description:** The method for controlling the state of hardware buttons has been refined with the introduction of a `button_mask` parameter.
|
||||||
|
This update simplifies the process of simultaneously updating the visual state of multiple hardware buttons,
|
||||||
|
enhancing user interaction by providing a more intuitive interface for managing button states.
|
||||||
|
Users can now specify the buttons they wish to control using a single `button_mask` parameter,
|
||||||
|
offering a streamlined approach for activating or deactivating the on-screen indication bars of the hardware buttons.
|
||||||
|
This change fosters a more flexible and efficient user experience in configuring the visual feedback for button states.
|
||||||
|
|
||||||
|
### Celsius Display Issue for Embedded Temperature Sensor Resolved (#1834)
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Addressed an issue where the NSPanel's built-in temperature sensor incorrectly displayed temperature readings in Celsius, even when Fahrenheit was expected.
|
||||||
|
This fix ensures temperature readings are accurately represented according to the user's settings, improving usability and consistency across the system.
|
||||||
|
|
||||||
|
### Resolution for Panel Naming When `device_name` Is Not Provided (#1907)
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Corrected a bug that caused the new "Device Name" sensor to report "nspanel"
|
||||||
|
and therefore fail on defining services names when a `device_name` substitution was not specified by the user.
|
||||||
|
|
||||||
|
### External Temperature Sensor Selection Now Correctly Overrides Embedded Sensor Value (#1911)
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** Blueprint and ESPHome
|
||||||
|
- **Description:** Fixed a display issue where the built-in sensor's temperature reading persisted despite configuration for an external sensor.
|
||||||
|
|
||||||
|
### Utilities Dashboard Now Correctly Omits Default Labels When Customized (#1899)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Enhanced the utilities dashboard by ensuring custom labels properly replace or remove default ones for a personalized display.
|
||||||
|
|
||||||
|
### Clarification and Improvements to `rtttl_play` Service Documentation (#1901 and #1912)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Documentation
|
||||||
|
- **Description:** Updated documentation for clearer guidance on using the `rtttl_play` service for custom sounds and alerts.
|
||||||
|
|
||||||
|
### Correction of Missing Icon Display Issue on Entities Page 3 (#1902)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Description:** Addressed a bug preventing certain icons from displaying on the third Entities page, ensuring a consistent user interface.
|
||||||
|
|
||||||
|
### Icons No Longer Appear "Disabled" for Sensor Values of 0.0 (#1902)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Resolved an incorrect icon color display issue where they appeared disabled at a sensor value of exactly 0.0.
|
||||||
|
|
||||||
|
### Vertical Alignment Improvements on Entities Pages for Enhanced Readability (#1903)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Description:** Adjusted the vertical alignment of text and icons on Entities pages for a more visually appealing presentation.
|
||||||
|
|
||||||
|
### Enhanced Guidance on Handling Duplicated Entities on the Device's Page (#1905)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Documentation
|
||||||
|
- **Description:** Updated documentation to better address and resolve issues related to entity duplication on the device's page on Home Assistant.
|
||||||
|
|
||||||
|
### Compilation Guidance Updated for Customizations with the Latest Version (#1914)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Documentation
|
||||||
|
- **Description:** Resolved documentation issues leading to compilation errors during customization, facilitating smoother custom feature implementation.
|
||||||
|
|
||||||
|
### Elimination of Transient Icon Flashes on the Home Page During Page Transitions (#1915)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint, ESPHome and TFT
|
||||||
|
- **Description:** Fixed a visual glitch where icons briefly flashed during transitions, streamlining the visual experience.
|
||||||
|
|
||||||
|
### Real-Time Brightness Adjustment Now Effective Even During Sleep Mode (#1919)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Ensured brightness settings changes are immediately applied, even when the panel is in sleep mode.
|
||||||
|
|
||||||
|
### Smooth Cursor Movement on Utilities Page Near Zero Sensor Readings (#1926)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Ensured cursor movement on the Utilities page is smooth and accurate, even with sensor readings defining the cursor direction is between 0 and 1.
|
||||||
|
|
||||||
|
### Notification Screen Clearing Now Functional with `notification_clear` Service Call (#1931)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Enabled clear display of notifications from the screen upon invoking the `notification_clear` service, enhancing display control.
|
||||||
|
|
||||||
|
### Page Indicator Removed for Single-Page Views (#1883)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Description:** Improved UI by removing unnecessary page indicators when only one page is present, simplifying navigation.
|
||||||
|
|
||||||
|
### Entities Page Font Adjustment for CJK Fonts Improved (#1884)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Optimized font sizing and display on Entities pages for CJK fonts, addressing readability issues.
|
||||||
|
|
||||||
|
### User Option Added to Disable Entities Page Icons for a Text-Focused View (#1885)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Introduced an option to disable icons on Entities pages, allowing for a simplified, text-only display.
|
||||||
|
|
||||||
|
### Utilities Page Line Cursor Size Customization Option Added (#1910)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Provided customization options for cursor size on the Utilities dashboard, enhancing data visualization.
|
||||||
|
|
||||||
|
### Temperature Measurement Sampling Enhancement (#1918)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Enhanced the temperature reporting mechanism of the NSPanel's built-in temperature sensor by implementing a sampling method.
|
||||||
|
Now, the sensor collects 12 intermediate measurements and calculates their average before reporting the temperature.
|
||||||
|
This enhancement, which does not alter the 1-minute measurement interval, aims to provide smoother and more stable temperature readings,
|
||||||
|
improving accuracy and reliability for users monitoring their environment.
|
||||||
|
|
||||||
|
### Boot Page Visual Feedback Enhancements for Clearer System Status Display (#1923)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome and TFT
|
||||||
|
- **Description:** Updated the Boot page to offer clearer visual feedback on version information and system status, with a new progress bar.
|
||||||
|
|
||||||
|
## v4.3.2 - Enhancements and Critical Fixes for a Seamless Experience
|
||||||
|
In this patch, we focus on enhancing the NSPanel experience by introducing critical fixes and requested enhancements to improve overall system stability and user interaction.
|
||||||
|
This update addresses key issues, such as the incorrect display of the "boot" page upon wake-up, and optimizes the performance of the Utilities Dashboard to prevent potential overload states.
|
||||||
|
With updates across firmware, user interface, and documentation, v4.3.2 underscores our dedication to delivering a seamless and robust smart home control solution.
|
||||||
|
|
||||||
|
### Device Reboot Issue on Wake Up Resolved (#1947 and #1976)
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1947 and #1976
|
||||||
|
- **Description:** Resolved a critical issue causing the NSPanel to boot to the "boot" page rather than the "home" page under certain conditions, such as upon waking.
|
||||||
|
This correction ensures the panel directly accesses the "home" page, streamlining user interaction by promptly presenting the main interface.
|
||||||
|
Effective implementation of this fix necessitates clearing the build files before updating.
|
||||||
|
The procedure below guides you through cleaning build files in the ESPHome Dashboard, an essential step to actualize this update.
|
||||||
|
|
||||||
|
### Utilities Dashboard Performance Bug Resolved (#1949 and #1964)
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** Blueprint and ESPHome
|
||||||
|
- **Issue Number:** #1949 and #1964
|
||||||
|
- **Description:** Fixed a significant performance bug in the "Utilities Dashboard" related to sensors with high update frequencies.
|
||||||
|
Previously, sensors updating frequently could overload the Home Assistant host, causing the blueprint execution to delay.
|
||||||
|
As updates persisted, this led to multiple instances of the blueprint being triggered, eventually hitting the limit of 50 concurrent instances.
|
||||||
|
This update minimizes the issue, ensuring smooth operation and reducing the chances of a overload state, thereby maintaining efficient and reliable dashboard performance.
|
||||||
|
|
||||||
|
#### How to Clean-up Build Files
|
||||||
|
1. Navigate to your ESPHome Dashboard.
|
||||||
|
2. Select the 3-dot menu adjacent to your device's listing.
|
||||||
|
3. Choose "**Clean Build Files**".
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Cleaning build files is a mandatory step for this update to apply successfully.
|
||||||
|
> It ensures your NSPanel operates smoothly with the new improvements post-update.
|
||||||
|
|
||||||
|
### Fix for Inverted Chip Icon Color Issue (#1928)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint, TFT
|
||||||
|
- **Issue Number:** #1928
|
||||||
|
- **Description:** Resolved an issue where the color of icons on inverted chips did not display correctly on the home page, affecting the visual distinction and readability of these elements.
|
||||||
|
This fix ensures that icons on inverted chips are now properly rendered, maintaining consistency and enhancing the overall aesthetic of the user interface.
|
||||||
|
This correction contributes to a more intuitive and visually appealing experience for users, reinforcing the clarity of information presented on the NSPanel.
|
||||||
|
|
||||||
|
### Fix for Numeric Button Page Labels Not Displaying (#1961)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1961
|
||||||
|
- **Description:** Resolved an issue where button page labels consisting solely of numbers were not being displayed, ensuring that numeric titles are now properly shown.
|
||||||
|
This fix enhances interface clarity by allowing users to utilize numerical identifiers for their button pages, thereby improving navigation and usability within the NSPanel environment.
|
||||||
|
|
||||||
|
### Automatic Update for Weather Icon at Sunrise and Sunset (#1971)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1971
|
||||||
|
- **Description:** Addressed a bug where the weather icon on the home page did not automatically update to reflect changes at sunrise and sunset, necessitating a manual page reload.
|
||||||
|
With this fix, the icon now refreshes automatically to provide an accurate representation of the weather conditions in relation to the day and night cycle.
|
||||||
|
This improvement ensures a more dynamic and responsive user interface, enhancing the visual experience by seamlessly integrating natural environmental changes.
|
||||||
|
|
||||||
|
### Fix for Missing Titles and Icons on Detailed Entities Pages (#1978)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1978
|
||||||
|
- **Description:** Resolved an issue on detailed entities pages where page titles and icons were not being displayed, leading to a lack of clarity and navigation challenges for users.
|
||||||
|
This fix ensures that each detailed page now correctly showcases its respective title and icon,
|
||||||
|
enhancing the overall user interface by providing immediate context and visual cues for better usability and navigation within the NSPanel environment.
|
||||||
|
|
||||||
|
### Swipe Functionality Restored on Button and Home Pages (#1980 and #1994)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Issue Number:** #1980 and #1994
|
||||||
|
- **Description:** Addressed issues impacting swipe functionality on button pages and the home page, which previously hindered smooth navigation through swipe gestures.
|
||||||
|
This update restores proper swipe operation, allowing users to effortlessly switch between pages with a simple gesture.
|
||||||
|
Enhancing swipe responsiveness contributes to a more fluid and intuitive user experience, reinforcing the ease of navigating the NSPanel's interface.
|
||||||
|
|
||||||
|
### Typo Correction in Blueprint Inputs (#2003)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2003
|
||||||
|
- **Description:** Corrected a minor typo in the blueprint inputs to ensure accuracy and clarity in the configuration options.
|
||||||
|
This adjustment, made in the description for the `hw_buttons_bar_color_off` input, showcases our commitment to detail and high-quality documentation,
|
||||||
|
enhancing user experience by providing clear and precise instructions.
|
||||||
|
- **Special Thanks:** Our thanks go to @colincachia for this attentive correction.
|
||||||
|
This action highlights the importance of community involvement and the collective effort to maintain the project's high standards, even in the smallest details.
|
||||||
|
|
||||||
|
### Immediate Brightness Adjustment from Home Assistant Fixed
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Issue Number:** #2006
|
||||||
|
- **Description:** Resolved a minor issue affecting brightness adjustments made from Home Assistant.
|
||||||
|
Previously, when the brightness target was reduced via Home Assistant, the change was not immediately reflected on the NSPanel.
|
||||||
|
This update ensures that any adjustments to brightness settings are promptly applied,
|
||||||
|
maintaining consistency between the Home Assistant interface and the NSPanel's display for a more synchronized and responsive user experience.
|
||||||
|
|
||||||
|
### Custom Binary State Entities for Hardware Button Status Display Enhancement (#1904, #1933, #1959, #1973)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1904, #1933, #1959, #1973
|
||||||
|
- **Description:** This update introduces the capability to assign custom binary state entities to the hardware button status display.
|
||||||
|
This significant enhancement allows for the hardware button bar to reflect the status of a different entity than the one assigned to the button itself,
|
||||||
|
providing users with greater customization and flexibility in their interface interactions.
|
||||||
|
This development enriches user feedback mechanisms, enabling more intuitive and dynamic control options within the NSPanel environment.
|
||||||
|
- **Special Thanks:** Our heartfelt appreciation goes to @lafriks for their invaluable contribution and initiative in developing this feature.
|
||||||
|
These efforts have notably advanced the customization potential of NSPanel, fostering a more versatile and user-centric experience.
|
||||||
|
|
||||||
|
### Enhanced Temperature Measurement Strategy (#1918)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Issue Number:** #1918
|
||||||
|
- **Description:** Thanks to the dedicated efforts and thorough testing by our community,
|
||||||
|
the NSPanel's built-in temperature sensor now employs a more sophisticated measurement strategy for enhanced accuracy and responsiveness.
|
||||||
|
By integrating a combination of four samples per measurement and employing a `sliding_window_moving_average` filter with a window size of six,
|
||||||
|
the sensor's reporting frequency has been adjusted to every 10 seconds.
|
||||||
|
This methodological enhancement, chiefly proposed and tested by community members @andythomas and @grigi,
|
||||||
|
ensures a smoother temperature curve and faster response to environmental changes such as opening a window.
|
||||||
|
While the adjusted frequency means data is reported more often, ESPHome's efficient data transmission only when changes occur ensures that the impact on Home Assistant's data processing is minimal.
|
||||||
|
This significant improvement, sparked by proactive community involvement,
|
||||||
|
not only enhances the NSPanel's functionality but also broadens the scope for more dynamic and responsive environmental automations.
|
||||||
|
- **Special Thanks:** To @andythomas and @grigi for their exceptional work in testing and proposing these adjustments, truly embodying the spirit of community-driven development.
|
||||||
|
Your active participation and contributions have been instrumental in refining this feature.
|
||||||
|
|
||||||
|
### Enhanced Version Mismatch Notifications for Comprehensive System Compatibility (#1966 and #1968)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1966 and #1968
|
||||||
|
- **Description:** The version mismatch notification system has been significantly improved to cover all critical components of the NSPanel project,
|
||||||
|
including the ESPHome firmware, Home Assistant blueprint, and Nextion TFT file.
|
||||||
|
This update ensures that notifications are more descriptive, pinpointing which component is out of sync and providing specific instructions for resolution.
|
||||||
|
This targeted approach helps users quickly identify and rectify compatibility issues, maintaining the system's overall harmony and preventing disruptions in functionality.
|
||||||
|
|
||||||
|
### Documentation Improvement for TFT Upload Process (#1969)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Documentation
|
||||||
|
- **Issue Number:** #1969
|
||||||
|
- **Description:** Enhanced the documentation to clarify the necessity of DNS for downloading TFT files from GitHub during the TFT upload process.
|
||||||
|
This update addresses confusion encountered when manually setting IP addresses as part of customizations, emphasizing that a DNS server must be specified to enable remote TFT downloads.
|
||||||
|
For setups lacking DNS configuration, the documentation now highlights the alternative of using local TFT transfer via the `nextion_update_url` substitution.
|
||||||
|
This clarification aims to streamline the TFT update process, ensuring users have a clear understanding of the requirements for successful TFT file downloads and uploads,
|
||||||
|
thereby enhancing the overall setup experience.
|
||||||
|
|
||||||
|
### Documentation Update for "Folder-Watcher" Engine Use (#1974)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1974
|
||||||
|
- **Description:** Updated documentation to provide clearer instructions on the "folder-watcher" engine's use within the NSPanel project.
|
||||||
|
This engine, which triggers TFT updates upon changes in a user-specified folder, may not be widely used but offers valuable functionality for those who do.
|
||||||
|
The documentation now more accurately describes how to leverage this feature for automated TFT updates, aiming to improve understanding and ease of use for interested users.
|
||||||
|
|
||||||
|
### Close Icon Visibility Enhancement (#1984)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Issue Number:** #1984
|
||||||
|
- **Description:** Enhanced the visibility of the "close" icon (represented as an "x" sign) located at the top right corner of various pages.
|
||||||
|
By slightly increasing the size of this icon, users can now more easily identify and interact with it, improving the overall usability of the NSPanel interface.
|
||||||
|
This minor yet impactful adjustment ensures a smoother, more intuitive navigation experience for all users.
|
||||||
|
|
||||||
|
### Alarm Control with Hardware Button Enhancement (#1995)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1995
|
||||||
|
- **Description:** Enhanced the functionality of hardware buttons for a more intuitive interaction with alarm control panels.
|
||||||
|
Now, a short click on a hardware button assigned to an entity from the `alarm_control_panel` domain will open its detailed page, aligning with the behavior for `climate` and `media_player` entities.
|
||||||
|
This update facilitates quicker access to alarm controls directly from the NSPanel, streamlining user interactions.
|
||||||
|
Long clicks continue to open the detailed page for these and other domains, maintaining a consistent and user-friendly experience across various controls.
|
||||||
|
|
||||||
|
### Documentation Updates for Arduino References (#1997)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Documentation
|
||||||
|
- **Issue Number:** #1997
|
||||||
|
- **Description:** Comprehensive updates and refinements were made to the project documentation, with a particular focus on correcting and clarifying references related to the Arduino framework.
|
||||||
|
This effort led to a thorough review and subsequent enhancement of various sections of the documentation, improving clarity, accuracy, and usefulness across the board.
|
||||||
|
Special thanks to the author of this PR, @andythomas, whose dedicated work went beyond just addressing
|
||||||
|
Arduino framework references to include minor fixes and overall improvements to the documentation.
|
||||||
|
These contributions have significantly elevated the quality of information available to users, ensuring that the documentation remains a reliable and up-to-date resource for the community.
|
||||||
|
|
||||||
|
### Expanded Wake-Up Sensor Support (#1998)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1998
|
||||||
|
- **Description:** The range of supported device classes for wake-up sensors on the NSPanel has been significantly expanded.
|
||||||
|
Now, in addition to the previously supported door, motion, and occupancy sensors, the NSPanel firmware accommodates a wider variety of sensor types.
|
||||||
|
These enhancements enable the panel to wake up from sleep mode upon detecting various environmental changes, improving responsiveness and user interaction.
|
||||||
|
The newly supported device classes include:
|
||||||
|
- door
|
||||||
|
- garage_door
|
||||||
|
- lock
|
||||||
|
- motion
|
||||||
|
- occupancy
|
||||||
|
- opening
|
||||||
|
- smoke
|
||||||
|
- sound
|
||||||
|
- vibration
|
||||||
|
- window
|
||||||
|
This update broadens the NSPanel's integration capabilities with home automation systems, allowing for a more dynamic and reactive smart home environment.
|
||||||
|
|
||||||
|
### Hebrew Translation Text Reversal Fix (#1999)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1999
|
||||||
|
- **Description:** Addressed a specific issue with the Hebrew translation where text was displayed in reverse order, hindering readability and user experience.
|
||||||
|
This fix ensures that Hebrew text is correctly aligned and presented, enhancing the interface for Hebrew-speaking users.
|
||||||
|
The commitment to support diverse languages and correct such localization issues underscores our dedication to providing a user-friendly experience for all NSPanel users,
|
||||||
|
regardless of their language.
|
||||||
|
|
||||||
|
### Enhanced TFT Update Reliability in ESPHome Nextion Component
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Improved the reliability of TFT updates within the ESPHome Nextion component.
|
||||||
|
This enhancement optimizes the process of updating the NSPanel's display, ensuring smoother transitions and reducing the potential for update failures.
|
||||||
|
The upgrade targets the underlying mechanisms of the Nextion component in ESPHome,
|
||||||
|
refining its functionality to offer a more dependable and efficient update experience for users implementing TFT changes.
|
||||||
|
|
||||||
|
## v4.3.3 - Enhancing Flexibility and User Experience
|
||||||
|
With the v4.3.3 update, we're focused on refining the NSPanel's usability and customization capabilities, addressing user feedback to enhance the intuitive interaction with the panel.
|
||||||
|
From streamlining light entity controls to expanding text length for entities on the home page, each change is aimed at improving the user experience.
|
||||||
|
This patch also introduces experimental features, such as prebuilt firmware updates and PSRAM use, pushing the boundaries of what's possible with NSPanel,
|
||||||
|
while also ensuring a smoother, more reliable interface across different languages and configurations.
|
||||||
|
|
||||||
|
### Simplified Light Entity Control on Custom Buttons (#1844)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1844
|
||||||
|
- **Description:** Addressed an inconsistency where light entities with only on/off capabilities erroneously showed an extended screen with a brightness slider.
|
||||||
|
This fix streamlines the control interface for such light entities, aligning with their actual capabilities.
|
||||||
|
|
||||||
|
### Deletion of Button Icons from Home Page Enabled (#1992)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1992
|
||||||
|
- **Description:** Resolved an issue preventing the removal of button icons from the home page.
|
||||||
|
Users can now delete or change button icons as needed, providing flexibility in customizing the panel's appearance.
|
||||||
|
|
||||||
|
### Correction of Missing Characters on Button Pages for Multi-Byte Languages (#2000)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint, ESPHome, and TFT
|
||||||
|
- **Issue Number:** #2000
|
||||||
|
- **Description:** Resolved a display issue affecting multi-byte languages, where specific characters were missing on the button pages.
|
||||||
|
This fix ensures complete and accurate representation of all languages across the NSPanel interface, including Hebrew and others where a character may occupy more than a single byte.
|
||||||
|
|
||||||
|
### Entity Display Persistence on Home Page Addressed (#2018)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2018
|
||||||
|
- **Description:** Fixed a bug where entities removed from the blueprint continued to display on the home page.
|
||||||
|
This update ensures that the home page accurately reflects the current configuration, removing any unassigned entities.
|
||||||
|
|
||||||
|
### Resolved Unintended Climate Control Page Access (#2021)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2021
|
||||||
|
- **Description:** Fixed an issue where touching the temperature display on the home page erroneously opened the climate control page, even in the absence of configured climate entities.
|
||||||
|
This update ensures that interactions with the temperature display are consistent with the available configurations, enhancing the intuitive use of the NSPanel.
|
||||||
|
|
||||||
|
### Internal Temperature Reporting Fix After Sleep (#2030)
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2030
|
||||||
|
- **Description:** Resolved an issue where the internal temperature indicator disappeared for a few seconds upon waking the panel from sleep mode.
|
||||||
|
This fix ensures the internal temperature, especially when sourced from the panel's internal sensor,
|
||||||
|
remains consistently displayed without interruption when transitioning from sleep to the home page, enhancing the stability and reliability of environmental monitoring on the NSPanel.
|
||||||
|
|
||||||
|
### Advanced Settings Page Entity Name Enhancement (#1909)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #1909
|
||||||
|
- **Description:** Improved the advanced settings page by providing clearer entity names when opened from a custom button,
|
||||||
|
enhancing user navigation and configuration understanding within the NSPanel settings.
|
||||||
|
|
||||||
|
### Support for `mdi:void` Icon on Homepage for Blank Display (#2019)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2019
|
||||||
|
- **Description:** Implemented support for the `mdi:void` icon on the homepage, allowing for a blank display where no icon is preferred.
|
||||||
|
This enhancement provides users with greater customization flexibility, enabling a cleaner and more minimalistic interface by opting not to show any icon.
|
||||||
|
|
||||||
|
### Extended Text Length for Entities on Home Page (#2020)
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** TFT
|
||||||
|
- **Issue Number:** #2020
|
||||||
|
- **Description:** Enhanced the home page by allowing for longer text for entities values.
|
||||||
|
This improvement accommodates more detailed values, improving clarity and user understanding of displayed data and controls.
|
||||||
|
|
||||||
|
### Timezone Selector Added to Blueprint
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** Blueprint and ESPHome
|
||||||
|
- **Description:** Introduced a timezone selector within the Blueprint configuration, streamlining the setup process and enhancing user convenience.
|
||||||
|
This addition simplifies the configuration of the NSPanel, significantly reducing the need for YAML customizations related to timezone settings.
|
||||||
|
By providing a direct method to specify the timezone, this enhancement ensures that time displays and other time-sensitive features on the NSPanel accurately reflect the user's local time,
|
||||||
|
contributing to a more personalized and accurate user experience.
|
||||||
|
|
||||||
|
### Prebuilt Firmware Updates (#2024) - EXPERIMENTAL
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Issue Number:** #2024
|
||||||
|
- **Description:** The prebuilt firmware has been updated to incorporate the latest fixes and enhancements,
|
||||||
|
ensuring users have access to the most current and stable version without the need for manual compilation.
|
||||||
|
This is another important step in our goal torwards [Simplifying User Experience for NSPanel Firmware](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions/1602),
|
||||||
|
allowing users to directly download the firmware from GitHub without the need of compiling it locally.
|
||||||
|
- **Special Thanks:** To @MichaelHeimann for trimming this feature, fixing bugs and reviving this idea.
|
||||||
|
|
||||||
|
### Use of PSRAM (#1815, #1946, and #1983) - EXPERIMENTAL
|
||||||
|
- **Criticality:** Enhancement
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Issue Number:** #1815, #1946, and #1983
|
||||||
|
- **Description:** We are introducing the use of PSRAM memory available on the NSPanel.
|
||||||
|
This will possibly open space for additional features to be developed in the future and the use of more customizations for your panel.
|
||||||
|
- **Special Thanks:** To @Bascht74 and @olicooper for giving the directions to enable the use of non-standard pins for PSRAM used in NSPanel,
|
||||||
|
and to @X-Ryl669 and @MichaelHeimann for all the tests, tips, and feedback around this.
|
||||||
|
|
||||||
|
## v4.3.4 - Urgent Fix for Home Screen Interaction
|
||||||
|
This patch release addresses a critical issue from the v4.3.3 update that affected the touch functionality on the Home screen, specifically impacting the ability to navigate to the climate page.
|
||||||
|
|
||||||
|
### Critical Touch Interaction Bug Fixed (#2040)
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Issue Number:** #2040
|
||||||
|
- **Description:** Fixed an issue where users were unable to navigate to the climate control page by touching the temperature display on the Home screen.
|
||||||
|
This bug was inadvertently introduced in the v4.3.3 update and has been promptly resolved to restore full functionality.
|
||||||
|
Users can now interact with the temperature display as intended, facilitating seamless access to the climate controls.
|
||||||
|
|
||||||
|
This update is essential for ensuring that the NSPanel functions correctly, maintaining the quality and reliability expected by our users.
|
||||||
|
We apologize for any inconvenience caused and thank you for your continued support.
|
||||||
|
|
||||||
|
## v4.3.5 - Experimenting with Bluetooth Capabilities
|
||||||
|
This patch release v4.3.5 introduces experimental Bluetooth features alongside critical fixes and enhancements.
|
||||||
|
The new Bluetooth capabilities leverage the previously untapped potential of the NSPanel's Bluetooth modem, enabled by the increased memory availability in the ESP-IDF framework.
|
||||||
|
|
||||||
|
### New Bluetooth Features (Experimental)
|
||||||
|
- **BLE Tracker Add-on**
|
||||||
|
- **Description:** This add-on enables the NSPanel to act as a Bluetooth Low Energy (BLE) tracker, allowing it to detect and report the presence of BLE devices in its vicinity.
|
||||||
|
This feature is instrumental for presence detection and smart home automation scenarios.
|
||||||
|
|
||||||
|
- **Bluetooth Proxy Add-on**
|
||||||
|
- **Description:** The Bluetooth Proxy add-on allows the NSPanel to act as a bridge or proxy for other Bluetooth devices, facilitating communication between BLE devices and Home Assistant.
|
||||||
|
This can significantly extend the functionality of Home Assistant in managing Bluetooth devices without direct connectivity.
|
||||||
|
|
||||||
|
### Temperature Display and Control Fixes
|
||||||
|
- **Temperature Increment Error in Climate Card Resolved (#2076)**
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Corrected a rounding error in the climate card, which caused temperature set points to adjust in increments of 0.9 degrees.
|
||||||
|
This fix ensures temperature adjustments are now rounded to the nearest whole number, aligning with expected control behavior.
|
||||||
|
|
||||||
|
- **Consistent Temperature Unit Display Across Panels (#2056)**
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Resolved an issue where the internal temperature sensor did not convert temperatures from Celsius to Fahrenheit for display on the home screen,
|
||||||
|
despite displaying correctly on the climate page. Temperatures are now consistently shown in the user-defined units across all NSPanel displays.
|
||||||
|
|
||||||
|
### Control and Interface Enhancements
|
||||||
|
- **Improved Custom Button Response for Dimmable Color Lights (#2072)**
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Fixed a bug where custom buttons for dimmable color lights only toggled the lights on/off.
|
||||||
|
The buttons now correctly adjust brightness and color settings, enhancing user control.
|
||||||
|
|
||||||
|
- **Homepage Weather and Climate Control Delay Minimized (#2056)**
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** ESPHome and TFT
|
||||||
|
- **Description:** Introduced a minor delay optimization for weather updates and climate control interactions on the home page, improving the responsiveness and user experience.
|
||||||
|
|
||||||
|
- **Consistent Icon Color Display on Home Page (#2043)**
|
||||||
|
- **Criticality:** Minor
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Addressed an issue where icons on the home page always displayed in white, regardless of the set color.
|
||||||
|
Icons now correctly reflect the specified colors, enhancing visual consistency and user interface aesthetics.
|
||||||
|
|
||||||
|
### System Stability and Functionality
|
||||||
|
- **Restoration of Webserver Functionality Post-Upgrade (#2054, #2050)**
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Fixed issues that caused the webserver component to stop functioning following recent upgrades.
|
||||||
|
This repair restores full webserver functionality, essential for user access and system configuration via a web interface.
|
||||||
|
|
||||||
|
- **Reliability Improvements for TFT Uploads with Bluetooth Components (#1946, #1815)**
|
||||||
|
- **Criticality:** Medium
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Enhanced the reliability of TFT file uploads when the Bluetooth proxy or the BLE Tracker are enabled.
|
||||||
|
This fix addresses disruptions previously experienced during TFT updates, ensuring smoother and more reliable firmware installations.
|
||||||
|
|
||||||
|
This update, v4.3.5, is a significant step towards harnessing the full potential of the NSPanel's hardware capabilities, especially its Bluetooth functionality,
|
||||||
|
while continuing to refine the user experience and system stability.
|
||||||
|
We appreciate the community's active involvement in identifying these issues and thank everyone for their contributions to improving the firmware.
|
||||||
|
|
||||||
|
## v4.3.6 - Critical Fixes for Custom Buttons
|
||||||
|
This release of v4.3.6 is an urgent patch to address critical issues affecting the functionality of custom buttons on the NSPanel.
|
||||||
|
These fixes ensure that custom buttons properly trigger actions for climate and alarm controls, and correct the integration with external thermostat entities.
|
||||||
|
|
||||||
|
### Fixes for Custom Button Functionality
|
||||||
|
- **Climate Page Accessibility Restored (#2067)**
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Resolved an issue where the climate page was not opening when triggered from a custom button.
|
||||||
|
Users can now access the climate controls directly from the home screen without interruption.
|
||||||
|
|
||||||
|
- **Alarm Control from Custom Button Restored (#2081)**
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** Blueprint
|
||||||
|
- **Description:** Fixed a malfunction where custom buttons configured for alarm control were unresponsive.
|
||||||
|
This update restores full functionality, allowing for immediate access and control of alarm settings from the home page.
|
||||||
|
|
||||||
|
- **Integration of External Thermostat Entities Fixed (#2080)**
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Description:** Corrected an issue introduced in v4.3.5 where external thermostat entities (the ones controlled by Home Assistant) linked to custom buttons were not functioning correctly.
|
||||||
|
With this fix, users can again utilize custom buttons to control their external thermostats effectively.
|
||||||
|
|
||||||
|
This patch release v4.3.6 ensures that custom buttons on the NSPanel are fully operational, addressing urgent issues that impacted user interaction and control of climate and alarm systems.
|
||||||
|
We thank our community for their prompt reporting and patience as we continue to enhance the NSPanel experience.
|
||||||
|
|
||||||
|
## v4.3.7 - Quick Fix for Captive Portal Compile Error
|
||||||
|
This patch addresses a critical compile error related to the captive portal feature, ensuring smooth and successful firmware compilations for users utilizing this feature.
|
||||||
|
|
||||||
|
### Captive Portal Compile Error Resolved (#2088)
|
||||||
|
- **Criticality:** Critical
|
||||||
|
- **Affected Components:** ESPHome
|
||||||
|
- **Issue Number:** #2088
|
||||||
|
- **Description:** Fixed a critical issue where users faced a compilation error due to an undeclared reference to 'ap_captive_portal'.
|
||||||
|
This fix corrects the reference error, restoring the ability to compile with the captive portal enabled.
|
||||||
|
Users who do not utilize the captive portal can continue without modification, while those who do should see successful compilations without further adjustments.
|
||||||
|
|
||||||
|
This release ensures that all users, regardless of their use of the captive portal feature, can compile and update their firmware without interruption.
|
||||||
|
We apologize for any inconvenience caused and appreciate your patience as we continue to improve the NSPanel firmware.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
For support or more information about this update,
|
||||||
|
visit our [GitHub repository](https://github.com/Blackymas/NSPanel_HA_Blueprint)
|
||||||
|
or our [online documentation](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/README.md).
|
||||||
|
|
||||||
|
## What's Next?
|
||||||
|
Discover our upcoming projects in our [Milestones](https://github.com/Blackymas/NSPanel_HA_Blueprint/milestones?direction=asc&sort=title&state=open).
|
||||||
|
|
||||||
|
## Special Thanks
|
||||||
|
We extend our heartfelt thanks to the contributors who have played a pivotal role in enhancing the NSPanel's capabilities and documentation in this release:
|
||||||
|
- **@shing6326**: For diligently addressing and fixing issues related to the new Fan oscillating feature.
|
||||||
|
Your efforts have significantly improved its functionality and reliability (#1839).
|
||||||
|
- **@andythomas**: For the comprehensive enhancements made to our documentation.
|
||||||
|
Your contributions have made our guides more informative and accessible, enriching the user experience for everyone (#1865).
|
||||||
|
|
||||||
|
## Previous releases
|
||||||
|
- [v4.3.6 - Critical Fixes for Custom Buttons](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.6)
|
||||||
|
- [v4.3.5 - Experimenting with Bluetooth Capabilities](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.5)
|
||||||
|
- [v4.3.4 - Urgent Fix for Home Screen Interaction](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.4)
|
||||||
|
- [v4.3.3 - Enhancing Flexibility and User Experience](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.3)
|
||||||
|
- [v4.3.2 - Enhancements and Critical Fixes for a Seamless Experience](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.2)
|
||||||
|
- [v4.3.1 - Ensuring Compatibility with ESPHome v2024.3.0 and Enhancing Stability](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.1)
|
||||||
|
- [v4.3 - Welcome to Framework ESP-IDF, an Utilities Dashboard and Enhanced Localization](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.3.0)
|
||||||
|
- [v4.2.6 - Enhancing Stability and User Experience](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.6)
|
||||||
|
- [v4.2.5 - Celebrating 1000 Stars with Enhanced Functionality and UI Improvements](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.5)
|
||||||
|
- [v4.2.4 - Critical bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.4)
|
||||||
|
- [v4.2.3 - Bug fixes and minor enhancements](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.3)
|
||||||
|
- [v4.2.2 - Bug fixes and minor enhancements](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.2)
|
||||||
|
- [v4.2.1 - Bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2.1)
|
||||||
|
- [v4.2 - Multi-Alarm Control, Dual Thermostat Functionality, and More](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.2)
|
||||||
|
- [v4.1.4 - Support to Home Assistant 2023.12.0](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.1.4)
|
||||||
|
- [v4.1.3 - Bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.1.3)
|
||||||
|
- [v4.1.2 - Bug fixes and minor enhancements](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.1.2)
|
||||||
|
- [v4.1.1 - UI Enhancements and Reintroduction of `play_rtttl` Service](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.1.1)
|
||||||
|
- [v4.1 - Easier TFT transfer](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.1)
|
||||||
|
- [v4.0.2 - Bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.0.2)
|
||||||
|
- [v4.0.1 - Bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.0.1)
|
||||||
|
- [v4.0 - Alarm and Media player pages, Climate add-ons and a more robust panel](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v4.0)
|
||||||
|
- [v3.4.1 - Patch for issues when compiling with ESPHome 2023.7.0](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v3.4.1)
|
||||||
|
- [v3.4 - New climate page and some bug fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v3.4)
|
||||||
|
- [v3.3 - New improvements and some issues fixed](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v.3.3)
|
||||||
|
- [v3.2.2 - fixed some bugs performance improvement](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v3.2.2)
|
||||||
|
- [v3.2.1 - New features and some fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v3.2.1)
|
||||||
|
- [v3.2 - New features and custom configurations](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v.3.2)
|
||||||
|
- [v3.1.0 - New features and US Version](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v.3.1.0)
|
||||||
|
- [v3.0.0 - major update with many features and improvements](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v.3.0.0)
|
||||||
|
- [v2.2.0 - 25 new languages added](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v.2.2.0)
|
||||||
|
- [v2.1.0 - New Domains, Buttons and Button Page Label](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v2.1.0)
|
||||||
|
- [v2.0.2](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v2.0.2)
|
||||||
|
- [v2.0.1 - Bug Fixes](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v2.0.1)
|
||||||
|
- [v2.0.0](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v2.0.0)
|
||||||
45
components/nspanel_ha_blueprint/__init__.py
Normal file
45
components/nspanel_ha_blueprint/__init__.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# __init__.py
|
||||||
|
|
||||||
|
import esphome.codegen as cg
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.components.esp32 import add_idf_sdkconfig_option
|
||||||
|
from esphome.core import CORE, coroutine_with_priority
|
||||||
|
# from esphome.cpp_tools import CppFile
|
||||||
|
|
||||||
|
CODEOWNERS = ["@edwardtfn"]
|
||||||
|
|
||||||
|
nspanel_ha_blueprint_ns = cg.esphome_ns.namespace('nspanel_ha_blueprint')
|
||||||
|
# MdiIcons = nspanel_ha_blueprint_ns.class_('MdiIcons', cg.Component)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = cv.All(
|
||||||
|
cv.Schema({}),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@coroutine_with_priority(1.0)
|
||||||
|
async def to_code(config):
|
||||||
|
if CORE.using_arduino:
|
||||||
|
cg.add_build_flag("-DCONFIG_D0WD_PSRAM_CLK_IO=5")
|
||||||
|
cg.add_build_flag("-DCONFIG_D0WD_PSRAM_CS_IO=18")
|
||||||
|
|
||||||
|
if CORE.using_esp_idf:
|
||||||
|
add_idf_sdkconfig_option("CONFIG_D0WD_PSRAM_CLK_IO", 5)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_D0WD_PSRAM_CS_IO", 18)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ESP32_REV_MIN_3", True)
|
||||||
|
# add_idf_sdkconfig_option("CONFIG_LWIP_MAX_SOCKETS", 5) # This breakes web_server
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_BUFFER", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP", True)
|
||||||
|
|
||||||
|
cg.add_define("USE_NSPANEL_HA_BLUEPRINT")
|
||||||
|
cg.add_global(nspanel_ha_blueprint_ns.using)
|
||||||
|
|
||||||
|
# Setup the MdiIcons class instance
|
||||||
|
# mdi_icons = cg.new_Pvariable('mdi_icons')
|
||||||
|
# yield cg.register_component(mdi_icons, config)
|
||||||
24
components/nspanel_ha_blueprint/ha_components.cpp
Normal file
24
components/nspanel_ha_blueprint/ha_components.cpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// ha_components.cpp
|
||||||
|
|
||||||
|
#include "ha_components.h"
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
// Function Definition
|
||||||
|
HomeAssistantEntity extractHomeAssistantEntity(const std::string& entity_id) {
|
||||||
|
size_t dotPos = entity_id.find(".");
|
||||||
|
HomeAssistantEntity result;
|
||||||
|
|
||||||
|
if (dotPos != std::string::npos) {
|
||||||
|
// Extract domain and id from the entity_id string
|
||||||
|
result.domain = entity_id.substr(0, dotPos);
|
||||||
|
result.id = entity_id.substr(dotPos + 1);
|
||||||
|
} else {
|
||||||
|
// No dot found, the entire entity_id is considered as id.
|
||||||
|
result.domain = "invalid";
|
||||||
|
result.id = entity_id;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
36
components/nspanel_ha_blueprint/ha_components.h
Normal file
36
components/nspanel_ha_blueprint/ha_components.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// ha_components.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
// Defines structures and functions related to Home Assistant entities within the nspanel_ha_blueprint namespace.
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
// Represents a Home Assistant entity with a domain and an identifier.
|
||||||
|
struct HomeAssistantEntity {
|
||||||
|
std::string domain; // The domain part of the entity, like "light" or "switch".
|
||||||
|
std::string id; // The unique identifier of the entity within its domain.
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the domain name and unique ID from a given Home Assistant entity string.
|
||||||
|
*
|
||||||
|
* This function parses a Home Assistant entity string to extract and separate the domain
|
||||||
|
* and ID components of the entity. If the string does not contain a valid entity format
|
||||||
|
* (i.e., "domain.id"), the function will mark the domain as "invalid" and treat the entire
|
||||||
|
* string as the ID. It also handles a special case where "alarm_control_panel" should be
|
||||||
|
* shortened to "alarm", though the implementation of this feature needs to be added in the
|
||||||
|
* function's definition in the corresponding .cpp file.
|
||||||
|
*
|
||||||
|
* Usage example:
|
||||||
|
* auto entity = extractHomeAssistantEntity("light.kitchen");
|
||||||
|
* // entity.domain would be "light"
|
||||||
|
* // entity.id would be "kitchen"
|
||||||
|
*
|
||||||
|
* @param entity_id The input string containing either the combined domain and unique ID or just the unique ID.
|
||||||
|
* @return A HomeAssistantEntity struct containing the extracted domain and the unique ID.
|
||||||
|
*/
|
||||||
|
HomeAssistantEntity extractHomeAssistantEntity(const std::string& entity_id);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
21
components/nspanel_ha_blueprint/hardware.cpp
Normal file
21
components/nspanel_ha_blueprint/hardware.cpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
// hardware.cpp
|
||||||
|
|
||||||
|
#include "hardware.h"
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
template<typename SettingsEnum>
|
||||||
|
void update_bitwise_setting(uint8_t& settings, bool condition, SettingsEnum flag) {
|
||||||
|
if (condition) {
|
||||||
|
settings |= flag; // Set bit
|
||||||
|
} else {
|
||||||
|
settings &= ~flag; // Clear bit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicit template instantiation
|
||||||
|
// Note: You need to explicitly instantiate templates for all enums used as SettingsEnum
|
||||||
|
template void update_bitwise_setting<ButtonSettings>(uint8_t& settings, bool condition, ButtonSettings flag);
|
||||||
|
template void update_bitwise_setting<RelaySettings>(uint8_t& settings, bool condition, RelaySettings flag);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
73
components/nspanel_ha_blueprint/hardware.h
Normal file
73
components/nspanel_ha_blueprint/hardware.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
// hardware.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
// Namespace for nspanel_ha_blueprint, encapsulating definitions related to hardware settings.
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum ButtonSettings
|
||||||
|
* Represents the settings for hardware buttons using individual bits within a uint8_t value.
|
||||||
|
* This allows efficient storage and manipulation of settings for multiple buttons in a compact form.
|
||||||
|
*
|
||||||
|
* The bit allocations are as follows:
|
||||||
|
* - Bit 0: Left button enabled.
|
||||||
|
* - Bit 1: Left button state (0 for `off`, 1 for `on`).
|
||||||
|
* - Bits 2-3: Reserved for future use.
|
||||||
|
* - Bit 4: Right button enabled.
|
||||||
|
* - Bit 5: Right button state (0 for `off`, 1 for `on`).
|
||||||
|
* - Bits 6-7: Reserved for future use.
|
||||||
|
*
|
||||||
|
* These settings facilitate easy manipulation of button states and configurations through bitwise operations.
|
||||||
|
*/
|
||||||
|
enum ButtonSettings {
|
||||||
|
ButtonLeft_Enabled = 1 << 0, ///< Enables left button visualization on screen.
|
||||||
|
ButtonLeft_State = 1 << 1, ///< Indicates current state of the left button.
|
||||||
|
// Bits 2 and 3 are reserved for future expansion.
|
||||||
|
ButtonRight_Enabled = 1 << 4, ///< Enables right button visualization on screen.
|
||||||
|
ButtonRight_State = 1 << 5, ///< Indicates current state of the right button.
|
||||||
|
// Bits 6 and 7 are reserved for future expansion.
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum RelaySettings
|
||||||
|
* Represents the settings for relays using individual bits within a uint8_t value.
|
||||||
|
* This approach allows for the efficient storage and manipulation of settings for multiple
|
||||||
|
* relays in a single byte, enabling compact representation and ease of setting manipulation.
|
||||||
|
*
|
||||||
|
* The bit allocations are as follows:
|
||||||
|
* - Bit 0: Relay 1 local control enabled.
|
||||||
|
* - Bit 1: Relay 1 fallback mode enabled.
|
||||||
|
* - Bits 2-3: Reserved for future use.
|
||||||
|
* - Bit 4: Relay 2 local control enabled.
|
||||||
|
* - Bit 5: Relay 2 fallback mode enabled.
|
||||||
|
* - Bits 6-7: Reserved for future use.
|
||||||
|
*
|
||||||
|
* These settings support flexible relay configuration and state management through bitwise operations.
|
||||||
|
*/
|
||||||
|
enum RelaySettings {
|
||||||
|
Relay1_Local = 1 << 0, ///< Enables local control for Relay 1.
|
||||||
|
Relay1_Fallback = 1 << 1, ///< Enables fallback mode for Relay 1.
|
||||||
|
// Bits 2 and 3 are reserved for future expansion.
|
||||||
|
Relay2_Local = 1 << 4, ///< Enables local control for Relay 2.
|
||||||
|
Relay2_Fallback = 1 << 5, ///< Enables fallback mode for Relay 2.
|
||||||
|
// Bits 6 and 7 are reserved for future expansion.
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a settings byte according to a specified condition and flag.
|
||||||
|
*
|
||||||
|
* This function template applies a bitwise operation to modify the settings byte based on
|
||||||
|
* the provided condition and flag. If the condition is true, the bit corresponding to the flag
|
||||||
|
* is set; otherwise, it's cleared. This method enables dynamic and conditional settings updates.
|
||||||
|
*
|
||||||
|
* @param settings Reference to the settings byte to be modified.
|
||||||
|
* @param condition Boolean condition determining how the settings byte is modified.
|
||||||
|
* @param flag The specific bit flag (from ButtonSettings or RelaySettings) to modify.
|
||||||
|
*/
|
||||||
|
template<typename SettingsEnum>
|
||||||
|
void update_bitwise_setting(uint8_t& settings, bool condition, SettingsEnum flag);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
61
components/nspanel_ha_blueprint/icons.cpp
Normal file
61
components/nspanel_ha_blueprint/icons.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// icons.cpp
|
||||||
|
#include "icons.h"
|
||||||
|
#include <vector>
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
#ifdef USE_ARDUINO
|
||||||
|
#include <esp32-hal-psram.h>
|
||||||
|
#else // ESP-IDF
|
||||||
|
#include <esp_heap_caps.h> // Required for heap capabilities functions
|
||||||
|
#endif // ARDUINO vs ESP-IDF
|
||||||
|
#endif // USE_PSRAM
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
std::vector<Icon> icons; // This declaration may not be necessary; see below
|
||||||
|
|
||||||
|
bool initializeIconsVector() {
|
||||||
|
Icon* allocatedMemory = nullptr;
|
||||||
|
|
||||||
|
// Try to allocate the vector in PSRAM
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
#if defined(USE_ARDUINO)
|
||||||
|
if (psramFound())
|
||||||
|
allocatedMemory = static_cast<Icon*>(ps_malloc(10 * sizeof(Icon)));
|
||||||
|
#else // ESP-IDF
|
||||||
|
allocatedMemory = static_cast<Icon*>(heap_caps_malloc(10 * sizeof(Icon), MALLOC_CAP_SPIRAM));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (allocatedMemory != nullptr) {
|
||||||
|
new (&icons) std::vector<Icon>(allocatedMemory, allocatedMemory + 10); // Placement new to initialize vector
|
||||||
|
return true; // Successfully allocated in PSRAM
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Fallback to DRAM if PSRAM allocation fails or if PSRAM is not used
|
||||||
|
allocatedMemory = static_cast<Icon*>(malloc(10 * sizeof(Icon)));
|
||||||
|
if (allocatedMemory != nullptr) {
|
||||||
|
new (&icons) std::vector<Icon>(allocatedMemory, allocatedMemory + 10); // Placement new to initialize vector
|
||||||
|
return true; // Successfully allocated in DRAM
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // Allocation failed
|
||||||
|
}
|
||||||
|
|
||||||
|
void Icon::updateIcon(const char* code, uint16_t color, bool vis) {
|
||||||
|
if (strcmp(last_icon_code, code) != 0 || last_icon_color != color || visible != vis) {
|
||||||
|
strncpy(last_icon_code, code, 4);
|
||||||
|
last_icon_code[4] = '\0';
|
||||||
|
last_icon_color = color;
|
||||||
|
visible = vis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Icon* findIcon(uint8_t page_id, const char* comp) {
|
||||||
|
for (auto& icon : icons) {
|
||||||
|
if (icon.page_id == page_id && strcmp(icon.component, comp) == 0) {
|
||||||
|
return &icon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
32
components/nspanel_ha_blueprint/icons.h
Normal file
32
components/nspanel_ha_blueprint/icons.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// icons.h
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring> // For strncpy and strcmp
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
struct Icon {
|
||||||
|
uint8_t page_id; // Page ID, placed logically before the component
|
||||||
|
char component[15]; // Component name (max 14 chars + null terminator)
|
||||||
|
char last_icon_code[5]; // UTF-8 code (4 bytes + null terminator)
|
||||||
|
uint16_t last_icon_color; // Color value
|
||||||
|
bool visible; // Visibility of the icon
|
||||||
|
|
||||||
|
// Constructor with default values
|
||||||
|
Icon(uint8_t pid, const char* comp, const char* code = "\xEF\xBF\xBF", uint16_t color = UINT16_MAX, bool vis = true)
|
||||||
|
: page_id(pid), last_icon_color(color), visible(vis) {
|
||||||
|
strncpy(const_cast<char*>(component), comp, 14); // Use const_cast to bypass const for initialization
|
||||||
|
const_cast<char*>(component)[14] = '\0'; // Ensure null termination safely
|
||||||
|
strncpy(last_icon_code, code, 4);
|
||||||
|
last_icon_code[4] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateIcon(const char* code, uint16_t color, bool vis);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern std::vector<Icon> icons; // Global list of icons
|
||||||
|
|
||||||
|
Icon* findIcon(uint8_t page_id, const char* component);
|
||||||
|
}
|
||||||
64
components/nspanel_ha_blueprint/mdiicons.cpp
Normal file
64
components/nspanel_ha_blueprint/mdiicons.cpp
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// mdiicons.cpp
|
||||||
|
|
||||||
|
#include "mdiicons.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
using namespace esphome;
|
||||||
|
|
||||||
|
MdiIcons::MdiIcons() : iconPool(nullptr), iconPoolSize(0), iconPoolCapacity(100) {}
|
||||||
|
|
||||||
|
void MdiIcons::setup() {
|
||||||
|
iconPool = new MdiIcon[iconPoolCapacity];
|
||||||
|
if (!iconPool) {
|
||||||
|
ESP_LOGE("MdiIcons", "Failed to allocate memory for icons in PSRAM");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memset(iconPool, 0, iconPoolCapacity * sizeof(MdiIcon));
|
||||||
|
ESP_LOGI("MdiIcons", "Icon pool initialized with capacity %u", iconPoolCapacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MdiIcons::dump_config() {
|
||||||
|
ESP_LOGCONFIG("MdiIcons", "MDI Icons: Initialized with pool capacity %u", iconPoolCapacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
const MdiIcon* MdiIcons::find_icon(const char* name) const {
|
||||||
|
for (size_t i = 0; i < iconPoolSize; ++i) {
|
||||||
|
if (strcmp(iconPool[i].name, name) == 0) {
|
||||||
|
return &iconPool[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MdiIcons::add_icon(const char* name, const char* code) {
|
||||||
|
if (find_icon(name) != nullptr) {
|
||||||
|
ESP_LOGW("MdiIcons", "Icon '%s' is already in the pool. Not adding again.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iconPoolSize >= iconPoolCapacity) {
|
||||||
|
resize_pool();
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(iconPool[iconPoolSize].name, name, sizeof(MdiIcon::name) - 1);
|
||||||
|
strncpy(iconPool[iconPoolSize].code, code, sizeof(MdiIcon::code) - 1);
|
||||||
|
iconPool[iconPoolSize].name[sizeof(MdiIcon::name) - 1] = '\0';
|
||||||
|
iconPool[iconPoolSize].code[sizeof(MdiIcon::code) - 1] = '\0';
|
||||||
|
iconPoolSize++;
|
||||||
|
ESP_LOGI("MdiIcons", "New icon '%s' added to the pool.", name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MdiIcons::resize_pool() {
|
||||||
|
size_t newCapacity = iconPoolCapacity * 2;
|
||||||
|
MdiIcon* newPool = new MdiIcon[newCapacity];
|
||||||
|
if (!newPool) {
|
||||||
|
ESP_LOGE("MdiIcons", "Failed to resize the icon pool");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy(newPool, iconPool, iconPoolSize * sizeof(MdiIcon));
|
||||||
|
delete[] iconPool;
|
||||||
|
iconPool = newPool;
|
||||||
|
iconPoolCapacity = newCapacity;
|
||||||
|
ESP_LOGI("MdiIcons", "Icon pool resized to %u.", iconPoolCapacity);
|
||||||
|
}
|
||||||
33
components/nspanel_ha_blueprint/mdiicons.h
Normal file
33
components/nspanel_ha_blueprint/mdiicons.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// mdiicons.h
|
||||||
|
|
||||||
|
#ifndef MDI_ICONS_H
|
||||||
|
#define MDI_ICONS_H
|
||||||
|
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
struct MdiIcon {
|
||||||
|
char name[32]; // Icon name, assuming max length of 31 characters + null terminator
|
||||||
|
char code[5]; // Icon code, 4 bytes + null terminator (UTF-8 characters)
|
||||||
|
};
|
||||||
|
|
||||||
|
class MdiIcons : public esphome::Component {
|
||||||
|
public:
|
||||||
|
MdiIcons(); // Constructor declaration
|
||||||
|
|
||||||
|
void setup() override; // Setup method declaration
|
||||||
|
void dump_config() override; // Dump config method declaration
|
||||||
|
|
||||||
|
const MdiIcon* find_icon(const char* name) const; // Method to find an icon by name
|
||||||
|
bool add_icon(const char* name, const char* code); // Method to add an icon
|
||||||
|
|
||||||
|
private:
|
||||||
|
MdiIcon* iconPool; // Dynamic array of MdiIcons
|
||||||
|
size_t iconPoolSize; // Number of icons currently in the pool
|
||||||
|
size_t iconPoolCapacity; // Current capacity of the pool
|
||||||
|
|
||||||
|
void resize_pool(); // Method to resize the icon pool
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MDI_ICONS_H
|
||||||
36
components/nspanel_ha_blueprint/nextion_components.cpp
Normal file
36
components/nspanel_ha_blueprint/nextion_components.cpp
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// nextion_components.cpp
|
||||||
|
|
||||||
|
#include "nextion_components.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
NextionComponent extractNextionComponent(const std::string& input, const std::string& defaultPage) {
|
||||||
|
NextionComponent result{};
|
||||||
|
size_t dotPos = input.find(".");
|
||||||
|
|
||||||
|
if (dotPos != std::string::npos) {
|
||||||
|
// Handling special case and standard extraction
|
||||||
|
strncpy(result.page, input.substr(0, std::min<size_t>(dotPos, 14)).c_str(), 14);
|
||||||
|
result.page[14] = '\0'; // Ensure null termination
|
||||||
|
strncpy(result.component_id, input.substr(dotPos + 1, 14).c_str(), 14);
|
||||||
|
result.component_id[14] = '\0'; // Ensure null termination
|
||||||
|
result.is_current_page = false;
|
||||||
|
} else {
|
||||||
|
// Default page case
|
||||||
|
strncpy(result.page, defaultPage.c_str(), 14);
|
||||||
|
result.page[14] = '\0'; // Ensure null termination
|
||||||
|
strncpy(result.component_id, input.c_str(), 14);
|
||||||
|
result.component_id[14] = '\0'; // Ensure null termination
|
||||||
|
result.is_current_page = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(result.page, defaultPage.c_str()) == 0) {
|
||||||
|
result.is_current_page = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
49
components/nspanel_ha_blueprint/nextion_components.h
Normal file
49
components/nspanel_ha_blueprint/nextion_components.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// nextion_components.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
struct NextionComponent {
|
||||||
|
char page[15]; // 14 characters + null terminator, representing the Nextion display page
|
||||||
|
char component_id[15]; // 14 characters + null terminator, representing the component ID within the page
|
||||||
|
bool is_current_page; // Flag indicating whether the component is on the current page
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the page name and component ID from a given input string.
|
||||||
|
* If the input string omits the page, a default page name is used.
|
||||||
|
* Handles a special case for "alarm_control_panel" by shortening it to "alarm".
|
||||||
|
*
|
||||||
|
* @param input The input string containing the component ID, optionally prefixed by the page name and a dot.
|
||||||
|
* @param defaultPage The default page name to use if the input string does not specify a page.
|
||||||
|
* @return A NextionComponent struct with the extracted or default page name, component ID, and current page status.
|
||||||
|
*/
|
||||||
|
NextionComponent extractNextionComponent(const std::string& input, const std::string& defaultPage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts an RGB color represented as a vector of integers to the 16-bit 5-6-5 format supported by Nextion displays.
|
||||||
|
*
|
||||||
|
* This function takes a vector containing three integer values representing
|
||||||
|
* the red, green, and blue components of an RGB color, each in the range 0-255.
|
||||||
|
* It then converts these values into a single uint16_t value in 5-6-5 format,
|
||||||
|
* commonly used for color displays. The conversion process masks and shifts
|
||||||
|
* the components to fit into the 5 bits for red, 6 bits for green, and 5 bits for blue.
|
||||||
|
*
|
||||||
|
* @param rgb A vector of integers with exactly three elements: [red, green, blue].
|
||||||
|
* @return The color encoded in 16-bit 5-6-5 format, or UINT16_MAX if the input vector
|
||||||
|
* does not contain at least three elements.
|
||||||
|
*/
|
||||||
|
template <typename Container>
|
||||||
|
inline uint16_t rgbTo565(const Container& rgb) {
|
||||||
|
if (rgb.size() != 3) {
|
||||||
|
return UINT16_MAX; // Use UINT16_MAX as an error indicator
|
||||||
|
}
|
||||||
|
return ((rgb[0] & 0xF8) << 8) | ((rgb[1] & 0xFC) << 3) | (rgb[2] >> 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
26
components/nspanel_ha_blueprint/pages.cpp
Normal file
26
components/nspanel_ha_blueprint/pages.cpp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// pages.cpp
|
||||||
|
|
||||||
|
#include "pages.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
uint8_t get_page_id(const std::string& page_name) {
|
||||||
|
for (uint8_t i = 0; i < page_names.size(); ++i) {
|
||||||
|
if (strcmp(page_names[i], page_name.c_str()) == 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return UINT8_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isStringInList(const std::string& strToSearch, std::initializer_list<std::string> list) {
|
||||||
|
for (const auto& str : list) {
|
||||||
|
if (strToSearch == str) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
72
components/nspanel_ha_blueprint/pages.h
Normal file
72
components/nspanel_ha_blueprint/pages.h
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
// pages.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
#include <initializer_list>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file pages.h
|
||||||
|
* Defines constants and functions related to page names for the NSPanel HA Blueprint project.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
/**
|
||||||
|
* A compile-time constant array containing the names of pages.
|
||||||
|
* These names correspond to various pages of the Nextion TFT file in use,
|
||||||
|
* such as settings, home, weather information, and more.
|
||||||
|
*/
|
||||||
|
constexpr std::array<const char*, 28> page_names = {
|
||||||
|
"boot",
|
||||||
|
"home",
|
||||||
|
"weather01",
|
||||||
|
"weather02",
|
||||||
|
"weather03",
|
||||||
|
"weather04",
|
||||||
|
"weather05",
|
||||||
|
"climate",
|
||||||
|
"settings",
|
||||||
|
"screensaver",
|
||||||
|
"light",
|
||||||
|
"cover",
|
||||||
|
"buttonpage01",
|
||||||
|
"buttonpage02",
|
||||||
|
"buttonpage03",
|
||||||
|
"buttonpage04",
|
||||||
|
"notification",
|
||||||
|
"qrcode",
|
||||||
|
"entitypage01",
|
||||||
|
"entitypage02",
|
||||||
|
"entitypage03",
|
||||||
|
"entitypage04",
|
||||||
|
"fan",
|
||||||
|
"alarm",
|
||||||
|
"keyb_num",
|
||||||
|
"media_player",
|
||||||
|
"confirm",
|
||||||
|
"utilities"
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the index of a given page name within the page_names array.
|
||||||
|
*
|
||||||
|
* @param page_name The name of the page to find.
|
||||||
|
* @return The index of the page_name in the page_names array. If the page_name
|
||||||
|
* is not found, returns UINT8_MAX as an indicator that no matching page was found.
|
||||||
|
*/
|
||||||
|
uint8_t get_page_id(const std::string& page_name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a given string is present within a list of strings.
|
||||||
|
*
|
||||||
|
* @param strToSearch The string to search for within the list.
|
||||||
|
* @param list An initializer list of strings to search within.
|
||||||
|
* @return `true` if the target string is found within the list, `false` otherwise.
|
||||||
|
*/
|
||||||
|
bool isStringInList(const std::string& strToSearch, std::initializer_list<std::string> list);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
49
components/nspanel_ha_blueprint/text.cpp
Normal file
49
components/nspanel_ha_blueprint/text.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// text.cpp
|
||||||
|
|
||||||
|
#include "text.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
template <unsigned int N>
|
||||||
|
void copyStringToCharArray(char (&dest)[N], const std::string& src) {
|
||||||
|
size_t length = std::min(src.size(), static_cast<size_t>(N - 1));
|
||||||
|
std::strncpy(dest, src.c_str(), length);
|
||||||
|
dest[length] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicit template instantiation might be needed depending on usage
|
||||||
|
// template void copyStringToCharArray<YOUR_SIZE_HERE>(char (&)[YOUR_SIZE_HERE], const std::string&);
|
||||||
|
|
||||||
|
bool isNumberChar(char c) {
|
||||||
|
return std::isdigit(static_cast<unsigned char>(c)) || c == '.' || c == '-' || c == ',';
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string adjustDecimalSeparator(const std::string& input, char decimalSeparator) {
|
||||||
|
if (decimalSeparator == '.') {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t numericEnd = 0;
|
||||||
|
for (; numericEnd < input.size() && isNumberChar(input[numericEnd]); ++numericEnd);
|
||||||
|
|
||||||
|
std::string numericPart = input.substr(0, numericEnd);
|
||||||
|
std::string suffix = input.substr(numericEnd);
|
||||||
|
|
||||||
|
char* end;
|
||||||
|
double val = strtod(numericPart.c_str(), &end);
|
||||||
|
|
||||||
|
if (end != numericPart.c_str() && *end == '\0') {
|
||||||
|
size_t decimalPointPos = numericPart.find('.');
|
||||||
|
if (decimalPointPos != std::string::npos) {
|
||||||
|
numericPart[decimalPointPos] = decimalSeparator;
|
||||||
|
}
|
||||||
|
return numericPart + suffix;
|
||||||
|
} else {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
40
components/nspanel_ha_blueprint/text.h
Normal file
40
components/nspanel_ha_blueprint/text.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// text.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the contents of a std::string to a fixed-size char array, ensuring
|
||||||
|
* null termination. The destination array size is automatically deduced.
|
||||||
|
* Designed for fixed-size char arrays only.
|
||||||
|
*
|
||||||
|
* @param dest A reference to the destination char array.
|
||||||
|
* @param src The source std::string to copy.
|
||||||
|
*/
|
||||||
|
template <unsigned int N>
|
||||||
|
void copyStringToCharArray(char (&dest)[N], const std::string& src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a character is part of a numeric string. This includes digits,
|
||||||
|
* a period (.), a minus sign (-), or a comma (,).
|
||||||
|
*
|
||||||
|
* @param c The character to check.
|
||||||
|
* @return True if the character is part of a number; false otherwise.
|
||||||
|
*/
|
||||||
|
bool isNumberChar(char c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjusts the decimal separator in a numeric string to the specified character.
|
||||||
|
* Only the first occurrence is replaced if it's a valid number followed by text.
|
||||||
|
* Returns the original string if it doesn't start with a valid number.
|
||||||
|
*
|
||||||
|
* @param input The string containing a numeric value followed by text.
|
||||||
|
* @param decimalSeparator The character to use as the decimal separator.
|
||||||
|
* @return A string with the adjusted decimal separator if valid; otherwise, the original string.
|
||||||
|
*/
|
||||||
|
std::string adjustDecimalSeparator(const std::string& input, char decimalSeparator);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
32
components/nspanel_ha_blueprint/upload_tft.cpp
Normal file
32
components/nspanel_ha_blueprint/upload_tft.cpp
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// upload_tft.cpp
|
||||||
|
|
||||||
|
#ifdef NSPANEL_HA_BLUEPRINT_ADDON_UPLOAD_TFT
|
||||||
|
|
||||||
|
#include "upload_tft.h"
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
std::string construct_tft_url(const std::string& branch, const std::string& model,
|
||||||
|
const std::string& defaultUrl, const std::string& baseUrl) {
|
||||||
|
std::string relative_branch = branch.find("b") != std::string::npos ? "beta" : branch.find("d") != std::string::npos ? "dev" : branch;
|
||||||
|
std::string file_name;
|
||||||
|
if (model == "NSPanel Blank") file_name = "nspanel_blank.tft";
|
||||||
|
else if (model == "NSPanel EU") file_name = "nspanel_eu.tft";
|
||||||
|
else if (model == "NSPanel US") file_name = "nspanel_us.tft";
|
||||||
|
else if (model == "NSPanel US Landscape") file_name = "nspanel_us_land.tft";
|
||||||
|
else if (model == "NSPanel EU (CJK languages)") file_name = "nspanel_CJK_eu.tft";
|
||||||
|
else if (model == "NSPanel US (CJK languages)") file_name = "nspanel_CJK_us.tft";
|
||||||
|
else if (model == "NSPanel US Landscape (CJK languages)") file_name = "nspanel_CJK_us_land.tft";
|
||||||
|
return file_name.empty() ? defaultUrl : baseUrl + relative_branch + "/hmi/" + file_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getNSPanelText(int displayMode, int charset) {
|
||||||
|
if (displayMode < 1 || displayMode > 3 || charset < 1 || charset > 2) return "";
|
||||||
|
std::string text = (displayMode == 1) ? "NSPanel EU" : (displayMode == 2) ? "NSPanel US" : "NSPanel US Landscape";
|
||||||
|
if (charset == 2) text += " (CJK languages)";
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
|
|
||||||
|
#endif // NSPANEL_HA_BLUEPRINT_ADDON_UPLOAD_TFT
|
||||||
34
components/nspanel_ha_blueprint/upload_tft.h
Normal file
34
components/nspanel_ha_blueprint/upload_tft.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// upload_tft.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef NSPANEL_HA_BLUEPRINT_ADDON_UPLOAD_TFT
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the TFT file URL based on branch, model, default URL, and base URL.
|
||||||
|
*
|
||||||
|
* @param branch The branch version input, potentially containing keywords like "beta" or "dev".
|
||||||
|
* @param model The device model, determining the specific TFT file name.
|
||||||
|
* @param defaultUrl The fallback URL if no specific file is associated with the model.
|
||||||
|
* @param baseUrl The base URL, to which branch and file names are appended to create the full URL.
|
||||||
|
* @return A string representing the fully constructed URL.
|
||||||
|
*/
|
||||||
|
std::string construct_tft_url(const std::string& branch, const std::string& model,
|
||||||
|
const std::string& defaultUrl, const std::string& baseUrl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a descriptive text for the NSPanel based on display mode and charset.
|
||||||
|
*
|
||||||
|
* @param displayMode Numeric code for the NSPanel's display mode: 1 for "EU", 2 for "US", 3 for "US Landscape".
|
||||||
|
* @param charset Numeric code for the character set: 1 for "International (original)", 2 for "CJK languages".
|
||||||
|
* @return A string describing the NSPanel configuration, or an empty string if inputs don't match any configuration.
|
||||||
|
*/
|
||||||
|
std::string getNSPanelText(int displayMode, int charset);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
|
|
||||||
|
#endif // NSPANEL_HA_BLUEPRINT_ADDON_UPLOAD_TFT
|
||||||
73
components/nspanel_ha_blueprint/utilities.cpp
Normal file
73
components/nspanel_ha_blueprint/utilities.cpp
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
// utilities.cpp
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
#include <cstdlib> // For malloc/free
|
||||||
|
#ifdef USE_ESP_IDF
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
#elif defined(USE_ARDUINO)
|
||||||
|
#include "esp32-hal-psram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
UtilitiesGroupValues *UtilitiesGroups = nullptr;
|
||||||
|
|
||||||
|
void resetUtilitiesGroups() {
|
||||||
|
// Dynamically allocate the UtilitiesGroups array in PSRAM
|
||||||
|
#ifdef USE_ESP_IDF
|
||||||
|
UtilitiesGroups = static_cast<UtilitiesGroupValues*>(heap_caps_malloc(8 * sizeof(UtilitiesGroupValues), MALLOC_CAP_SPIRAM));
|
||||||
|
#elif defined(USE_ARDUINO)
|
||||||
|
UtilitiesGroups = static_cast<UtilitiesGroupValues*>(ps_malloc(8 * sizeof(UtilitiesGroupValues)));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!UtilitiesGroups) UtilitiesGroups = new UtilitiesGroupValues[8]; // Fallback to internal SRAM if PSRAM is not available or not supported
|
||||||
|
if (!UtilitiesGroups) return; // Fail nicely if no memory is available
|
||||||
|
|
||||||
|
// Initialize UtilitiesGroups with default values
|
||||||
|
const UtilitiesGroupValues initialUtilitiesGroups[8] = {
|
||||||
|
{"grid", "\0", "\0", 0},
|
||||||
|
{"group01", "\0", "\0", 0},
|
||||||
|
{"group02", "\0", "\0", 0},
|
||||||
|
{"group03", "\0", "\0", 0},
|
||||||
|
{"group04", "\0", "\0", 0},
|
||||||
|
{"group05", "\0", "\0", 0},
|
||||||
|
{"group06", "\0", "\0", 0},
|
||||||
|
{"home", "\0", "\0", 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 8; ++i) {
|
||||||
|
std::strcpy(UtilitiesGroups[i].group_id, initialUtilitiesGroups[i].group_id);
|
||||||
|
std::strcpy(UtilitiesGroups[i].value1, initialUtilitiesGroups[i].value1);
|
||||||
|
std::strcpy(UtilitiesGroups[i].value2, initialUtilitiesGroups[i].value2);
|
||||||
|
UtilitiesGroups[i].direction = initialUtilitiesGroups[i].direction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanupUtilitiesGroups() {
|
||||||
|
if (UtilitiesGroups != nullptr) {
|
||||||
|
free(UtilitiesGroups); // Compatible with both heap_caps_malloc and ps_malloc
|
||||||
|
UtilitiesGroups = nullptr; // Prevent dangling pointers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t findUtilitiesGroupIndex(const char* group_id) {
|
||||||
|
int low = 0;
|
||||||
|
int high = 7; // Directly use the number of elements in UtilitiesGroups - 1
|
||||||
|
|
||||||
|
while (low <= high) {
|
||||||
|
int mid = low + (high - low) / 2;
|
||||||
|
int cmp = std::strcmp(UtilitiesGroups[mid].group_id, group_id);
|
||||||
|
|
||||||
|
if (cmp < 0) {
|
||||||
|
low = mid + 1;
|
||||||
|
} else if (cmp > 0) {
|
||||||
|
high = mid - 1;
|
||||||
|
} else {
|
||||||
|
return static_cast<uint8_t>(mid); // Found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return UINT8_MAX; // Not found
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
44
components/nspanel_ha_blueprint/utilities.h
Normal file
44
components/nspanel_ha_blueprint/utilities.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// utilities.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring> // For std::strcpy
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
struct UtilitiesGroupValues {
|
||||||
|
char group_id[8]; // 7 characters + null terminator
|
||||||
|
char value1[11]; // 10 characters + null terminator
|
||||||
|
char value2[11]; // 10 characters + null terminator
|
||||||
|
int8_t direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern UtilitiesGroupValues *UtilitiesGroups;
|
||||||
|
|
||||||
|
void resetUtilitiesGroups();
|
||||||
|
void cleanupUtilitiesGroups();
|
||||||
|
uint8_t findUtilitiesGroupIndex(const char* group_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the contents of a std::string to a fixed-size char array, ensuring
|
||||||
|
* null termination. The destination array size is automatically deduced.
|
||||||
|
* Designed for fixed-size char arrays only.
|
||||||
|
*
|
||||||
|
* @param dest A reference to the destination char array.
|
||||||
|
* @param src The source std::string to copy.
|
||||||
|
*/
|
||||||
|
template <unsigned int N>
|
||||||
|
void copyStringToCharArray(char (&dest)[N], const std::string& src) {
|
||||||
|
// Ensure we do not exceed the buffer size, leaving space for the null terminator
|
||||||
|
size_t length = std::min(src.size(), N - 1);
|
||||||
|
|
||||||
|
// Copy the string data into the destination buffer
|
||||||
|
std::strncpy(dest, src.c_str(), length);
|
||||||
|
|
||||||
|
// Explicitly null-terminate the destination buffer
|
||||||
|
dest[length] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
20
components/nspanel_ha_blueprint/versioning.cpp
Normal file
20
components/nspanel_ha_blueprint/versioning.cpp
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// versioning.cpp
|
||||||
|
|
||||||
|
#include "versioning.h"
|
||||||
|
#include <cstdio> // For sscanf
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
bool compare_versions(const char* version1, const char* version2) {
|
||||||
|
int major1 = 0, minor1 = 0;
|
||||||
|
int major2 = 0, minor2 = 0;
|
||||||
|
|
||||||
|
// Parse the version strings into major and minor numbers
|
||||||
|
sscanf(version1, "%d.%d", &major1, &minor1);
|
||||||
|
sscanf(version2, "%d.%d", &major2, &minor2);
|
||||||
|
|
||||||
|
// Compare the parsed major and minor numbers
|
||||||
|
return (major1 == major2) && (minor1 == minor2);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
19
components/nspanel_ha_blueprint/versioning.h
Normal file
19
components/nspanel_ha_blueprint/versioning.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// versioning.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace nspanel_ha_blueprint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two version strings by major and minor version numbers, assuming the version
|
||||||
|
* strings are formatted as "major.minor". This function parses both version strings and
|
||||||
|
* compares their major and minor components.
|
||||||
|
*
|
||||||
|
* @param version1 The first version string to compare, in "major.minor" format.
|
||||||
|
* @param version2 The second version string to compare, in "major.minor" format.
|
||||||
|
* @return True if both the major and minor versions of version1 and version2 are equal,
|
||||||
|
* false otherwise.
|
||||||
|
*/
|
||||||
|
bool compare_versions(const char* version1, const char* version2);
|
||||||
|
|
||||||
|
} // namespace nspanel_ha_blueprint
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"files.associations": {
|
|
||||||
"*.yaml": "home-assistant"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
# NSPanel Custom with HA Blueprint
|
|
||||||
Custom Firmware for NsPanel (esphome) and HA Blueprint with configuration of button, light settings, thermostate, colorwheel, colortemp, cover, weather preview, automatic TFT upload etc.
|
|
||||||
|
|
||||||
Why another version for the NSPanel?
|
|
||||||
Well - all versions I've seen have been missing something everywhere.
|
|
||||||
That's why I decided to create something myself.
|
|
||||||
|
|
||||||
My thanks to Masto, Marcfager, lovejoy777, Hellis81 and SmartHome yourself ( link see below) for sharing your code. Give them the credit they deserve, I'm merely a copy paste ninja. XDD
|
|
||||||
|
|
||||||
|
|
||||||
### GOAL:
|
|
||||||
My goal was to create a version that could be quickly adopted for multiple NSPanels.
|
|
||||||
In addition, the configuration should be as simple as possible. Therefore I decided to put most of it into a HA Blueprint
|
|
||||||
|
|
||||||
In addition, another NSPanel can be configured very quickly. But have a look yourself ;)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Home / Thermostat - more pictures see below)
|
|
||||||
|
|
||||||
## Features:
|
|
||||||
- easy to use and simple configuration via Blueprint
|
|
||||||
- 40 buttons on 5 button pages with long press function for settings (more buttons are also possible)
|
|
||||||
- Weather + 5 days weather forcast
|
|
||||||
- Thermostat + Touch + Relay control for floor heating
|
|
||||||
- Light control (brightness-slider, colorwheel, TempColor-slider) - via Long Press
|
|
||||||
- Cover control (open, close, position-slider) - via long press
|
|
||||||
- Settings page (display brightness, display dim brightness, auto-dim, sleep mode, reboot NSPanel)
|
|
||||||
- Swipe between pages
|
|
||||||
- Top menu with 10 icons for specific states
|
|
||||||
- Heating control (hot water)
|
|
||||||
- Auto Upload TFT File to Nextion Display
|
|
||||||
- Swipe between pages
|
|
||||||
- modern design - design easy to change via Adobe Express (free + design template)
|
|
||||||
- 2 pysical switches
|
|
||||||
- and much more ;)
|
|
||||||
|
|
||||||
|
|
||||||
## NSPanel:
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Home / Weather Forcast)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Thermostat / Settings Page)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Light Settings Colorwheel / Light Settings TempColor)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Cover Settings / Button Page)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Blueprint:
|
|
||||||

|
|
||||||
|
|
||||||
# Pages
|
|
||||||
|
|
||||||
## Home
|
|
||||||
- current weather with button to Weather Forcast page
|
|
||||||
- Temperature outside
|
|
||||||
- Status icons at the top
|
|
||||||
- Room temperature with button to thermostat page
|
|
||||||
- Room humidity
|
|
||||||
- Hot water temperature
|
|
||||||
- Button to display settings page
|
|
||||||
|
|
||||||
## Weather Forcast
|
|
||||||
- 5 days Weather Forcast via swipe (Integration Accuweather - but should also go with another integration)
|
|
||||||
- Lowest and highest temperature outside
|
|
||||||
- Date
|
|
||||||
- Rain probability
|
|
||||||
- Sunshine hours
|
|
||||||
- Sun pressure
|
|
||||||
- Thunderstorm probability
|
|
||||||
- Wind speed
|
|
||||||
- Night thunderstorm probability and wind speed
|
|
||||||
|
|
||||||
## Thermostat
|
|
||||||
- Touch Temp control
|
|
||||||
- Outside temperature
|
|
||||||
- Hot water
|
|
||||||
- Floor heating on, off and idle
|
|
||||||
- Hot water button
|
|
||||||
- Status icons
|
|
||||||
|
|
||||||
## Display Settings
|
|
||||||
- Restart NSPanel
|
|
||||||
- Sleep mode - display off after time X
|
|
||||||
- Display brightness slider
|
|
||||||
- Display dim brightness slider
|
|
||||||
- Status Brightness in %
|
|
||||||
|
|
||||||
## Light Settings
|
|
||||||
- Light on and off (alignment with HA)
|
|
||||||
- Light color with Colorwheel
|
|
||||||
- Light color with TempColor slider
|
|
||||||
- Brightness Slider
|
|
||||||
- Brightness in %.
|
|
||||||
- Tempcolor value
|
|
||||||
- Jump back to the right button page
|
|
||||||
|
|
||||||
## Cover Settings
|
|
||||||
- Open and close cover
|
|
||||||
- Cover position via slider
|
|
||||||
- Cover battery value (I use Ikea roller blind)
|
|
||||||
- jump back to the right button page
|
|
||||||
|
|
||||||
## Button Page
|
|
||||||
- 40 Button
|
|
||||||
- 5 Button pages
|
|
||||||
- all buttons with long press function
|
|
||||||
- automatic detection by long press if it is a light or cover for submenu
|
|
||||||
- swipe between all pages
|
|
||||||
- swipe also down and up for fast access to certain pages
|
|
||||||
- number of buttons and button pages can be extended - functions like long press, light settings and cover settings stay the same
|
|
||||||
|
|
||||||
## Upcoming Features
|
|
||||||
- Shorten Esphome code and transfer to Blueprint
|
|
||||||
- Cover page with window open status as image
|
|
||||||
- small design adjustments
|
|
||||||
- Notifications on Home Page
|
|
||||||
- Energy and Gas consumption on home page
|
|
||||||
- Extra page for energy dashboard
|
|
||||||
- Garbage plan with icon on home page
|
|
||||||
- Let's see what ideas I still have ;)
|
|
||||||
|
|
||||||
## HowTo Deutsch
|
|
||||||
1. den Code aus der Datei esphome.yaml kopieren und in HA unter esphome einfügen. Vorher muss natürlich ein Device erstellt werden.
|
|
||||||
1.2 in der ESPhome Datei müssen Passwörter eingesetzt werden. Entweder in der ESPHome Secret oder einfach in der ESPhome Datei
|
|
||||||
1.3 Einige Entities sind aktuell noch in der Esphome Datei angegeben (direkt unter den Passwörtern. Diese Entities müssen noch angepasst werden. In zukunft will ich aber auch diese ins Bluebrint einbauen
|
|
||||||
3. den Code aus der Datei blueprint.yaml kopieren und eine neue yaml Datei unter config/blueprints erstellen und den Code einfügen
|
|
||||||
4. HA Automationen neu starten -> Enticklerwerkzege -> YAML -> Automatisierungen
|
|
||||||
5. den Code aus der Datei sensor.yaml und climate.yaml kopieren und eine eigenen yaml Datei erstellen. Der Code wird in zukunft direkt im Blueprint eingebaut.
|
|
||||||
6. den Code aus der Datei folder_wather kopieren und in der coniguration.yaml einfügen
|
|
||||||
7. TFT File auf Home Assistant hochladen (Der Pfad kann später im Blueprint angegeben werden
|
|
||||||
8. Blueprint unter Automationen auswählen und und Felder ausfüllen.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Thanks to:
|
|
||||||
SmartHome yourself: https://www.youtube.com/c/SmarthomeyourselfDe_DIY
|
|
||||||
|
|
||||||
Masto: https://github.com/masto/NSPanel-Demo-Files
|
|
||||||
|
|
||||||
Marcfager: https://github.com/marcfager/nspanel-mf
|
|
||||||
|
|
||||||
lovejoy77: https://github.com/lovejoy777/NSpanel
|
|
||||||
|
|
||||||
Hellis81: https://github.com/Hellis81/NS-panel
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +0,0 @@
|
|||||||
climate:
|
|
||||||
- platform: generic_thermostat
|
|
||||||
unique_id: cf308990-0dbd-4e8a-be77-aec56d7a5aa4
|
|
||||||
name: NSPanel Büro
|
|
||||||
heater: switch.nspanel_buro_relay_2
|
|
||||||
target_sensor: sensor.nspanel_buro_temperature
|
|
||||||
min_temp: 13
|
|
||||||
max_temp: 27
|
|
||||||
ac_mode: false
|
|
||||||
target_temp: 22
|
|
||||||
cold_tolerance: 0.5
|
|
||||||
hot_tolerance: 0.5
|
|
||||||
min_cycle_duration:
|
|
||||||
seconds: 60
|
|
||||||
keep_alive:
|
|
||||||
minutes: 3
|
|
||||||
initial_hvac_mode: "heat"
|
|
||||||
precision: 0.5
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Please insert into the default file "configuration.yaml
|
|
||||||
# Folder must be changed to the directory where the tft file (Nextion Editor) will be uploaded
|
|
||||||
###########
|
|
||||||
#
|
|
||||||
#Folder watcher for NS panel auto upload tft
|
|
||||||
folder_watcher:
|
|
||||||
- folder: /config/www/nspanel/
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
##### Sensor ######
|
|
||||||
sensor:
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag:
|
|
||||||
friendly_name: "Wochentag"
|
|
||||||
unique_id: 6ac64850-8563-456c-b562-92343dd96f0b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,'] %}
|
|
||||||
{{ now().timestamp() | timestamp_custom(days[now().weekday()] ~ ' %d.%m')}}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag01:
|
|
||||||
friendly_name: "Wochentag+1"
|
|
||||||
unique_id: 6b2aad54-3eb0-48cc-ae32-ee3574197f1b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (86400)) | timestamp_custom(days[now().weekday()+1] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag02:
|
|
||||||
friendly_name: "Wochentag+2"
|
|
||||||
unique_id: edbddaf0-2791-4774-b8d4-aa706f75cc7a
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (172800)) | timestamp_custom(days[now().weekday()+2] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag03:
|
|
||||||
friendly_name: "Wochentag+3"
|
|
||||||
unique_id: ad592622-db86-40f7-9961-4c1ffd21c711
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,'] %}
|
|
||||||
{{(as_timestamp(now())+ (259200)) | timestamp_custom(days[now().weekday()+3] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag04:
|
|
||||||
friendly_name: "Wochentag+4"
|
|
||||||
unique_id: dcb3ed45-2b89-4672-a04f-a55f025ac745
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (345600)) | timestamp_custom(days[now().weekday()+4] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag05:
|
|
||||||
friendly_name: "Wochentag+5"
|
|
||||||
unique_id: 77e642a5-de54-452d-9f4a-febe3a7851c2
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (432000)) | timestamp_custom(days[now().weekday()+ 5] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_buro_target_temp:
|
|
||||||
unique_id: 2393ab74-21ce-42d3-b15e-ec162b9d6f31
|
|
||||||
friendly_name: NSPanel Buro Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_buro', 'temperature') }}"
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_lea_target_temp:
|
|
||||||
unique_id: e8e61ff7-3a41-47ad-bd6c-303f730de96f
|
|
||||||
friendly_name: NSPanel Lea Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_lea', 'temperature') }}"
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,159 +0,0 @@
|
|||||||
# NSPanel Custom with HA Blueprint
|
|
||||||
Custom Firmware for NsPanel (esphome) and HA Blueprint with configuration of button, light settings, thermostate, colorwheel, colortemp, cover, weather preview, automatic TFT upload etc.
|
|
||||||
|
|
||||||
Why another version for the NSPanel?
|
|
||||||
Well - all versions I've seen have been missing something everywhere.
|
|
||||||
That's why I decided to create something myself.
|
|
||||||
|
|
||||||
My thanks to Masto, Marcfager, lovejoy777, Hellis81 and SmartHome yourself ( link see below) for sharing your code. Give them the credit they deserve, I'm merely a copy paste ninja. XDD
|
|
||||||
|
|
||||||
|
|
||||||
### GOAL:
|
|
||||||
My goal was to create a version that could be quickly adopted for multiple NSPanels.
|
|
||||||
In addition, the configuration should be as simple as possible. Therefore I decided to put most of it into a HA Blueprint
|
|
||||||
|
|
||||||
In addition, another NSPanel can be configured very quickly. But have a look yourself ;)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Home / Thermostat - more pictures see below)
|
|
||||||
|
|
||||||
## Features:
|
|
||||||
- easy to use and simple configuration via Blueprint
|
|
||||||
- 40 buttons on 5 button pages with long press function for settings (more buttons are also possible)
|
|
||||||
- Weather + 5 days weather forcast
|
|
||||||
- Thermostat + Touch + Relay control for floor heating
|
|
||||||
- Light control (brightness-slider, colorwheel, TempColor-slider) - via Long Press
|
|
||||||
- Cover control (open, close, position-slider) - via long press
|
|
||||||
- Settings page (display brightness, display dim brightness, auto-dim, sleep mode, reboot NSPanel)
|
|
||||||
- Swipe between pages
|
|
||||||
- Top menu with 10 icons for specific states
|
|
||||||
- Heating control (hot water)
|
|
||||||
- Auto Upload TFT File to Nextion Display
|
|
||||||
- Swipe between pages
|
|
||||||
- modern design - design easy to change via Adobe Express (free + design template)
|
|
||||||
- 2 pysical switches
|
|
||||||
- and much more ;)
|
|
||||||
|
|
||||||
|
|
||||||
## NSPanel:
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Home / Weather Forcast)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Thermostat / Settings Page)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Light Settings Colorwheel / Light Settings TempColor)
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
(Cover Settings / Button Page)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Blueprint:
|
|
||||||

|
|
||||||
|
|
||||||
# Pages
|
|
||||||
|
|
||||||
## Home
|
|
||||||
- current weather with button to Weather Forcast page
|
|
||||||
- Temperature outside
|
|
||||||
- Status icons at the top
|
|
||||||
- Room temperature with button to thermostat page
|
|
||||||
- Room humidity
|
|
||||||
- Hot water temperature
|
|
||||||
- Button to display settings page
|
|
||||||
|
|
||||||
## Weather Forcast
|
|
||||||
- 5 days Weather Forcast via swipe (Integration Accuweather - but should also go with another integration)
|
|
||||||
- Lowest and highest temperature outside
|
|
||||||
- Date
|
|
||||||
- Rain probability
|
|
||||||
- Sunshine hours
|
|
||||||
- Sun pressure
|
|
||||||
- Thunderstorm probability
|
|
||||||
- Wind speed
|
|
||||||
- Night thunderstorm probability and wind speed
|
|
||||||
|
|
||||||
## Thermostat
|
|
||||||
- Touch Temp control
|
|
||||||
- Outside temperature
|
|
||||||
- Hot water
|
|
||||||
- Floor heating on, off and idle
|
|
||||||
- Hot water button
|
|
||||||
- Status icons
|
|
||||||
|
|
||||||
## Display Settings
|
|
||||||
- Restart NSPanel
|
|
||||||
- Sleep mode - display off after time X
|
|
||||||
- Display brightness slider
|
|
||||||
- Display dim brightness slider
|
|
||||||
- Status Brightness in %
|
|
||||||
|
|
||||||
## Light Settings
|
|
||||||
- Light on and off (alignment with HA)
|
|
||||||
- Light color with Colorwheel
|
|
||||||
- Light color with TempColor slider
|
|
||||||
- Brightness Slider
|
|
||||||
- Brightness in %.
|
|
||||||
- Tempcolor value
|
|
||||||
- Jump back to the right button page
|
|
||||||
|
|
||||||
## Cover Settings
|
|
||||||
- Open and close cover
|
|
||||||
- Cover position via slider
|
|
||||||
- Cover battery value (I use Ikea roller blind)
|
|
||||||
- jump back to the right button page
|
|
||||||
|
|
||||||
## Button Page
|
|
||||||
- 40 Button
|
|
||||||
- 5 Button pages
|
|
||||||
- all buttons with long press function
|
|
||||||
- automatic detection by long press if it is a light or cover for submenu
|
|
||||||
- swipe between all pages
|
|
||||||
- swipe also down and up for fast access to certain pages
|
|
||||||
- number of buttons and button pages can be extended - functions like long press, light settings and cover settings stay the same
|
|
||||||
|
|
||||||
## Upcoming Features
|
|
||||||
- Shorten Esphome code and transfer to Blueprint
|
|
||||||
- Cover page with window open status as image
|
|
||||||
- small design adjustments
|
|
||||||
- Notifications on Home Page
|
|
||||||
- Energy and Gas consumption on home page
|
|
||||||
- Extra page for energy dashboard
|
|
||||||
- Garbage plan with icon on home page
|
|
||||||
- Let's see what ideas I still have ;)
|
|
||||||
|
|
||||||
## HowTo Deutsch
|
|
||||||
1. den Code aus der Datei esphome.yaml kopieren und in HA unter esphome einfügen. Vorher muss natürlich ein Device erstellt werden.
|
|
||||||
1.2 in der ESPhome Datei müssen Passwörter eingesetzt werden. Entweder in der ESPHome Secret oder einfach in der ESPhome Datei
|
|
||||||
1.3 Einige Entities sind aktuell noch in der Esphome Datei angegeben (direkt unter den Passwörtern. Diese Entities müssen noch angepasst werden. In zukunft will ich aber auch diese ins Bluebrint einbauen
|
|
||||||
3. den Code aus der Datei blueprint.yaml kopieren und eine neue yaml Datei unter config/blueprints erstellen und den Code einfügen
|
|
||||||
4. HA Automationen neu starten -> Enticklerwerkzege -> YAML -> Automatisierungen
|
|
||||||
5. den Code aus der Datei sensor.yaml und climate.yaml kopieren und eine eigenen yaml Datei erstellen. Der Code wird in zukunft direkt im Blueprint eingebaut.
|
|
||||||
6. den Code aus der Datei folder_wather kopieren und in der coniguration.yaml einfügen
|
|
||||||
7. TFT File auf Home Assistant hochladen (Der Pfad kann später im Blueprint angegeben werden
|
|
||||||
8. Blueprint unter Automationen auswählen und und Felder ausfüllen.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Thanks to:
|
|
||||||
SmartHome Yourself: https://www.youtube.com/c/SmarthomeyourselfDe_DIY
|
|
||||||
|
|
||||||
Masto: https://github.com/masto/NSPanel-Demo-Files
|
|
||||||
|
|
||||||
Marcfager: https://github.com/marcfager/nspanel-mf
|
|
||||||
|
|
||||||
lovejoy77: https://github.com/lovejoy777/NSpanel
|
|
||||||
|
|
||||||
Hellis81: https://github.com/Hellis81/NS-panel
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +0,0 @@
|
|||||||
climate:
|
|
||||||
- platform: generic_thermostat
|
|
||||||
unique_id: cf308990-0dbd-4e8a-be77-aec56d7a5aa4
|
|
||||||
name: NSPanel Büro
|
|
||||||
heater: switch.nspanel_buro_relay_2
|
|
||||||
target_sensor: sensor.nspanel_buro_temperature
|
|
||||||
min_temp: 13
|
|
||||||
max_temp: 27
|
|
||||||
ac_mode: false
|
|
||||||
target_temp: 22
|
|
||||||
cold_tolerance: 0.5
|
|
||||||
hot_tolerance: 0.5
|
|
||||||
min_cycle_duration:
|
|
||||||
seconds: 60
|
|
||||||
keep_alive:
|
|
||||||
minutes: 3
|
|
||||||
initial_hvac_mode: "heat"
|
|
||||||
precision: 0.5
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Please insert into the default file "configuration.yaml
|
|
||||||
# Folder must be changed to the directory where the tft file (Nextion Editor) will be uploaded
|
|
||||||
###########
|
|
||||||
#
|
|
||||||
#Folder watcher for NS panel auto upload tft
|
|
||||||
folder_watcher:
|
|
||||||
- folder: /config/www/nspanel/
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
##### Sensor ######
|
|
||||||
sensor:
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag:
|
|
||||||
friendly_name: "Wochentag"
|
|
||||||
unique_id: 6ac64850-8563-456c-b562-92343dd96f0b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,'] %}
|
|
||||||
{{ now().timestamp() | timestamp_custom(days[now().weekday()] ~ ' %d.%m')}}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag01:
|
|
||||||
friendly_name: "Wochentag+1"
|
|
||||||
unique_id: 6b2aad54-3eb0-48cc-ae32-ee3574197f1b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (86400)) | timestamp_custom(days[now().weekday()+1] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag02:
|
|
||||||
friendly_name: "Wochentag+2"
|
|
||||||
unique_id: edbddaf0-2791-4774-b8d4-aa706f75cc7a
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (172800)) | timestamp_custom(days[now().weekday()+2] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag03:
|
|
||||||
friendly_name: "Wochentag+3"
|
|
||||||
unique_id: ad592622-db86-40f7-9961-4c1ffd21c711
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,'] %}
|
|
||||||
{{(as_timestamp(now())+ (259200)) | timestamp_custom(days[now().weekday()+3] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag04:
|
|
||||||
friendly_name: "Wochentag+4"
|
|
||||||
unique_id: dcb3ed45-2b89-4672-a04f-a55f025ac745
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (345600)) | timestamp_custom(days[now().weekday()+4] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag05:
|
|
||||||
friendly_name: "Wochentag+5"
|
|
||||||
unique_id: 77e642a5-de54-452d-9f4a-febe3a7851c2
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (432000)) | timestamp_custom(days[now().weekday()+ 5] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_buro_target_temp:
|
|
||||||
unique_id: 2393ab74-21ce-42d3-b15e-ec162b9d6f31
|
|
||||||
friendly_name: NSPanel Buro Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_buro', 'temperature') }}"
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_lea_target_temp:
|
|
||||||
unique_id: e8e61ff7-3a41-47ad-bd6c-303f730de96f
|
|
||||||
friendly_name: NSPanel Lea Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_lea', 'temperature') }}"
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,18 +0,0 @@
|
|||||||
climate:
|
|
||||||
- platform: generic_thermostat
|
|
||||||
unique_id: cf308990-0dbd-4e8a-be77-aec56d7a5aa4
|
|
||||||
name: NSPanel Büro
|
|
||||||
heater: switch.nspanel_buro_relay_2
|
|
||||||
target_sensor: sensor.nspanel_buro_temperature
|
|
||||||
min_temp: 13
|
|
||||||
max_temp: 27
|
|
||||||
ac_mode: false
|
|
||||||
target_temp: 22
|
|
||||||
cold_tolerance: 0.5
|
|
||||||
hot_tolerance: 0.5
|
|
||||||
min_cycle_duration:
|
|
||||||
seconds: 60
|
|
||||||
keep_alive:
|
|
||||||
minutes: 3
|
|
||||||
initial_hvac_mode: "heat"
|
|
||||||
precision: 0.5
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Please insert into the default file "configuration.yaml
|
|
||||||
# Folder must be changed to the directory where the tft file (Nextion Editor) will be uploaded
|
|
||||||
###########
|
|
||||||
#
|
|
||||||
#Folder watcher for NS panel auto upload tft
|
|
||||||
folder_watcher:
|
|
||||||
- folder: /config/www/nspanel/
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
##### Sensor ######
|
|
||||||
sensor:
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag:
|
|
||||||
friendly_name: "Wochentag"
|
|
||||||
unique_id: 6ac64850-8563-456c-b562-92343dd96f0b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,'] %}
|
|
||||||
{{ now().timestamp() | timestamp_custom(days[now().weekday()] ~ ' %d.%m')}}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag01:
|
|
||||||
friendly_name: "Wochentag+1"
|
|
||||||
unique_id: 6b2aad54-3eb0-48cc-ae32-ee3574197f1b
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (86400)) | timestamp_custom(days[now().weekday()+1] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag02:
|
|
||||||
friendly_name: "Wochentag+2"
|
|
||||||
unique_id: edbddaf0-2791-4774-b8d4-aa706f75cc7a
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (172800)) | timestamp_custom(days[now().weekday()+2] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag03:
|
|
||||||
friendly_name: "Wochentag+3"
|
|
||||||
unique_id: ad592622-db86-40f7-9961-4c1ffd21c711
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,'] %}
|
|
||||||
{{(as_timestamp(now())+ (259200)) | timestamp_custom(days[now().weekday()+3] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag04:
|
|
||||||
friendly_name: "Wochentag+4"
|
|
||||||
unique_id: dcb3ed45-2b89-4672-a04f-a55f025ac745
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (345600)) | timestamp_custom(days[now().weekday()+4] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
wochentag05:
|
|
||||||
friendly_name: "Wochentag+5"
|
|
||||||
unique_id: 77e642a5-de54-452d-9f4a-febe3a7851c2
|
|
||||||
value_template: >
|
|
||||||
{% set days = ['Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,', 'Samstag,', 'Sonntag,', 'Montag,', 'Dienstag,', 'Mittwoch,', 'Donnerstag,', 'Freitag,'] %}
|
|
||||||
{{(as_timestamp(now())+ (432000)) | timestamp_custom(days[now().weekday()+ 5] ~ ' %d.%m') }}
|
|
||||||
icon_template: mdi:calendar-range
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_buro_target_temp:
|
|
||||||
unique_id: 2393ab74-21ce-42d3-b15e-ec162b9d6f31
|
|
||||||
friendly_name: NSPanel Buro Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_buro', 'temperature') }}"
|
|
||||||
|
|
||||||
###### NSPanel Büro - climate target temperature #####
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
nspanel_lea_target_temp:
|
|
||||||
unique_id: e8e61ff7-3a41-47ad-bd6c-303f730de96f
|
|
||||||
friendly_name: NSPanel Lea Target Temp
|
|
||||||
value_template: "{{ state_attr('climate.nspanel_lea', 'temperature') }}"
|
|
||||||
24
docs/README.md
Normal file
24
docs/README.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Manuals:
|
||||||
|
## Setup
|
||||||
|
- [First Steps | Installation and Setup](install.md)
|
||||||
|
- [Blueprint | Setup and explanation of the Blueprint](blueprint.md)
|
||||||
|
- [HowTo | All important things you should know](howto.md)
|
||||||
|
- [Version compatibility matrix](version_compatibility.md)
|
||||||
|
|
||||||
|
## Common issues
|
||||||
|
- [Panel startup issues](error_initializing.md)
|
||||||
|
- [Compiling Errors](error_compiling.md)
|
||||||
|
- [TFT Upload](tft_upload.md)
|
||||||
|
|
||||||
|
## Advanced settings
|
||||||
|
- [Customization](customization.md)
|
||||||
|
- [Add-on Bluetooth Proxy](addon_bluetooth_proxy.md)
|
||||||
|
- [Add-on Climate](addon_climate.md)
|
||||||
|
- [Alarm Control Panel](alarm.md)
|
||||||
|
- [API](api.md)
|
||||||
|
- [Using Different Versions of This Project](different_version.md)
|
||||||
|
|
||||||
|
## Setup and overview videos:
|
||||||
|
- **_[Overview and features](https://www.youtube.com/watch?v=b7vW4YtUaTs) - Mark Watt Tech_**
|
||||||
|
- **_[How to setup](https://www.youtube.com/watch?v=jpSTA_ILB8g) - Mark Watt Tech_**
|
||||||
|
- **_[(DE) Einrichtungs und konfigurations video](https://www.youtube.com/watch?v=3afPFg6kUdc) - SmartHome yourself_**
|
||||||
64
docs/addon_ble_tracker.md
Normal file
64
docs/addon_ble_tracker.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# Add-on: BLE Tracker
|
||||||
|
|
||||||
|
## Description
|
||||||
|
This add-on enables your NSPanel to use its internal Bluetooth module to track nearby Bluetooth Low Energy (BLE) devices
|
||||||
|
using the [ESPHome BLE Tracker component](https://esphome.io/components/esp32_ble_tracker.html).
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Configuring the BLE Tracker on your NSPanel is crucial for enabling device discovery and presence detection functionalities efficiently.
|
||||||
|
This component should be managed with careful consideration of ESP32's memory capabilities, especially when other Bluetooth components are used concurrently.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
- The `esp-idf` framework is recommended for the [ESP32 Platform](customization.md#framework-esp-idf) to ensure optimal operation and compatibility when using BLE features.
|
||||||
|
The `arduino` framework is not advised as it may increase memory usage and impact the performance negatively.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Using the `arduino` framework can lead to high memory consumption which might interfere with the stability of BLE operations on the NSPanel.
|
||||||
|
It is crucial to use the `esp-idf` framework to avoid such issues.
|
||||||
|
|
||||||
|
## Configuration Steps
|
||||||
|
1. **Edit Your ESPHome YAML File**: Incorporate the BLE Tracker component into your NSPanel's configuration by adding the necessary entries under the `esp32_ble_tracker:` section as shown below:
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
device_name: "YOUR_NSPANEL_NAME" # Set your NSPanel's device name
|
||||||
|
friendly_name: "Your Friendly Name" # Set a friendly display name
|
||||||
|
wifi_ssid: !secret wifi_ssid # Your Wi-Fi SSID
|
||||||
|
wifi_password: !secret wifi_password # Your Wi-Fi password
|
||||||
|
|
||||||
|
# Optional configurations (uncomment if needed)
|
||||||
|
## Add-on for specific tracked devices or automation triggers
|
||||||
|
# sensor:
|
||||||
|
# - platform: ble_rssi
|
||||||
|
# mac_address: MAC_ADDRESS_OF_DEVICE
|
||||||
|
# name: "BLE Device RSSI"
|
||||||
|
|
||||||
|
## If you wanna set non-standard parameters to your BLE tracker, just add like this:
|
||||||
|
# esp32_ble_tracker:
|
||||||
|
# scan_parameters:
|
||||||
|
# interval: 1100ms
|
||||||
|
# window: 1100ms
|
||||||
|
# active: true
|
||||||
|
|
||||||
|
# Package Configuration
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic NSPanel package
|
||||||
|
# Optional packages for advanced features and other add-ons
|
||||||
|
- esphome/nspanel_esphome_addon_ble_tracker.yaml # BLE Tracker add-on package
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
2. **Update Substitutions**: Customize `"YOUR_NSPANEL_NAME"` and `"Your Friendly Name"` to appropriate identifiers for your device and its Bluetooth functionality.
|
||||||
|
3. **Save and Upload**: After making the necessary changes, save your configuration file and upload it to your NSPanel via the ESPHome dashboard.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The first time this component is enabled for an ESP32, the code partition needs to be resized.
|
||||||
|
> Please flash the ESP32 via USB when adding this to your configuration. After that, you can use OTA updates again.
|
||||||
|
|
||||||
|
This configuration allows your NSPanel to efficiently manage Bluetooth connections, acting as a proxy for various BLE operations.
|
||||||
65
docs/addon_bluetooth_proxy.md
Normal file
65
docs/addon_bluetooth_proxy.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Add-on: Bluetooth Proxy
|
||||||
|
|
||||||
|
## Description
|
||||||
|
This add-on enables your NSPanel to function as a Bluetooth Low Energy (BLE) proxy utilizing its internal Bluetooth module
|
||||||
|
along with the [ESPHome Bluetooth Proxy component](https://esphome.io/components/bluetooth_proxy.html).
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> It is crucial to configure the Bluetooth Proxy using this add-on for optimal memory management, which involves releasing the Bluetooth stack prior to any TFT updates.
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- Ensure the `esp-idf` framework is utilized for the [ESP32 Platform](customization.md#framework-esp-idf) when enabling Bluetooth features.
|
||||||
|
Avoid switching to the `arduino` framework as it significantly increases memory usage, potentially causing installation failures on your panel.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> The `arduino` framework, while compatible, should not be used for Bluetooth-intensive applications on the NSPanel due to its higher memory consumption.
|
||||||
|
|
||||||
|
### Configuration Steps
|
||||||
|
1. **Edit Your ESPHome YAML File**: Add the Bluetooth Proxy add-on to your configuration by including the `remote_package` entry under the `packages` section as illustrated below:
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
device_name: "YOUR_NSPANEL_NAME" # Set your NSPanel's device name
|
||||||
|
friendly_name: "Your Friendly Name" # Set a friendly display name
|
||||||
|
wifi_ssid: !secret wifi_ssid # Your Wi-Fi SSID
|
||||||
|
wifi_password: !secret wifi_password # Your Wi-Fi password
|
||||||
|
|
||||||
|
# Optional configurations (uncomment if needed)
|
||||||
|
## Add-on for climate control
|
||||||
|
# heater_relay: "1" # Options: "1" or "2"
|
||||||
|
|
||||||
|
# Begin Customization Section
|
||||||
|
##### Customization - Start #####
|
||||||
|
## If you wanna set non-standard parameters to your Bluetooth proxy just add like this:
|
||||||
|
# esp32_ble_tracker:
|
||||||
|
# scan_parameters:
|
||||||
|
# interval: 1100ms
|
||||||
|
# window: 1100ms
|
||||||
|
# active: true
|
||||||
|
#
|
||||||
|
# bluetooth_proxy:
|
||||||
|
# active: true
|
||||||
|
##### Customization - End #####
|
||||||
|
|
||||||
|
# Package Configuration
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic NSPanel package
|
||||||
|
# Optional packages for advanced features and other add-ons
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_bluetooth_proxy.yaml # Bluetooth Proxy add-on package
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
2. **Update Substitutions**: Customize `"YOUR_NSPANEL_NAME"` and `"Your Friendly Name"` to appropriate identifiers for your device and its Bluetooth functionality.
|
||||||
|
3. **Save and Upload**: After making the necessary changes, save your configuration file and upload it to your NSPanel via the ESPHome dashboard.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The first time this component is enabled for an ESP32, the code partition needs to be resized.
|
||||||
|
> Please flash the ESP32 via USB when adding this to your configuration. After that, you can use OTA updates again.
|
||||||
|
|
||||||
|
This configuration allows your NSPanel to efficiently manage Bluetooth connections, acting as a proxy for various BLE operations.
|
||||||
255
docs/addon_climate.md
Normal file
255
docs/addon_climate.md
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
# Add-on: Climate
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This add-on enables the use of your panel's relays to act as a thermostat (either cooler or heater)
|
||||||
|
using the internal temperature sensor and independent of the network availability.
|
||||||
|
|
||||||
|
### Attention
|
||||||
|
1. The NSPanel is limited to 2A per relay.
|
||||||
|
Don't use it for directly power your cooler/heater if exceeding the panel specifications:
|
||||||
|
- 150W/110V/Gang, 300W/110V/Total
|
||||||
|
- 300W/220V/Gang, 600W/220V/Total
|
||||||
|
2. A target temperature must be set on the climate entity in Home Assistant or the page Climate in your panel.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> More details on the [Sonoff NSPanel's page](https://sonoff.tech/product/central-control-panel/nspanel/)
|
||||||
|
> and the [product specifications document](https://sonoff.tech/wp-content/uploads/2021/11/%E4%BA%A7%E5%93%81%E5%8F%82%E6%95%B0%E8%A1%A8-NSPanel-20210831.pdf).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You will need to add the reference to `addon_climate_heat`, `addon_climate_cool` or `addon_climate_dual` files on your ESPHome settings in the `package` section
|
||||||
|
and after the `remote_package` (base code), as shown below (for `heat` in this example):
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Occasionally, ESPHome updates may result in the `entity_id` of embedded thermostats being appended with `_2`.
|
||||||
|
> If you experience this change, refer to this [forum post](https://community.home-assistant.io/t/esphome-devices-all-renamed-with-2-added/388146) on the Home Assistant Forum for guidance.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
## Add-on climate
|
||||||
|
heater_relay: "1" # Possible values: "1" or "2"
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Basic and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The following keys are available to be used in your `substitutions`:
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 MD033 -->
|
||||||
|
Key|Required|Supported values|Default|Description
|
||||||
|
:-|:-:|:-:|:-:|:-
|
||||||
|
cooler_relay|Mandatory for *cool* and *dual*|`1` or `2`|`0` (disabled)|Relay used for control the cooler. User `1` for "Relay 1" or `2` for "Relay 2".
|
||||||
|
heater_relay|Mandatory for *heat* and *dual*|`1` or `2`|`0` (disabled)|Relay used for control the heater. User `1` for "Relay 1" or `2` for "Relay 2".
|
||||||
|
temp_units|Optional|`°C` or `°F`|`°C`|Temperature unit.
|
||||||
|
min_off_time|Optional|Positive integer representing the number of seconds|`300`|Minimum duration (in seconds) the cooling/heating action must be disengaged before it may be engaged.
|
||||||
|
min_run_time|Optional|Positive integer representing the number of seconds|`300`|Minimum duration (in seconds) the cooling/heating action must be engaged before it may be disengaged.
|
||||||
|
min_idle_time|Optional|Positive integer representing the number of seconds|`30`|Minimum duration (in seconds) the idle action must be active before calling another climate action.
|
||||||
|
target_low|Optional|Number representing a temperature in the selected unit|`18`|The initial lower treshold for the target temperature.
|
||||||
|
target_high|Optional|Number representing a temperature in the selected unit|`24`|The initial higher treshold for the target temperature.
|
||||||
|
temp_min|Optional|Number representing a temperature in the selected unit|*cool: `15`*<br>*heat: `7`*<br>*dual: `7`* |The minimum temperature the climate device can reach. Used to set the range of the frontend gauge.
|
||||||
|
temp_max|Optional|Number representing a temperature in the selected unit|*cool: `45`*<br>*heat: `35`*<br>*dual: `45`* |The maximum temperature the climate device can reach. Used to set the range of the frontend gauge.
|
||||||
|
temp_step|Optional|Number representing a temperature in the selected unit|`0.5`|The granularity with which the target temperature can be controlled.
|
||||||
|
cool_deadband|Optional|Number representing a temperature hysteresis in the selected unit|`0.5`|The minimum temperature differential (temperature above the set point) before engaging cooling.
|
||||||
|
cool_overrun|Optional|Number representing a temperature hysteresis in the selected unit|`0.5`|The minimum temperature differential (cooling beyond the set point) before disengaging cooling.
|
||||||
|
heat_deadband|Optional|Number representing a temperature hysteresis in the selected unit|`0.5`|The minimum temperature differential (temperature below the set point) before engaging heat.
|
||||||
|
heat_overrun|Optional|Number representing a temperature hysteresis in the selected unit|`0.5`|The minimum temperature differential (heating beyond the set point) before disengaging heat.
|
||||||
|
|
||||||
|
<!-- markdownlint-enable MD013 MD033 -->
|
||||||
|
|
||||||
|
- All values must be delimited with `""`
|
||||||
|
- For more details on the keys, please take a look at [ESPHome Base Climate Configurations](https://esphome.io/components/climate/index.html#base-climate-configuration)
|
||||||
|
and [ESPHome Climate Thermostat - Additional actions behavior](https://esphome.io/components/climate/thermostat.html#additional-actions-behavior).
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Cooler
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
## Add-on climate
|
||||||
|
cooler_relay: "1" # Possible values: "1" or "2"
|
||||||
|
temp_units: "°F" # Temperatures in Fahrenheit
|
||||||
|
temp_min: "40" # Min supported temperature is 40°F
|
||||||
|
temp_max: "80" # Max supported temperature is 80°F
|
||||||
|
temp_step: "1" # Temperature granularity is 1°F
|
||||||
|
cool_deadband: "1.2" # Temperature delta before engaging cooling
|
||||||
|
cool_overrun: "1.2" # Temperature delta before disengaging cooling
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Basic and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Heater
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
## Add-on climate
|
||||||
|
heater_relay: "1" # Possible values: "1" or "2"
|
||||||
|
temp_units: "°F" # Temperatures in Fahrenheit
|
||||||
|
temp_min: "40" # Min supported temperature is 40°F
|
||||||
|
temp_max: "80" # Max supported temperature is 80°F
|
||||||
|
temp_step: "1" # Temperature granularity is 1°F
|
||||||
|
heat_deadband: "1.2" # Temperature delta before engaging heat
|
||||||
|
heat_overrun: "1.2" # Temperature delta before disengaging heat
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Basic and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Dual
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
## Add-on climate
|
||||||
|
heater_relay: "1" # Possible values: "1" or "2"
|
||||||
|
cooler_relay: "2" # Possible values: "1" or "2"
|
||||||
|
temp_units: "°F" # Temperatures in Fahrenheit
|
||||||
|
temp_min: "40" # Min supported temperature is 40°F
|
||||||
|
temp_max: "80" # Max supported temperature is 80°F
|
||||||
|
temp_step: "1" # Temperature granularity is 1°F
|
||||||
|
cool_deadband: "1.2" # Temperature delta before engaging cooling
|
||||||
|
cool_overrun: "1.2" # Temperature delta before disengaging cooling
|
||||||
|
heat_deadband: "1.2" # Temperature delta before engaging heat
|
||||||
|
heat_overrun: "1.2" # Temperature delta before disengaging heat
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Basic and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Real Use Case Example: Water Underfloor Heating with NSPanel
|
||||||
|
The NSPanel works nicely as a replacement for existing water underfloor heating controllers, installed at eye level and often powered by 100-240VAC.
|
||||||
|
In my specific use case, the control valve is of the 'normally closed' type, meaning that an open relay indicates 'no heating.'
|
||||||
|
I have utilized relay #1 for this purpose. It's important to note that this setup does not act as a PID controller, but operates on a simple on-off mechanism.
|
||||||
|
The system initiates heating at a preset value below and turns it off at a value above the set point.
|
||||||
|
I have set these values to `0.1°C` below and `0.1°C` above the target temperature, respectively.
|
||||||
|
These adjustments have been effectively maintaining the desired temperature in all of our four rooms.
|
||||||
|
The thermostat's settings range from a minimum of `15°C` to a maximum of `22°C`, with a granularity of `0.1°C` for adjustments.
|
||||||
|
Furthermore, I have selected `18.3°C` as the default target temperature.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
##### addon-configuration #####
|
||||||
|
## addon_climate ##
|
||||||
|
heater_relay: "1" #Use relay 1
|
||||||
|
temp_min: "15"
|
||||||
|
temp_max: "22"
|
||||||
|
temp_step: "0.1"
|
||||||
|
cold_tolerance: "0.1"
|
||||||
|
hot_tolerance: "0.1"
|
||||||
|
|
||||||
|
##### CHANGE ME END #####
|
||||||
|
climate:
|
||||||
|
- id: !extend thermostat_embedded
|
||||||
|
visual:
|
||||||
|
temperature_step: ${temp_step}
|
||||||
|
preset:
|
||||||
|
- name: Home
|
||||||
|
default_target_temperature_low: 18.3
|
||||||
|
mode: "heat"
|
||||||
|
```
|
||||||
|
|
||||||
|
Please note that employing any filter to smooth the temperature readings, such as averaging, is discouraged if the relevant timescale exceeds 1min.
|
||||||
|
Such filtering methods can delay the response times of an already slow underfloor heating system.
|
||||||
|
Despite this, the temperature stability achieved is quite satisfactory, as illustrated in the graph below.
|
||||||
|
|
||||||
|

|
||||||
|
*On March 24th (around 9:20 PM) and March 25th (around 7:30AM) a window was opened, and all heaters were set to 'off.' for 30min*
|
||||||
75
docs/alarm.md
Normal file
75
docs/alarm.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Alarm Control Panel
|
||||||
|
|
||||||
|
You can control an Alarm Control Panel from your NSPanel, which allows you to set the alarm mode to standard
|
||||||
|
modes supported by Home Assistant (Home, Away, Night, Vacation, or Custom bypass) or disarm the alarm.
|
||||||
|
|
||||||
|
Currently, the NSPanel supports alarms without a code or with a numeric code. For alarms using a text code,
|
||||||
|
the NSPanel will display it, but interactions (like button clicks) will send service calls to Home Assistant
|
||||||
|
without the code, leading to failed operations that require a code.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> **Security advisory**
|
||||||
|
> The default communication between your NSPanel (ESPHome) and Home Assistant (HA) is not encrypted. This
|
||||||
|
> could allow someone with network access to monitor and replicate the service calls. This risk is
|
||||||
|
> particularly relevant when controlling your alarm system.
|
||||||
|
>
|
||||||
|
> To enhance security, we strongly recommend enabling API encryption for NSPanel users managing an Alarm
|
||||||
|
> system. Follow the instructions in the ["API encryption" example here](customization.md#api-encryption)
|
||||||
|
> to implement this security measure.
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Allow the device to make Home Assistant service calls
|
||||||
|
|
||||||
|
First, you need to configure your Home Assistant to permit your NSPanel to make service calls. While
|
||||||
|
most services are handled via the Blueprint, ESPHome needs to send events with all necessary data in
|
||||||
|
plain text for these service calls. To mitigate any security risks, alarm-related calls are managed
|
||||||
|
directly by the panel.
|
||||||
|
|
||||||
|
To enable this:
|
||||||
|
1. Go to your ESPHome integrations panel (Settings > Devices and Services > ESPHome).
|
||||||
|
2. Click "Configure" next to your panel's entry.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. Select the "Allow the device to make Home Assistant service calls" option.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Blueprint settings
|
||||||
|
|
||||||
|
To assign Alarm Control Panel entities to buttons:
|
||||||
|
1. Open the NSPanel Blueprint automation.
|
||||||
|
2. Find the button configuration section.
|
||||||
|
3. Choose a button and select your alarm control panel entity.
|
||||||
|
4. Click "Save" to complete setup.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Follow these steps to ensure your NSPanel is correctly configured for controlling your alarm system.
|
||||||
|
## Controlling your alarm from your panel
|
||||||
|
|
||||||
|
When an alarm control panel is configured in your Blueprint automation, the alarm icon appears on your
|
||||||
|
NSPanel's Home page or the respective button page. This icon changes based on the alarm state, detailed
|
||||||
|
in the following table.
|
||||||
|
|
||||||
|
Clicking this button opens the Alarm Control Panel page. Here, you can adjust alarm settings with a
|
||||||
|
single click or return to the Home page.
|
||||||
|
|
||||||
|

|
||||||
|
### Description of states shown with the alarm icon
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 -->
|
||||||
|
State | Color | Icon | Icon Name | Description
|
||||||
|
-- | -- | -- | -- | --
|
||||||
|
disarmed | White |  | mdi:shield-off-outline | The alarm is disarmed (off).
|
||||||
|
armed_home | Green |  | mdi:shield-home-outline | The alarm is armed in home mode.
|
||||||
|
armed_away | Green |  | mdi:shield-lock-outline | The alarm is armed in away mode.
|
||||||
|
armed_night | Green |  | mdi:shield-moon-outline | The alarm is armed in night mode.
|
||||||
|
armed_vacation | Green |  | mdi:shield-airplane-outline | The alarm is armed in vacation mode.
|
||||||
|
armed_custom_bypass | Green |  | mdi:shield-half-full | The alarm is armed in bypass mode.
|
||||||
|
pending | Amber |  | mdi:shield-outline | The alarm is pending (towards triggered).
|
||||||
|
arming | Amber |  | mdi:shield-outline | The alarm is arming.
|
||||||
|
disarming | Amber |  | mdi:shield-off-outline | The alarm is disarming.
|
||||||
|
triggered | Red |  | mdi:shield-alert-outline | The alarm is triggered.
|
||||||
|
unknown/unavailable | White |  | mdi:shield-alert-outline | The alarm state is unknown or unavailable.
|
||||||
|
<!-- markdownlint-enable MD013 -->
|
||||||
843
docs/api.md
Normal file
843
docs/api.md
Normal file
@@ -0,0 +1,843 @@
|
|||||||
|
# API
|
||||||
|
This document provides details on custom services designed for integration with Home Assistant, including their usage, parameters, and examples.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- [Service Documentation](#service-documentation)
|
||||||
|
- [Button Service (`button`)](#button-service-button): Configures properties and state of buttons on a specified button page.
|
||||||
|
- [Command Service (`command`)](#command-service-command): Sends a custom command directly to the display.
|
||||||
|
- [Component Color Service (`component_color`)](#component-color-service-component_color): Changes the foreground color of a specified component on the display.
|
||||||
|
- [Component Text Service (`component_text`)](#component-text-service-component_text): Updates the text of a specified component on the display.
|
||||||
|
- [Component Value Service (`component_val`)](#component-value-service-component_val): Updates the value of a specified component on the display.
|
||||||
|
- [Components Visibility Service (`components_visibility`)](#components-visibility-service-components_visibility): Hides or shows a specified component on the display.
|
||||||
|
- [Entity Details Show Service (`entity_details_show`)](#entity-details-show-service-entity_details_show): Displays detailed information for a specific entity.
|
||||||
|
- [Hardware Button State Indication Service (`hw_button_state`)](#hardware-button-state-indication-service-hw_button_state):
|
||||||
|
Updates the visual state (on/off) of the left and right hardware button indicators on the panel.
|
||||||
|
- [Icon Service (`icon`)](#icon-service-icon): Updates a chip or custom button's icon, color, and visibility.
|
||||||
|
- [Initialization Service: Global (`init_global`)](#initialization-service-init_global): Transfers global settings on initialization.
|
||||||
|
- [Initialization Service: Hardware (`init_hardware`)](#initialization-service-init_hardware): Transfers NSPanel hardware settings during initialization.
|
||||||
|
- [Initialization Service: Home Page (`init_page_home`)](#initialization-service-init_page_home): Transfers settings for the "Home" page on initialization.
|
||||||
|
- [Initialization Service: Settings Page (`init_page_settings`)](#initialization-service-init_page_settings): Transfers settings for the "Settings" page on initialization.
|
||||||
|
- [Notification Clear Service (`notification_clear`)](#notification-clear-service-notification_clear): Clears the current notification from the screen.
|
||||||
|
- [Notification Show Service (`notification_show`)](#notification-show-service-notification_show): Displays a notification-message on the screen.
|
||||||
|
- [QR Code Service (`qrcode`)](#qr-code-service-qrcode): Displays a QR code on the panel or updates the QR code information for local control.
|
||||||
|
- [RTTTL Play Service (`rtttl_play`)](#rtttl-play-service-rtttl_play): Plays melodies encoded in the RTTTL format.
|
||||||
|
- [Upload TFT Service (`upload_tft`)](#tft-file-update-service-upload_tft): Enables TFT file updates from a URL, requiring the "Upload TFT" add-on.
|
||||||
|
- [Value Service (`value`)](#value-service-value): Updates an entity to display specific values.
|
||||||
|
- [Wake Up Service (`wake_up`)](#wake-up-service-wake_up): Activates the display from a screensaver or low-brightness state.
|
||||||
|
- [Alarm Settings Page Service (`page_alarm`)](#alarm-settings-page-service-page_alarm): Updates the Alarm page with current state information.
|
||||||
|
- [Climate Page Service (`page_climate`)](#climate-page-service-page_climate): Updates the Climate page with current state information.
|
||||||
|
- [Media Player Page Service (`page_media_player`)](#media-player-page-service-page_media_player): Updates the Media Player page with current state information.
|
||||||
|
- [Screen Components](#screen-components)
|
||||||
|
- [Home page - Chips](#home-page---chips)
|
||||||
|
- [User-defined Chips](#user-defined-chips)
|
||||||
|
- [Relays Chips](#relays-chips)
|
||||||
|
- [Climate Chip](#climate-chip)
|
||||||
|
- [Home page - Custom Buttons](#home-page---custom-buttons)
|
||||||
|
- [Home page - Values](#home-page---values)
|
||||||
|
- [Entities Pages - Values](#entities-pages---values)
|
||||||
|
|
||||||
|
## Service Documentation
|
||||||
|
|
||||||
|
### General Guidance
|
||||||
|
In general, there's no validation on the content of the parameters in a service call.
|
||||||
|
Please make sure to fulfill the validation from the service caller side, otherwise it can drive to a crash in the ESPHome side, it will most likely restart the panel.
|
||||||
|
|
||||||
|
One example is with colors. In almost all cases, it is expected an array with 3 unsigned integers between 0 to 255.
|
||||||
|
If you send anything different, the conversion to the RGB565 used by Nextion will crash.
|
||||||
|
|
||||||
|
### Table of Contents
|
||||||
|
<!-- markdownlint-disable MD013 -->
|
||||||
|
| Service ID | Service Name | Description |
|
||||||
|
|------------|--------------|-------------|
|
||||||
|
| [`button`](#button-service-button) | [Button Service](#button-service-button) | Configures properties and state of buttons on a specified button page. |
|
||||||
|
| [`command`](#command-service-command) | [Command Service](#command-service-command) | Sends a custom command directly to the display. |
|
||||||
|
| [`component_color`](#component-color-service-component_color) | [Component Color Service](#component-color-service-component_color) | Changes the foreground color of a specified component on the display. |
|
||||||
|
| [`component_text`](#component-text-service-component_text) | [Component Text Service](#component-text-service-component_text) | Updates the text of a specified component on the display. |
|
||||||
|
| [`component_val`](#component-value-service-component_val) | [Component Value Service](#component-value-service-component_val) | Updates the value of a specified component on the display. |
|
||||||
|
| [`components_visibility`](#components-visibility-service-components_visibility) | [Components Visibility Service](#components-visibility-service-components_visibility) | Hides or shows a specified component on the display. |
|
||||||
|
| [`entity_details_show`](#entity-details-show-service-entity_details_show) | [Entity Details Show Service](#entity-details-show-service-entity_details_show) | Displays detailed information for a specific entity. |
|
||||||
|
| [`hw_button_state`](#hardware-button-state-indication-service-hw_button_state) | [Hardware Button State Indication Service](#hardware-button-state-indication-service-hw_button_state) | Updates the visual state (on/off) of the left and right hardware button indicators on the panel. |
|
||||||
|
| [`icon`](#icon-service-icon) | [Icon Service](#icon-service-icon) | Updates a chip or custom button's icon, color, and visibility. |
|
||||||
|
| [`init_global`](#initialization-service-init_global) | [Initialization Service](#initialization-service-init_global) | Transfers global settings on initialization. |
|
||||||
|
| [`init_hardware`](#initialization-service-init_hardware) | [Initialization Service](#initialization-service-init_hardware) | Transfers NSPanel hardware settings during initialization. |
|
||||||
|
| [`init_page_home`](#initialization-service-init_page_home) | [Initialization Service](#initialization-service-init_page_home) | Transfers settings for the "Home" page on initialization. |
|
||||||
|
| [`init_page_settings`](#initialization-service-init_page_settings) | [Initialization Service](#initialization-service-init_page_settings) | Transfers settings for the "Settings" page on initialization. |
|
||||||
|
| [`notification_clear`](#notification-clear-service-notification_clear) | [Notification Clear Service](#notification-clear-service-notification_clear) | Clears the current notification from the screen. |
|
||||||
|
| [`notification_show`](#notification-show-service-notification_show) | [Notification Show Service](#notification-show-service-notification_show) | Displays a notification-message on the screen. |
|
||||||
|
| [`page_alarm`](#alarm-settings-page-service-page_alarm) | [Alarm Settings Page Service](#alarm-settings-page-service-page_alarm) | Updates the Alarm page with current state information. |
|
||||||
|
| [`page_climate`](#climate-page-service-page_climate) | [Climate Page Service](#climate-page-service-page_climate) | Updates the Climate page with current state information. |
|
||||||
|
| [`page_media_player`](#media-player-page-service-page_media_player) | [Media Player Page Service](#media-player-page-service-page_media_player) | Updates the Media Player page with current state information. |
|
||||||
|
| [`qrcode`](#qr-code-service-qrcode) | [QR Code Service](#qr-code-service-qrcode) | Displays a QR code on the panel or update the QR code information for local control. |
|
||||||
|
| [`rtttl_play`](#rtttl-play-service-rtttl_play) | [RTTTL Play Service](#rtttl-play-service-rtttl_play) | Plays melodies encoded in the RTTTL format. |
|
||||||
|
| [`upload_tft`](#tft-file-update-service-upload_tft) | [Upload TFT Service](#tft-file-update-service-upload_tft) | Enables TFT file updates from a URL, requiring the "Upload TFT" add-on. |
|
||||||
|
| [`value`](#value-service-value) | [Value Service](#value-service-value) | Updates an entity to display specific values. |
|
||||||
|
| [`wake_up`](#wake-up-service-wake_up) | [Wake Up Service](#wake-up-service-wake_up) | Activates the display from a screensaver or low-brightness state. |
|
||||||
|
<!-- markdownlint-enable MD013 -->
|
||||||
|
|
||||||
|
### Button Service: `button`
|
||||||
|
Configures the properties and state of buttons on a specified button page, allowing for dynamic updates to button appearance and behavior based on specified parameters.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is designed for dynamic user interface adjustments, enabling the customization of button states, icons, colors, and labels.
|
||||||
|
It's particularly useful for reflecting changes in device states or user interactions within the UI.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `page` (string): The page identifier where the button is located.
|
||||||
|
- `id` (string): The button's unique identifier.
|
||||||
|
- `state` (bool): The state of the button, which can affect its background picture and other visual elements.
|
||||||
|
- `icon` (string): Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
|
||||||
|
Example: "\uE6E8" for `mdi:lightbulb-on-outline`.
|
||||||
|
- `icon_color` (int[]): The RGB color array for the icon.
|
||||||
|
- `icon_font` (int): The Nextion font identifier for the icon (default is 8).
|
||||||
|
- `bri` (string): Brightness level or other dynamic information to display on the button close to the icon.
|
||||||
|
- `label` (string): The main text label displayed on the button.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_button
|
||||||
|
data:
|
||||||
|
page: "buttonpage01"
|
||||||
|
id: "button08"
|
||||||
|
state: true
|
||||||
|
icon: "\uE6E8" # Example for mdi:lightbulb-on-outline
|
||||||
|
icon_color: [255, 0, 0] # Red
|
||||||
|
icon_font: 2
|
||||||
|
bri: "75%"
|
||||||
|
label: "Living Room"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service dynamically updates the specified button's properties to match the provided parameters.
|
||||||
|
|
||||||
|
### Command Service: `command`
|
||||||
|
Sends a custom command directly to the display, enabling direct interaction and dynamic content updates.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is particularly useful for advanced customizations and direct display manipulations, such as showing messages, updating statuses, or any other display-centric commands.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `cmd` (string): The command string to be sent to the display. Please refer to [The Nextion Instruction Set](https://nextion.tech/instruction-set/) for a comprehensive list of commands supported.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_command
|
||||||
|
data:
|
||||||
|
cmd: "page home" # Go to page "Home"
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Ensure the command string (`cmd`) is properly formatted according to your display's command processing capabilities.
|
||||||
|
|
||||||
|
### Component Color Service: `component_color`
|
||||||
|
Changes the foreground color of a specified component on the display, enabling dynamic color updates for user interface customization.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is ideal for creating visually dynamic interfaces, allowing elements to change color based on conditions,
|
||||||
|
events, or user actions, such as indicating status changes or highlighting specific UI components.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `id` (string): Identifier of the component whose color will be updated. It is essential that this matches the component's ID in your display layout to ensure the correct element is targeted.
|
||||||
|
- `color` (int[]): The new color for the component, specified as an RGB array (e.g., `[255, 0, 0]` for red).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_component_color
|
||||||
|
data:
|
||||||
|
id: "home.time"
|
||||||
|
color: [255, 0, 0] # Changes the component's color to red
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Ensure the `id` and color parameters accurately target and define the new color for the component.
|
||||||
|
|
||||||
|
### Component Text Service: `component_text`
|
||||||
|
Updates the text of a specified component on the display, enabling dynamic text content updates.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Ideal for user interfaces that require real-time text updates, such as status messages, labels, or any text-based information display.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `id` (string): Identifier of the component whose text will be updated. Ensure this matches the component's ID in your display layout.
|
||||||
|
- `txt` (string): The new text content to display. This can include static text or dynamic information passed at runtime.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_component_text
|
||||||
|
data:
|
||||||
|
id: "home.time"
|
||||||
|
txt: "12:34"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Make sure the `id` corresponds to the correct component on your display for the text update to work as intended.
|
||||||
|
|
||||||
|
### Component Value Service: `component_val`
|
||||||
|
Updates the value of a specified component on the display, enabling dynamic value updates.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Ideal for interfaces requiring real-time updates of numerical values, such as counters, temperature readings, or any numeric indicators.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `id` (string): Identifier of the component whose value will be updated. It's crucial this matches the component's ID in your display layout accurately.
|
||||||
|
- `val` (int): The new integer value to be set for the component. This can represent various data types, depending on the component's purpose (e.g., temperature, humidity levels).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_component_val
|
||||||
|
data:
|
||||||
|
id: "cover.coverslider"
|
||||||
|
val: 25
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Ensure the `id` accurately matches the component on your display to successfully update its value.
|
||||||
|
|
||||||
|
### Components Visibility Service: `components_visibility`
|
||||||
|
Hides or shows a list of component on the display, allowing for dynamic interface changes.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is ideal for creating interactive user interfaces that adapt by hiding or showing certain elements based on user actions, conditions, or events.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ids` (string[]): Array of identifiers of the components to be hidden/shown. It is crucial that this matches the component's ID in your display layout to ensure the correct element is hidden/shown.
|
||||||
|
- `visible` (bool): Set to true to show the component, or false to hide it.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_component_hide
|
||||||
|
data:
|
||||||
|
ids: [ "date", "time" ] # Hides the date and time display on Home page
|
||||||
|
visible: false
|
||||||
|
```
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace <your_panel_name> with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Ensure the ids matches the component on your display you wish to hide or show.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> This command only works when the page is visible.
|
||||||
|
>
|
||||||
|
> If a component being hidden/shown is not part of the current page, the command will fail and an error message will be logged.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### Entity Details Show Service: `entity_details_show`
|
||||||
|
This service is designed to display detailed information about a specific entity within the panel's interface.
|
||||||
|
It enables users to navigate to a dedicated page showing extensive details about an entity, such as a light or a climate,
|
||||||
|
and provides a structured way to return to either the home page or a specific button page.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Ideal for interfaces requiring detailed entity information across various contexts.
|
||||||
|
By specifying the `entity` and `back_page`, users are offered a seamless navigation experience,
|
||||||
|
ensuring they can easily access detailed information and return to their initial navigation point within the interface.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `entity` (string): The unique identifier of the entity (`entity_id` in Home Assistant) for which details are displayed.
|
||||||
|
- `back_page` (string): The page identifier to return to after viewing entity details.
|
||||||
|
Valid options are `home` for the home page or `buttonpage01` to `buttonpage04` for button pages.
|
||||||
|
No other pages are supported to maintain navigation consistency.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_entity_details_show
|
||||||
|
data:
|
||||||
|
entity: "light.living_room"
|
||||||
|
back_page: "buttonpage01"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Ensure to replace <your_panel_name> with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This setup provides a direct and user-friendly way to access and return from detailed entity information, enhancing the interface's usability.
|
||||||
|
|
||||||
|
### Hardware Button State Indication Service: `hw_button_state`
|
||||||
|
This service dynamically updates the on-screen indication bars for the hardware buttons, reflecting the current state of the entities they control.
|
||||||
|
It's designed to provide immediate visual feedback, enhancing the user interface by showing the active/inactive state of the left and right hardware button indicators on the panel.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Utilize this service to modify the visual state (on/off) of hardware button indicators on the panel, corresponding to the state of entities controlled by these buttons.
|
||||||
|
This allows for visual feedback that matches the operational state of the buttons.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `button_mask` (int): A bitwise identifier for buttons. Use `1` for the left button, `2` for the right button, and `3` for both buttons.
|
||||||
|
- `state` (bool): The state to apply to the button(s) indicated by `button_mask`. True for on (active), false for off (inactive).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_hw_button_state
|
||||||
|
data:
|
||||||
|
button_mask: 3 # Targets both the left (1) and right (2) buttons
|
||||||
|
state: true # Turns the indication bars on for both buttons
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant.
|
||||||
|
> This service leverages a bitmask (`button_mask`) for flexible control over multiple hardware buttons simultaneously, offering a streamlined method for updating their visual states.
|
||||||
|
|
||||||
|
### Icon Service: `icon`
|
||||||
|
Updates a chip or custom button's icon, color, and visibility within Home Assistant.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is ideal for dynamically updating icons on your Panel, allowing for a customizable and interactive user interface.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `id` (string): Identifier of the chip or button component. Refer to "[Screen components](#screen-components)" for more details.
|
||||||
|
- `icon` (string): Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
|
||||||
|
Example: "\uE6E8" for `mdi:lightbulb-on-outline`.
|
||||||
|
- `icon_color` (int[]): RGB color array for the icon. Example: `[0, 255, 0]` for green.
|
||||||
|
- `visible` (bool): Flag indicating whether the icon should be visible (`true`) or hidden (`false`).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_icon
|
||||||
|
data:
|
||||||
|
id: "home.chip03"
|
||||||
|
icon: "\uE6E8" # Example for mdi:lightbulb-on-outline
|
||||||
|
icon_color: [0, 255, 0] # Green
|
||||||
|
visible: true
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Ensure the placeholder `<your_panel_name>` is replaced with the specific panel name you will need to reference in your Home Assistant configuration.
|
||||||
|
|
||||||
|
### Initialization Service: `init_global`
|
||||||
|
Transfers global settings from the blueprint to ESPHome,
|
||||||
|
ensuring that ESPHome is configured with the necessary parameters for operation according to the blueprint specifications.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is crucial during the initialization phase or when global settings need to be updated to reflect changes in the blueprint.
|
||||||
|
It configures ESPHome with settings that affect overall functionality and user interface aspects.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `blueprint_version` (string): Specifies the version of the blueprint being used.
|
||||||
|
- `ent_value_xcen` (int): Alignment of values on entities pages (0 for right (default), 1 for center or 2 for left).
|
||||||
|
- `mui_please_confirm` (string): Localized (language based) message used for asking for confirmation in the UI.
|
||||||
|
- `mui_unavailable` (string): Localized (language based) message used for indicating unavailability in the UI.
|
||||||
|
- `screensaver_time` (bool): Enables or disables the screensaver time display.
|
||||||
|
- `screensaver_time_font` (int): Specifies the font id for the screensaver time display.
|
||||||
|
- `screensaver_time_color` (int[]): Specifies the RGB color array for the screensaver time display.
|
||||||
|
- `decimal_separator` (string): The char to be used as decimal separator.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_init_global
|
||||||
|
data:
|
||||||
|
blueprint_version: "4.2.5"
|
||||||
|
ent_value_xcen: 0
|
||||||
|
mui_please_confirm: "Confirme, por favor."
|
||||||
|
mui_unavailable: "Indisponível"
|
||||||
|
screensaver_time: true
|
||||||
|
screensaver_time_font: 11
|
||||||
|
screensaver_time_color: [165, 42, 42] # Reddish-brown
|
||||||
|
decimal_separator: ","
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
>
|
||||||
|
> This service should be called to update ESPHome with the latest global settings as specified in your blueprint.
|
||||||
|
|
||||||
|
### Initialization Service: `init_hardware`
|
||||||
|
Configures NSPanel hardware settings in ESPHome according to the specifications provided in the blueprint,
|
||||||
|
ensuring each component operates with the correct parameters for control, appearance, and fallback behavior.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is essential for initializing or updating button and relay configurations to reflect changes in the blueprint.
|
||||||
|
It tailors ESPHome's hardware operations for specific use cases, including local control capabilities, iconography, color indications, and fallback states.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `relay1_local_control` (bool): Enables or disables local control for Relay 1.
|
||||||
|
- `relay1_icon` (string):
|
||||||
|
Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html) for Relay 1.
|
||||||
|
- `relay1_icon_color` (int[]): The RGB color array for Relay 1's icon.
|
||||||
|
- `relay1_fallback` (bool): Determines the fallback state for Relay 1 in case of communication loss.
|
||||||
|
- `relay2_local_control` (bool): Enables or disables local control for Relay 2.
|
||||||
|
- `relay2_icon` (string):
|
||||||
|
Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html) for Relay 2.
|
||||||
|
- `relay2_icon_color` (int[]): The RGB color array for Relay 2's icon.
|
||||||
|
- `relay2_fallback` (bool): Determines the fallback state for Relay 2 in case of communication loss.
|
||||||
|
- `button_left` (bool): Enable/disable left button status visualization.
|
||||||
|
- `button_right` (bool): Enable/disable right button status visualization.
|
||||||
|
- `button_bar_color_on` (int[]): RGB color array for the hardware button bar when the status is `On`.
|
||||||
|
- `button_bar_color_off` (int[]): RGB color array for the hardware button bar when the status is `Off`.
|
||||||
|
- `embedded_climate` (bool): Indicates whether climate control is embedded in the panel.
|
||||||
|
- `embedded_climate_friendly_name` (string): Provides a friendly name for the embedded climate control.
|
||||||
|
- `embedded_indoor_temperature` (bool): Determines if indoor temperature display is enabled.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_init_hardware
|
||||||
|
data:
|
||||||
|
relay1_local_control: true
|
||||||
|
relay1_icon: "\uE3A5" # Example for mdi:numeric-1-box-outline
|
||||||
|
relay1_icon_color: [248, 0, 0] # Red
|
||||||
|
relay1_fallback: false
|
||||||
|
relay2_local_control: true
|
||||||
|
relay2_icon: "\uE3A8" # Example for mdi:numeric-2-box-outline
|
||||||
|
relay2_icon_color: [0, 252, 0] # Green
|
||||||
|
relay2_fallback: true
|
||||||
|
button_left: true
|
||||||
|
button_right: true
|
||||||
|
button_bar_color_on: [31, 169, 255] # Blueish
|
||||||
|
button_bar_color_off: [44, 44, 44] # Dark gray
|
||||||
|
embedded_climate: true
|
||||||
|
embedded_climate_friendly_name: "Termostato da Sala"
|
||||||
|
embedded_indoor_temperature: true
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service initializes buttons and relay settings based on the provided parameters, customizing relay functionality and presentation as defined in the blueprint.
|
||||||
|
|
||||||
|
### Initialization Service: `init_page_home`
|
||||||
|
Configures the "Home" page settings and user interface elements in ESPHome,
|
||||||
|
aligning with the blueprint specifications to create a personalized and functional home screen.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service plays a crucial role in the initial setup and ongoing updates of the "Home" page,
|
||||||
|
facilitating dynamic adjustments to layout, appearance, and interactive elements.
|
||||||
|
It accommodates extensive customizations, impacting both visual appeal and functionality of UI components.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `date_color` (int[]): RGB color array for the date display.
|
||||||
|
- `time_format` (string): Format string for displaying time, supporting standard time formatting symbols.
|
||||||
|
- `time_color` (int[]): RGB color array for the time display.
|
||||||
|
- `meridiem` (string[]): Array of strings for AM/PM labels, applicable if the time format includes meridiem.
|
||||||
|
- `chip_font` (int): Font Id for icons or chips displayed on the "Home" page.
|
||||||
|
- `custom_buttons_font` (int): Font Id for custom button icons on the "Home" page.
|
||||||
|
- `qrcode` (bool): Flag indicating whether the QR code button is enabled.
|
||||||
|
- `qrcode_icon` (string):
|
||||||
|
Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html)
|
||||||
|
for the QR code button.
|
||||||
|
- `qrcode_icon_color` (int[]): RGB color array for the QR code button icon.
|
||||||
|
- `entities_pages_icon` (string):
|
||||||
|
Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html)
|
||||||
|
for the entities page button.
|
||||||
|
- `entities_pages_icon_color` (int[]): RGB color array for the entities page button icon.
|
||||||
|
- `utilities` (bool): Flag indicating whether the utilities page button is enabled.
|
||||||
|
- `utilities_icon` (string):
|
||||||
|
Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html)
|
||||||
|
for the utilities page button.
|
||||||
|
- `utilities_icon_color` (int[]): RGB color array for utilities page button icon.
|
||||||
|
- `outdoor_temp_font` (int): Font Id for outdoor temperature indication on the "Home" page.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_init_page_home
|
||||||
|
data:
|
||||||
|
date_color: [255, 255, 255] # White
|
||||||
|
time_format: "HH:mm"
|
||||||
|
time_color: [255, 255, 255] # White
|
||||||
|
meridiem: ["AM", "PM"]
|
||||||
|
chip_font: 8
|
||||||
|
custom_buttons_font: 9
|
||||||
|
qrcode: true
|
||||||
|
qrcode_icon: "\uE432" # Example for mdi:qrcode-scan
|
||||||
|
qrcode_icon_color: [0, 255, 0] # Green
|
||||||
|
entities_pages_icon: "\uEDCF" # Example for mdi:format-list-bulleted-square
|
||||||
|
entities_pages_icon_color: [0, 0, 255] # Blue
|
||||||
|
utilities: true
|
||||||
|
utilities_icon: "\uE299" # Example for mdi:gauge
|
||||||
|
utilities_icon_color: [255, 255, 255] # White
|
||||||
|
|
||||||
|
outdoor_temp_font: 5
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Ensure to replace `<your_panel_name>` with the actual name of your panel configured in Home Assistant.
|
||||||
|
> This service customizes the "Home" page with specified settings, enhancing the panel's interface based on the project's blueprint.
|
||||||
|
|
||||||
|
### Initialization Service: `init_page_settings`
|
||||||
|
Populates the "Settings" page with configurable options in the panel,
|
||||||
|
tailored according to the project's blueprint to create a user-friendly and cohesive settings interface.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is crucial for the initial configuration and subsequent updates of the "Settings" page.
|
||||||
|
It facilitates the customization of labels and functionalities, including reboot actions and screen brightness adjustments, directly from the panel's interface.
|
||||||
|
This customization ensures that the settings are not only accessible but also intuitive for end-users.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `reboot` (string): Text label for the reboot button, guiding users on the action to restart the device.
|
||||||
|
- `brightness` (string): Description label for adjusting the screen's brightness.
|
||||||
|
- `bright` (string): Label preceding the slider for selecting the high brightness level, indicating the option for a brighter screen setting.
|
||||||
|
- `dim` (string): Label preceding the slider for selecting the dimmed brightness level, indicating the option for a lower light setting.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_init_page_settings
|
||||||
|
data:
|
||||||
|
reboot: "Restart Device"
|
||||||
|
brightness: "Screen Brightness"
|
||||||
|
bright: "Bright Mode:"
|
||||||
|
dim: "Dim Mode:"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service customizes the "Settings" page according to specified labels, enhancing user interaction with device settings.
|
||||||
|
|
||||||
|
### Notification Clear Service: `notification_clear`
|
||||||
|
Removes any displayed notification from the screen, allowing the display to return to its normal state or view.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is essential after displaying notifications or alerts.
|
||||||
|
It ensures the user interface remains clean and uncluttered by clearing messages once they are no longer needed or have been acknowledged.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_notification_clear
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant to ensure the service executes correctly.
|
||||||
|
This simple action clears the current notification from the display, maintaining a tidy interface.
|
||||||
|
|
||||||
|
### Notification Show Service: `notification_show`
|
||||||
|
Displays a notification message on the screen, enabling dynamic presentation of information or alerts.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Designed for scenarios requiring immediate feedback or notification on the display,
|
||||||
|
this service is suitable for showing alerts, informational messages, or updates directly on the screen interface.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `label` (string): A brief title or label for the notification, typically displayed in a prominent, bold format.
|
||||||
|
- `message` (string): The detailed message or content of the notification, providing the main information or alert to the user.
|
||||||
|
The system will automatically wrap text to fit the display unless `\r` is used to insert manual line breaks. When `\r` is present,
|
||||||
|
the system respects only the line breaks provided by the user, enhancing message formatting control.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_notification_show
|
||||||
|
data:
|
||||||
|
label: "Security Alert"
|
||||||
|
message: "Front door opened at 10:30 PM\rPlease check the entrance."
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> The action ensures the service executes correctly, displaying the notification with the specified `label` and `message`.
|
||||||
|
>
|
||||||
|
> Utilize `\r` within the message for custom line breaks, offering precise formatting control.
|
||||||
|
|
||||||
|
### Alarm Settings Page Service: `page_alarm`
|
||||||
|
Populates the alarm settings page with the current configuration and state information,
|
||||||
|
seamlessly integrating with the panel's interface to reflect the latest settings and statuses of the alarm system.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
The `page_alarm` service is specifically designed to dynamically update the alarm settings page, providing users with immediate access to the alarm system's controls and information.
|
||||||
|
It plays a crucial role in ensuring a responsive and user-friendly interface for alarm management, allowing for real-time interaction with the alarm system directly from the panel.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `page_title` (string): The title displayed at the top of the alarm settings page.
|
||||||
|
- `state` (string): The current state of the alarm system, such as "armed_home" or "disarmed".
|
||||||
|
- `supported_features` (int): A bitmask indicating the features supported by the alarm system.
|
||||||
|
This determines the controls and options available on the alarm settings page.
|
||||||
|
The bitmask values are aligned with the
|
||||||
|
[Home Assistant Alarm Control Panel Supported Features](https://github.com/home-assistant/core/blob/33ff6b5b6ee3d92f4bb8deb9594d67748ea23d7c/homeassistant/components/alarm_control_panel/const.py#L32).
|
||||||
|
- `code_format` (string): Specifies the code format required for arming/disarming the alarm system, such as numeric or alphanumeric.
|
||||||
|
- `code_arm_required` (bool): Indicates whether a code is required to arm the system.
|
||||||
|
- `entity` (string): The entity ID of the alarm system, used for state updates and control actions.
|
||||||
|
- `mui_alarm` (string[]): An array of localized text strings for the alarm control buttons, supporting various alarm states and actions.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_page_alarm
|
||||||
|
data:
|
||||||
|
page_title: "Home Security System"
|
||||||
|
state: "disarmed"
|
||||||
|
supported_features: 31 # Example: Supports arm/disarm, home/away modes, etc.
|
||||||
|
code_format: "number"
|
||||||
|
code_arm_required: true
|
||||||
|
entity: "alarm_control_panel.home_alarm"
|
||||||
|
mui_alarm:
|
||||||
|
- "Zuhause"
|
||||||
|
- "Abwesend"
|
||||||
|
- "Nacht"
|
||||||
|
- "Urlaub"
|
||||||
|
- "Umgehen"
|
||||||
|
- "Entwaffnen"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Ensure to replace `<your_panel_name>` with the actual name of your panel configured in Home Assistant.
|
||||||
|
> This service configuration allows for the alarm settings page to dynamically reflect the current features, state, and control options of your alarm system, enhancing the overall user experience.
|
||||||
|
|
||||||
|
### Climate Page Service: `page_climate`
|
||||||
|
Updates the climate page with the current state information, seamlessly integrating with the panel's interface to display the latest climate settings and statuses.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Designed to dynamically update the climate page, this service ensures users have instant access to climate control settings and information.
|
||||||
|
It's crucial for maintaining a responsive and informative interface for efficient climate management.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `current_temp` (float): The current temperature.
|
||||||
|
- `supported_features` (int): Bitmask indicating the climate device's supported features.
|
||||||
|
These features determine the available climate controls and settings on the device.
|
||||||
|
The bitmask values correspond to features such as temperature control, mode setting, fan speed adjustment, etc., as defined in Home Assistant's climate component constants.
|
||||||
|
For detailed descriptions of each feature and its corresponding bitmask value, refer to the
|
||||||
|
[Home Assistant Climate Component Constants](https://github.com/home-assistant/core/blob/33ff6b5b6ee3d92f4bb8deb9594d67748ea23d7c/homeassistant/components/climate/const.py#L156C7-L156C27).
|
||||||
|
- `target_temp` (float): The set target temperature.
|
||||||
|
- `target_temp_high` (float): The high end of the target temperature range, for devices that support temperature ranges.
|
||||||
|
- `target_temp_low` (float): The low end of the target temperature range.
|
||||||
|
- `temp_step` (int): Increment step for temperature adjustment, effectively the granularity of temperature change allowed.
|
||||||
|
- `total_steps` (int): Total number of steps for temperature adjustment, calculated as ((temp_max - temp_min) / temp_step).
|
||||||
|
- `temp_offset` (int): Offset applied to the temperature reading for calibration.
|
||||||
|
- `climate_icon` (string): Icon representing the current climate status,
|
||||||
|
selected from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
|
||||||
|
- `embedded_climate` (bool): Flag indicating if climate controls are embedded within the interface.
|
||||||
|
- `entity` (string): Entity ID for the climate device.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_page_climate
|
||||||
|
data:
|
||||||
|
current_temp: 22.5
|
||||||
|
supported_features: 1 | 4 # Assuming '1' is for temperature control and '4' is for fan mode, as an example.
|
||||||
|
target_temp: 24.0
|
||||||
|
target_temp_high: 25.0
|
||||||
|
target_temp_low: 19.0
|
||||||
|
temp_step: 5 # Adjust in 0.5°C increments.
|
||||||
|
total_steps: 56 # Calculated based on the device's temperature range and step.
|
||||||
|
temp_offset: 70 # Applied as a calibration offset.
|
||||||
|
climate_icon: "\uE392" # mdi:thermostat
|
||||||
|
embedded_climate: true
|
||||||
|
entity: "climate.living_room"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service ensures the climate page reflects the latest in climate control settings, enhancing the user experience by providing up-to-date information.
|
||||||
|
|
||||||
|
### Media Player Page Service: `page_media_player`
|
||||||
|
Updates the media player page with current configuration and state information,
|
||||||
|
integrating seamlessly with the panel's interface to display the latest media playback status and controls.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
The `page_media_player` service is specifically tailored to dynamically update the media player page, ensuring users have immediate access to media playback controls and information.
|
||||||
|
This service is essential for providing a responsive and user-friendly interface for media management, allowing real-time interaction with the media player directly from the panel.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `entity` (string): The entity ID of the media player.
|
||||||
|
- `state` (string): The current state of the media player (e.g., playing, paused, stopped).
|
||||||
|
- `is_volume_muted` (bool): Indicates whether the volume is currently muted.
|
||||||
|
- `friendly_name` (string): The friendly name of the media player to be displayed as the page title.
|
||||||
|
- `volume_level` (int): The current volume level of the media player.
|
||||||
|
- `media_title` (string): The title of the currently playing media.
|
||||||
|
- `media_artist` (string): The artist of the currently playing media.
|
||||||
|
- `media_duration` (float): The total duration of the currently playing media in seconds.
|
||||||
|
- `media_position` (float): The current playback position within the media in seconds.
|
||||||
|
- `media_position_delta` (float): The amount of time in seconds since the last update of the media position.
|
||||||
|
- `supported_features` (int): A bitmask indicating the features supported by the media player, such as play/pause, next/previous track, volume control, etc.
|
||||||
|
The bitmask values correspond to the
|
||||||
|
[Home Assistant Media Player Supported Features](https://github.com/home-assistant/core/blob/33ff6b5b6ee3d92f4bb8deb9594d67748ea23d7c/homeassistant/components/media_player/const.py#L177).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_page_media_player
|
||||||
|
data:
|
||||||
|
entity: "media_player.living_room"
|
||||||
|
state: "playing"
|
||||||
|
is_volume_muted: false
|
||||||
|
friendly_name: "Living Room Player"
|
||||||
|
volume_level: 40
|
||||||
|
media_title: "Favorite Song"
|
||||||
|
media_artist: "Famous Artist"
|
||||||
|
media_duration: 180
|
||||||
|
media_position: 30
|
||||||
|
media_position_delta: 0.5
|
||||||
|
supported_features: 84 # Example: Play, Pause, Next, Previous
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service ensures the media player page reflects the latest in media playback settings and status, enhancing the user experience by providing up-to-date information.
|
||||||
|
|
||||||
|
### QR Code Service: `qrcode`
|
||||||
|
Displays a QR code on the display, which can be used for various purposes such as sharing a WiFi password or linking to a website.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service enables the dynamic display of QR codes on a specified page of the ESPHome user interface, allowing for the convenient sharing of information.
|
||||||
|
It's particularly useful for settings where quick, scannable access to data is beneficial.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `title` (string): The title or heading to display above the QR code, providing context or instructions.
|
||||||
|
- `qrcode` (string): The actual data or URL to be encoded into the QR code.
|
||||||
|
- `show` (bool): A flag that determines whether to immediately display the QR code page upon calling the service.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_qrcode
|
||||||
|
data:
|
||||||
|
title: "Wi-Fi Access"
|
||||||
|
qrcode: "WIFI:T:WPA;S:mynetwork;P:mypass;;"
|
||||||
|
show: true
|
||||||
|
```
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This service will generate and display the QR code based on the provided data, navigating to the QR code page if `show` is set to `true`.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> This service is typically invoked during initialization to preload QR Code information based on blueprint settings,
|
||||||
|
> ensuring the data is accessible on the panel even without Wi-Fi connectivity.
|
||||||
|
> To update the QR Code information without immediately displaying it, call this service with `show: false`.
|
||||||
|
> This allows for seamless updates to the QR Code content without disrupting the current user interface.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### RTTTL Play Service: `rtttl_play`
|
||||||
|
Plays melodies encoded in the RTTTL format, enabling the integration of audio feedback or alerts with simple text-based melody strings.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is perfect for projects requiring audio signals, such as notifications, alerts, or simple melodies, by interpreting RTTTL (Ring Tone Text Transfer Language) strings.
|
||||||
|
RTTTL is a compact format for storing melody sequences in a text-based format, making it ideal for simple audio devices like buzzers.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `tone` (string): The RTTTL string representing the melody to be played.
|
||||||
|
This string must conform to the RTTTL format, which includes the melody's name, default settings, and a sequence of notes.
|
||||||
|
|
||||||
|
**Example Tones:**
|
||||||
|
For example tones and further inspiration, you can visit examples of RTTTL songs [here](https://codebender.cc/sketch:109888#RTTTL%20Songs.ino).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_rtttl_play
|
||||||
|
data:
|
||||||
|
tone: "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6"
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
>
|
||||||
|
> Ensure the `tone` parameter contains a valid RTTTL string to successfully play the melody.
|
||||||
|
|
||||||
|
### TFT File Update Service: `upload_tft`
|
||||||
|
Enables the remote update of the panel's TFT file from a specified URL or a default location, available exclusively with the "Upload TFT" add-on installed.
|
||||||
|
This service is valuable for downloading alternative TFT files for customization or addressing file access issues.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is crucial for dynamically updating the TFT file, facilitating seamless transitions between different configurations or updates.
|
||||||
|
It's particularly useful for applying custom interface designs or updates when direct access to the repository is limited.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `url` (string): The URL for downloading the TFT file.
|
||||||
|
If set to "default", it utilizes the URL from the "**Update TFT - Display Model**" selection in Home Assistant (**Settings** > **Devices & Services** > **ESPHome**).
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_upload_tft
|
||||||
|
data:
|
||||||
|
url: "http://homeassistant.local:8123/local/custom_tft_file.tft" # URL to the new TFT file
|
||||||
|
```
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant.
|
||||||
|
> Using "default" fetches the URL associated with the selected display model in Home Assistant settings, simplifying updates or customizations.
|
||||||
|
|
||||||
|
> [!ATTENTION]
|
||||||
|
> The "Upload TFT" add-on must be installed for this service to be available, enhancing the panel's flexibility for interface customization or troubleshooting.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### Value Service: `value`
|
||||||
|
Updates an entity to display specific values, allowing for dynamic updates of icons, names, and value colors within Home Assistant.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
This service is intended for entities that need to display information dynamically, such as sensor readings or state values, with customized icons, names, and color coding for both icon and value.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `id` (string): Identifier of the entity being updated. For details on entity identifiers, refer to "[Screen components](#screen-components)".
|
||||||
|
- `icon` (string): Icon codepoint from [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
|
||||||
|
Indicates the icon displayed next to the value.
|
||||||
|
- `icon_color` (int[]): RGB color array for the icon, allowing for custom icon colors.
|
||||||
|
- `name` (string): The display name for the entity, useful for labeling the value displayed.
|
||||||
|
- `value` (string): The actual value to be displayed next to the icon and name.
|
||||||
|
- `value_color` (int[]): RGB color array for the value text, enabling custom coloring of the displayed value.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_value
|
||||||
|
data:
|
||||||
|
id: "sensor.temperature"
|
||||||
|
icon: "\uE6E8" # Example for mdi:thermometer
|
||||||
|
icon_color: [255, 0, 0] # Red
|
||||||
|
name: "Temperature"
|
||||||
|
value: "75°F"
|
||||||
|
value_color: [255, 255, 0] # Yellow
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with your specific panel name as configured in Home Assistant to ensure correct service execution.
|
||||||
|
|
||||||
|
### Wake Up Service: `wake_up`
|
||||||
|
Activates the display from a screensaver or low-power state, enabling dynamic interface adjustments based on user interactions or automated triggers.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
Ideal for scenarios requiring the display to become active upon certain events, such as motion detection, thereby conserving energy while ensuring the display is available when needed.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `reset_timer` (bool): Determines whether to reset the sleep and dimming timers upon waking up the display.
|
||||||
|
Setting this to `true` ensures the display remains active during user presence, while `false` retains the existing timer durations.
|
||||||
|
|
||||||
|
**Home Assistant Example:**
|
||||||
|
```yaml
|
||||||
|
service: esphome.<your_panel_name>_wake_up
|
||||||
|
data:
|
||||||
|
reset_timer: true
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Replace `<your_panel_name>` with the specific name of your panel configured in Home Assistant.
|
||||||
|
> This action ensures the service is executed correctly, waking the display and optionally resetting timers based on the reset_timer parameter.
|
||||||
|
|
||||||
|
**Practical Use Case: Motion Sensor Activation:**
|
||||||
|
This service can be seamlessly integrated with a motion sensor to wake the display when motion is detected, making it instantly usable.
|
||||||
|
Additionally, if the display is already awake, calling this service with `reset_timer: true` can reset the sleep timer,
|
||||||
|
keeping the display active as long as there is movement and allowing it to sleep normally once no motion is detected.
|
||||||
|
|
||||||
|
The example bellow integrates the `wake_up` service with a motion sensor to ensure the display wakes or remains awake during periods of activity, reverting to sleep mode after inactivity.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
automation:
|
||||||
|
- alias: "Wake Display on Motion"
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: binary_sensor.motion_sensor_123
|
||||||
|
to: 'on'
|
||||||
|
action:
|
||||||
|
- service: esphome.<your_panel_name>_wake_up
|
||||||
|
data:
|
||||||
|
reset_timer: true
|
||||||
|
mode: restart
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> Adjust `<your_panel_name>` and `binary_sensor.motion_sensor_123` to your actual panel and sensor entity IDs.
|
||||||
|
> This setup ensures the display is responsive to environmental conditions, enhancing user interaction while managing energy consumption efficiently.
|
||||||
|
|
||||||
|
## Screen components
|
||||||
|
|
||||||
|
### Home Page - Chips
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
#### User-defined Chips
|
||||||
|
- **Description**: Chips are icons that are shown in specific situations or hidden. Their behaviour is controlled by the blueprint.
|
||||||
|
- **Type**: Icon only with no touch commands.
|
||||||
|
- **Availability**: Global (available even when page is not visible).
|
||||||
|
- **Ids**: `home.chip01` to `home.chip07`.
|
||||||
|
|
||||||
|
#### Relays Chips
|
||||||
|
- **Description**: Icons representing each of the relays states.
|
||||||
|
- **Type**: Icon only with no touch commands.
|
||||||
|
- **Availability**: Global (available even when page is not visible).
|
||||||
|
- **Ids**: `home.chip_relay1` and `home.chip_relay2`.
|
||||||
|
|
||||||
|
#### Climate Chip
|
||||||
|
- **Description**: Icon representing the state of the main climate entity.
|
||||||
|
- **Type**: Icon only with no touch commands.
|
||||||
|
- **Availability**: Global (available even when page is not visible).
|
||||||
|
- **Ids**: `home.chip_relay1` and `home.chip_relay2`.
|
||||||
|
|
||||||
|
### Home Page - Custom buttons
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### Home Page - Values
|
||||||
|

|
||||||
|

|
||||||
|
This is a multi-component system, with names `value01` to `value03` containing the state of the entity,
|
||||||
|
where `value01_icon` to `value03_icon` supports the icons.
|
||||||
|
|
||||||
|
### Entities Pages - Values
|
||||||
|
Just like in "[Home Page - Values](#home-page---values)", this is a multi-component system, with names `value01` to `value08` containing the state of the entity,
|
||||||
|
where `value01_icon` to `value08_icon` supports the icons and, exclusivelly in the Entities pages, `value01_label` to `value08_label`,
|
||||||
|
which will contain the friendly name or some alternative label for the entities.
|
||||||
|
|
||||||
|
Each to these sets are sent using the [Value Service (`value`)](#value-service-value), with up to 8 individual calls to this service for each page construction.
|
||||||
252
docs/blueprint.md
Normal file
252
docs/blueprint.md
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
# Blueprint Automation
|
||||||
|
|
||||||
|
This article covers the settings in the Blueprint Automation.
|
||||||
|
|
||||||
|
The Blueprint Automation is the central configuration element of this solution for the NSPanel.
|
||||||
|
|
||||||
|
In principle, the setup of the automation is self-explanatory.
|
||||||
|
The individual elements of the Blueprint are described below.
|
||||||
|
|
||||||
|
It is possible to change both the color of the labels and the icons for most of the elements on each screen.
|
||||||
|
|
||||||
|
On the blueprint settings, you will be able to select any of the MDI icons supported by Home Assistant, however, your panel will only support the icons available on the [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
|
||||||
|
|
||||||
|
For an easier overview, the menu items "Icon Color" and "Label Color" will not be described separately in the following documentation.
|
||||||
|
|
||||||
|
## Basic settings
|
||||||
|
|
||||||
|
### NSPanel device (REQUIRED)
|
||||||
|
|
||||||
|
You will be presented with a list of all of your ESPHome ESP32 devices and you must select your panel from the list.
|
||||||
|
|
||||||
|
This is technically the only required field, as basic functionality will be available when the Blueprint knows to which panel it has to send the settings.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> You cannot have more than one blueprint based automation per each panel
|
||||||
|
|
||||||
|
### Language for NSPanel
|
||||||
|
|
||||||
|
The language can be selected via the drop-down menu.
|
||||||
|
|
||||||
|
Currently around 30 languages are supported, but if you cannot find your language there,
|
||||||
|
please create a [new feature request](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues/new) and we will be happy to help.
|
||||||
|
|
||||||
|
### Date format
|
||||||
|
|
||||||
|
Select how you want to see the date displayed on your panel (Home page and weather pages are affected).
|
||||||
|
|
||||||
|
### Time format
|
||||||
|
|
||||||
|
Select how you want to see the time displayed on your panel's Home page.
|
||||||
|
|
||||||
|
### Timezone
|
||||||
|
|
||||||
|
Select the timezone for this panel. Default (nothing) sets the timezone of the machine the firmware was compiled on. Important to set for prebuilt firmware.
|
||||||
|
|
||||||
|
## Weather and Temperature
|
||||||
|
|
||||||
|
### Weather entity from HA
|
||||||
|
|
||||||
|
Select a Weather entity to use.
|
||||||
|
|
||||||
|
Most of the weather integrations are supported, however some may be able to provide more information than others.
|
||||||
|
|
||||||
|
We run all of our tests with "Accuweather", so the parameters shown on the panel are targetting this integration and will be shown with your integration when available.
|
||||||
|
|
||||||
|
### Outdoor temperature Sensor (Optional)
|
||||||
|
|
||||||
|
Optionally, the value of an outdoor temperature sensor can be used here.
|
||||||
|
If no separate sensor is used, the value of the weather integration will be used.
|
||||||
|
|
||||||
|
### Indoor Temperature Sensor (Optional)
|
||||||
|
|
||||||
|
An indoor temperature sensor is not necessary.
|
||||||
|
Leave the field empty if you want to use the temperature sensor of the NSPanel.
|
||||||
|
If the value of the sensor needs to be corrected, this can be done via the temperature correction for the NSPanel under HA Devices.
|
||||||
|
|
||||||
|
## Home page - Entities States
|
||||||
|
|
||||||
|
### Home page - Entity 01-04 (Optional)
|
||||||
|
|
||||||
|
Up to four entities can be displayed on the home screen.
|
||||||
|
Select the corresponding HA entity.
|
||||||
|
|
||||||
|
## Home page - Chips
|
||||||
|
|
||||||
|
### Chip 01-07 - Entity (Optional)
|
||||||
|
|
||||||
|
Used to display HA entities on the home screen.
|
||||||
|
For example to display the status of a specific switch on the NSPanel.
|
||||||
|
|
||||||
|
## Home page - Custom buttons
|
||||||
|
|
||||||
|
### Custom button 01-06 - Entity (Optional)
|
||||||
|
|
||||||
|
Your panel will show 10 buttons on the Home page.
|
||||||
|
4 of those are fixed for Notifications, QR Code, Entities pages and Alarm, but you have additional 6 custom buttons that can be assigned to different entities from your Home Assistant.
|
||||||
|
The behavior of these buttons will depend on the entity's domain (light, media player, etc).
|
||||||
|
|
||||||
|
## Alarm Control Panel
|
||||||
|
|
||||||
|
An alarm control panel entity can be controlled by your panel.
|
||||||
|
When you assign the entity here, its icon will be shown as a button on the Home page.
|
||||||
|
|
||||||
|
## Climate
|
||||||
|
|
||||||
|
### Climate to Control (Optional)
|
||||||
|
|
||||||
|
Here you select the main climate entity controlled by your panel.
|
||||||
|
Its temperature will be used on the Home page and by clicking on that value you will be able to control the climate settings.
|
||||||
|
|
||||||
|
You can optionally use your panel to control a climate system locally, using its temperature sensor and relays.
|
||||||
|
You will find more details about this on the Add-on Climate documentation.
|
||||||
|
|
||||||
|
If you are using the climate add-on, it will create a climate entity in your panel's device page.
|
||||||
|
You still have to select that entity on this field in the blueprint settings to have it used as your main climate.
|
||||||
|
|
||||||
|
Additional climate entities can be assigned to buttons and will be explained later in this document.
|
||||||
|
|
||||||
|
On the blueprint settings, you will also find settings for sensors and custom buttons to be shown on all the climate pages.
|
||||||
|
|
||||||
|
## QR Code
|
||||||
|
|
||||||
|
### Activate QR Code (Optional)
|
||||||
|
|
||||||
|
Activates the QR Code page and shows the QR Code button on the Home page.
|
||||||
|
|
||||||
|
### QR Code content (Optional)
|
||||||
|
|
||||||
|
String, which is shown as a QR Code on the NSPanel.
|
||||||
|
This can be a simple text, an URL or could also be used for a simplified login to the Wi-Fi.
|
||||||
|
Here is an example (simply change SSID and password to your credentials and either use "WPA" or "WEP"):
|
||||||
|
|
||||||
|
`WIFI:S:SSID;T:WPA/WEP;P:PASSWORD;;`
|
||||||
|
|
||||||
|
#### Example:
|
||||||
|
|
||||||
|
For a network with the following parameters:
|
||||||
|
- **SSID:** my_ssid
|
||||||
|
- **Pass:** MySecurePa$$w0rd
|
||||||
|
- **Type:** WPA
|
||||||
|
|
||||||
|
Your QR code string will look like this:
|
||||||
|
|
||||||
|
`WIFI:S:my_ssid;T:WPA;P:MySecurePa$$w0rd;;`
|
||||||
|
|
||||||
|
For more details about these specifications, please visit the [WPA3™ Specification v3.1, chapter 7](https://www.wi-fi.org/system/files/WPA3%20Specification%20v3.1.pdf#page=24).
|
||||||
|
|
||||||
|
## Hardware Buttons
|
||||||
|
|
||||||
|
### Visibility Pages
|
||||||
|
|
||||||
|
Choose the pages where the bars, indicating the status of entities linked to hardware buttons, will be displayed.
|
||||||
|
|
||||||
|
### Activate Relay x local Fallback (Optional)
|
||||||
|
|
||||||
|
Normally, the internal relays of the NSPanels are triggered via HA.
|
||||||
|
If the NSPanel loses Wi-Fi connection or HA is down, the hardware button can then switch the corresponding relay directly.
|
||||||
|
|
||||||
|
### Left/Right Hardware Button - Entity (Optional)
|
||||||
|
|
||||||
|
The entity that should be switched with the left/right hardware button.
|
||||||
|
|
||||||
|
### Left/Right Hardware Button Name - Label (Optional)
|
||||||
|
|
||||||
|
Text on the screen above the corresponding hardware button (home screen).
|
||||||
|
|
||||||
|
### Left/Right Hardware Button hold assignment - VALUE (optional)
|
||||||
|
|
||||||
|
Selection of what action should happen when the button is pressed for a longer time.
|
||||||
|
|
||||||
|
### Left/Right Hardware Button custom hold action - VALUE (Optional)
|
||||||
|
|
||||||
|
Selection of the action to start when holding the button.
|
||||||
|
|
||||||
|
## Button Page 01-04
|
||||||
|
|
||||||
|
### Button Page 01-04 name - LABEL (Optional)
|
||||||
|
|
||||||
|
Text on the respective button screens.
|
||||||
|
|
||||||
|
### Buttons 01 - 32 (Optional)
|
||||||
|
|
||||||
|
The buttons can be accessed by swiping on the Home Screen and their functions are completely identical.
|
||||||
|
Either the individual button pages can be accessed one after the other by swiping to the left, or the button pages can be accessed directly by swiping up, down or to the right.
|
||||||
|
|
||||||
|
The buttons are numbered as follows:
|
||||||
|
|
||||||
|
#### EU and US landscape models:
|
||||||
|
|
||||||
|
| | Button Page 1 | Button Page 2 | Button Page 3 | Button Page 4 |
|
||||||
|
| :--: | :--: | :--: | :--: | :--: |
|
||||||
|
| Row 1 | 01 02 03 04 | 09 10 11 12 | 17 18 19 20 | 25 26 27 28 |
|
||||||
|
| Row 2 | 05 06 07 08 | 13 14 15 16 | 21 22 23 24 | 29 30 31 32 |
|
||||||
|
|
||||||
|
#### US model:
|
||||||
|
|
||||||
|
| | Button Page 1 | Button Page 2 | Button Page 3 | Button Page 4 |
|
||||||
|
| :--: | :--: | :--: | :--: | :--: |
|
||||||
|
| Row 1 | 01 02 | 09 10 | 17 18 | 25 26 |
|
||||||
|
| Row 2 | 03 04 | 11 12 | 19 20 | 27 28 |
|
||||||
|
| Row 3 | 05 06 | 13 14 | 21 22 | 29 30 |
|
||||||
|
| Row 4 | 07 08 | 15 16 | 23 24 | 31 32 |
|
||||||
|
|
||||||
|
When the respective button is pressed, a toggle action is executed or the corresponding page is automatically opened, e.g.
|
||||||
|
the cover control for covers, etc.
|
||||||
|
For 2 state buttons (where toggle is the default action), a long press in the button will open it's corresponding page, when supported.
|
||||||
|
|
||||||
|
For each button an own name can be specified optionally.
|
||||||
|
|
||||||
|
All buttons offer the possibility to optionally confirm the execution of the action.
|
||||||
|
This can be activated or deactivated separately for each button via *"Confirm execution of the button press"*.
|
||||||
|
|
||||||
|
## Entity Page 01-04
|
||||||
|
|
||||||
|
### Activate Entity Page (Optional)
|
||||||
|
|
||||||
|
This option activates the entity pages on the Home Screen.
|
||||||
|
The entity pages can be used for example to display values or statuses of entities on the individual pages.
|
||||||
|
|
||||||
|
### Entity Page 01-04 name - LABEL (Optional)
|
||||||
|
|
||||||
|
Naming of the corresponding Entity Screens.
|
||||||
|
|
||||||
|
### Entity 01 - 32 (Optional)
|
||||||
|
|
||||||
|
The entity pages can be accessed by pressing the symbol on the Home Screen and their functions are completely identical.
|
||||||
|
|
||||||
|
The entities are numbered as follows:
|
||||||
|
|
||||||
|
| Entity page | Entities shown |
|
||||||
|
| :--: | :--: |
|
||||||
|
| 1 | 01 to 08 |
|
||||||
|
| 2 | 09 to 16 |
|
||||||
|
| 3 | 17 to 24 |
|
||||||
|
| 4 | 25 to 32 |
|
||||||
|
|
||||||
|
Additionally there is the possibility to choose an icon of your choice for the Entities button on the Home page.
|
||||||
|
|
||||||
|
Of course there is also the possibility to enter a label for each of the 4 pages and the aligment for the values on the entities pages.
|
||||||
|
|
||||||
|
## Advanced Settings
|
||||||
|
|
||||||
|
### System settings - Decimal Separator
|
||||||
|
|
||||||
|
Choose the decimal separator for displaying numbers.
|
||||||
|
|
||||||
|
### Delay to avoid synchronization problems
|
||||||
|
|
||||||
|
If the Wi-Fi signal is poor, you may have issues when loading some pages.
|
||||||
|
If this happens, try to increase this delay as that may help.
|
||||||
|
|
||||||
|
### Nextion TFT File Folder (Optional)
|
||||||
|
|
||||||
|
Specify the path to the folder containing the Nextion TFT file. This is to be used together with the option nextion_upload_tft on the "Update TFT Display - Model" option on the device's page.
|
||||||
|
|
||||||
|
## Example Screenshots
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
750
docs/customization.md
Normal file
750
docs/customization.md
Normal file
@@ -0,0 +1,750 @@
|
|||||||
|
# Customization
|
||||||
|
|
||||||
|
Table of contents:
|
||||||
|
- [Description](#description)
|
||||||
|
- [Instructions](#instructions)
|
||||||
|
- [Memory Management](#memory-management)
|
||||||
|
- [Removing Standard Settings](#removing-standard-settings)
|
||||||
|
- [Examples](#examples)
|
||||||
|
- [API encryption](#api-encryption)
|
||||||
|
- [Custom OTA password](#custom-ota-password)
|
||||||
|
- [Web server credentials](#web-server-credentials)
|
||||||
|
- [Reboot when API fails](#reboot-when-api-fails)
|
||||||
|
- [Manual IP](#manual-ip)
|
||||||
|
- [Hidden Wi-Fi](#hidden-wi-fi)
|
||||||
|
- [Connect to multiple networks](#connect-to-multiple-networks)
|
||||||
|
- [SNTP (time) server](#sntp-time-server)
|
||||||
|
- [Sensor for display awake vs sleeping](#sensor-for-display-awake-vs-sleeping)
|
||||||
|
- [Deep sleep](#deep-sleep)
|
||||||
|
- [Enforce time zone](#enforce-time-zone)
|
||||||
|
- [Compiling ESPHome on lower powered machines](#compiling-esphome-on-lower-powered-machines)
|
||||||
|
- [Sleep & Wake-up buttons](#sleep--wake-up-buttons)
|
||||||
|
- [Set display as a light](#set-display-as-a-light)
|
||||||
|
- [Scheduled actions](#scheduled-actions)
|
||||||
|
- [Scheduled relay](#scheduled-relay)
|
||||||
|
- [Scheduled climate](#scheduled-climate)
|
||||||
|
- [Frameworks](#frameworks)
|
||||||
|
- [Framework `arduino`](#framework-arduino)
|
||||||
|
- [Framework `esp-idf`](#framework-esp-idf)
|
||||||
|
- [Bluetooth proxy](#bluetooth-proxy)
|
||||||
|
- [BLE tracker](#ble-tracker)
|
||||||
|
- [Logger via UART](#logger-via-uart)
|
||||||
|
- [Climate custom presets](#climate-custom-presets)
|
||||||
|
- [Push button / Momentary switch](#push-button--momentary-switch)
|
||||||
|
- [Expose relay fallback switch](#expose-relay-fallback-switch)
|
||||||
|
- [Relay Interlocking](#relay-interlocking)
|
||||||
|
- [Remove non-essential components](#remove-non-essential-components)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
This project adds lots of functionalities to your NSPanel and we are constantly adding new features based on user's feedback.
|
||||||
|
However, you might have some specific case that are not included on the current implementation or is not a common case for other users.
|
||||||
|
|
||||||
|
You can take advantage of [ESPHome Configuration Types](https://esphome.io/guides/configuration-types.html) to add your custom functionality
|
||||||
|
or even to customize an existing functionality with minimum effort and this document intents to clarify how to use this and give some examples of customization.
|
||||||
|
|
||||||
|
Please feel free to add your own customation to this document by creating a PR in the `dev` branch.
|
||||||
|
|
||||||
|
***IMPORTANT:***
|
||||||
|
- *Use customization at your own risk. Custom/advanced systems won't be supported by this project's team.*
|
||||||
|
- *Please monitor the memory consumption when using customizations. Getting closer to the full memory can drive to errors in the system or prevent your system to support the future updates.*
|
||||||
|
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
There's nothing particular for this project, so you can just use any of the [ESPHome Configuration Types](https://esphome.io/guides/configuration-types.html)
|
||||||
|
and only edit your local ESPHome yaml settings.
|
||||||
|
|
||||||
|
Most of the ESPHome components in this project contains an `Id`, which can be used together with the `!extend` key to add or replace existing code.
|
||||||
|
|
||||||
|
You should add your customizations at the end of your ESPHome yaml, as in the example bellow:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
## Add-on climate
|
||||||
|
# heater_relay: "1" # Possible values: "1" or "2"
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
|
||||||
|
# Encrypt the communication between ESPHome and Home Assistant
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: !secret api_encryption_key
|
||||||
|
|
||||||
|
# More detailed log (for troubleshooting only)
|
||||||
|
logger:
|
||||||
|
level: VERBOSE
|
||||||
|
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Basic and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Memory Management
|
||||||
|
When adding new components or code to your ESP32, it's important to be mindful of memory usage.
|
||||||
|
Your device has limited memory, and every addition uses some of this precious resource.
|
||||||
|
|
||||||
|
### Understanding Memory Usage
|
||||||
|
After compiling your firmware, you'll see a summary showing how much memory your firmware needs.
|
||||||
|
Here's what it might look like:
|
||||||
|
|
||||||
|
```log
|
||||||
|
Successfully created esp32 image.
|
||||||
|
Linking .pioenvs/office-workstation-panel/firmware.elf
|
||||||
|
RAM: [= ] 10.5% (used 34484 bytes from 327680 bytes)
|
||||||
|
Flash: [======= ] 67.5% (used 1239253 bytes from 1835008 bytes)
|
||||||
|
Building .pioenvs/office-workstation-panel/firmware.bin
|
||||||
|
Creating esp32 image...
|
||||||
|
Successfully created esp32 image.
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Static Memory**: This is the memory required to load your firmware.
|
||||||
|
Running your firmware requires additional memory.
|
||||||
|
- **Dynamic Memory**: This is the memory allocated while your firmware is running.
|
||||||
|
ESPHome checks if your static memory usage exceeds your device's limits to prevent installation issues, but it doesn't check dynamic memory usage.
|
||||||
|
**Aim to keep static RAM usage below 20% and static Flash usage below 75%** to ensure there's enough room for dynamic operations.
|
||||||
|
|
||||||
|
### Risks of Exceeding Memory Limits
|
||||||
|
Exceeding memory limits can lead to issues:
|
||||||
|
- **During Compilation**: ESPHome might prevent firmware installation if static memory is too high.
|
||||||
|
- **During Runtime**: Exceeding dynamic memory can cause unexpected restarts.
|
||||||
|
- **During Startup**: If your device runs out of memory at startup, it may not load the firmware, resulting in a black screen and an unresponsive device.
|
||||||
|
The solution is to use a serial cable to reflash your device with a lighter firmware.
|
||||||
|
|
||||||
|
### Tips for Managing Memory
|
||||||
|
- Be cautious when adding memory-intensive components like `bluetooth_proxy`.
|
||||||
|
- Compile your firmware with the option to download it before installation.
|
||||||
|
This lets you check static memory usage without risking wireless installation issues.
|
||||||
|
|
||||||
|
## Removing Standard Settings
|
||||||
|
You can use customizations to remove certain default components or settings from this project.
|
||||||
|
This is useful for altering standard settings or freeing up memory for additional components.
|
||||||
|
Here's how you might remove some default settings:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Removes the `captive_portal` component
|
||||||
|
captive_portal: !remove
|
||||||
|
|
||||||
|
# Removes the OTA password
|
||||||
|
ota:
|
||||||
|
password: !remove
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!ATTENTION]
|
||||||
|
> Be aware of the implications before removing components or settings.
|
||||||
|
> Some of them are crucial for allowing your panel to interact correctly with the blueprint or for enabling ESPHome to install the firmware Over The Air.
|
||||||
|
> Incorrect removals could render your panel unusable, potentially requiring a reflash via a serial cable.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### API encryption
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Changing the API encryption can break the connection to Home Assistant,
|
||||||
|
> requiring the device to be removed from integrations (**Settings** > **Devices & Services** > **ESPHome**) and then re-added.
|
||||||
|
|
||||||
|
This is highly recommended when you are transfer sensitive information between your panel and Home Assistant,
|
||||||
|
as when you use your panel to enter the PIN for an Alarm Control Panel.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Encrypt the communication between ESPHome and Home Assistant
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: !secret api_encryption_key
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom OTA password
|
||||||
|
By default, the Wi-Fi password will be used as your OTA password, but you can replace it.
|
||||||
|
|
||||||
|
First, you need to change the default password using this code.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# change OTA password, remove after flashing
|
||||||
|
esphome:
|
||||||
|
on_boot:
|
||||||
|
- priority: 601.0
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
id(my_ota).set_auth_password("New password");
|
||||||
|
ota:
|
||||||
|
password: !secret wifi_password
|
||||||
|
id: my_ota
|
||||||
|
```
|
||||||
|
|
||||||
|
After flashing the device, you must remove the code above and replace it with the code below to start using this customization.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Use my global OTA password
|
||||||
|
ota:
|
||||||
|
password: !secret ota_password
|
||||||
|
```
|
||||||
|
|
||||||
|
### Web server credentials
|
||||||
|
By default, the web server credentials are defined by this project using `admin` as `username` and your `Wi-Fi password` as `password`, but you can replace it using this customization:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Custom web server credentials
|
||||||
|
web_server:
|
||||||
|
auth:
|
||||||
|
username: !secret web_server_username
|
||||||
|
password: !secret web_server_password
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reboot when API fails
|
||||||
|
Reboot your panel if it loses it's connection to Home Assistant for more than a certain time (15 minutes in this example).
|
||||||
|
|
||||||
|
Sometimes the low level ESP functions could report that the ESP is connected to the network, when in fact it is not and only a full reboot fixes it.
|
||||||
|
|
||||||
|
To support long times without Wi-Fi, this is disabled by default in this project, but you can set a reasonable interval to restart, based on your network reliability.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Reboot if HA is not connected for 15 minutes
|
||||||
|
api:
|
||||||
|
reboot_timeout: 15min
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual IP
|
||||||
|
Set IP address manually.
|
||||||
|
|
||||||
|
> [!ATTENTION]
|
||||||
|
> At least one DNS server is required to enable TFT transfer direcly from GitHub, otherwise use `nextion_update_url`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Set IP address manually
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- id: !extend wifi_default
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.0.123
|
||||||
|
gateway: 192.168.0.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
dns1: 1.1.1.1 # At least one DNS server is required to enable TFT transfer direcly from GitHub, otherwise use `nextion_update_url`.
|
||||||
|
dns2: 8.8.8.8
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hidden Wi-Fi
|
||||||
|
Connect to a hidden Wi-Fi network.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Connect to a hidden Wi-Fi network.
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- id: !extend wifi_default
|
||||||
|
hidden: true
|
||||||
|
fast_connect: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Connect to multiple networks
|
||||||
|
NSPanel will attempt to connect to the one with the highest signal strength or, if you set a priority, it will try to connect to the highest priority.
|
||||||
|
After failing it will connect to the second network.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Set dual network
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- id: !extend wifi_default
|
||||||
|
priority: 10
|
||||||
|
- ssid: !secret wifi_ssid_backup
|
||||||
|
password: !secret wifi_password_backup
|
||||||
|
priority: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### SNTP (time) server
|
||||||
|
ESPHome takes it's time from Home Assistant, however you can configure it to use a Network Time Server instead.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Use my own local network time server
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
platform: sntp
|
||||||
|
servers:
|
||||||
|
- !secret mysntpserver
|
||||||
|
- europe.pool.ntp.org
|
||||||
|
- 0.pool.ntp.org
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sensor for display awake vs sleeping
|
||||||
|
Creates a binary sensor to indicate either when the display is showing some page (`on`) or sleeping (`off`).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Is display awake?
|
||||||
|
binary_sensor:
|
||||||
|
- name: Display state
|
||||||
|
id: display_state
|
||||||
|
platform: template
|
||||||
|
lambda: |-
|
||||||
|
return (current_page->state != "screensaver");
|
||||||
|
```
|
||||||
|
|
||||||
|
You can easily invert the meaning to have a sensor for display sleeping:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Is display sleeping?
|
||||||
|
binary_sensor:
|
||||||
|
- name: Display sleeping
|
||||||
|
id: display_sleeping
|
||||||
|
platform: template
|
||||||
|
lambda: |-
|
||||||
|
return (current_page->state == "screensaver");
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deep sleep
|
||||||
|
In this example, the panel will deep sleep for 7 hours, starting at 23:00:00 every day, for its maximum energy saving.
|
||||||
|
|
||||||
|
During this time, nothing will be shown, the screen will be off and therefore no response to touch, and the panel will be disconnected from Wi-Fi,
|
||||||
|
but you can still wake-up the panel by pressing one of the hardware buttons (the left one in this example):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Define the wake-up button. Use pin 14 for left button or pin 27 for right button
|
||||||
|
deep_sleep:
|
||||||
|
wakeup_pin:
|
||||||
|
number: 14
|
||||||
|
allow_other_uses: true
|
||||||
|
wakeup_pin_mode: INVERT_WAKEUP
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- id: !extend left_button
|
||||||
|
pin:
|
||||||
|
allow_other_uses: true
|
||||||
|
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
on_time:
|
||||||
|
- hours: 23
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- deep_sleep.enter:
|
||||||
|
sleep_duration: 7h
|
||||||
|
```
|
||||||
|
|
||||||
|
You can find more ideas around this on [#955](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues/955).
|
||||||
|
|
||||||
|
### Enforce time zone
|
||||||
|
Until v3.4 (including), the time was coming from Home Assistant with it's timezone, so the Blueprint was sending the info with no transformation, to the panel.
|
||||||
|
From v4.0, the time reference still coming from HA (or optionally from a time server), but is calculated in ESPHome, which will try to detect the timezone from the server.
|
||||||
|
From v4.3.3 or later, the time still calculated on ESPHome side, however, you can select the timezone on the Blueprint, making this customization obsolete.
|
||||||
|
|
||||||
|
If your system is not showing the time in the correct timezone, it's probabily ESPHome not succeeding on finding your time zone.
|
||||||
|
You can easily force a timezone by adding this to your ESPHome settings:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
timezone: "America/Cancun"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compiling ESPHome on lower powered machines
|
||||||
|
For systems with lower CPU or memory capabilities, like an RPi 3 or systems with less than 2GB of RAM, this could help preventing errors caused by lack of resources when compiling ESPHome firmware.
|
||||||
|
|
||||||
|
More datails on the [ESPHome docs](https://esphome.io/changelog/2022.11.0.html#running-esphome-on-lower-powered-machines).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Limit the amount of resources used for compiling
|
||||||
|
esphome:
|
||||||
|
compile_process_limit: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sleep & Wake-up buttons
|
||||||
|
There are several ways to wake-up or put your panel to sleep, but in this example we tried a simple approach by adding two buttons (you can implement only one of those if you want):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
button:
|
||||||
|
# Adds a button to put the panel to sleep
|
||||||
|
- name: Sleep
|
||||||
|
id: force_sleep
|
||||||
|
platform: template
|
||||||
|
icon: mdi:sleep
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Sleep pressed
|
||||||
|
- lambda: |-
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
# Adds a button to wake-up the panel (similar to the existing service)
|
||||||
|
- name: Wake-up
|
||||||
|
id: force_wake_up
|
||||||
|
platform: template
|
||||||
|
icon: mdi:alarm
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- logger.log: Button Wake-up pressed
|
||||||
|
- lambda: |-
|
||||||
|
if (current_page->state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str());
|
||||||
|
// timer_page->execute(); // enable this if you want page timeout to be reset
|
||||||
|
timer_sleep->execute();
|
||||||
|
timer_dim->execute();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Set display as a light
|
||||||
|
You can set your display as a light in Home Assistant, so you can control the brightness and turn on/off just like any other light,
|
||||||
|
and even use this in your automation to control when your panel is on with the same automation you use for your lights:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
light:
|
||||||
|
# Add the display as a light in Home Assistant
|
||||||
|
- name: Display
|
||||||
|
id: display_light
|
||||||
|
icon: mdi:tablet-dashboard
|
||||||
|
platform: monochromatic
|
||||||
|
output: display_output
|
||||||
|
default_transition_length: 0s
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-on");
|
||||||
|
if (current_page->state == "screensaver") disp1->goto_page(wakeup_page_name->state.c_str());
|
||||||
|
timer_reset_all->execute();
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("light.display_light", "Turn-off");
|
||||||
|
goto_page->execute("screensaver");
|
||||||
|
|
||||||
|
output:
|
||||||
|
# Output required by `display_light` to send the commands to Nextion
|
||||||
|
- id: display_output
|
||||||
|
platform: template
|
||||||
|
type: float
|
||||||
|
write_action:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGV("output.display_output", "state: %f", state);
|
||||||
|
uint8_t current_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("output.display_output", "current_brightness: %i%%", current_brightness);
|
||||||
|
set_brightness->execute(current_brightness);
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Updates the existing `page_changed` script to update the `display_light` status when a page changes
|
||||||
|
- id: !extend page_changed
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.page_changed(custom)", "page: %s", current_page->state.c_str());
|
||||||
|
ESP_LOGV("script.page_changed(custom)", "is_on(): %s", display_light->current_values.is_on() ? "True" : "False");
|
||||||
|
if (current_page->state == "screensaver" and display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.perform();
|
||||||
|
} else if (current_page->state != "screensaver" and (not display_light->current_values.is_on())) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
|
||||||
|
# Updates the existing `set_brightness` script to update the `display_light` status when a new brightness level is set
|
||||||
|
- id: !extend set_brightness
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("script.set_brightness(custom)", "brightness: %.0f%%", brightness);
|
||||||
|
uint8_t current_light_brightness = int(round(display_light->current_values.is_on() ? (display_light->current_values.get_brightness() * 100.0f) : 0.0));
|
||||||
|
ESP_LOGV("script.set_brightness(custom)", "current_light_brightness: %i%%", current_light_brightness);
|
||||||
|
if (brightness != current_light_brightness) {
|
||||||
|
if (current_page->state != "screensaver" and brightness > 0) {
|
||||||
|
auto call = display_light->turn_on();
|
||||||
|
call.set_brightness(static_cast<float>(current_brightness->state) / 100.0f);
|
||||||
|
call.perform();
|
||||||
|
} else if (display_light->current_values.is_on()) {
|
||||||
|
auto call = display_light->turn_off();
|
||||||
|
call.set_brightness(0);
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scheduled actions
|
||||||
|
Although ESPHome doesn't have a Scheduler component, it is possible to use the timer to schedule actions and this is entirely managed in the device,
|
||||||
|
so it will work even if Home Assistant and/or the Wi-Fi are unavailable.
|
||||||
|
|
||||||
|
Following some examples:
|
||||||
|
|
||||||
|
#### Scheduled relay
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Scheduled relay
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
on_time:
|
||||||
|
- hours: 7
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 12
|
||||||
|
minutes: 15
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
- hours: 19
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_on: relay_1
|
||||||
|
- hours: 23
|
||||||
|
minutes: 30
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- switch.turn_off: relay_1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Scheduled climate
|
||||||
|
> [!NOTE]
|
||||||
|
> This requires add-on climate to be installed
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Scheduled climate
|
||||||
|
time:
|
||||||
|
- id: !extend time_provider
|
||||||
|
on_time:
|
||||||
|
- hours: 7
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 22°C
|
||||||
|
- hours: 19
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 20°C
|
||||||
|
- hours: 23
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
then:
|
||||||
|
- climate.control:
|
||||||
|
id: thermostat_embedded
|
||||||
|
mode: auto
|
||||||
|
target_temperature: 18°C
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frameworks
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> When switching between frameworks, make sure to update the device with a serial cable as the partition table is different between the two frameworks
|
||||||
|
as [OTA Update Component](https://esphome.io/components/ota) updates will not change the partition table. While it will appear to work, the device will boot the old framework after a reset.
|
||||||
|
|
||||||
|
This project currently uses `esp-idf` as default framework.
|
||||||
|
You can overlap the settings with this customization.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> For more info about frameworks, please visit [ESPHome docs](https://esphome.io/components/esp32).
|
||||||
|
|
||||||
|
`esp-idf` is maintained by EspressIF and is kept updated,
|
||||||
|
more boards are supported and the memory management is better, making it ideal if you wanna customize your panel to support memory consumption functionalities,
|
||||||
|
like `bluetooth_proxy` or [Improv](https://www.improv-wifi.com/). Consequently, this project uses `esp-idf` as the default framework since `v4.3`.
|
||||||
|
|
||||||
|
However, the `arduino` protocol still very popular and, therefore, more components are available and the project allows to switch between the frameworks
|
||||||
|
by adding the following lines in your panel's yaml file.
|
||||||
|
|
||||||
|
#### Framework `arduino`
|
||||||
|
```yaml
|
||||||
|
# Change framework to `arduino`
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
```
|
||||||
|
#### Framework `esp-idf`
|
||||||
|
```yaml
|
||||||
|
# Change framework to `esp-idf`
|
||||||
|
# (should not be required)
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bluetooth Proxy
|
||||||
|
Please refer to the "[Add-on: Bluetooth Proxy](addon_bluetooth_proxy.md)" guide.
|
||||||
|
|
||||||
|
### BLE Tracker
|
||||||
|
Please refer to the "[Add-on: BLE Tracker Proxy](addon_ble_tracker.md)" guide.
|
||||||
|
|
||||||
|
### Logger via UART
|
||||||
|
|
||||||
|
By default, the logging via hardware UART is disable in this project.
|
||||||
|
You can enable it by setting the baud rate accordingly to your interface:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Enable hardware UART serial logging
|
||||||
|
logger:
|
||||||
|
baud_rate: 115200
|
||||||
|
```
|
||||||
|
|
||||||
|
### Climate custom presets
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Add custom presets to your climate (heat in this example)
|
||||||
|
climate:
|
||||||
|
- id: !extend thermostat_embedded
|
||||||
|
default_preset: "Home"
|
||||||
|
preset:
|
||||||
|
- name: "Off"
|
||||||
|
default_target_temperature_low: ${temp_min} ${temp_units}
|
||||||
|
mode: "off"
|
||||||
|
- name: Home
|
||||||
|
default_target_temperature_low: 21 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Away
|
||||||
|
default_target_temperature_low: 16.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
- name: Sleep
|
||||||
|
default_target_temperature_low: 17.5 ${temp_units}
|
||||||
|
mode: "heat"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Push button / Momentary switch
|
||||||
|
You can set the physical relays to be `on` only while the hardware buttons are pressed, and then back to `off` when the buttons are released:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
binary_sensor:
|
||||||
|
# Left button custom action: Push button / Momentary switch - Relay 1
|
||||||
|
- id: !extend left_button
|
||||||
|
on_click:
|
||||||
|
then:
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
switch.turn_on: relay_1
|
||||||
|
on_release:
|
||||||
|
switch.turn_off: relay_1
|
||||||
|
|
||||||
|
# Right button custom action: Push button / Momentary switch - Relay 2
|
||||||
|
- id: !extend right_button
|
||||||
|
on_click:
|
||||||
|
then:
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
switch.turn_on: relay_2
|
||||||
|
on_release:
|
||||||
|
switch.turn_off: relay_2
|
||||||
|
```
|
||||||
|
|
||||||
|
### Expose Relay Fallback Switch
|
||||||
|
You can configure a local fallback relay to integrate with Home Assistant.
|
||||||
|
This is particularly useful for devices like WiFi-connected lights.
|
||||||
|
For instance, you can program it to cut the power to a connected light under certain conditions, directly via a switch.
|
||||||
|
|
||||||
|
#### Use Case
|
||||||
|
One application, as utilized by @tikismoke and detailed in [#1349](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues/1349), is in response to fluctuating energy prices.
|
||||||
|
When the energy price is high, an automation can change the fallback mode to cut off the relay.
|
||||||
|
This ensures that the bulb does not consume energy in standby mode. However, it will still function normally with `light.toggle` from the blueprint in all other cases.
|
||||||
|
Local control is reinstated when the power price returns to normal.
|
||||||
|
On the next switch activation, the relay turns `on`, powering up the bulb.
|
||||||
|
Subsequent activations will trigger `light.toggle` from the blueprint, as this functionality is already embedded in the ESPHome YAML code.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> In this scenario, the bulb must be set to turn `on` automatically when power is restored.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Expose relay local control switch to Home Assistant
|
||||||
|
switch:
|
||||||
|
- name: Relay 1 Local
|
||||||
|
platform: template
|
||||||
|
id: relay1_local
|
||||||
|
entity_category: config
|
||||||
|
internal: false
|
||||||
|
lambda: |-
|
||||||
|
return (id(relay_settings) & nspanel_ha_blueprint::RelaySettings::Relay1_Local);
|
||||||
|
turn_on_action:
|
||||||
|
- lambda: nspanel_ha_blueprint::update_bitwise_setting(id(relay_settings), true, RelaySettings::Relay1_Local);
|
||||||
|
on_turn_on:
|
||||||
|
- logger.log: "Relay 1 Local turned On!"
|
||||||
|
turn_off_action:
|
||||||
|
- lambda: nspanel_ha_blueprint::update_bitwise_setting(id(relay_settings), false, RelaySettings::Relay1_Local);
|
||||||
|
on_turn_off:
|
||||||
|
- logger.log: "Relay 1 Local turned Off!"
|
||||||
|
- name: Relay 2 Local
|
||||||
|
platform: template
|
||||||
|
id: relay2_local
|
||||||
|
entity_category: config
|
||||||
|
internal: false
|
||||||
|
lambda: return (id(relay_settings) & nspanel_ha_blueprint::RelaySettings::Relay2_Local);
|
||||||
|
turn_on_action:
|
||||||
|
- lambda: nspanel_ha_blueprint::update_bitwise_setting(id(relay_settings), true, RelaySettings::Relay2_Local);
|
||||||
|
on_turn_on:
|
||||||
|
- logger.log: "Relay 2 Local turned On!"
|
||||||
|
turn_off_action:
|
||||||
|
- lambda: nspanel_ha_blueprint::update_bitwise_setting(id(relay_settings), false, RelaySettings::Relay2_Local);
|
||||||
|
on_turn_off:
|
||||||
|
- logger.log: "Relay 2 Local turned Off!"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Relay Interlocking
|
||||||
|
This is using ESPHome capability to prevents the two relays to be active at the same time, which could be useful in some cases,
|
||||||
|
like to control a cover like discussed in [#965](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues/965).
|
||||||
|
|
||||||
|
> [!ATTENTION]
|
||||||
|
> There are some considerations about using software interlocking on the [ESPHome GPIO Switch documentation](https://esphome.io/components/switch/gpio.html#interlocking).
|
||||||
|
Please read that carefully to understand what this is doing.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
switch:
|
||||||
|
# Prevents the two relays to be on simultaneously
|
||||||
|
- id: !extend relay_1
|
||||||
|
interlock: [relay_1, relay_2]
|
||||||
|
interlock_wait_time: 500ms # Please adjust this accordingly
|
||||||
|
- id: !extend relay_2
|
||||||
|
interlock: [relay_1, relay_2]
|
||||||
|
interlock_wait_time: 500ms # Please adjust this accordingly
|
||||||
|
```
|
||||||
|
|
||||||
|
### Remove non-essential components
|
||||||
|
This can be useful to free-up memory, so other custom components could be used instead.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Removes captive portal
|
||||||
|
captive_portal: !remove
|
||||||
|
|
||||||
|
# Removes embedded web server
|
||||||
|
web_server: !remove
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart with 15s button press
|
||||||
|
This could be used to have an easy way to restart your panel locally in addition to the [reset pin in the bottom of your panel](pics/eu_reset_button.png).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
binary_sensor:
|
||||||
|
# Restarts the Nextion display after pressing and holding the left button for 15s
|
||||||
|
- id: !extend left_button
|
||||||
|
on_multi_click:
|
||||||
|
- timing:
|
||||||
|
- ON for at least 15.0s
|
||||||
|
invalid_cooldown: ${invalid_cooldown}
|
||||||
|
then: # Restart the display
|
||||||
|
- switch.turn_off: screen_power
|
||||||
|
- delay: 5s
|
||||||
|
- switch.turn_on: screen_power
|
||||||
|
- delay: 2s
|
||||||
|
- lambda: disp1->soft_reset();
|
||||||
|
- delay: 2s
|
||||||
|
- script.execute: setup_sequence
|
||||||
|
|
||||||
|
# Restarts ESPHome after pressing and holding the right button for 15s
|
||||||
|
- id: !extend right_button
|
||||||
|
on_multi_click:
|
||||||
|
- timing:
|
||||||
|
- ON for at least 15.0s
|
||||||
|
invalid_cooldown: ${invalid_cooldown}
|
||||||
|
then: # Restart the panel
|
||||||
|
- button.press: restart_nspanel
|
||||||
|
```
|
||||||
99
docs/different_version.md
Normal file
99
docs/different_version.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# Guide to Using Different Versions of This Project
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
This guide provides instructions on how to switch between different versions for each component of this project:
|
||||||
|
Blueprint, ESPHome, and Nextion TFT, allowing users to access development (`dev`), beta, or previous versions.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!WARNING]
|
||||||
|
> Use non-main versions at your own risk. Only the `main`/latest release is officially supported.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Ensure all three components (Blueprint, ESPHome, TFT) are synchronized at the same version for system stability.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
## Suggested Update Order
|
||||||
|
1. **ESPHome**: Start with ESPHome for its straightforward update process.
|
||||||
|
2. **TFT**: Then proceed with Nextion TFT.
|
||||||
|
3. **Blueprint**: Finally, update Blueprint, as it requires more manual effort and careful handling.
|
||||||
|
|
||||||
|
## Finding Available Versions
|
||||||
|
For available versions and branches, visit: [NSPanel_HA_Blueprint Tags](https://github.com/Blackymas/NSPanel_HA_Blueprint/tags).
|
||||||
|
Take note of the branch (`dev`, `beta`, or `main`) or version name exactly as it is published, as this is case-sensitive.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> **Understanding Tags in GitHub**
|
||||||
|
> Tags on GitHub mark specific versions of a project, akin to bookmarks.
|
||||||
|
They're created for each new release, allowing easy access to different project stages.
|
||||||
|
|
||||||
|
### Special Versions
|
||||||
|
- **dev**: The development version, containing the latest code but potentially unstable.
|
||||||
|
- **beta**: The pre-release version, more stable than `dev` but still undergoing final testing.
|
||||||
|
- **main**: The default latest version, where you will find the most recent release code.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> When using `dev` or `beta`, report findings in the [issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues) section, clearly stating the version.
|
||||||
|
>
|
||||||
|
> **Please do not report issues related to old released versions.**
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
### For ESPHome Component
|
||||||
|
1. Open your device's YAML config and find the key `ref:`, which is under `remote_package:` in the `packages:` area:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
2. Change the value of `ref:` to the version you want to install, like `ref: dev` or `ref: v4.1.4`:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. Save your settings and then install it.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Older versions may require `arduino` framework.
|
||||||
|
> Please refer to this guide for setting the framework properly: [Change framework](customization.md#frameworks)
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Older versions of the components may not be compatible with the latest ESPHome compiler or Home Assistant.
|
||||||
|
>
|
||||||
|
> Ensure you are using a compatible version of Home Assistant and the compiler when working with older project versions to avoid potential issues.
|
||||||
|
> You can use our [Version compatibility matrix](version_compatibility.md) to identify the minimum requirement per version as a reference for possible version incompatibility,
|
||||||
|
> although we don't have a register of the "Maximum version" supported.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### For Nextion TFT Component
|
||||||
|
The instructions to upload TFT will vary depending on the version you are installing and the framework you are using.
|
||||||
|
|
||||||
|
#### v4.2 or later (if you are using ESP-IDF) or v4.2.5 or later (if you are using Arduino)
|
||||||
|
1. Go to your device's page under **Settings** > **Devices & Services** > **ESPHome**.
|
||||||
|
2. On the **Configuration** group, press **Update TFT display** and wait for the upload to complete. The system will automatically find the right TFT file for the ESPHome version you are running.
|
||||||
|
|
||||||
|
#### v4.1 or earlier (in either case) or v4.2.4 or earlier (if you are using Arduino)
|
||||||
|
1. On the GitHub repository, click on your chosen version name on the [NSPanel_HA_Blueprint Tags](https://github.com/Blackymas/NSPanel_HA_Blueprint/tags) list, then select the tab **Code**.
|
||||||
|
2. Double-check that the correct version is shown below the repository name:
|
||||||
|
|
||||||
|

|
||||||
|
3. Locate the TFT file related to your model and download it to your local http server.
|
||||||
|
4. Double check your `nextion_update_url` substitution is pointing to the right URL where the file you just downloaded is available.
|
||||||
|
|
||||||
|

|
||||||
|
5. Go to your device's page under **Settings** > **Devices & Services** > **ESPHome**.
|
||||||
|
6. On the **Configuration** group, press **Update TFT display** and wait for the upload to complete.
|
||||||
|
|
||||||
|
### For Blueprint Component
|
||||||
|
1. Use your preferred code editor to edit the blueprint file under `/homeassistant/blueprints/automation/Blackymas/nspanel_blueprint.yaml`.
|
||||||
|
2. Go to the GitHub repository and select the [branch (`main`, `beta` or `dev`)](https://github.com/Blackymas/NSPanel_HA_Blueprint/branches)
|
||||||
|
or the [tag](https://github.com/Blackymas/NSPanel_HA_Blueprint/tags) (for previous versions) you want to use.
|
||||||
|
3. Find the file `nspanel_blueprint.yaml` in the root of the branch/tag, then click on it to open the file content visualization.
|
||||||
|
4. Click the button "**Copy raw file**" in the top right area of the code box. This will copy the entire code to the clipboard.
|
||||||
|
5. Go back to your code editor in Home Assistant and replace the entire old code by the one in your clipboard (typically CTRL+A & CTRL+V).
|
||||||
|
6. Go to **Developer Tools**, select the tab **YAML** and click the button to reload **AUTOMATIONS**.
|
||||||
|
|
||||||
|
## Additional Notes
|
||||||
|
- Please note that the images provided in this guide might become outdated as the project evolves.
|
||||||
|
It's always a good idea to refer to the latest version of the project for current details.
|
||||||
|
- For the most up-to-date information and updates,
|
||||||
|
refer to the [project's documents](README.md)
|
||||||
|
and check the [issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues)
|
||||||
|
and [discussions](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions) sections on our GitHub repository.
|
||||||
45
docs/error_compiling.md
Normal file
45
docs/error_compiling.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Compiling Errors Guide
|
||||||
|
|
||||||
|
The most common cases for compiling errors are related to build files needing to be cleaned up and the lack of resources on your ESPHome compiler host.
|
||||||
|
These are our suggestions for both cases:
|
||||||
|
|
||||||
|
## Clean-up build files
|
||||||
|
|
||||||
|
Go to your ESPHome Dashboard, click the 3-dot menu related to your device and then "**Clean Build Files**":
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Limited resources on ESPHome compiler host
|
||||||
|
### Free Up Server Resources
|
||||||
|
|
||||||
|
1. First, please check the available memory of the ESPHome compiler host. 4GB of memory are recommended if you are installing ESPHome as a Home Assistant add-on.
|
||||||
|
Therefore, a RasPi 4 with 4GB RAM is the minimum if you are using a Raspberry Pi.
|
||||||
|
A manual installation requires at least 2GB of memory and 500MB of swap space or 3GB of memory.
|
||||||
|
With less memory the compiler will crash!
|
||||||
|
|
||||||
|
2. Add the following to your device's YAML to reduce resource usage (this may slow down the compilation process):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Limit the amount of resources used for compiling
|
||||||
|
esphome:
|
||||||
|
compile_process_limit: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Place this in a dedicated customization section in your YAML for easier maintenance,
|
||||||
|
similar to [this example](https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/docs/customization.md#instructions).
|
||||||
|
|
||||||
|
3. Restart your host system, not just Home Assistant. Use the advanced options to **Reboot system**, which also restarts add-ons and can free up memory.
|
||||||
|
|
||||||
|
4. Temporarily stop non-essential add-ons in Home Assistant, especially resource-intensive ones like Studio Code Server.
|
||||||
|
|
||||||
|
5. [Clean up build files](#clean-up-build-files)
|
||||||
|
|
||||||
|
6. Try compiling again.
|
||||||
|
|
||||||
|
7. After completion, restart your host system to reactivate the stopped add-ons.
|
||||||
|
|
||||||
|
### Compile Using Your Computer
|
||||||
|
1. Install ESPHome on your computer (Windows, Mac, or Linux) following this guide: [Installing ESPHome Manually](https://esphome.io/guides/installing_esphome.html).
|
||||||
|
|
||||||
|
2. With ESPHome installed locally, you can use the ESPHome Dashboard or the [ESPHome Command Line Interface](https://esphome.io/guides/cli.html#command-line-interface) for compilation.
|
||||||
104
docs/error_initializing.md
Normal file
104
docs/error_initializing.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Panel startup issues
|
||||||
|
|
||||||
|
When your panel starts, a number of different things needs to be set and the ESPHome must establish connection to the Nextion display used by your panel
|
||||||
|
and also to your Home Assistant, which will provide the proper settings required by your panel.
|
||||||
|
If everything goes right, the boot page will be shown for just a few seconds, then the wake-up page will be shown.
|
||||||
|
|
||||||
|
If something happens during this process, your panel may get stuck on this page.
|
||||||
|
In many cases, restarting your panel can resolve the issue, but if it is still showing the boot page after a reboot, this guide may help you.
|
||||||
|
|
||||||
|
Understanding what is shown on the boot page can be useful to find the cause of the problem or when you are looking for help.
|
||||||
|
|
||||||
|
## Understanding the boot page
|
||||||
|
|
||||||
|
Your boot page probably looks like this:
|
||||||
|
|
||||||
|
**Before Home Assistant/ESPHome is connected:**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**When Home Assistant/ESPHome is connected:**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### What is shown on the screen
|
||||||
|
|
||||||
|
#### Initializing or IP address
|
||||||
|
|
||||||
|
In the top, you will see the message "Initializing..." while the display is executing it's boot sequence or waiting for a connection from ESPHome.
|
||||||
|
|
||||||
|
Once ESPHome is connected to both the display and the Wi-Fi network, that text will be replace by the IP address, which can be useful for troubleshooting.
|
||||||
|
|
||||||
|
#### Baud rate (bps)
|
||||||
|
|
||||||
|
On the top right corner, it's shown the baud rate used by the display to communicate to ESPHome.
|
||||||
|
By default, all the communication should happens at 115200 bps, but as 921600 bps is also supported, the display will alternate between these 2 rates every 30 seconds until ESPHome gets connected.
|
||||||
|
|
||||||
|
#### Framework
|
||||||
|
|
||||||
|
Right bellow the baud rate information, you may see the framework used by ESPHome, which is either `esp-idf` (default for new installations) or `arduino` (default for installations prior v4.1.4).
|
||||||
|
|
||||||
|
That information will be available only when ESPHome establishes communication with the display.
|
||||||
|
If you cannot see that information after a couple of seconds then you may have an issue on the communication between ESPHome and the display (explained later).
|
||||||
|
|
||||||
|
#### Versions
|
||||||
|
|
||||||
|
Here you may see the version of TFT, ESPHome and Blueprint used by this project.
|
||||||
|
|
||||||
|
If some of those versions are not shown, you can have an indication of where a possible communication issue is.
|
||||||
|
|
||||||
|
- **TFT** version will always be shown, as that is part of the display itself.
|
||||||
|
- **ESPHome** version will be shown as soon the ESPHome establishes the communication with the display.
|
||||||
|
- **Blueprint** version requires both ESPHome and the Blueprint (in Home Assistant) to establish communication to be shown.
|
||||||
|
|
||||||
|
In normal situation, all the versions should be displayed and should be the same. Different patch versions are supported.
|
||||||
|
|
||||||
|
#### Reboot button
|
||||||
|
|
||||||
|
You can use this button to force a reboot of your panel. This button is available when ESPHome establishes communication with the display.
|
||||||
|
|
||||||
|
## Common issues
|
||||||
|
|
||||||
|
### ESPHome cannot establish communication to your panel's Nextion display
|
||||||
|
|
||||||
|
**Symptoms:** The ESPHome version (and other info) won't be shown in the boot page.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 MD033 -->
|
||||||
|
| Possible causes | Suggestions |
|
||||||
|
| :-- | :-- |
|
||||||
|
| You may have an older version of ESPHome installed or ESPHome is not installed. | Make sure you have the latest version of ESPHome and flash your device again. |
|
||||||
|
| Baud rate mismatch. | The default baud rate for this project is 115200 bps, however your device might be set with a different baud rate. Use the baud rate selector under your device's page to adjust to the same baud rate as the display, then change it back to 115200 bps, which will instruct the display to start using that. |
|
||||||
|
<!-- markdownlint-enable MD013 MD033 -->
|
||||||
|
|
||||||
|
### Blueprint is not detected
|
||||||
|
|
||||||
|
**Symptoms:** The ESPHome version is shown, but not the blueprint version or, the Home page is shown, but the Home Assistant icon is shown in red and typically the functionality is very limited:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
In some cases you can also see duplicate entities on the device's page in Home Assistant, and some of these entities may have the `entity_id` ending with `_2`, `_3`, etc.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 MD033 -->
|
||||||
|
| Possible causes | Suggestions |
|
||||||
|
| :-- | :-- |
|
||||||
|
| You may have an older version of the blueprint installed or the blueprint isn't installed into your Home Assistant. | [Install the blueprint](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2FBlackymas%2FNSPanel_HA_Blueprint%2Fblob%2Fmain%2Fnspanel_blueprint.yaml).<br>[Update the blueprint](howto.md#update-blueprint).|
|
||||||
|
| You don't have an automation created using the blueprint. | On Home Assistant, go to **Settings** --> **Automations & Scenes** --> **Blueprints** --> **NSPanel Configuration** --> **CREATE AUTOMATION** and follow the [instructions to setup your automation](blueprint.md).<br>**Attention!!** You need one automation per panel, if you have more than one panel set. |
|
||||||
|
| Your panel is not selected in the automation. | Open the automation related to your panel and make sure the right device is set on the **NSPanel device** field. |
|
||||||
|
| Your panel's connection to Home Assistant may have issues.<br>This could be from an invalid entity Id (e.g. ending with `_2`), or some service missing registration. | Reconnect the Panel's device to Home Assistant:<br>1. Go to **Settings** --> **Devices & Services** --> **ESPHome**<br>2. Delete the device<br>3. Restart Home Assistant host<br>4. Go back to **Settings** --> **Devices & Services**<br>5. Click **Add integration**<br>6. Select **ESPHome**<br>7. Enter your panel's hostname or IP address.|
|
||||||
|
<!-- markdownlint-enable MD013 MD033 -->
|
||||||
|
|
||||||
|
## Additional Tips and Resources
|
||||||
|
|
||||||
|
After troubleshooting, if issues persist, consult the [Issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues) and feel free to create a new one asking for more personalized assistance.
|
||||||
|
|
||||||
|
Please share as much info as possible, like:
|
||||||
|
1. Describing (or a picture of) what is on your screen
|
||||||
|
2. Are you updating from a previous version of this project, or you coming from another NSPanel customization (which one?) or are you customizing for the first time a panel with the original Sonoff settings?
|
||||||
|
3. Please share the ESPHome logs from when your panel starts to the moment the upload fails.
|
||||||
|
4. Describe what you have already tried.
|
||||||
|
|
||||||
|
## Important note
|
||||||
|
|
||||||
|
Remember, these steps are a guideline and might vary slightly based on your specific setup and previously installed system.
|
||||||
388
docs/howto.md
Normal file
388
docs/howto.md
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
# How-to
|
||||||
|
|
||||||
|
In this document, we collect important information, tips, and solutions related to various topics noticed over time.
|
||||||
|
This is a community-driven resource, and we encourage everyone to contribute their knowledge.
|
||||||
|
|
||||||
|
## Community Contribution
|
||||||
|
|
||||||
|
If you have a solution or tip to share, please contribute! Your knowledge can significantly help others in the community.
|
||||||
|
You can write a short message with your findings, and we'll include it here.
|
||||||
|
|
||||||
|
## Topics and Solutions
|
||||||
|
Below are the topics covered in this document, each with relevant tips and solutions.
|
||||||
|
|
||||||
|
1. [How do I create "Issues" when I have a problem ](#how-to-create-issues-when-i-have-a-problem)
|
||||||
|
2. [Update Blueprint](#update-blueprint)
|
||||||
|
3. [Update ESPHome](#update-esphome)
|
||||||
|
4. [Update TFT](#update-tft)
|
||||||
|
5. [Notification via HA](#notification-via-ha)
|
||||||
|
6. [Climate control with relays](#climate-control-with-relays)
|
||||||
|
7. [Call a page directly](#call-a-page-directly)
|
||||||
|
8. [Play RTTTL Sound](#play-rtttl-sound)
|
||||||
|
9. [Start automations via Input_Boolean](#start-automations-via-input_boolean)
|
||||||
|
10. [Updating Wi-Fi and OTA passwords in ESPHome with this project](#updating-wi-fi-settings-and-ota-passwords-in-esphome-with-this-project)
|
||||||
|
|
||||||
|
## How to create "issues" when I have a problem
|
||||||
|
|
||||||
|
> _**To be able to solve your problem, it is important for us to have as much information as possible**_.
|
||||||
|
|
||||||
|
* Describe your problem as detailed as possible.
|
||||||
|
* Please write your ESPHome and Home Assistant version, as the version of files of this project (TFT, ESPHome and Blueprint).
|
||||||
|
* Please go to your automation and then to the "3 dots" and then to _**Edit as YAML**_.
|
||||||
|
Copy the complete code and attach it to the ticket
|
||||||
|
* An important "helper" for solving problems is the trace of an automation.
|
||||||
|
You can find the trace under _**Settings --> Automations & Scenes --> your NSPanel automation --> Traces (top right)**_
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!NOTE]
|
||||||
|
> TRACES! Please execute again what does not work and open the trace immediately afterwards.
|
||||||
|
> Often you have to open the trace after the reboot too.
|
||||||
|
> During the start up, most things are loaded.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> In the trace you can see by the _**"orange "**_ lines which way the automation has gone.
|
||||||
|
> Please tell us this path.
|
||||||
|
> Also, please take one or more screenshots and add them to your ticket.
|
||||||
|
> Especially important for us is where the _**"Orange "**_ line ends, because most of the time this is also where the problem is.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> When you have opened the trace, there is a _**"timestamp "**_ at the top.
|
||||||
|
> It is important that you select the correct timestamp.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
### Example trace after reboot
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Example automations Blueprint
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
alias: YYXYYXYYX - NSPanel Configuration
|
||||||
|
description: ""
|
||||||
|
use_blueprint:
|
||||||
|
path: nspanel_configuration.yaml
|
||||||
|
input:
|
||||||
|
nspanel_name: nspanel_dev
|
||||||
|
language: DE
|
||||||
|
sync_value_ha: select_no
|
||||||
|
sync_slider_ha: select_no
|
||||||
|
weather: AccuWeather
|
||||||
|
accuweather: home_wetter
|
||||||
|
outdoortemp: sensor.terrasse_garage_motion_sensor_temperature
|
||||||
|
humidity: sensor.kinderzimmer_lea_temperatur_sensor_humidity
|
||||||
|
climate: climate.nspanel_buro
|
||||||
|
left_button_entity: light.haustur_spot_2
|
||||||
|
right_button_entity: light.haustur_spot_1
|
||||||
|
entity01: light.buro_sideboard
|
||||||
|
entity01_name: Sideboard
|
||||||
|
entity02: cover.kuche_rollo
|
||||||
|
entity02_name: Küche Rollo
|
||||||
|
entity03: switch.buro_dart_beleuchtung
|
||||||
|
entity03_name: Dart Licht
|
||||||
|
delay: 2
|
||||||
|
right_button_name: Test 1
|
||||||
|
left_button_name: Test 2
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update Blueprint
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> To install a new version of the NSPanel, the Blueprint, ESPHome and the TFT must be updated!
|
||||||
|
|
||||||
|
1. In Home Assistant, go to Settings > Automation & Scenes, select the tab Blueprints and find the blueprint named "NSPanel Configuration"
|
||||||
|
2. Click the 3-dot menu and select "Re-import blueprint":
|
||||||
|
|
||||||
|

|
||||||
|
3. Click "Re-import" button:
|
||||||
|
|
||||||
|

|
||||||
|
4. Reload automations or restart Home Assistant.
|
||||||
|
5. The new Blueprint is now available.
|
||||||
|
Settings that have already been made are adopted.
|
||||||
|
6. Please review the blueprint settings (under Automations tab) for new settings available with the new version.
|
||||||
|
|
||||||
|
## Update ESPHome
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> To install a new version of the NSPanel, the Blueprint, ESPHome and the TFT must be updated!
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> These instructions are for updating a panel where an older version of these files are already installed.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
These are the steps to flash your panel with an updated version from this project:
|
||||||
|
|
||||||
|
1. Go to the ESPHome dashboard (in your Home Assistant) and find the device you want to update.
|
||||||
|
Then click the 3-dot menu and select the option "Clean Build Files" to make sure you clean-up your system from the previous versions files:
|
||||||
|

|
||||||
|
|
||||||
|
2. When the clean-up process is done, click on **Install** button:
|
||||||
|

|
||||||
|
|
||||||
|
3. As your panel is probably already connected to the Wi-Fi, you may select to install **Wirelessly**,
|
||||||
|
as it is much easier and you don't have to unassemble your panel.
|
||||||
|

|
||||||
|
|
||||||
|
The new firmware will be built and then flashed to your panel, which will restart at the end of this process and start sending logs again:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Update TFT
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> These instructions are for updating a panel where an older version of these files are already installed.
|
||||||
|
|
||||||
|
1. Go to ***Settings --> Devices & Services --> Integrations***, select the display under the ESPHome integration.
|
||||||
|
2. Select the "**Update TFT Display - Model**" accordingly, under **Configuration**.
|
||||||
|
3. Press the button "**Update TFT Display**".
|
||||||
|
4. The display starts the update process and then restarts.
|
||||||
|
|
||||||
|
## Notification via HA
|
||||||
|
To show a notification on the NSPanel, the following service call can be used:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.panelname_notification_show
|
||||||
|
data:
|
||||||
|
label: Example label text
|
||||||
|
message: Example message text
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#notification-show-service-notification_show).
|
||||||
|
|
||||||
|
To clear any notifications, the following service call can be used:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.panelname_notification_clear
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#notification-clear-service-notification_clear).
|
||||||
|
|
||||||
|
To use the notifications in an automation, again simply use the service call as shown in the example below:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
description: ""
|
||||||
|
mode: single
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id:
|
||||||
|
- binary_sensor.motion_detector
|
||||||
|
to: "on"
|
||||||
|
condition: []
|
||||||
|
action:
|
||||||
|
- service: esphome.panelname_notification_show
|
||||||
|
data:
|
||||||
|
label: Motion Detected
|
||||||
|
message: Example for a Notification on the Panel Screen
|
||||||
|
```
|
||||||
|
|
||||||
|
## Climate control with Relays
|
||||||
|
> [!ATTENTION]
|
||||||
|
> Although these instructions are still valid, since v4.0 there is a better way to setup a climate control using the panel's relays an the [add-on climate](addon_climate.md),
|
||||||
|
> which will continue to work even if Home Assistant and/or WiFi are not available.
|
||||||
|
> You probably only want to use this approach, if you are not using the build-in thermometer.
|
||||||
|
|
||||||
|
In order to use the NSPanel to control a radiator or underfloor heating, at least one Generic Thermostat must be created in the HA.
|
||||||
|
More information can be found here: https://www.home-assistant.io/integrations/generic_thermostat/
|
||||||
|
|
||||||
|
Example configuration Generic Thermostat:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
climate:
|
||||||
|
- platform: generic_thermostat
|
||||||
|
name: Study
|
||||||
|
heater: switch.study_heater ## Wenn das NSPanel Relays den Heizkreis Regler schaltet, kann dieses hier definiert werden
|
||||||
|
target_sensor: sensor.study_temperature ## Hier kann der NSPanel Sensor verwendet werden
|
||||||
|
min_temp: 15
|
||||||
|
max_temp: 21
|
||||||
|
ac_mode: false
|
||||||
|
target_temp: 17
|
||||||
|
cold_tolerance: 0.3
|
||||||
|
hot_tolerance: 0
|
||||||
|
min_cycle_duration:
|
||||||
|
seconds: 5
|
||||||
|
keep_alive:
|
||||||
|
minutes: 3
|
||||||
|
initial_hvac_mode: "off"
|
||||||
|
away_temp: 16
|
||||||
|
precision: 0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Afterwards, the climate.entity must be assigned accordingly in the panel configuration.
|
||||||
|
|
||||||
|
## Call a Page Directly
|
||||||
|
|
||||||
|
In user-created automations within Home Assistant, there are scenarios where you might want to automatically display a specific page on your device's screen.
|
||||||
|
The following services enable this functionality:
|
||||||
|
|
||||||
|
### Basic Pages
|
||||||
|
|
||||||
|
To open a specific page, you can utilize the `esphome.xxxxxx_command` service.
|
||||||
|
Here's an example that demonstrates how to open the `home` page:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.xxxxx_command
|
||||||
|
data:
|
||||||
|
cmd: page home
|
||||||
|
```
|
||||||
|
|
||||||
|
Currently, the following pages can be accessed using this method:
|
||||||
|
|
||||||
|
- `buttonpage01`
|
||||||
|
- `buttonpage02`
|
||||||
|
- `buttonpage03`
|
||||||
|
- `buttonpage04`
|
||||||
|
- `entitypage01`
|
||||||
|
- `entitypage02`
|
||||||
|
- `entitypage03`
|
||||||
|
- `entitypage04`
|
||||||
|
- `home`
|
||||||
|
- `qrcode`
|
||||||
|
- `screensaver`
|
||||||
|
- `utilities`
|
||||||
|
|
||||||
|
For instance, to directly navigate to button page 2, replace `home` in the command with `buttonpage02`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.xxxxx_command
|
||||||
|
data:
|
||||||
|
cmd: page buttonpage02
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#command-service-command).
|
||||||
|
|
||||||
|
### Entity-Specific Pages
|
||||||
|
|
||||||
|
For entity-specific pages, a more detailed call is required as it involves specifying the entity.
|
||||||
|
You can use the service `esphome.xxxxx_entity_details_show` as shown in the following example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.xxxxx_entity_details_show
|
||||||
|
data:
|
||||||
|
entity_id: climate.my_thermostat
|
||||||
|
back_page: buttonpage01
|
||||||
|
```
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#entity-details-show-service-entity_details_show).
|
||||||
|
|
||||||
|
### Wake-up Page
|
||||||
|
|
||||||
|
You may have configured a specific **Wake-up page** on your device.
|
||||||
|
This page is automatically displayed after the device boots up or wakes up from sleep mode (such as the `screensaver` page).
|
||||||
|
To open this page, you have two options:
|
||||||
|
|
||||||
|
1. Directly call the page if it is one of the [Basic pages](#basic-pages).
|
||||||
|
2. Use the `esphome.xxxxx_wake_up` service as follows:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
service: esphome.xxxxx_wake_up
|
||||||
|
data:
|
||||||
|
reset_timer: true
|
||||||
|
```
|
||||||
|
|
||||||
|
The `reset_timer` parameter allows you to control the **Timeout sleep timer**.
|
||||||
|
Setting it to `true` resets the timer, while `false` continues counting down from the current value.
|
||||||
|
|
||||||
|
The **Wake-up** service differs from a normal page call in that it only opens the wake-up page if the panel is in sleep mode.
|
||||||
|
If the panel is already active, the current page remains displayed.
|
||||||
|
This feature is particularly useful in conjunction with a motion sensor to wake up your panel automatically.
|
||||||
|
By repeatedly calling this service whenever motion is detected, the panel can be either woken up or have its sleep timeout timer reset (if `reset_timer` is set to `true`).
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#wake-up-service-wake_up).
|
||||||
|
|
||||||
|
## Play RTTTL Sound
|
||||||
|
|
||||||
|
HA can send a RTTTL to the NSPanel, custom melodies are possible.
|
||||||
|
|
||||||
|
The use this function, the following service is called: `rtttl_play`
|
||||||
|
|
||||||
|
You can find many RTTTL strings on the web, the important thing is that they must start with the name and then a colon.
|
||||||
|
|
||||||
|
Here is an example:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
More information: https://esphome.io/components/rtttl.html#common-beeps
|
||||||
|
|
||||||
|
More songs: https://codebender.cc/sketch:109888#RTTTL%20Songs.ino
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> For more details about this service call, please refer to our [API documentation](api.md#rtttl-play-service-rtttl_play).
|
||||||
|
|
||||||
|
## Start Automations via Input_Boolean
|
||||||
|
|
||||||
|
Although the NSPanel can execute scripts directly over the buttons, there is also the possibility of starting automations directly by the means of Input_Boolean.
|
||||||
|
|
||||||
|
For this, a helper must first be created under ***Settings --> Devices&Services --> Helpers***
|
||||||
|
|
||||||
|
Now add the created Input_Boolean as a trigger in the desired automation under State.
|
||||||
|
|
||||||
|
In the last step, assign the trigger to a button in the Panel Config.
|
||||||
|
|
||||||
|
## Updating Wi-Fi settings and OTA Passwords in ESPHome with This Project
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
When you update your Wi-Fi password in a device with firmware from our project,
|
||||||
|
it's important to remember that the `wifi_password` substitution is used for both Wi-Fi and OTA updates (and a few more places that are not relevant now).
|
||||||
|
Failing to update both simultaneously can lead to connection issues.
|
||||||
|
|
||||||
|
### Step-by-Step Guide
|
||||||
|
|
||||||
|
1. **Prepare Your Device for Update**
|
||||||
|
- Ensure your device is connected to your computer and is accessible via your current Wi-Fi network.
|
||||||
|
|
||||||
|
2. **Update OTA Password First**
|
||||||
|
- Open your panel's YAML.
|
||||||
|
- Add the following in the customization area:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
esphome:
|
||||||
|
on_boot:
|
||||||
|
- priority: 600
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
id(my_ota).set_auth_password("Your new Wi-Fi password");
|
||||||
|
ota:
|
||||||
|
password: "Your current Wi-Fi password"
|
||||||
|
id: my_ota
|
||||||
|
```
|
||||||
|
|
||||||
|
- Flash your device.
|
||||||
|
It will use the current password for this flash and will inform your device to start using the new password for the next OTA.
|
||||||
|
- When your device starts, **remove the lines above**.
|
||||||
|
- Find the `wifi_ssid` and `wifi_password` key in the `substitutions` area (usually at the beginning of the file) and change it to your new Wi-Fi password.
|
||||||
|
If that is point to `!secret`, you will have to edit it in your `secrets.yaml` file instead.
|
||||||
|
- Flash your device again with the updated YAML.
|
||||||
|
It will use the current Wi-Fi to connect to your device and the new Wi-Fi password as the OTA password, then will inform your device to connect to the Wi-Fi with the new settings.
|
||||||
|
|
||||||
|
3. **Update Wi-Fi Settings in Your Access Point**
|
||||||
|
|
||||||
|
### Important Notes
|
||||||
|
|
||||||
|
- The device will still be using the old Wi-Fi settings for this update.
|
||||||
|
If you've already changed your Wi-Fi network settings, this step will fail.
|
||||||
|
- **Troubleshooting: Unable to Connect via Wi-Fi**
|
||||||
|
- If your device cannot connect to Wi-Fi due to a password or SSID change, you will need to flash the device via a serial connection.
|
||||||
|
- Connect your device to your computer using a USB-to-Serial adapter.
|
||||||
|
- Use the ESPHome flasher tool to upload the new configuration.
|
||||||
|
- In this case, don't worry about the OTA password, as it's not required when flashing via serial.
|
||||||
|
|
||||||
|
### Verify the Update
|
||||||
|
|
||||||
|
- Once the new configuration is uploaded, your device should automatically connect to your Wi-Fi network with the new settings.
|
||||||
|
- Verify that OTA updates are working with the new password.
|
||||||
|
|
||||||
|
### Additional Tips
|
||||||
|
|
||||||
|
- **Backup Your Configuration:** Always keep a backup of your ESPHome configuration files.
|
||||||
|
- **Network Accessibility:** Ensure your device remains within your Wi-Fi network's range during the update process.
|
||||||
|
- **Serial Flashing:** Familiarize yourself with the process of flashing via serial, as it's a reliable fallback method.
|
||||||
|
|
||||||
|
### Conclusion
|
||||||
|
|
||||||
|
By carefully updating both your Wi-Fi settings and OTA passwords in your ESPHome configuration, you can avoid connection issues.
|
||||||
|
Remember to always back up your configuration and be prepared to use a serial connection if Wi-Fi connectivity is lost.
|
||||||
500
docs/install.md
Normal file
500
docs/install.md
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
# Getting Started with NSPanel HA Blueprint
|
||||||
|
Welcome to this setup guide, a community-driven approach to integrating NSPanel into your smart home.
|
||||||
|
This guide is designed to be user-friendly, aiming to assist users who have a basic understanding of Home Assistant and ESPHome.
|
||||||
|
While it's crafted to be accessible at all levels, a foundational knowledge in smart home automation will help you make the most of it.
|
||||||
|
|
||||||
|
Whether you're taking your first steps in customizing your smart home or you're an enthusiast looking to further personalize your setup, this guide provides essential tools and instructions.
|
||||||
|
Let’s embark on this journey together to create a smart home that’s uniquely yours.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!TIP]
|
||||||
|
> For troubleshooting TFT transfer issues, the most popular topic for new users, please consult our [TFT Transfer Troubleshooting Guide](tft_upload.md).
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> We encourage users with absolute beginner-level knowledge in Home Assistant, ESPHome, or YAML editing to familiarize themselves with the basics of these platforms.
|
||||||
|
> Our community is here to support, but please note that this guide may not cover the fundamental aspects of Home Assistant and ESPHome extensively.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Some images or instructions on this guide might be slighly different due to different configurations depending on your ESPHome and Home Assistant implementation or versions.
|
||||||
|
>
|
||||||
|
> If you find something that is not understandable or needs to be updated, please let us know.
|
||||||
|
> You can create an issue reporting this, or fix it yourself and submit a [Pull Request](https://github.com/Blackymas/NSPanel_HA_Blueprint/pulls) to this repository.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- [Preparation](#preparation)
|
||||||
|
- [ESPHome Firmware](#esphome-firmware)
|
||||||
|
- [Preparing the ESPHome Environment](#preparing-the-esphome-environment)
|
||||||
|
- [Setting Up a Device on ESPHome Dashboard](#setting-up-a-device-on-esphome-dashboard)
|
||||||
|
- [Flashing the Device for the First Time](#flashing-the-device-for-the-first-time)
|
||||||
|
- [Integrating Your Panel to Home Assistant](#integrating-your-panel-to-home-assistant)
|
||||||
|
- [Making Changes Over The Air (OTA)](#making-changes-over-the-air-ota)
|
||||||
|
- [Updating Your NSPanel Firmware](#updating-your-nspanel-firmware)
|
||||||
|
- [Migrating from Other Custom Firmware](#migrating-from-other-custom-firmware)
|
||||||
|
- [Upload TFT](#upload-tft)
|
||||||
|
- [Select the Right File](#select-the-right-file)
|
||||||
|
- [Uploading to Nextion](#uploading-to-nextion)
|
||||||
|
- [Troubleshooting TFT Transfer Issues](#troubleshooting-tft-transfer-issues)
|
||||||
|
- [Blueprint](#blueprint)
|
||||||
|
- [Importing the Blueprint](#importing-the-blueprint)
|
||||||
|
- [Creating an Automation](#creating-an-automation)
|
||||||
|
- [Editing Automation Settings](#editing-automation-settings)
|
||||||
|
- [How to Handle Multiple Panels](#how-to-handle-multiple-panels)
|
||||||
|
- [Advanced Configuration for ESPHome and Home Assistant Experts](#advanced-configuration-for-esphome-and-home-assistant-experts)
|
||||||
|
- [Additional Tips and Resources](#additional-tips-and-resources)
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## Preparation
|
||||||
|
Start by ensuring you have all the necessary tools and files.
|
||||||
|
This includes your NSPanel device, a stable internet connection, and access to your Home Assistant instance.
|
||||||
|
|
||||||
|
If flashing it for the first time, please look for additional preparation and tools on the
|
||||||
|
[Flashing the device for the first time](#flashing-the-device-for-the-first-time) section later in this guide.
|
||||||
|
|
||||||
|
## ESPHome Firmware
|
||||||
|
|
||||||
|
### Preparing the ESPHome Environment
|
||||||
|
|
||||||
|
To flash your NSPanel, ESPHome firmware is required.
|
||||||
|
ESPHome can be integrated into your setup in various ways, including as a Home Assistant add-on or through a local installation on your computer.
|
||||||
|
This guide is based on using the ESPHome dashboard, which is available in all standard implementations.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> 4GB of memory are recommended if you are installing ESPHome as a Home Assistant add-on.
|
||||||
|
Therefore, a RasPi 4 with 4GB RAM is the minimum if you are using a Raspberry Pi.
|
||||||
|
A manual installation requires at least 2GB of memory and 500MB of swap space or 3GB of memory.
|
||||||
|
With less memory the compiler will crash!
|
||||||
|
|
||||||
|
- **Installing ESPHome as a Home Assistant Add-On**: For seamless integration with Home Assistant, ESPHome can be installed as an add-on.
|
||||||
|
This method provides an easy-to-navigate interface and direct integration with your Home Assistant setup.
|
||||||
|
For detailed instructions on this installation method, refer to [Getting Started with ESPHome and Home Assistant](https://esphome.io/guides/getting_started_hassio).
|
||||||
|
|
||||||
|
- **Manual Installation of ESPHome**: A manual installation on your computer might be preferred
|
||||||
|
if your Home Assistant's host is resource-limited and struggles with compiling ESPHome projects.
|
||||||
|
Standalone installations on a normal computer typically offer faster and more efficient compiling.
|
||||||
|
This method is ideal if you're working with a system that doesn't support Home Assistant add-ons or if you prefer a separate management environment for your ESPHome devices.
|
||||||
|
Detailed steps for a manual installation can be found in the guide [Installing ESPHome Manually](https://esphome.io/guides/installing_esphome.html).
|
||||||
|
|
||||||
|
### Setting Up a Device on ESPHome Dashboard
|
||||||
|
|
||||||
|
Follow these steps to add a new device in the ESPHome Dashboard:
|
||||||
|
1. Click the **+ New Device** button.
|
||||||
|
|
||||||
|
2. Enter a unique name for your new ESPHome device.
|
||||||
|

|
||||||
|
|
||||||
|
3. Select **ESP32** as the device type.
|
||||||
|

|
||||||
|
|
||||||
|
4. Click **Skip** as we're not starting the installation yet.
|
||||||
|

|
||||||
|
|
||||||
|
5. Locate your newly created device in the ESPHome Dashboard and click **Edit**.
|
||||||
|

|
||||||
|
|
||||||
|
6. (Optional) For enhanced security, consider copying the `api:` entry to your panel's yaml file while adding the key itself to the secrets file
|
||||||
|

|
||||||
|
|
||||||
|
which can be edited clicking `secrets` at the top right of your ESPHome menu.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
7. Note the device name at the beginning of the file under `esphome`.
|
||||||
|

|
||||||
|
|
||||||
|
8. Clear all existing content and paste the following YAML configuration:
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Settings - Editable values
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
nextion_update_url: "http://homeassistant.local:8123/local/nspanel_eu.tft" # Optional
|
||||||
|
# Add-on configuration (if needed)
|
||||||
|
# heater_relay: "1" # Possible values: "1" or "2"
|
||||||
|
|
||||||
|
# Customization area
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
# Core and optional configurations
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||||
|
ref: main
|
||||||
|
refresh: 300s
|
||||||
|
files:
|
||||||
|
- nspanel_esphome.yaml # Basic package
|
||||||
|
# Optional advanced and add-on configurations
|
||||||
|
# - esphome/nspanel_esphome_advanced.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_ble_tracker.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_bluetooth_proxy.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||||
|
- esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||||
|
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
9. Modify the **Settings** section with your device name (as noted in step 7) and Wi-Fi details.
|
||||||
|

|
||||||
|
|
||||||
|
10. For Wi-Fi credentials, use `!secret` for added security or input them directly.
|
||||||
|
Learn about secrets in ESPHome: [Home Assistant Secrets in ESPHome](https://www.youtube.com/watch?v=eW4vKDeHh7Y).
|
||||||
|
|
||||||
|
11. (Optional) Adjust `nextion_update_url` to the URL of a TFT file hosted on an HTTP or HTTPS server,
|
||||||
|
ensuring that the file is accessible to the NSPanel.
|
||||||
|
This URL will be used by ESPHome to download the TFT file to your panel.
|
||||||
|
For more information on hosting the TFT file and setting up the URL, see the [Upload TFT](#upload-tft) section.
|
||||||
|
> [!CAUTION]
|
||||||
|
> **Prefer HTTP over HTTPS for File Transfer**
|
||||||
|
> While you might encounter examples using HTTPS in URLs for file transfer,
|
||||||
|
> it is strongly recommended to use HTTP, especially when employing the `arduino` framework.
|
||||||
|
> The support for HTTPS in this context can be unstable,
|
||||||
|
> often leading to issues with file transfers.
|
||||||
|
|
||||||
|
12. (Optional) Enhance security with API encryption by adding the copied key from step 6 to the **My Customization** area.
|
||||||
|
> [!TIP]
|
||||||
|
> You can get a new randomly generated valid key from [ESPHome Native API Component](https://esphome.io/components/api.html#configuration-variables) page.
|
||||||
|
|
||||||
|
13. After finalizing settings, click **Save** and close the YAML window.
|
||||||
|
|
||||||
|
Your NSPanel is now configured in your ESPHome Dashboard.
|
||||||
|
|
||||||
|
### Flashing the Device for the First Time
|
||||||
|
|
||||||
|
#### Drive Safe
|
||||||
|
<!-- markdownlint-disable MD028 -->
|
||||||
|
> [!CAUTION]
|
||||||
|
> **Disconnect your panel's controller module from main power during all work.**
|
||||||
|
> Operating on an open device that's plugged into the wall puts you at risk of electrocution.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> **You are solely responsible for your own safety.**
|
||||||
|
> If you're uncomfortable or if something feels wrong, stop immediately.
|
||||||
|
<!-- markdownlint-enable MD028 -->
|
||||||
|
|
||||||
|
- Use only electronic components rated for 3.3VDC. Ensure your TTL adapter is set to 3.3VDC. Exceeding this voltage can cause permanent damage to your panel.
|
||||||
|
- Maintain a clean work area to prevent damage to your device, especially the screen.
|
||||||
|
- Keep all small parts, like screws and cables, safely stored.
|
||||||
|
|
||||||
|
#### Required Tools
|
||||||
|
For first-time flashing of your NSPanel with ESPHome, you may need:
|
||||||
|
1. [USB-to-Serial TTL adapter](https://esphome.io/guides/physical_device_connection#usb-serial-adapter)
|
||||||
|
2. [Jumper wires](https://esphome.io/guides/physical_device_connection#jumper-wires)
|
||||||
|
3. [Breakable headers (optional)](https://esphome.io/guides/physical_device_connection#pcb-headers)
|
||||||
|
4. Appropriate screwdriver to disassemble your panel's controller module (touch plate)
|
||||||
|
|
||||||
|
#### Connecting Your Device via USB-to-Serial TTL Interface
|
||||||
|
|
||||||
|
Before you begin disassembling your panel, it is recommended to review the following resources for guidance:
|
||||||
|
- [YouTube - Mark Watt Tech - HOW TO - Setup the SIMPLEST Smart Home Scene Controller](https://www.youtube.com/watch?v=jpSTA_ILB8g&t=323s)
|
||||||
|
- @blakadder's [Sonoff NSPanel EU Switch in Detail](https://blakadder.com/nspanel-teardown/)
|
||||||
|
- [ESPHome - Physically Connecting to Your Device](https://esphome.io/guides/physical_device_connection)
|
||||||
|
|
||||||
|
While this guide does not cover the firmware transfer process in detail,
|
||||||
|
here are some important points to consider during the setup:
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
1. Handle with care the pins connecting the front panel (which includes the main board and screen) to the back part (the section mounted to the wall).
|
||||||
|
These pins are fragile and can break or bend, potentially rendering your panel nonfunctional.
|
||||||
|
2. Ensure that the pin `IO0` on the panel's board is connected to the `GND` pin on the back part connectors.
|
||||||
|
This connection is necessary to put the ESP32 into firmware transfer mode.
|
||||||
|
3. Before connecting the TTL adapter to your panel's board, verify that the adapter is set to output 3.3VDC.
|
||||||
|
Using a voltage higher than 3.3VDC, such as 5VDC, can damage your panel.
|
||||||
|
4. To avoid short circuits, consider moving the panel's board away from the metal backing of the display.
|
||||||
|
The use of a non-conductive tool, like the blue plastic one shown in the picture, can be helpful.
|
||||||
|
5. Note the cross-connection of `RX` and `TX` pins.
|
||||||
|
The following pin-out should be used:
|
||||||
|
<!-- markdownlint-disable MD033 -->
|
||||||
|
| Panel's Board | TTL USB-to-Serial |
|
||||||
|
| :--: | :--: |
|
||||||
|
| `3V3` | `VCC`, `3V3`, or `3.3V` |
|
||||||
|
| `TX` | `RX` |
|
||||||
|
| `RX` | `TX` |
|
||||||
|
| `GND` | `GND` |
|
||||||
|
| `IO0` | `GND`<br>This can be connected to a `GND` pin on the panel's board. |
|
||||||
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
|
By following these guidelines and referring to the provided resources, you can safely prepare your NSPanel for firmware updates.
|
||||||
|
|
||||||
|
#### Transferring the Firmware to Your Device
|
||||||
|
After ensuring your device is properly connected, proceed to update or install the firmware using the ESPHome Dashboard.
|
||||||
|
|
||||||
|
1. **Access the ESPHome Dashboard** and locate your NSPanel device.
|
||||||
|
2. **Open the Installation Options:** Click on the three-dot menu next to your device and select **Install**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. **Choose the Installation Method:**
|
||||||
|
- If you're **updating** your panel, the **Wirelessly** option is typically the right choice.
|
||||||
|
This method will compile and transfer the firmware directly to your panel over Wi-Fi.
|
||||||
|
- For **initial installations** or updates via a USB-to-Serial TTL adapter, select either **Plug into this computer** or **Manual download**.
|
||||||
|
Both these options will compile the firmware and prompt you to download it to your computer.
|
||||||
|
|
||||||
|
4. **Transfer Firmware via USB-to-Serial TTL:**
|
||||||
|
- Navigate to [ESPHome Web](https://web.esphome.io/) on your computer.
|
||||||
|
- Click **Connect** and choose the serial interface connected to your USB-to-Serial TTL adapter.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Once connected, opt to install an existing firmware to your panel.
|
||||||
|
Select the compiled firmware file and initiate the installation.
|
||||||
|
|
||||||
|
The firmware installation process will take a few minutes.
|
||||||
|
After completion, reassemble your panel and mount it back on the wall.
|
||||||
|
Power it up, and it should appear online in the ESPHome Dashboard within a couple of minutes, running the latest firmware.
|
||||||
|
|
||||||
|
### Integrating your panel to Home Assistant
|
||||||
|
Once your panel loaded the new ESPHome firmware, it should be automatically detected by Home Assistant and you should get a notification about that.
|
||||||
|
If that isn't happnening, you can manually add it as a new intgration with the following steps:
|
||||||
|
> [!TIP]
|
||||||
|
> You can use [this link](https://my.home-assistant.io/redirect/config_flow_start/?domain=esphome)
|
||||||
|
> to go directly to the dialog to add a new ESPHome device,
|
||||||
|
> then you can go directly to step 3.
|
||||||
|
|
||||||
|
1. Go to your [ESPHome integration's page](https://my.home-assistant.io/redirect/integration/?domain=esphome) under **Settings** > **Devices & Services** > **ESPHome**.
|
||||||
|
2. If your panel is automatically discovered, just click **Configure**, otherwise, click on **Add device**.
|
||||||
|
3. Enter your new panel's hostname or IP address and click **Next**.
|
||||||
|
4. Follow the instructions from your Home Assistant to add your new panel.
|
||||||
|
|
||||||
|
After that, you will have access to the **Device's page** related to your NSPanel.
|
||||||
|
On that page you will find all the entities published by the ESPHome firmware installed in your panel,
|
||||||
|
which can be use to see it's status and control some of it's settings.
|
||||||
|
|
||||||
|
It might take a minute or two until the device's page gets fully populated, but when that is completed, take a look around and get familiar with that page.
|
||||||
|
|
||||||
|
You can always get back to the device's page under your [ESPHome integration's page](https://my.home-assistant.io/redirect/integration/?domain=esphome).
|
||||||
|
|
||||||
|
### Making Changes Over The Air (OTA)
|
||||||
|
Once your NSPanel is flashed with ESPHome, updating the firmware wirelessly via Over The Air (OTA) updates is a straightforward process.
|
||||||
|
This method eliminates the need for a USB-to-serial TTL adapter for most firmware updates.
|
||||||
|
|
||||||
|
#### Steps for OTA Updates
|
||||||
|
1. After making your changes in the yaml editor, click the **Install** button located at the top of the editor.
|
||||||
|
Alternatively, you can click the three-dot menu next to your device on the ESPHome Dashboard and select **Install**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
2. A dialog box will appear with different installation options:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. Choose the first option to transfer the firmware **Wirelessly**.
|
||||||
|
ESPHome will compile the firmware with the new settings and automatically transfer it to your device via Wi-Fi.
|
||||||
|
|
||||||
|
- The compilation and transfer process may take a few minutes.
|
||||||
|
- Once complete, your panel will restart automatically with the new firmware.
|
||||||
|
|
||||||
|
Using OTA for firmware updates is a time-efficient way to keep your NSPanel updated with the latest changes and enhancements, ensuring a smooth and hassle-free user experience.
|
||||||
|
|
||||||
|
### Updating Your NSPanel Firmware
|
||||||
|
Regularly updating your NSPanel firmware ensures that you have the latest features and improvements from this project and ESPHome.
|
||||||
|
To update your device's firmware to the latest version, simply follow the [Steps for OTA Updates](#steps-for-ota-updates) as outlined above.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> This project comprises three integral parts: ESPHome, the TFT file, and the Blueprint.
|
||||||
|
> It is crucial that all three components are updated to the same version to ensure compatibility and optimal performance.
|
||||||
|
> When updating the ESPHome firmware, make sure to also update the TFT file and the Blueprint to the corresponding version.
|
||||||
|
|
||||||
|
Keeping each component of the NSPanel HA Blueprint in sync with the same version enhances the stability and functionality of your smart panel.
|
||||||
|
|
||||||
|
### Migrating from other custom firmware
|
||||||
|
The installation in a NSPanel with Sonoff's original firmware should be straighforward, however,
|
||||||
|
if you have installed some other custom firmware before, you may have additional steps to execute.
|
||||||
|
|
||||||
|
#### NSPanel Lovelace UI
|
||||||
|
If you have already installed on your NSPanel the "nspanel-lovelace-ui" firmware from @joBr99 or from Tasmota, an [intermediate step](lovelace_ui.md) is necessary.
|
||||||
|
Please execute that first before returning here.
|
||||||
|
|
||||||
|
#### Other
|
||||||
|
Please try the standard process and if you find any issue,
|
||||||
|
please [create a new issue](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues) and inform
|
||||||
|
which custom firmware you have installed before migrating to NSPanel HA Blueprint.
|
||||||
|
|
||||||
|
## Upload TFT
|
||||||
|
|
||||||
|
The NSPanel utilizes a Nextion display, which is equipped with its own controller, memory, and firmware.
|
||||||
|
This setup enables the display to render UI components and respond to commands sent from ESPHome.
|
||||||
|
The firmware and UI elements for the Nextion display are compiled into a TFT file, which needs to be loaded onto the display for proper functionality.
|
||||||
|
|
||||||
|
ESPHome manages the transfer of the TFT file to the Nextion display.
|
||||||
|
It does this by connecting to an HTTP/HTTPS server, downloading the required TFT file, and then transferring it to the display.
|
||||||
|
This process is crucial for updating or changing the UI and functionality of the display.
|
||||||
|
|
||||||
|
In our GitHub repository, you can find all the necessary TFT files for this project, catering to different models of the NSPanel.
|
||||||
|
These files are specifically designed to work with the various functionalities and features provided in each update of the NSPanel HA Blueprint.
|
||||||
|
|
||||||
|
Make sure to select and upload the correct TFT file corresponding to your specific model of NSPanel to ensure smooth operation and access to all the latest features.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> For troubleshooting TFT transfer issues, consult our [TFT Transfer Troubleshooting Guide](tft_upload.md).
|
||||||
|
|
||||||
|
### Select the right file
|
||||||
|
Open the device's page under [ESPHome integration's page](https://my.home-assistant.io/redirect/integration/?domain=esphome)
|
||||||
|
and look for **Update TFT display** and **Update TFT display - Model** under the **Configuration** area.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Expand the **Update TFT display - Model** control and find the model that better fits your panel:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The options are:
|
||||||
|
- **Use `nextion_update_url`:** This will indicate ESPHome to download the TFT file from the URL
|
||||||
|
you specified in your panel's yaml setting under the ESPHome dashboard and is typically used
|
||||||
|
when your device have issues to transfer a TFT file directly from the GitHub repository or when
|
||||||
|
you want to use a custom TFT file hosted in your local server.
|
||||||
|
This is the default option and this keeps the compatibility with legacy installations when this was the only option.
|
||||||
|
- **NSPanel Blank:** This is a very small TFT file which just shows a pre-formatted QR code on the screen with a link to the instructions.
|
||||||
|
Although it's not a functional TFT for controlling your panel, it can be usefull when you have
|
||||||
|
issues in your first TFT upload, as it will remove the *Nextion Active Reparse Mode* used when
|
||||||
|
a Sonoff's TFT and also when some other custom implementations are installed.
|
||||||
|
- **NSPanel EU:** This should be used when you are using a Sonoff NSPanel EU model.
|
||||||
|
- **NSPanel US:** This should be used when you are using a Sonoff NSPanel US model installed on
|
||||||
|
it's normal (portrait) position with the buttons bellow the screen.
|
||||||
|
- **NSPanel US Landscape:** This should be used when you are using a Sonoff NSPanel US model
|
||||||
|
installed on the landscape position with the buttons at the right side of the screen.
|
||||||
|
- **NSPanel EU (CJK languages):** This should be used when you are using a Sonoff NSPanel EU model
|
||||||
|
and want to use the CJK (Chinese/Japanese/Korean) languages.
|
||||||
|
- **NSPanel US (CJK languages):** This should be used when you are using a Sonoff NSPanel US model
|
||||||
|
installed on it's normal (portrait) position with the buttons bellow the screen,
|
||||||
|
and want to use the CJK (Chinese/Japanese/Korean) languages.
|
||||||
|
- **NSPanel US Landscape (CJK languages):** This should be used when you are using a Sonoff NSPanel US model
|
||||||
|
installed on the landscape position with the buttons at the right side of the screen,
|
||||||
|
and want to use the CJK (Chinese/Japanese/Korean) languages.
|
||||||
|
|
||||||
|
### Uploading to Nextion
|
||||||
|
Once the right model is selected, please press the button **Update TFT display**.
|
||||||
|
|
||||||
|
In a few seconds your display should start transferring the file correspondent to the selected model.
|
||||||
|
The transfer screen shows a progress bar with a percentage counter with a black background.
|
||||||
|
|
||||||
|
If the transfer don't starts in a few seconds, ESPHome will retry automatically a few times, with different transfer parameters, so the transfer can take up to a minute to start.
|
||||||
|
|
||||||
|
Once started, the transfer shouldn't take more than 10 to 20 minutes. If after this time it isn't close to finnish, please cancel the process by restarting your device, then try it again.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> For troubleshooting TFT transfer issues, consult our [TFT Transfer Troubleshooting Guide](tft_upload.md).
|
||||||
|
|
||||||
|
### Troubleshooting TFT transfer issues
|
||||||
|
We have an useful guide for [troubleshooting TFT transfer issues](tft_upload.md). Please take a look there.
|
||||||
|
|
||||||
|
## Blueprint
|
||||||
|
This section provides guidance on importing the NSPanel HA Blueprint from our GitHub repository into your Home Assistant,
|
||||||
|
creating a new automation for your panel setup, and updating the blueprint when new versions are available.
|
||||||
|
These processes are straightforward with the latest versions of Home Assistant.
|
||||||
|
If you have any questions or need clarification, please reach out to us.
|
||||||
|
|
||||||
|
### Importing the Blueprint
|
||||||
|
Importing the blueprint into Home Assistant is a simple process. Just click the button below and follow the steps:
|
||||||
|
<!-- markdownlint-disable MD013 -->
|
||||||
|
[](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2FBlackymas%2FNSPanel_HA_Blueprint%2Fblob%2Fmain%2Fnspanel_blueprint.yaml)
|
||||||
|
<!-- markdownlint-enable MD013 -->
|
||||||
|
|
||||||
|
### Creating an Automation
|
||||||
|
After importing the Blueprint into Home Assistant, create a new automation using these steps:
|
||||||
|
|
||||||
|
1. Go to [**Settings** → **Automations & Scenes** → **Blueprints**](https://my.home-assistant.io/redirect/blueprints/) in Home Assistant.
|
||||||
|
2. Find the **NSPanel Configuration** Blueprint and click on it.
|
||||||
|
3. In the Blueprint settings, select your panel in the **NSPanel device** field.
|
||||||
|
4. Complete the relevant settings and click the **Save** button.
|
||||||
|
5. Name your automation for easy identification and click **Rename**.
|
||||||
|

|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> For a comprehensive list of panel settings, refer to the [Blueprint Guide](blueprint.md).
|
||||||
|
|
||||||
|
### Editing Automation Settings
|
||||||
|
You can modify your automation anytime to change configurations:
|
||||||
|
|
||||||
|
1. In Home Assistant, go to **Settings** → **Automations & Scenes**. Or use the link below.
|
||||||
|
[](https://my.home-assistant.io/redirect/automations/)
|
||||||
|
|
||||||
|
2. Find your automation in the list and click on it to edit.
|
||||||
|
|
||||||
|
3. After making changes, click **Save**. The new settings will be sent to your panel, usually within seconds. Some changes may require a page reload on the panel to appear.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> For a comprehensive list of panel settings, refer to the [Blueprint Guide](blueprint.md).
|
||||||
|
|
||||||
|
## How to Handle Multiple Panels
|
||||||
|
For homes with multiple panels:
|
||||||
|
|
||||||
|
1. Repeat the steps in the "Blueprint" section for each panel.
|
||||||
|
|
||||||
|
2. Ensure each panel has a unique entry in the ESPHome Dashboard and in Home Assistant under **Settings** → **Devices & Services** → **ESPHome**.
|
||||||
|
|
||||||
|
3. Create a separate automation for each panel in Home Assistant.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Avoid assigning the same panel to multiple automations.
|
||||||
|
> This can cause unexpected behavior and put extra load on Home Assistant and your Wi-Fi network.
|
||||||
|
> Currently, Home Assistant does not have a mechanism to prevent this.
|
||||||
|
|
||||||
|
## Advanced Configuration for ESPHome and Home Assistant Experts
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Customizations and advanced mode are not supported by this project's team. Use them with caution and only if you have the necessary expertise.
|
||||||
|
|
||||||
|
Before customizing your system, we encourage you to share any enhancements you make.
|
||||||
|
Consider creating a [Pull Request](https://github.com/Blackymas/NSPanel_HA_Blueprint/pulls) to the `dev` branch to share your discoveries with the community.
|
||||||
|
|
||||||
|
### Advanced ESPHome Configuration
|
||||||
|
For advanced customization with ESPHome, start with "Customizations."
|
||||||
|
We have a dedicated page for this, and your contributions are welcome: [Customization](customization.md).
|
||||||
|
|
||||||
|
To use a local copy of `nspanel_esphome.yaml`, copy the file from GitHub to your local file system and include it in your ESPHome settings as follows:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
# Editable settings
|
||||||
|
device_name: "YOUR_NSPANEL_NAME"
|
||||||
|
friendly_name: "Your panel's friendly name"
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_password: !secret wifi_password
|
||||||
|
nextion_update_url: "http://homeassistant.local:8123/local/nspanel_eu.tft" # Optional
|
||||||
|
# Add-on configuration
|
||||||
|
# heater_relay: "1" - possible values: 1/2
|
||||||
|
|
||||||
|
##### My customization - Start #####
|
||||||
|
##### My customization - End #####
|
||||||
|
|
||||||
|
packages:
|
||||||
|
local_package: !include packages/nspanel_esphome.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> A sub-folder is recommended to prevent the file from being added as an additional device in the ESPHome dashboard.
|
||||||
|
> Alternatively, you can name the file starting with `.` to exclude it from the device list.
|
||||||
|
|
||||||
|
### Advanced Blueprint Configuration
|
||||||
|
The Blueprint file `nspanel_blueprint.yaml` can be installed manually.
|
||||||
|
You can also edit your local copy of the Blueprint, but be aware that reloading the Blueprint from the repository will overwrite local changes.
|
||||||
|
|
||||||
|
### Advanced TFT File
|
||||||
|
All `.HMI` files used in this project are available in our GitHub repository.
|
||||||
|
Modify these files using the [Nextion Editor](https://nextion.tech/nextion-editor/) and create your own `.tft` files for your device.
|
||||||
|
|
||||||
|
For guidance on using Nextion, refer to:
|
||||||
|
- [Nextion Instruction Set](https://nextion.tech/instruction-set)
|
||||||
|
- [Nextion Editor Guide](https://nextion.tech/editor_guide/)
|
||||||
|
|
||||||
|
## Additional Tips and Resources
|
||||||
|
> [!TIP]
|
||||||
|
> For troubleshooting TFT transfer issues, consult our [TFT Transfer Troubleshooting Guide](tft_upload.md) first.
|
||||||
|
|
||||||
|
If problems persist after troubleshooting, visit the [Issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues) page.
|
||||||
|
Feel free to create a new issue for personalized assistance, providing details such as:
|
||||||
|
1. A description or picture of what is displayed on your screen.
|
||||||
|
2. Information on whether you are updating from a previous version of this project, migrating from another NSPanel customization, or customizing a panel with the original Sonoff settings.
|
||||||
|
3. ESPHome logs from the start of your panel to the point where the upload fails.
|
||||||
|
4. A description of what you have already tried.
|
||||||
|
|
||||||
|
## Important Note
|
||||||
|
Remember, these instructions serve as a guideline and may vary based on your specific setup and any systems previously installed.
|
||||||
71
docs/lovelace_ui.md
Normal file
71
docs/lovelace_ui.md
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
# Migrating from **NsPanel Lovelace UI**
|
||||||
|
|
||||||
|
This document applies to users trying to migrate from **NsPanel Lovelace UI**, which is another customization for NSPanel which is available for Tasmota or ESPHome.
|
||||||
|
|
||||||
|
If you are coming from there, you have to chose one of the 3 options:
|
||||||
|
|
||||||
|
- [Upload TFT using **NsPanel Lovelace UI** tools - ESPHome version](#upload-tft-using-nspanel-lovelace-ui-tools---esphome-version)
|
||||||
|
- [Upload TFT using **NsPanel Lovelace UI** tools - Tasmota version](#upload-tft-using-nspanel-lovelace-ui-tools---tasmota-version)
|
||||||
|
- [Upload TFT using this project's tools](#upload-tft-using-this-projects-tools)
|
||||||
|
|
||||||
|
## Updating TFT
|
||||||
|
|
||||||
|
### Common steps
|
||||||
|
|
||||||
|
1. Download the file [`nspanel_blank.tft`](../hmi/nspanel_blank.tft) from our GitHub repository.
|
||||||
|
2. Upload the same file (`nspanel_blank.tft`) to the folder _**"www"**_ in your Home Assistant
|
||||||
|
3. Double check if the file is available by trying to download it using your local url (typically [`http://homeassistant.local:8123/local/nspanel_blank.tft`](http://homeassistant.local:8123/local/nspanel_blank.tft)).
|
||||||
|
|
||||||
|
### Upload TFT using **NsPanel Lovelace UI** tools - ESPHome version
|
||||||
|
|
||||||
|
After following the [**Common steps**](#common-steps), follow the additional steps:
|
||||||
|
|
||||||
|
1. On Home Assistant, go to _**"Developer tools --> Services"**_ and search there for the service named "**ESPHome: DEVICE_NAME_upload_tft**" or `esphome.<<device_name>>_upload_tft`.
|
||||||
|
2. On the field `URL`, enter the url for your local `nspanel_blank.tft` file (typically `http://homeassistant.local:8123/local/nspanel_blank.tft`).
|
||||||
|
3. Press the button **CALL SERVICE**
|
||||||
|
|
||||||
|
If everything goes right, you will see the progress bar indicating the file transfer an you will end up with a black screen showing a QR code. Then please follow the instructions from [here](nspanel_blank.md#what-to-do-after-installing-nspanel_blanktft).
|
||||||
|
|
||||||
|
### Upload TFT using **NsPanel Lovelace UI** tools - Tasmota version
|
||||||
|
|
||||||
|
After following the [**Common steps**](#common-steps),
|
||||||
|
use the instructions from [**NsPanel Lovelace UI** - Flash Firmware to Nextion Screen](https://docs.nspanel.pky.eu/stable/prepare_nspanel/#flash-firmware-to-nextion-screen) website to upload TFT,
|
||||||
|
just replacing the file url by the one you have locally (typically `http://homeassistant.local:8123/local/nspanel_blank.tft`).
|
||||||
|
|
||||||
|
If everything goes right, you will see the progress bar indicating the file transfer an you will end up with a black screen showing a QR code. Then please follow the instructions from [here](nspanel_blank.md#what-to-do-after-installing-nspanel_blanktft).
|
||||||
|
|
||||||
|
### Upload TFT using this project's tools
|
||||||
|
|
||||||
|
If you have already installed the ESPHome firmware from this project, this is probably your better option now.
|
||||||
|
|
||||||
|
After following the [**Common steps**](#common-steps), follow the additional steps:
|
||||||
|
|
||||||
|
1. On your panel's screen showing a ring and a message "Wait for content...", click 9 times in the center of the ring.
|
||||||
|
|
||||||
|

|
||||||
|
2. You should get to this page:
|
||||||
|
|
||||||
|

|
||||||
|
3. Click on the button "disable recmod"
|
||||||
|
4. Click on the button "bauds=115200"
|
||||||
|
5. On Home Assistant, go to _**"Developer tools --> Services"**_ and search there for the service named "**ESPHome: DEVICE_NAME_upload_tft**" or `esphome.<<device_name>>_upload_tft`.
|
||||||
|
6. On the field `URL`, enter the url for your local `nspanel_blank.tft` file (typically `http://homeassistant.local:8123/local/nspanel_blank.tft`).
|
||||||
|
7. Press the button **CALL SERVICE**
|
||||||
|
|
||||||
|
If everything goes right, you will see the progress bar indicating the file transfer an you will end up with a black screen showing a QR code. Then please follow the instructions from [here](nspanel_blank.md#what-to-do-after-installing-nspanel_blanktft).
|
||||||
|
|
||||||
|
## Additional Tips and Resources
|
||||||
|
|
||||||
|
We have an useful guide for [troubleshooting TFT transfer issues](tft_upload.md). Please take a look there first.
|
||||||
|
|
||||||
|
After troubleshooting, if issues persist, consult the [Issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues) and feel free to create a new one asking for more personalized assistance.
|
||||||
|
|
||||||
|
Please share as much info as possible, like:
|
||||||
|
1. Describing (or a picture of) what is in your screen
|
||||||
|
2. Are updating from a previous version of this same project, or coming from another NSPanel customization (which one?) or customizing for the first time a panel with original Sonoff settings?
|
||||||
|
3. Please share the ESPHome logs from when your panel starts to the moment the upload fails.
|
||||||
|
4. Describe what you have already tried.
|
||||||
|
|
||||||
|
## Important note
|
||||||
|
|
||||||
|
Remember, these steps are a guideline and might vary slightly based on your specific setup and previously installed system.
|
||||||
50
docs/nspanel_blank.md
Normal file
50
docs/nspanel_blank.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# `nspanel_blank.tft`
|
||||||
|
|
||||||
|
The NSPanel consist in a ESP32 board (the panel itself, controlling the relays, buttons, communications, etc.)
|
||||||
|
with a Nextion display connected to.
|
||||||
|
|
||||||
|
This Nextion display have an independent controller which also requires a firmware and its settings (the basic layout),
|
||||||
|
and this is done by an `.tft` file.
|
||||||
|
|
||||||
|
When you get your panel from Sonoff, their `tft` file is installed in the Nextion display and using a called "Reparse mode",
|
||||||
|
which makes a bit challenging to replace the `tft` file when using ESPHome and then, we highly recoment you using `nspanel_blank.tft`,
|
||||||
|
which is just a fraction of the size of a regular `tft` and will make the first `tft` replacement much easier.
|
||||||
|
|
||||||
|
Once NSPanel's original `tft` is replaced, is much easier to install a new `tft` with ESPHome,
|
||||||
|
so you can go directly to the final file (either `nspanel_eu.tft`, `nspanel_us.tft` or `nspanel_us_land.tft`).
|
||||||
|
|
||||||
|
For more datails on how to install the first `tft` file, specially if your panel still displaying the original Sonoff screen,
|
||||||
|
please refeer to the [Troubleshooting TFT transfer](tft_upload.md) guide.
|
||||||
|
|
||||||
|
## How to install a different `tft` file?
|
||||||
|
|
||||||
|
Just go to your devices's page (under **Settings** > **Devices and Services** > **ESPHome**),
|
||||||
|
select your **Upload TFT display - Model** and then press **Upload TFT display**.
|
||||||
|
|
||||||
|
## What to do after installing `nspanel_blank.tft`?
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Once you have sucessfully installed any of the `tft` files from this project,
|
||||||
|
the `nspanel_blank.tft` file shouldn't be necessary anymore and you should be able to always install the final `tft` file.
|
||||||
|
|
||||||
|
Just go to your devices's page (under **Settings** > **Devices and Services** > **ESPHome**),
|
||||||
|
select your **Upload TFT display - Model** and then press **Upload TFT display**.
|
||||||
|
|
||||||
|
## Additional Tips and Resources
|
||||||
|
We have an useful guide for [troubleshooting TFT transfer issues](tft_upload.md).
|
||||||
|
Please take a look there first.
|
||||||
|
|
||||||
|
After troubleshooting, if issues persist, consult the [Issues](https://github.com/Blackymas/NSPanel_HA_Blueprint/issues)
|
||||||
|
and feel free to create a new one asking for more personalized assistance.
|
||||||
|
|
||||||
|
Please share as much info as possible, like:
|
||||||
|
1. Describing (or a picture of) what is in your screen
|
||||||
|
2. Are updating from a previous version of this same project,
|
||||||
|
or coming from another NSPanel customization (which one?)
|
||||||
|
or customizing for the first time a panel with original Sonoff settings?
|
||||||
|
3. Please share the ESPHome logs from when your panel starts to the moment the upload fails.
|
||||||
|
4. Describe what you have already tried.
|
||||||
|
|
||||||
|
## Important note
|
||||||
|
Remember, these steps are a guideline and might vary slightly based on your specific setup and previously installed system.
|
||||||
BIN
docs/pics/204139082-70d3a8d1-1c82-43cb-88f2-573f2e276a48.png
Normal file
BIN
docs/pics/204139082-70d3a8d1-1c82-43cb-88f2-573f2e276a48.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
BIN
docs/pics/269593660-e393ced5-78d4-475a-8630-893c05734f5d.png
Normal file
BIN
docs/pics/269593660-e393ced5-78d4-475a-8630-893c05734f5d.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 318 KiB |
BIN
docs/pics/269593729-bc67533b-4f2e-4034-8e7e-34063a26f1c3.png
Normal file
BIN
docs/pics/269593729-bc67533b-4f2e-4034-8e7e-34063a26f1c3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 581 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user