Compare commits
1391 Commits
ee98aed55d
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fad2ed875 | ||
|
|
5a6be04a0c | ||
|
|
0ae9b9184d | ||
|
|
162537312c | ||
|
|
f5b62f2dc4 | ||
|
|
402df4d9de | ||
|
|
dd874c0c3f | ||
|
|
e6a9580166 | ||
|
|
2e55e6d5fe | ||
|
|
06900a5de6 | ||
|
|
498d1d7ed9 | ||
|
|
e32dbfe1f7 | ||
|
|
e3524899d1 | ||
|
|
7bb86afa02 | ||
|
|
085fc0beb4 | ||
|
|
b788ad8a1c | ||
|
|
6428b15eec | ||
|
|
877def3a65 | ||
|
|
c370c31d82 | ||
|
|
1ef00adbfc | ||
|
|
d4118e27e1 | ||
|
|
1bb6307f07 | ||
|
|
3bee85669c | ||
|
|
3da9c4d850 | ||
|
|
5626070323 | ||
|
|
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 | ||
|
|
c57e4165d0 |
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
|
||||
...
|
||||
11
.github/workflows/validate_blueprint.yml
vendored
11
.github/workflows/validate_blueprint.yml
vendored
@@ -1,5 +1,7 @@
|
||||
---
|
||||
name: Validate Blueprint YAML
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
@@ -7,8 +9,6 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "nspanel_blueprint.yaml"
|
||||
#schedule:
|
||||
# - cron: "0 0 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
@@ -16,6 +16,9 @@ jobs:
|
||||
name: Validate Blueprint YAML
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- uses: actions/checkout@main
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- name: Validate nspanel_blueprint.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" 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"
|
||||
...
|
||||
442
.github/workflows/validate_esphome.yml
vendored
442
.github/workflows/validate_esphome.yml
vendored
@@ -1,153 +1,373 @@
|
||||
name: Validate ESPHome
|
||||
---
|
||||
name: Validate and Build ESPHome
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "nspanel_esphome*.yaml"
|
||||
- "advanced/esphome/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"
|
||||
- "advanced/esphome/nspanel_esphome*.yaml"
|
||||
#schedule:
|
||||
# - cron: "0 0 * * *"
|
||||
- "esphome/nspanel_esphome*.yaml"
|
||||
- "prebuilt/nspanel_esphome*.yaml"
|
||||
- "prebuilt/wall_display*.yaml"
|
||||
- ".test/*.yaml"
|
||||
- "*.h"
|
||||
- "*.c"
|
||||
- "*.cpp"
|
||||
- "*.py"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
# yamllint disable-line rule:line-length
|
||||
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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Validate nspanel_esphome.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome.yaml
|
||||
- name: Validate nspanel_esphome_core.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_core.yaml
|
||||
- name: Validate nspanel_esphome_addon_upload_tft.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_addon_upload_tft.yaml
|
||||
- name: Validate nspanel_esphome_advanced.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_base.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_addon_climate_base.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_cool.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome_addon_climate_cool.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_heat.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome_addon_climate_heat.yaml
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@main
|
||||
|
||||
build_core:
|
||||
name: Core
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- code_scan
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@main
|
||||
with:
|
||||
yaml_file: "./.test/esphome_core.yaml"
|
||||
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
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced
|
||||
uses: esphome/build-action@v1.8.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced.yaml"
|
||||
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"
|
||||
|
||||
build_climate_heat:
|
||||
name: Climate (heat)
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+climate_heat
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Advanced Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_climate_heat.yaml"
|
||||
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)
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+climate_cool
|
||||
uses: esphome/build-action@v1.8.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_climate_cool.yaml"
|
||||
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"
|
||||
|
||||
build_climate_heat_advanced:
|
||||
name: Advanced+climate (heat)
|
||||
runs-on: "ubuntu-latest"
|
||||
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_climate_heat
|
||||
- build_advanced
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced+climate_heat
|
||||
uses: esphome/build-action@v1.8.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_heat.yaml"
|
||||
- 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"
|
||||
|
||||
build_climate_cool_advanced_esp_idf:
|
||||
name: esp-idf & Bluetooth proxy
|
||||
runs-on: "ubuntu-latest"
|
||||
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_advanced
|
||||
- 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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced+climate_cool+esp_idf
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Customizations Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
|
||||
#build_climate_cool_advanced_esp_idf5:
|
||||
# name: esp-idf v5 & Bluetooth proxy
|
||||
# runs-on: "ubuntu-latest"
|
||||
# needs:
|
||||
# - build_climate_cool_advanced_esp_idf
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4.1.0
|
||||
# - name: Build core+advanced+climate_cool+esp_idf5
|
||||
# uses: esphome/build-action@v1.8.0
|
||||
# with:
|
||||
# yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf5.yaml"
|
||||
|
||||
build_climate_heat_advanced_customization:
|
||||
name: Customizations
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_climate_heat_advanced
|
||||
- build_climate_cool_advanced_esp_idf
|
||||
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@v4.1.0
|
||||
- name: Build core+advanced+climate_heat+customizations
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- uses: actions/checkout@main
|
||||
|
||||
- name: Build ESPHome Prebuilt Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_heat_customizations.yaml"
|
||||
yaml_file: prebuilt/nspanel_esphome_prebuilt.yaml
|
||||
|
||||
#build_climate_cool_advanced_esp_idf5:
|
||||
# name: esp-idf v5 & Bluetooth proxy
|
||||
# runs-on: "ubuntu-latest"
|
||||
# needs:
|
||||
# - build_climate_cool
|
||||
# - build_advanced
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4.1.0
|
||||
# - name: Build core+advanced+climate_cool+esp_idf
|
||||
# uses: esphome/build-action@v1.8.0
|
||||
# with:
|
||||
# yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf5.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 }}
|
||||
...
|
||||
|
||||
392
.github/workflows/validate_esphome_beta.yml
vendored
392
.github/workflows/validate_esphome_beta.yml
vendored
@@ -1,157 +1,333 @@
|
||||
---
|
||||
name: Validate ESPHome (beta)
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
paths:
|
||||
- "nspanel_esphome*.yaml"
|
||||
- "advanced/esphome/nspanel_esphome*.yaml"
|
||||
#schedule:
|
||||
#- cron: "0 0 * * *"
|
||||
|
||||
concurrency:
|
||||
# yamllint disable-line rule:line-length
|
||||
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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Validate nspanel_esphome.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome.yaml
|
||||
- name: Validate nspanel_esphome_core.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_core.yaml
|
||||
- name: Validate nspanel_esphome_addon_upload_tft.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_addon_upload_tft.yaml
|
||||
- name: Validate nspanel_esphome_advanced.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_base.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" advanced/esphome/nspanel_esphome_addon_climate_base.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_cool.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome_addon_climate_cool.yaml
|
||||
- name: Validate nspanel_esphome_addon_climate_heat.yaml
|
||||
run: yamllint -c "./.yamllint/rules.yml" nspanel_esphome_addon_climate_heat.yaml
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@main
|
||||
|
||||
build_core:
|
||||
name: Core
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- code_scan
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@main
|
||||
with:
|
||||
yaml_file: "./.test/esphome_core.yaml"
|
||||
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 }}
|
||||
version: beta
|
||||
|
||||
build_advanced:
|
||||
name: Advanced
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Advanced Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
version: beta
|
||||
|
||||
build_climate_heat:
|
||||
name: Climate (heat)
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+climate_heat
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build BLE Tracker Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_climate_heat.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
version: beta
|
||||
|
||||
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 }}
|
||||
version: beta
|
||||
|
||||
build_climate_cool:
|
||||
name: Climate (cool)
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_core
|
||||
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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+climate_cool
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Climate Cool Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_climate_cool.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
version: beta
|
||||
|
||||
build_climate_heat_advanced:
|
||||
name: Advanced+climate (heat)
|
||||
runs-on: "ubuntu-latest"
|
||||
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 }}
|
||||
version: beta
|
||||
|
||||
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 }}
|
||||
version: beta
|
||||
|
||||
build_customizations:
|
||||
name: Customizations
|
||||
needs:
|
||||
- build_climate_heat
|
||||
- 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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced+climate_heat
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Customizations Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_heat.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
version: beta
|
||||
|
||||
build_climate_cool_advanced_esp_idf:
|
||||
name: esp-idf & Bluetooth proxy
|
||||
runs-on: "ubuntu-latest"
|
||||
build_climate_ble_proxy:
|
||||
name: Climate Cool + Bluetooth Proxy
|
||||
needs:
|
||||
- build_climate_cool
|
||||
- build_advanced
|
||||
- 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:
|
||||
- uses: actions/checkout@v4.1.0
|
||||
- name: Build core+advanced+climate_cool+esp_idf
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build Customizations Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf.yaml"
|
||||
yaml_file: ${{ matrix.yaml_file }}
|
||||
version: beta
|
||||
|
||||
#build_climate_cool_advanced_esp_idf5:
|
||||
# name: esp-idf v5 & Bluetooth proxy
|
||||
# runs-on: "ubuntu-latest"
|
||||
# needs:
|
||||
# - build_climate_cool_advanced_esp_idf
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4.1.0
|
||||
# - name: Build core+advanced+climate_cool+esp_idf5
|
||||
# uses: esphome/build-action@v1.8.0
|
||||
# with:
|
||||
# yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf5.yaml"
|
||||
# version: beta
|
||||
|
||||
build_climate_heat_advanced_customization:
|
||||
name: Customizations
|
||||
runs-on: "ubuntu-latest"
|
||||
needs:
|
||||
- build_climate_heat_advanced
|
||||
- build_climate_cool_advanced_esp_idf
|
||||
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@v4.1.0
|
||||
- name: Build core+advanced+climate_heat+customizations
|
||||
uses: esphome/build-action@v1.8.0
|
||||
- uses: actions/checkout@main
|
||||
|
||||
- name: Build ESPHome Prebuilt Firmware
|
||||
uses: barndawgie/build-action@v1.9.0
|
||||
with:
|
||||
yaml_file: "./.test/esphome_advanced_climate_heat_customizations.yaml"
|
||||
yaml_file: prebuilt/nspanel_esphome_prebuilt.yaml
|
||||
version: beta
|
||||
|
||||
#build_climate_cool_advanced_esp_idf5:
|
||||
# name: esp-idf v5 & Bluetooth proxy
|
||||
# runs-on: "ubuntu-latest"
|
||||
# needs:
|
||||
# - build_climate_cool
|
||||
# - build_advanced
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4.1.0
|
||||
# - name: Build core+advanced+climate_cool+esp_idf
|
||||
# uses: esphome/build-action@v1.8.0
|
||||
# with:
|
||||
# yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf5.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
|
||||
...
|
||||
|
||||
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
|
||||
...
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -11,5 +11,3 @@ Nextion2Text.*
|
||||
|
||||
# Ignore dev folder
|
||||
dev
|
||||
|
||||
nspanel_esphome_prebuilt.yaml
|
||||
|
||||
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
|
||||
...
|
||||
@@ -1,11 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
#addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
#addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
@@ -1,21 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
#addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
|
||||
esp32:
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
bluetooth_proxy:
|
||||
|
||||
# Set Wi-Fi power save mode to "LIGHT" as required for Bluetooth on ESP32
|
||||
wifi:
|
||||
power_save_mode: LIGHT
|
||||
@@ -1,23 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
#addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
|
||||
esp32:
|
||||
framework:
|
||||
type: esp-idf
|
||||
version: 5.0.2
|
||||
platform_version: 6.3.2
|
||||
|
||||
bluetooth_proxy:
|
||||
|
||||
# Set Wi-Fi power save mode to "LIGHT" as required for Bluetooth on ESP32
|
||||
wifi:
|
||||
power_save_mode: LIGHT
|
||||
@@ -1,11 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
#addon_climate_cold: !include ../nspanel_esphome_addon_climate_cold.yaml
|
||||
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
|
||||
...
|
||||
@@ -1,15 +1,18 @@
|
||||
---
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
nextion_update_blank_url: "http://homeassistant.local:8123/local/nspanel/dev/nspanel_blank.tft"
|
||||
nextion_blank_url: "http://homeassistant.local:8123/local/nspanel_blank.tft"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
#addon_climate_cold: !include ../nspanel_esphome_addon_climate_cold.yaml
|
||||
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:
|
||||
@@ -25,27 +28,9 @@ binary_sensor:
|
||||
id: display_state
|
||||
platform: template
|
||||
lambda: |-
|
||||
return (id(current_page).state != "screensaver");
|
||||
|
||||
# Enable Bluetooth proxy
|
||||
bluetooth_proxy:
|
||||
return (current_page->state != "screensaver");
|
||||
|
||||
button:
|
||||
##### UPDATE TFT BLANK DISPLAY #####
|
||||
#- name: ${device_name} Update TFT display (blank)
|
||||
# platform: template
|
||||
# icon: mdi:file-sync
|
||||
# id: tft_update_blank
|
||||
# entity_category: config
|
||||
# on_press:
|
||||
# - logger.log: "Button pressed: Update TFT display (blank)"
|
||||
# - binary_sensor.template.publish:
|
||||
# id: nextion_init
|
||||
# state: false
|
||||
# - delay: 16ms
|
||||
# - lambda: |-
|
||||
# id(disp1)->set_tft_url("${nextion_update_blank_url}");
|
||||
# id(disp1).upload_tft();
|
||||
# Adds a button to put the panel to sleep
|
||||
- name: ${device_name} Sleep
|
||||
id: force_sleep
|
||||
@@ -55,8 +40,8 @@ button:
|
||||
then:
|
||||
- logger.log: Button Sleep pressed
|
||||
- lambda: |-
|
||||
if (id(current_page).state != "screensaver") id(disp1).goto_page("screensaver");
|
||||
|
||||
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
|
||||
@@ -66,10 +51,10 @@ button:
|
||||
then:
|
||||
- logger.log: Button Wake-up pressed
|
||||
- lambda: |-
|
||||
if (id(current_page).state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str());
|
||||
// id(timer_page).execute(id(wakeup_page_name).state.c_str()); // enable this if you want page timeout to be reset
|
||||
id(timer_sleep).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_sleep).state));
|
||||
id(timer_dim).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_dim).state));
|
||||
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:
|
||||
@@ -91,16 +76,13 @@ climate:
|
||||
default_target_temperature_low: 17.5 ${temp_units}
|
||||
mode: "heat"
|
||||
|
||||
# Change framework to `esp-idf`
|
||||
esp32:
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
esphome:
|
||||
# change OTA password, remove after flashing
|
||||
on_boot:
|
||||
- lambda: |-
|
||||
id(my_ota).set_auth_password("New password");
|
||||
- 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
|
||||
|
||||
@@ -117,12 +99,12 @@ light:
|
||||
- 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(wakeup_page_name->state.c_str());
|
||||
timer_reset_all->execute();
|
||||
on_turn_off:
|
||||
then:
|
||||
- lambda: |-
|
||||
ESP_LOGD("light.display_light", "Turn-off");
|
||||
disp1->goto_page("screensaver");
|
||||
goto_page->execute("screensaver");
|
||||
|
||||
logger:
|
||||
# Enable hardware UART serial logging
|
||||
@@ -144,18 +126,18 @@ output:
|
||||
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", page.c_str());
|
||||
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 (page == "screensaver" and display_light->current_values.is_on()) {
|
||||
if (current_page->state == "screensaver" and display_light->current_values.is_on()) {
|
||||
auto call = display_light->turn_off();
|
||||
call.perform();
|
||||
} else if (page != "screensaver" and (not display_light->current_values.is_on())) {
|
||||
} else if (current_page->state != "screensaver" and (not display_light->current_values.is_on())) {
|
||||
auto call = display_light->turn_on();
|
||||
call.perform();
|
||||
}
|
||||
@@ -164,13 +146,13 @@ script:
|
||||
- id: !extend set_brightness
|
||||
then:
|
||||
- lambda: |-
|
||||
ESP_LOGD("script.set_brightness(custom)", "brightness: %i%%", brightness);
|
||||
uint8_t current_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_brightness: %i%%", current_brightness);
|
||||
if (brightness != current_brightness) {
|
||||
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>(id(display_last_brightness)) / 100.0f);
|
||||
call.set_brightness(current_brightness->state / 100.0f);
|
||||
call.perform();
|
||||
} else if (display_light->current_values.is_on()) {
|
||||
auto call = display_light->turn_off();
|
||||
@@ -188,14 +170,8 @@ time:
|
||||
- !secret mysntpserver
|
||||
- europe.pool.ntp.org
|
||||
- 0.pool.ntp.org
|
||||
on_time:
|
||||
#- hours: 22
|
||||
# minutes: 0
|
||||
# seconds: 0
|
||||
# then:
|
||||
# - deep_sleep.enter:
|
||||
# sleep_duration: 7h
|
||||
# Scheduled relay
|
||||
on_time:
|
||||
- hours: 7
|
||||
minutes: 30
|
||||
seconds: 0
|
||||
@@ -242,11 +218,6 @@ time:
|
||||
mode: auto
|
||||
target_temperature: 18°C
|
||||
|
||||
uart:
|
||||
# Set Nextion comms baud rate to 921600 bps
|
||||
- id: !extend tf_uart
|
||||
baud_rate: 9600
|
||||
|
||||
web_server:
|
||||
# Custom web server credentials
|
||||
auth:
|
||||
@@ -266,5 +237,4 @@ wifi:
|
||||
- ssid: !secret wifi_ssid_backup
|
||||
password: !secret wifi_password_backup
|
||||
priority: 0
|
||||
# Set Wi-Fi power save mode to "LIGHT" as required for Bluetooth on ESP32
|
||||
power_save_mode: LIGHT
|
||||
...
|
||||
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
|
||||
...
|
||||
@@ -1,11 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
#advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
#addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
@@ -1,11 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
#advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
#addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
@@ -1,11 +0,0 @@
|
||||
substitutions:
|
||||
device_name: nspanel
|
||||
wifi_ssid: "nspanel"
|
||||
wifi_password: "NSPanel_HA_Blueprint"
|
||||
nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy"
|
||||
|
||||
packages:
|
||||
core_package: !include ../nspanel_esphome.yaml # Core package
|
||||
#advanced_package: !include ../advanced/esphome/nspanel_esphome_advanced.yaml
|
||||
#addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml
|
||||
#addon_climate_cool: !include ../nspanel_esphome_addon_climate_cool.yaml
|
||||
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
|
||||
...
|
||||
@@ -1,3 +1,4 @@
|
||||
---
|
||||
api_encryption_key: MSANehPIH8kCp/vGcpPcKPSkYnv3zchyxkXCleXJinM=
|
||||
mysntpserver: 192.168.0.1
|
||||
web_server_password: NotASecret01
|
||||
@@ -5,3 +6,4 @@ web_server_username: NotASecret01
|
||||
wifi_password: NotASecret01
|
||||
wifi_password_backup: NotASecret01
|
||||
wifi_ssid_backup: NotASecret01
|
||||
...
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# https://yamllint.readthedocs.io/en/stable/configuration.html#default-configuration
|
||||
|
||||
extends: relaxed
|
||||
|
||||
rules:
|
||||
anchors:
|
||||
forbid-undeclared-aliases: true
|
||||
forbid-duplicated-anchors: true
|
||||
|
||||
# 255 chars should be enough, but don't fail if a line is longer
|
||||
line-length:
|
||||
max: 255
|
||||
level: warning
|
||||
116
README.md
116
README.md
@@ -1,16 +1,16 @@
|
||||
# NSPanel Custom with HA Blueprint
|
||||
|
||||
This innovative solution is designed to revolutionize how you interact with your Sonoff NSPanel.
|
||||
Our goal? To make the customization of your NSPanel seamless, intuitive, and completely code-free!
|
||||
|
||||
*Are you happy with our version for NSPanel? Please consider supporting us with a donation.*
|
||||
<br>[](https://www.paypal.com/donate/?hosted_button_id=S974SWQMB8PB2)
|
||||
|
||||
[](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)
|
||||
|
||||
[](https://github.com/Blackymas/NSPanel_HA_Blueprint/actions/workflows/validate_esphome.yml)
|
||||
[](https://github.com/Blackymas/NSPanel_HA_Blueprint/actions/workflows/validate_esphome_beta.yml)
|
||||
|
||||
# NSPanel Custom with HA Blueprint
|
||||
|
||||
This innovative solution is designed to revolutionize how you interact with your Sonoff NSPanel. Our goal? To make the customization of your NSPanel seamless, intuitive, and completely code-free!
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Project Highlights](#-project-highlights)
|
||||
2. [Documentation & Resources](#-documentation--resources)
|
||||
3. [Features](#-features)
|
||||
@@ -29,10 +29,10 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
|
||||
## 📚 Documentation & Resources
|
||||
|
||||
- **Getting Started:** Dive into our comprehensive [Documentation and Setup Guide](/docs/en/README.md) for detailed instructions.
|
||||
- **Video Tutorial:** Prefer visual learning? Check out our [Step-by-Step Setup Video](/docs/en/README.md).
|
||||
- **Troubleshooting:** Encounter an issue? Here's how to report it: [WIKI HowTo](/docs/en/README.md).
|
||||
- **Feature Requests:** Got ideas? Share them [here](/Blackymas/NSPanel_HA_Blueprint/labels/new%20feature%20request).
|
||||
- **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)
|
||||
|
||||
## 🚀 Features
|
||||
@@ -43,7 +43,7 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Buttons show current brightness and cover position in the button itself
|
||||
- Buttons label can be assigned via blueprint
|
||||
- Weather + 5 days weather forecast
|
||||
- Thermostat + Touch + [Relay control for floor heating](/docs/en/addon_climate.md)
|
||||
- Thermostat + Touch + [Relay control for floor heating](docs/addon_climate.md)
|
||||
- Light control (brightness, color and temperature) - via long Press
|
||||
- Cover control (open, close and position) - via long press
|
||||
- Settings page (display brightness, display dim brightness, sleep mode, reboot NSPanel)
|
||||
@@ -54,13 +54,12 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- 2 physical switches with optional fallback mode
|
||||
- and much more ;)
|
||||
|
||||
|
||||
## 📖 Pages Overview
|
||||
|
||||
|
||||
### Home
|
||||
|
||||

|
||||
<br>
|
||||
|
||||

|
||||
|
||||
- Current weather with button to Weather Forcast page
|
||||
@@ -73,23 +72,32 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Room humidity
|
||||
- Up to 3 user's selectable entities
|
||||
|
||||
|
||||
### Button Page
|
||||
### Buttons Pages
|
||||
|
||||

|
||||

|
||||
|
||||
- Up to 32 buttons
|
||||
- 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
|
||||
- Buttons show current brightness and cover position in the button itself
|
||||
- Buttons label can be assigned via blueprint
|
||||
- All buttons with long press function
|
||||
- Automatic detection by long press if it is a light, cover or climate for submenu
|
||||
- Swipe between all pages
|
||||
- Swipe also down and up for fast access to certain pages
|
||||
- Buttons display current brightness and cover position directly on the button
|
||||
- Button labels can be assigned via blueprint
|
||||
- All buttons feature a long-press function
|
||||
- Automatic detection of light, cover, fan, media player, alarm or climate entities for submenus through long press
|
||||
- Swipe between all 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
|
||||
|
||||

|
||||

|
||||

|
||||
@@ -100,8 +108,8 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Color temperature slider
|
||||
- Jump back to the right button page
|
||||
|
||||
|
||||
### Cover Settings
|
||||
|
||||

|
||||
|
||||
- Open and close cover
|
||||
@@ -109,29 +117,28 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Cover battery value (when available)
|
||||
- jump back to the right button page
|
||||
|
||||
|
||||
### Thermostat / Climate
|
||||
- Target temperature control slider
|
||||
|
||||
- Target temperature control slider
|
||||
- Current temperature
|
||||
- 4 user's selectable values (for water and external temperatures, etc.)
|
||||
- All the standard climate controls from Home Assistant (`heat`, `fan`, `cool`, `auto`, `dry`)
|
||||
- 2 user's selectable buttons
|
||||
- [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/en/addon_climate.md)
|
||||
- [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
|
||||
|
||||
- Turn-on and turn-off fan
|
||||
- Set speed via slider or buttons
|
||||
- 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)
|
||||
@@ -144,11 +151,10 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Thunderstorm probability
|
||||
- Wind speed
|
||||
|
||||
|
||||
### Display Settings
|
||||
|
||||

|
||||
<br>
|
||||
|
||||

|
||||
|
||||
- Restart NSPanel
|
||||
@@ -156,22 +162,27 @@ This innovative solution is designed to revolutionize how you interact with your
|
||||
- Display dim brightness slider
|
||||
|
||||
### Boot
|
||||

|
||||
<br>
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Home Assistant interface
|
||||
|
||||
## Device's page
|
||||
|
||||
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:
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 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:
|
||||

|
||||

|
||||
@@ -179,7 +190,6 @@ In your automations you use the blueprint's inputs to define what will be shown
|
||||

|
||||

|
||||
|
||||
|
||||
## 🚀 Contributing
|
||||
|
||||
- **Pull Requests:** Please direct all pull requests to the `DEV` branch, not the `main` branch.
|
||||
@@ -198,15 +208,15 @@ Join our vibrant community! Whether you're seeking support, wanting to contribut
|
||||
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
|
||||
|
||||
- [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
|
||||
|
||||
|
||||
844
ReleaseNotes.md
844
ReleaseNotes.md
@@ -1,87 +1,816 @@
|
||||
# v4.2 <= pending update
|
||||
# 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.
|
||||
|
||||
## Support this project
|
||||
And with a nice Utilities Dashboard as a bonus!!
|
||||
|
||||
### As always, we would like to thank everyone who donated to this project and remind you that every donation helps to support this project - so if you haven't made a donation yet, now would be a good time ;)
|
||||
Our dedication to refining the user experience and expanding customization options continues, with this release featuring:
|
||||
|
||||
[](https://www.paypal.com/donate/?hosted_button_id=S974SWQMB8PB2)
|
||||
- **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.
|
||||
|
||||
|
||||
## General <= pending update
|
||||
The focus this time was on making easier to transfer the TFT files.
|
||||
- **Comprehensive API Documentation**: Simplifying customization and integration for developers and users, enabling tailored experiences with detailed service documentation.
|
||||
|
||||
As this project grows with features, it becomes more hungry of resources from all sides (ESPHome, your Home Assistant server and even the Nextion display) and with that the chances of something going wrong when updating increased.
|
||||
- **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.
|
||||
|
||||
So at this release we concentrated on cleaning up de code everywhere and shave some unnecessary elements, making the system easier to install and opening some space for future features. But you still can find a couple of nice new things not related to the cleaning.
|
||||
- **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
|
||||
Updates may come with changes on the blueprint inputs and we highly recommend you review your settings and make sure all fields have the correct selection. We did our best to support your legacy settings and avoid breaking your system, but please double check your settings if you see something not working as expected.
|
||||
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).
|
||||
|
||||
### Files that need to be reloaded:
|
||||
1. nspanel_eu.tft, nspanel_us.tft or nspanel_us_land.tft - v4.2
|
||||
2. nspanel_esphome.yaml - v4.2
|
||||
3. nspanel_blueprint.yaml - v4.2
|
||||
## 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).
|
||||
|
||||
### Instructions
|
||||
_You can find the update procedures following here:_
|
||||
- [(EN) How To - All important thing you should know - Update](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(EN)-HowTo---All-important-thing-you-should-know#2-update-blueprint)
|
||||
- [(DE) How To - Alle wichtigen Dinge die man wissen sollte - Update](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#2-update-blueprint)
|
||||
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.
|
||||
|
||||
|
||||
## Breaking changes
|
||||
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.
|
||||
|
||||
1. Service `esphome.xxxxx_set_component_color` parameter `background` is deprecated.
|
||||
2. Due to the additional custom buttons, the other buttons on home page changed their positions.
|
||||
3. The Wi-Fi power save mode is back to "NONE" as default.<br>
|
||||
This was the default until v4.0, but we changed on v4.1 to support Bluetooth components, however as this is not used by the majority of users, we are reverting back to the original setting. You can (and should if you want use Bluetooth) enforce other mode as a customization, like in the example bellow:
|
||||
```yaml
|
||||
##### My customization - Start #####
|
||||
# Enable Bluetooth proxy
|
||||
bluetooth_proxy:
|
||||
# Set Wi-Fi power save mode to "LIGHT" as required for Bluetooth on ESP32
|
||||
wifi:
|
||||
power_save_mode: LIGHT
|
||||
##### My customization - End #####
|
||||
```
|
||||
4. Default baud rate for advanced mode is back to 115200 bps, to avoid issues when creating buttons pages.
|
||||
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
|
||||
1. Standardized entity's icons
|
||||
2. Additional custom buttons on Home page
|
||||
3. Outdoor temperature selectable font size
|
||||
- [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.
|
||||
|
||||
### 1. Standardized entity's icons
|
||||
The engine for defining the icons to be shown and it's color was standardize between all the pages, so now you may see a more consistent User's Interface.
|
||||
For more information, visit our [discussion](https://github.com/Blackymas/NSPanel_HA_Blueprint/discussions/1756).
|
||||
|
||||
|
||||
### 2. Additional custom buttons on Home page
|
||||
It's that simple, now you have 6 buttons where used to be 3. 😉
|
||||
### 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.
|
||||
|
||||
|
||||
### 3. Outdoor temperature selectable font size
|
||||
Now you can select the font size of your outdoor temperature display:
|
||||
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:
|
||||
|
||||
> Important: Long text with bigger fonts may exceed the limit of space reserved for this with incomplete information shown.
|
||||

|
||||
|
||||
|
||||
## Next topics we are currently working on
|
||||
See here: https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap
|
||||
#### 72px
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
## Special thanks to:
|
||||
### 112px
|
||||

|
||||

|
||||
|
||||
## New Contributors
|
||||
|
||||
### 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)
|
||||
@@ -103,4 +832,3 @@ See here: https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap
|
||||
- [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)
|
||||
- [v1.0.1 Blueprint](https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/latest)
|
||||
|
||||
15
advanced/.gitignore
vendored
15
advanced/.gitignore
vendored
@@ -1,15 +0,0 @@
|
||||
# Ignore Mac DS_Store files
|
||||
.DS_Store
|
||||
**/.DS_Store
|
||||
|
||||
Nextion2Text.*
|
||||
*.cmd
|
||||
*.bat
|
||||
|
||||
# Ignore IntelliJ IDEA project directory
|
||||
.idea
|
||||
|
||||
# Ignore dev folder
|
||||
dev
|
||||
|
||||
nspanel_esphome_prebuilt.yaml
|
||||
@@ -1,149 +0,0 @@
|
||||
#####################################################################################################
|
||||
##### NSPANEL ESPHOME created by Blackymas - https://github.com/Blackymas/NSPanel_HA_Blueprint #####
|
||||
##### ESPHome Add-on for Climate control - Shared - This will be called by heat/cool #####
|
||||
##### PLEASE only make changes if it is necessary and also the required knowledge is available. #####
|
||||
##### For normal use with the Blueprint, no changes are necessary. #####
|
||||
#####################################################################################################
|
||||
##### ATTENTION: This will add climate elements to the core system and requires the core part. #####
|
||||
#####################################################################################################
|
||||
|
||||
substitutions:
|
||||
### Local thermostat defaults ###
|
||||
# https://esphome.io/components/climate/thermostat.html
|
||||
temp_units: "°C"
|
||||
heater_relay: "0" # Select 1 for "Relay 1", 2 for "Relay 2" or "0" to a dummy switch/disabled
|
||||
cooler_relay: "0" # Select 1 for "Relay 1", 2 for "Relay 2" or "0" to a dummy switch/disabled
|
||||
min_off_time: "300"
|
||||
min_run_time: "300"
|
||||
min_idle_time: "30"
|
||||
# https://esphome.io/components/climate/index.html#base-climate-configuration
|
||||
temp_min: "5"
|
||||
temp_max: "45"
|
||||
temp_step: "0.5"
|
||||
|
||||
##### DO NOT CHANGE THIS #####
|
||||
addon_climate_cool: "false"
|
||||
addon_climate_heat: "false"
|
||||
##############################
|
||||
|
||||
climate:
|
||||
- platform: thermostat
|
||||
name: ${device_name} Thermostat
|
||||
id: thermostat_embedded
|
||||
sensor: temp_nspanel
|
||||
min_idle_time: ${min_idle_time}s
|
||||
visual:
|
||||
min_temperature: ${temp_min} ${temp_units}
|
||||
max_temperature: ${temp_max} ${temp_units}
|
||||
#temperature_step: ${temp_step} ${temp_units}
|
||||
temperature_step:
|
||||
target_temperature: 0.5 #This is hard coded for now as ESPHome isn't supporting a substitution here. In contact with support.
|
||||
current_temperature: 0.1
|
||||
idle_action:
|
||||
- switch.turn_off: relay_${heater_relay}
|
||||
default_preset: "Off"
|
||||
on_boot_restore_from: memory
|
||||
internal: false
|
||||
on_state:
|
||||
- logger.log: Climate state changed - Start
|
||||
- script.execute: addon_climate_update_page_climate
|
||||
- script.execute: addon_climate_update_page_home
|
||||
- logger.log: Climate state changed - End
|
||||
|
||||
globals:
|
||||
##### Is embedded thermostat visible on climate page? #####
|
||||
- id: is_addon_climate_visible
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: 'false'
|
||||
##### Embeded climate friendly name #####
|
||||
- id: addon_climate_friendly_name
|
||||
type: std::string
|
||||
restore_value: false
|
||||
initial_value: '"${device_name} Thermostat"'
|
||||
|
||||
switch:
|
||||
##### PHYSICAL SWITCH 0 (Dummy) - Used when relay is not set #####
|
||||
- name: ${device_name} Relay 0 (dummy)
|
||||
platform: template
|
||||
id: relay_0
|
||||
lambda: !lambda return false;
|
||||
internal: true
|
||||
optimistic: true
|
||||
|
||||
script:
|
||||
- id: !extend addon_climate_update_page_home
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
// Update home.climate_entity variable
|
||||
detailed_entity->publish_state((id(is_embedded_thermostat)) ? "embedded_climate" : "");
|
||||
disp1->set_component_value("climate.embedded", (id(is_embedded_thermostat)) ? 1 : 0);
|
||||
// Update chips
|
||||
if (id(is_embedded_thermostat))
|
||||
id(update_climate_icon).execute("home.icon_top_03", int(thermostat_embedded->action), int(thermostat_embedded->mode));
|
||||
|
||||
- id: !extend addon_climate_service_call
|
||||
then:
|
||||
- lambda: |-
|
||||
id(is_addon_climate_visible) = true;
|
||||
disp1->set_component_value("climate.embedded", 1);
|
||||
auto call = thermostat_embedded->make_call();
|
||||
if (key == "set_temperature")
|
||||
call.set_target_temperature(stof(value) / 10);
|
||||
else if (key == "hvac_mode")
|
||||
call.set_mode(value);
|
||||
call.perform();
|
||||
|
||||
- id: !extend addon_climate_set_climate
|
||||
then:
|
||||
- lambda: |-
|
||||
id(is_addon_climate_visible) = embedded_climate;
|
||||
|
||||
- id: !extend addon_climate_update_page_climate
|
||||
then:
|
||||
- lambda: |-
|
||||
if (current_page->state == "climate" and id(is_addon_climate_visible))
|
||||
{
|
||||
disp1->set_component_text_printf("page_label", id(addon_climate_friendly_name).c_str());
|
||||
float temp_step = ${temp_step};
|
||||
float temp_offset = ${temp_min};
|
||||
float temp_max = ${temp_max};
|
||||
float total_steps = (temp_max-temp_offset)/temp_step;
|
||||
set_climate->execute
|
||||
(
|
||||
thermostat_embedded->current_temperature, // current_temp
|
||||
thermostat_embedded->target_temperature, // target_temp
|
||||
int(round(${temp_step}*10)), // temp_step
|
||||
int(round(total_steps)), // total_steps //int(round((10*thermostat_embedded->target_temperature-temp_offset)/temp_step)), // slider_val
|
||||
int(round(${temp_min}*10)), // temp_offset
|
||||
"", // climate_icon
|
||||
true // embedded_climate
|
||||
);
|
||||
|
||||
// Update target temp icon
|
||||
update_climate_icon->execute("climate.target_icon", int(thermostat_embedded->action), int(thermostat_embedded->mode));
|
||||
|
||||
// Update buttons bar
|
||||
// Hide not supported hotspots
|
||||
disp1->hide_component("button01");
|
||||
disp1->hide_component("button02");
|
||||
if (${addon_climate_heat}) disp1->show_component("button03"); else disp1->hide_component("button03"); //Heat
|
||||
if (${addon_climate_cool}) disp1->show_component("button04"); else disp1->hide_component("button04"); //Cool
|
||||
disp1->hide_component("button05");
|
||||
disp1->hide_component("button06");
|
||||
disp1->show_component("button07"); //Off
|
||||
// Set buttons colors
|
||||
disp1->set_component_font_color("climate.button01", 6339);
|
||||
disp1->set_component_font_color("climate.button02", 6339);
|
||||
disp1->set_component_font_color("climate.button03", (thermostat_embedded->mode==climate::CLIMATE_MODE_HEAT) ? 64164 : ((${addon_climate_heat}) ? 48631 : 6339));
|
||||
disp1->set_component_font_color("climate.button04", (thermostat_embedded->mode==climate::CLIMATE_MODE_COOL) ? 1055 : ((${addon_climate_cool}) ? 48631 : 6339));
|
||||
disp1->set_component_font_color("climate.button05", 6339);
|
||||
disp1->set_component_font_color("climate.button06", 6339);
|
||||
disp1->set_component_font_color("climate.button07", (thermostat_embedded->mode==climate::CLIMATE_MODE_OFF) ? 10597 : 35921);
|
||||
}
|
||||
|
||||
- id: !extend addon_climate_set_climate_friendly_name
|
||||
then:
|
||||
- lambda: |-
|
||||
id(addon_climate_friendly_name) = friendly_name;
|
||||
@@ -1,948 +0,0 @@
|
||||
#####################################################################################################
|
||||
##### NSPANEL ESPHOME created by Blackymas - https://github.com/Blackymas/NSPanel_HA_Blueprint #####
|
||||
##### TFT Upload engine #####
|
||||
##### PLEASE only make changes if it is necessary and also the required knowledge is available. #####
|
||||
##### For normal use with the Blueprint, no changes are necessary. #####
|
||||
#####################################################################################################
|
||||
##### ATTENTION: This will add advanced elements to the core system and requires the core part. #####
|
||||
#####################################################################################################
|
||||
|
||||
substitutions:
|
||||
|
||||
################## Defaults ##################
|
||||
# Just in case user forgets to set something #
|
||||
nextion_update_url: "http://github.com/Blackymas/NSPanel_HA_Blueprint/raw/main/custom_configuration/nspanel_eu.tft"
|
||||
nextion_blank_url: "http://github.com/Blackymas/NSPanel_HA_Blueprint/raw/main/custom_configuration/nspanel_blank.tft"
|
||||
##############################################
|
||||
|
||||
##### DON'T CHANGE THIS #####
|
||||
upload_tft_chunk_size_max: "32768"
|
||||
#############################
|
||||
|
||||
#external_components:
|
||||
# - source: github://pr#3256 # adds esp-idf support to http_request
|
||||
# components:
|
||||
# - http_request
|
||||
# - source: github://pr#5910
|
||||
# components:
|
||||
# - nextion
|
||||
# - uart
|
||||
# refresh: 1s
|
||||
|
||||
##### HTTP REQUEST #####
|
||||
# Enables http client #
|
||||
# for upload_tft. #
|
||||
########################
|
||||
#http_request:
|
||||
# id: httpclient
|
||||
|
||||
api:
|
||||
services:
|
||||
##### SERVICE TO UPDATE THE TFT FILE from URL #####
|
||||
##### It will use the default url if url is empty or "default"
|
||||
- service: upload_tft_url
|
||||
variables:
|
||||
url: string
|
||||
then:
|
||||
- lambda: |-
|
||||
static const char *const TAG = "service.upload_tft_url";
|
||||
ESP_LOGVV(TAG, "Starting...");
|
||||
|
||||
std::string clean_url = url;
|
||||
// Convert to lowercase
|
||||
std::transform(clean_url.begin(), clean_url.end(), clean_url.begin(),
|
||||
[](unsigned char c){ return std::tolower(c); });
|
||||
// Trim trailing spaces
|
||||
auto endPos = clean_url.find_last_not_of(" \t");
|
||||
if (std::string::npos != endPos) {
|
||||
clean_url = clean_url.substr(0, endPos + 1);
|
||||
}
|
||||
|
||||
if ( clean_url.empty() or clean_url == "default") url = tft_list->state;
|
||||
upload_tft->execute(url.c_str());
|
||||
|
||||
button:
|
||||
##### UPDATE TFT DISPLAY #####
|
||||
- name: ${device_name} Update TFT display
|
||||
platform: template
|
||||
icon: mdi:file-sync
|
||||
id: tft_update
|
||||
entity_category: config
|
||||
on_press:
|
||||
- lambda: |-
|
||||
static const char *const TAG = "button.tft_update.on_press";
|
||||
ESP_LOGD(TAG, "Update TFT display button pressed");
|
||||
upload_tft->execute(tft_list->state.c_str());
|
||||
|
||||
display:
|
||||
- id: !extend disp1
|
||||
tft_url: ${nextion_update_url}
|
||||
|
||||
script:
|
||||
- id: upload_tft_nextion #NOT IN USE FOR NOW
|
||||
mode: single
|
||||
parameters:
|
||||
url: string
|
||||
then:
|
||||
- lambda: |-
|
||||
static const char *const TAG = "script.upload_tft_new";
|
||||
ESP_LOGVV(TAG, "Starting...");
|
||||
nextion_status->execute();
|
||||
|
||||
auto delay_seconds_ = [](int seconds) {
|
||||
ESP_LOGD(TAG, "Wait %i seconds", seconds);
|
||||
for (int i = 0; i < (seconds*4); i++) {
|
||||
#ifdef ARDUINO
|
||||
delay(250);
|
||||
#elif defined(USE_ESP_IDF)
|
||||
vTaskDelay(pdMS_TO_TICKS(250));
|
||||
#endif
|
||||
App.feed_wdt();
|
||||
}
|
||||
};
|
||||
|
||||
std::string framework = "Unknown";
|
||||
#ifdef ARDUINO
|
||||
framework = "Arduino";
|
||||
#elif defined(ESP_PLATFORM)
|
||||
framework = "ESP-IDF";
|
||||
#endif
|
||||
|
||||
if (disp1->is_setup()) {
|
||||
disp1->set_backlight_brightness(1);
|
||||
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
|
||||
disp1->set_component_text_printf("confirm.body", "Preparing...");
|
||||
disp1->goto_page("confirm");
|
||||
disp1->hide_component("bt_close");
|
||||
disp1->hide_component("bt_accept");
|
||||
disp1->hide_component("bt_clear");
|
||||
disp1->hide_component("bt_close");
|
||||
App.feed_wdt();
|
||||
delay_seconds_(1);
|
||||
display_wrapped_text->execute("confirm.body", "Informing the blueprint that panel is unavailable...", 18);
|
||||
disp1->hide_component("bt_close");
|
||||
App.feed_wdt();
|
||||
}
|
||||
nextion_init->publish_state(false);
|
||||
App.feed_wdt();
|
||||
if (disp1->is_setup()) {
|
||||
delay_seconds_(1);
|
||||
display_wrapped_text->execute("confirm.body", "Stopping scripts...", 18);
|
||||
App.feed_wdt();
|
||||
}
|
||||
stop_all->execute();
|
||||
if (disp1->is_setup()) delay_seconds_(1);
|
||||
App.feed_wdt();
|
||||
|
||||
ESP_LOGD(TAG, "Try #1 at 921600 bps");
|
||||
nextion_status->execute();
|
||||
if (disp1->is_setup()) {
|
||||
display_wrapped_text->execute("confirm.body", "Try #1 at 921600 bps", 18);
|
||||
App.feed_wdt();
|
||||
delay_seconds_(1);
|
||||
}
|
||||
//if (disp1->upload_tft(921600)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #1 failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #1 failed", 18);
|
||||
App.feed_wdt();
|
||||
delay_seconds_(5);
|
||||
ESP_LOGD(TAG, "Try #2 at 921600 bps");
|
||||
nextion_status->execute();
|
||||
App.feed_wdt();
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #2 at 921600 bps", 18);
|
||||
//if (disp1->upload_tft(921600)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #2 failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #2 failed", 18);
|
||||
App.feed_wdt();
|
||||
delay_seconds_(5);
|
||||
ESP_LOGD(TAG, "Try #3 at 115200 bps");
|
||||
nextion_status->execute();
|
||||
App.feed_wdt();
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #3 at 115200 bps", 18);
|
||||
//if (disp1->upload_tft(115200)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #3 failed");
|
||||
App.feed_wdt();
|
||||
if (disp1->is_setup()) {
|
||||
display_wrapped_text->execute("confirm.body", "Try #3 failed. Restarting display.", 18);
|
||||
App.feed_wdt();
|
||||
delay_seconds_(3);
|
||||
}
|
||||
ESP_LOGD(TAG, "Turn off Nextion");
|
||||
id(screen_power).turn_off();
|
||||
delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn on Nextion");
|
||||
id(screen_power).turn_on();
|
||||
delay_seconds_(10);
|
||||
App.feed_wdt();
|
||||
ESP_LOGD(TAG, "Try #4 at 115200 bps");
|
||||
nextion_status->execute();
|
||||
if (disp1->is_setup()) {
|
||||
disp1->set_backlight_brightness(1);
|
||||
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
|
||||
display_wrapped_text->execute("confirm.body", "Try #4 at 115200 bps", 18);
|
||||
disp1->goto_page("confirm");
|
||||
disp1->hide_component("bt_close");
|
||||
disp1->hide_component("bt_accept");
|
||||
disp1->hide_component("bt_clear");
|
||||
disp1->hide_component("bt_close");
|
||||
App.feed_wdt();
|
||||
delay_seconds_(1);
|
||||
}
|
||||
//if (disp1->upload_tft(115200)) id(restart_nspanel).press();
|
||||
ESP_LOGE(TAG, "TFT upload failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "TFT upload failed", 18);
|
||||
if (disp1->is_setup()) delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn off Nextion");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Restarting...", 18);
|
||||
if (disp1->is_setup()) delay_seconds_(2);
|
||||
id(screen_power).turn_off();
|
||||
delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn on Nextion");
|
||||
id(screen_power).turn_on();
|
||||
ESP_LOGD(TAG, "Restarting ESPHome");
|
||||
delay_seconds_(2);
|
||||
id(restart_nspanel).press();
|
||||
|
||||
ESP_LOGD(TAG, "Finished!");
|
||||
|
||||
- id: upload_tft
|
||||
mode: single
|
||||
parameters:
|
||||
url: string
|
||||
then:
|
||||
- lambda: |-
|
||||
static const char *const TAG = "script.upload_tft";
|
||||
ESP_LOGD(TAG, "Starting...");
|
||||
|
||||
auto delay_seconds_ = [](int seconds) {
|
||||
ESP_LOGD(TAG, "Wait %i seconds", seconds);
|
||||
for (int i = 0; i < (seconds*4); i++) {
|
||||
#ifdef ARDUINO
|
||||
delay(250);
|
||||
#elif defined(USE_ESP_IDF)
|
||||
vTaskDelay(pdMS_TO_TICKS(250));
|
||||
#endif
|
||||
App.feed_wdt();
|
||||
}
|
||||
};
|
||||
|
||||
std::string framework = "Unknown";
|
||||
#ifdef ARDUINO
|
||||
framework = "Arduino";
|
||||
#elif defined(ESP_PLATFORM)
|
||||
framework = "ESP-IDF";
|
||||
#endif
|
||||
|
||||
if (disp1->is_setup()) {
|
||||
disp1->set_backlight_brightness(1);
|
||||
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
|
||||
disp1->set_component_text_printf("confirm.body", "Preparing...");
|
||||
disp1->goto_page("confirm");
|
||||
disp1->hide_component("bt_close");
|
||||
disp1->hide_component("bt_accept");
|
||||
disp1->hide_component("bt_clear");
|
||||
disp1->hide_component("bt_close");
|
||||
delay_seconds_(1);
|
||||
display_wrapped_text->execute("confirm.body", "Informing the blueprint that panel is unavailable...", 18);
|
||||
disp1->hide_component("bt_close");
|
||||
}
|
||||
nextion_init->publish_state(false);
|
||||
if (disp1->is_setup()) {
|
||||
delay_seconds_(1);
|
||||
display_wrapped_text->execute("confirm.body", "Stopping scripts...", 18);
|
||||
}
|
||||
stop_all->execute();
|
||||
if (disp1->is_setup()) delay_seconds_(1);
|
||||
|
||||
std::vector<uint8_t> buffer_;
|
||||
|
||||
bool is_updating_ = false;
|
||||
|
||||
bool upload_first_chunk_sent_ = false;
|
||||
|
||||
int content_length_ = 0;
|
||||
int tft_size_ = 0;
|
||||
|
||||
auto set_baud_rate_ = [](int baud_rate) {
|
||||
#ifdef USE_ARDUINO
|
||||
auto *uart = reinterpret_cast<uart::ESP32ArduinoUARTComponent *>(tf_uart);
|
||||
#endif
|
||||
#ifdef USE_ESP_IDF
|
||||
auto *uart = reinterpret_cast<uart::IDFUARTComponent *>(tf_uart);
|
||||
#endif
|
||||
uart->set_baud_rate(baud_rate);
|
||||
uart->setup();
|
||||
};
|
||||
|
||||
auto send_nextion_command = [](const std::string &command) -> bool
|
||||
{
|
||||
static const char *const TAG = "script.upload_tft.send_nextion_command";
|
||||
ESP_LOGD(TAG, "Sending: %s", command.c_str());
|
||||
id(tf_uart).write_str(command.c_str());
|
||||
const uint8_t to_send[3] = {0xFF, 0xFF, 0xFF};
|
||||
id(tf_uart).write_array(to_send, sizeof(to_send));
|
||||
return true;
|
||||
};
|
||||
|
||||
auto recv_ret_string_ = [](std::string &response, uint32_t timeout, bool recv_flag) -> uint16_t
|
||||
{
|
||||
static const char *const TAG = "script.upload_tft.recv_ret_string_";
|
||||
uint16_t ret;
|
||||
uint8_t c = 0;
|
||||
uint8_t nr_of_ff_bytes = 0;
|
||||
uint64_t start;
|
||||
bool exit_flag = false;
|
||||
bool ff_flag = false;
|
||||
|
||||
start = millis();
|
||||
|
||||
while ((timeout == 0 && id(tf_uart).available()) || millis() - start <= timeout)
|
||||
{
|
||||
if (!id(tf_uart).available())
|
||||
{
|
||||
App.feed_wdt();
|
||||
continue;
|
||||
}
|
||||
|
||||
id(tf_uart).read_byte(&c);
|
||||
if (c == 0xFF)
|
||||
{
|
||||
nr_of_ff_bytes++;
|
||||
}
|
||||
else
|
||||
{
|
||||
nr_of_ff_bytes = 0;
|
||||
ff_flag = false;
|
||||
}
|
||||
|
||||
if (nr_of_ff_bytes >= 3)
|
||||
ff_flag = true;
|
||||
|
||||
response += (char) c;
|
||||
if (recv_flag)
|
||||
{
|
||||
if (response.find(0x05) != std::string::npos)
|
||||
{
|
||||
exit_flag = true;
|
||||
}
|
||||
}
|
||||
App.feed_wdt();
|
||||
delay(2);
|
||||
|
||||
if (exit_flag || ff_flag)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ff_flag)
|
||||
response = response.substr(0, response.length() - 3); // Remove last 3 0xFF
|
||||
|
||||
ret = response.length();
|
||||
return ret;
|
||||
};
|
||||
|
||||
auto upload_end_ = [&](bool completed) -> bool
|
||||
{
|
||||
static const char *const TAG = "script.upload_tft.upload_end_";
|
||||
ESP_LOGD(TAG, "Completed: %i", completed ? 1 : 0);
|
||||
//ESP_LOGD(TAG, "Restarting Nextion");
|
||||
//send_nextion_command("rest");
|
||||
#ifdef ARDUINO
|
||||
delay(1500);
|
||||
#elif defined(ESP_PLATFORM)
|
||||
//vTaskDelay(pdMS_TO_TICKS(1500));
|
||||
#endif
|
||||
|
||||
is_updating_ = false;
|
||||
if (!completed) ESP_LOGD(TAG, "Nextion TFT upload will try again");
|
||||
return completed;
|
||||
};
|
||||
|
||||
#ifdef ARDUINO // arduino # To do: Move to Nextion component on ESPHome
|
||||
size_t transfer_buffer_size_ = 0;
|
||||
uint8_t *transfer_buffer_{nullptr};
|
||||
auto upload_by_chunks_arduino = [&](HTTPClient *http, const std::string &url, int range_start) -> int
|
||||
{
|
||||
static const char *const TAG = "script.upload_tft.upload_by_chunks_arduino";
|
||||
int range_end;
|
||||
|
||||
if (range_start == 0 && transfer_buffer_size_ > 16384) { // Start small at the first run in case of a big skip
|
||||
range_end = 16384 - 1;
|
||||
} else {
|
||||
range_end = range_start + transfer_buffer_size_ - 1;
|
||||
}
|
||||
|
||||
if (range_end > tft_size_)
|
||||
range_end = tft_size_;
|
||||
|
||||
char range_header[64];
|
||||
sprintf(range_header, "bytes=%d-%d", range_start, range_end);
|
||||
|
||||
ESP_LOGD(TAG, "Requesting range: %s", range_header);
|
||||
|
||||
int tries = 1;
|
||||
int code;
|
||||
bool begin_status;
|
||||
while (tries <= 10) {
|
||||
begin_status = http->begin(url.c_str());
|
||||
|
||||
++tries;
|
||||
if (!begin_status) {
|
||||
ESP_LOGD(TAG, "Connection failed");
|
||||
delay(1000);
|
||||
continue;
|
||||
};
|
||||
|
||||
http->addHeader("Range", range_header);
|
||||
|
||||
code = http->GET();
|
||||
if (code == 200 || code == 206) {
|
||||
break;
|
||||
}
|
||||
ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Error: %s, retries(%d/10)", url.c_str(),
|
||||
HTTPClient::errorToString(code).c_str(), tries);
|
||||
http->end();
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
if (tries > 10) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string recv_string;
|
||||
size_t size;
|
||||
int fetched = 0;
|
||||
int range = range_end - range_start;
|
||||
int write_len;
|
||||
|
||||
// fetch next segment from HTTP stream
|
||||
while (fetched < range) {
|
||||
size = http->getStreamPtr()->available();
|
||||
if (!size) {
|
||||
App.feed_wdt();
|
||||
delay(2);
|
||||
continue;
|
||||
}
|
||||
int c = http->getStreamPtr()->readBytes(
|
||||
&transfer_buffer_[fetched], ((size > transfer_buffer_size_) ? transfer_buffer_size_ : size));
|
||||
fetched += c;
|
||||
}
|
||||
http->end();
|
||||
ESP_LOGD(TAG, "Fetched %d bytes", fetched);
|
||||
|
||||
// upload fetched segments to the display in 4KB chunks
|
||||
for (int i = 0; i < range; i += 4096) {
|
||||
App.feed_wdt();
|
||||
write_len = content_length_ < 4096 ? content_length_ : 4096;
|
||||
id(tf_uart).write_array(&transfer_buffer_[i], write_len);
|
||||
content_length_ -= write_len;
|
||||
ESP_LOGD(TAG, "Uploaded %0.1f %%, remaining %d bytes, heap: %d",
|
||||
100.0 * (tft_size_ - content_length_) / tft_size_,
|
||||
content_length_, ESP.getFreeHeap());
|
||||
|
||||
if (!upload_first_chunk_sent_) {
|
||||
upload_first_chunk_sent_ = true;
|
||||
delay(500);
|
||||
}
|
||||
|
||||
recv_ret_string_(recv_string, 5000, true);
|
||||
if (recv_string[0] != 0x05) { // 0x05 == "ok"
|
||||
ESP_LOGD(TAG, "recv_string [%s]",
|
||||
format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
|
||||
}
|
||||
|
||||
// handle partial upload request
|
||||
if (recv_string[0] == 0x08 && recv_string.size() == 5) {
|
||||
uint32_t result = 0;
|
||||
for (int j = 0; j < 4; ++j) {
|
||||
result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
|
||||
}
|
||||
if (result > 0) {
|
||||
ESP_LOGD(TAG, "Nextion reported new range %d", result);
|
||||
content_length_ = tft_size_ - result;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
recv_string.clear();
|
||||
}
|
||||
return range_end + 1;
|
||||
};
|
||||
auto upload_tft_ = [&](const std::string &url, unsigned int update_baud_rate_) -> bool
|
||||
{
|
||||
static const char *const TAG = "script.upload_tft.upload_tft_arduino";
|
||||
ESP_LOGD(TAG, "Nextion TFT upload requested");
|
||||
ESP_LOGD(TAG, " url: %s", url.c_str());
|
||||
ESP_LOGD(TAG, " baud_rate: %i", update_baud_rate_);
|
||||
|
||||
if (is_updating_) {
|
||||
ESP_LOGD(TAG, "Currently updating");
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
if (!network::is_connected()) {
|
||||
ESP_LOGD(TAG, "Network is not connected");
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
if (!disp1->is_setup()) {
|
||||
ESP_LOGD(TAG, "Setting Nextion protocol reparse mode to passive");
|
||||
exit_reparse->execute();
|
||||
delay_seconds_(5);
|
||||
}
|
||||
|
||||
is_updating_ = true;
|
||||
|
||||
HTTPClient http;
|
||||
http.setTimeout(15000); // Yes 15 seconds.... Helps 8266s along
|
||||
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
|
||||
bool begin_status = http.begin(url.c_str());
|
||||
if (!begin_status) {
|
||||
is_updating_ = false;
|
||||
ESP_LOGD(TAG, "Connection failed");
|
||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||
allocator.deallocate(transfer_buffer_, transfer_buffer_size_);
|
||||
return upload_end_(false);
|
||||
} else {
|
||||
ESP_LOGD(TAG, "Connected");
|
||||
}
|
||||
|
||||
http.addHeader("Range", "bytes=0-255");
|
||||
const char *header_names[] = {"Content-Range"};
|
||||
http.collectHeaders(header_names, 1);
|
||||
ESP_LOGD(TAG, "Requesting URL: %s", url.c_str());
|
||||
|
||||
http.setReuse(true);
|
||||
// try up to 5 times. DNS sometimes needs a second try or so
|
||||
int tries = 1;
|
||||
int code = http.GET();
|
||||
delay(100);
|
||||
|
||||
while (code != 200 && code != 206 && tries <= 5) {
|
||||
ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Error: %s, retrying (%d/5)", url.c_str(),
|
||||
HTTPClient::errorToString(code).c_str(), tries);
|
||||
|
||||
delay(250);
|
||||
code = http.GET();
|
||||
++tries;
|
||||
}
|
||||
|
||||
if ((code != 200 && code != 206) || tries > 5) {
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
String content_range_string = http.header("Content-Range");
|
||||
content_range_string.remove(0, 12);
|
||||
content_length_ = content_range_string.toInt();
|
||||
tft_size_ = content_length_;
|
||||
http.end();
|
||||
|
||||
if (content_length_ < 4096) {
|
||||
ESP_LOGE(TAG, "Failed to get file size");
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Updating Nextion");
|
||||
// The Nextion will ignore the update command if it is sleeping
|
||||
|
||||
char command[128];
|
||||
// Tells the Nextion the content length of the tft file and baud rate it will be sent at
|
||||
// Once the Nextion accepts the command it will wait until the file is successfully uploaded
|
||||
// If it fails for any reason a power cycle of the display will be needed
|
||||
sprintf(command, "whmi-wris %d,%d,1", content_length_, update_baud_rate_);
|
||||
|
||||
ESP_LOGD(TAG, "Clear serial receive buffer: %d", id(tf_uart).available());
|
||||
// Clear serial receive buffer
|
||||
uint8_t d;
|
||||
while (id(tf_uart).available()) {
|
||||
id(tf_uart).read_byte(&d);
|
||||
};
|
||||
|
||||
send_nextion_command(command);
|
||||
|
||||
if (update_baud_rate_ != id(tf_uart).get_baud_rate()) {
|
||||
set_baud_rate_(update_baud_rate_);
|
||||
//id(tf_uart).set_baud_rate(update_baud_rate_);
|
||||
//id(tf_uart).setup();
|
||||
//delay_seconds_(2);
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Waiting for upgrade response");
|
||||
std::string response;
|
||||
recv_ret_string_(response, 5000, true); // This can take some time to return
|
||||
// The Nextion display will, if it's ready to accept data, send a 0x05 byte.
|
||||
ESP_LOGD(TAG, "Upgrade response is [%s]",
|
||||
format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str());
|
||||
|
||||
if (response.find(0x05) != std::string::npos) {
|
||||
ESP_LOGD(TAG, "Preparation for tft update done");
|
||||
} else {
|
||||
ESP_LOGD(TAG, "Preparation for tft update failed %d \"%s\"", response[0], response.c_str());
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
// Nextion wants 4096 bytes at a time. Make chunk_size a multiple of 4096
|
||||
uint32_t chunk_size = 8192;
|
||||
if (ESP.getFreeHeap() > 81920) { // Ensure some FreeHeap to other things and limit chunk size
|
||||
chunk_size = ESP.getFreeHeap() - 65536;
|
||||
chunk_size = int(chunk_size / 4096) * 4096;
|
||||
chunk_size = chunk_size > ${upload_tft_chunk_size_max} ? ${upload_tft_chunk_size_max} : chunk_size;
|
||||
} else if (ESP.getFreeHeap() < 32768) {
|
||||
chunk_size = 4096;
|
||||
}
|
||||
|
||||
if (transfer_buffer_ == nullptr) {
|
||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||
ESP_LOGD(TAG, "Allocating buffer size %d, Heap size is %" PRIu32, chunk_size, ESP.getFreeHeap());
|
||||
transfer_buffer_ = allocator.allocate(chunk_size);
|
||||
if (transfer_buffer_ == nullptr) { // Try a smaller size
|
||||
ESP_LOGD(TAG, "Could not allocate buffer size: %d trying 4096 instead", chunk_size);
|
||||
chunk_size = 4096;
|
||||
ESP_LOGD(TAG, "Allocating %d buffer", chunk_size);
|
||||
transfer_buffer_ = allocator.allocate(chunk_size);
|
||||
|
||||
if (!transfer_buffer_)
|
||||
{
|
||||
return upload_end_(false);
|
||||
}
|
||||
}
|
||||
|
||||
transfer_buffer_size_ = chunk_size;
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Updating tft from \"%s\" with a file size of %d using %zu chunksize, Heap Size %" PRIu32,
|
||||
url.c_str(), content_length_, transfer_buffer_size_, ESP.getFreeHeap());
|
||||
|
||||
int result = 0;
|
||||
while (content_length_ > 0) {
|
||||
result = upload_by_chunks_arduino(&http, url, result);
|
||||
if (result < 0) {
|
||||
ESP_LOGD(TAG, "Error updating Nextion!");
|
||||
return upload_end_(false);
|
||||
}
|
||||
App.feed_wdt();
|
||||
ESP_LOGD(TAG, "Heap Size %" PRIu32 ", Bytes left %d", ESP.getFreeHeap(), content_length_);
|
||||
}
|
||||
is_updating_ = false;
|
||||
ESP_LOGD(TAG, "Successfully updated Nextion!");
|
||||
|
||||
return upload_end_(true);
|
||||
};
|
||||
#elif defined(ESP_PLATFORM) // esp-idf # To do: Move to Nextion component on ESPHome
|
||||
auto upload_range_esp_idf_ = [&](const std::string &url, int range_start) -> int {
|
||||
static const char *const TAG = "script.upload_tft.upload_range_esp_idf_";
|
||||
ESP_LOGVV(TAG, "url: %s", url.c_str());
|
||||
uint range_size_ = tft_size_ - range_start;
|
||||
ESP_LOGVV(TAG, "tft_size_: %i", tft_size_);
|
||||
ESP_LOGV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
int range_end = (range_start == 0) ? std::min(tft_size_, 16383) : tft_size_;
|
||||
if (range_size_ <= 0 or range_end <= range_start) {
|
||||
ESP_LOGE(TAG, "Invalid range");
|
||||
ESP_LOGD(TAG, "Range start: %i", range_start);
|
||||
ESP_LOGD(TAG, "Range end: %i", range_end);
|
||||
ESP_LOGD(TAG, "Range size: %i", range_size_);
|
||||
return -1;
|
||||
}
|
||||
|
||||
esp_http_client_config_t config = {
|
||||
.url = url.c_str(),
|
||||
.cert_pem = nullptr,
|
||||
};
|
||||
esp_http_client_handle_t client = esp_http_client_init(&config);
|
||||
|
||||
char range_header[64];
|
||||
sprintf(range_header, "bytes=%d-%d", range_start, range_end);
|
||||
ESP_LOGV(TAG, "Requesting range: %s", range_header);
|
||||
esp_http_client_set_header(client, "Range", range_header);
|
||||
ESP_LOGVV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
ESP_LOGV(TAG, "Opening http connetion");
|
||||
esp_err_t err;
|
||||
if ((err = esp_http_client_open(client, 0)) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
|
||||
esp_http_client_cleanup(client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ESP_LOGV(TAG, "Fetch content length");
|
||||
int content_length = esp_http_client_fetch_headers(client);
|
||||
ESP_LOGV(TAG, "content_length = %d", content_length);
|
||||
if (content_length <= 0) {
|
||||
ESP_LOGE(TAG, "Failed to get content length: %d", content_length);
|
||||
esp_http_client_cleanup(client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int total_read_len = 0, read_len;
|
||||
|
||||
ESP_LOGV(TAG, "Allocate buffer");
|
||||
uint8_t* buffer = new uint8_t[4096];
|
||||
std::string recv_string;
|
||||
if (buffer == nullptr) {
|
||||
ESP_LOGE(TAG, "Failed to allocate memory for buffer");
|
||||
ESP_LOGV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
} else {
|
||||
ESP_LOGV(TAG, "Memory for buffer allocated successfully");
|
||||
|
||||
while (true) {
|
||||
App.feed_wdt();
|
||||
ESP_LOGVV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
int read_len = esp_http_client_read(client, reinterpret_cast<char*>(buffer), 4096);
|
||||
ESP_LOGVV(TAG, "Read %d bytes from HTTP client, writing to UART", read_len);
|
||||
if (read_len > 0) {
|
||||
tf_uart->write_array(buffer, read_len);
|
||||
ESP_LOGVV(TAG, "Write to UART successful");
|
||||
recv_ret_string_(recv_string, 5000, true);
|
||||
content_length_ -= read_len;
|
||||
ESP_LOGD(TAG, "Uploaded %0.2f %%, remaining %d bytes, heap: %d",
|
||||
100.0 * (tft_size_ - content_length_) / tft_size_,
|
||||
content_length_, esp_get_free_heap_size());
|
||||
if (recv_string[0] != 0x05) { // 0x05 == "ok"
|
||||
ESP_LOGD(TAG, "recv_string [%s]",
|
||||
format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
|
||||
}
|
||||
// handle partial upload request
|
||||
if (recv_string[0] == 0x08 && recv_string.size() == 5) {
|
||||
uint32_t result = 0;
|
||||
for (int j = 0; j < 4; ++j) {
|
||||
result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
|
||||
}
|
||||
if (result > 0) {
|
||||
ESP_LOGI(TAG, "Nextion reported new range %" PRIu32, result);
|
||||
content_length_ = tft_size_ - result;
|
||||
// Deallocate the buffer when done
|
||||
delete[] buffer;
|
||||
ESP_LOGVV(TAG, "Memory for buffer deallocated");
|
||||
esp_http_client_cleanup(client);
|
||||
esp_http_client_close(client);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
recv_string.clear();
|
||||
} else if (read_len == 0) {
|
||||
ESP_LOGV(TAG, "End of HTTP response reached");
|
||||
break; // Exit the loop if there is no more data to read
|
||||
} else {
|
||||
ESP_LOGE(TAG, "Failed to read from HTTP client, error code: %d", read_len);
|
||||
break; // Exit the loop on error
|
||||
}
|
||||
}
|
||||
|
||||
// Deallocate the buffer when done
|
||||
delete[] buffer;
|
||||
ESP_LOGVV(TAG, "Memory for buffer deallocated");
|
||||
}
|
||||
esp_http_client_cleanup(client);
|
||||
esp_http_client_close(client);
|
||||
return range_end + 1;
|
||||
};
|
||||
auto upload_tft_ = [&](const std::string &url, unsigned int update_baud_rate_) -> bool {
|
||||
static const char *const TAG = "script.upload_tft.upload_tft_esp_idf";
|
||||
ESP_LOGD(TAG, "Nextion TFT upload requested");
|
||||
ESP_LOGD(TAG, " url: %s", url.c_str());
|
||||
ESP_LOGD(TAG, " baud_rate: %i", update_baud_rate_);
|
||||
|
||||
if (is_updating_) {
|
||||
ESP_LOGW(TAG, "Currently updating");
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
if (!network::is_connected()) {
|
||||
ESP_LOGE(TAG, "Network is not connected");
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
if (!disp1->is_setup()) {
|
||||
ESP_LOGD(TAG, "Setting Nextion protocol reparse mode to passive");
|
||||
exit_reparse->execute();
|
||||
delay_seconds_(5);
|
||||
}
|
||||
|
||||
is_updating_ = true;
|
||||
|
||||
// Define the configuration for the HTTP client
|
||||
ESP_LOGV(TAG, "Establishing connection to HTTP server");
|
||||
ESP_LOGVV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
esp_http_client_config_t config = {
|
||||
.url = url.c_str(),
|
||||
.cert_pem = nullptr,
|
||||
.method = HTTP_METHOD_HEAD,
|
||||
.timeout_ms = 15000,
|
||||
};
|
||||
|
||||
// Initialize the HTTP client with the configuration
|
||||
ESP_LOGV(TAG, "Initializing HTTP client");
|
||||
ESP_LOGV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
esp_http_client_handle_t http = esp_http_client_init(&config);
|
||||
if (!http) {
|
||||
ESP_LOGE(TAG, "Failed to initialize HTTP client.");
|
||||
return upload_end_(false); // return -1 to indicate an error
|
||||
}
|
||||
|
||||
// Perform the HTTP request
|
||||
ESP_LOGV(TAG, "Check if the client could connect");
|
||||
ESP_LOGV(TAG, "Available heap: %u", esp_get_free_heap_size());
|
||||
esp_err_t err = esp_http_client_perform(http);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err));
|
||||
esp_http_client_cleanup(http);
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
// Check the HTTP Status Code
|
||||
int status_code = esp_http_client_get_status_code(http);
|
||||
ESP_LOGV(TAG, "HTTP Status Code: %d", status_code);
|
||||
size_t tft_file_size = esp_http_client_get_content_length(http);
|
||||
ESP_LOGD(TAG, "TFT file size: %zu", tft_file_size);
|
||||
|
||||
if (tft_file_size < 4096) {
|
||||
ESP_LOGE(TAG, "File size check failed. Size: %zu", tft_file_size);
|
||||
esp_http_client_cleanup(http);
|
||||
return upload_end_(false);
|
||||
} else {
|
||||
ESP_LOGD(TAG, "File size check passed. Proceeding...");
|
||||
}
|
||||
content_length_ = tft_file_size;
|
||||
tft_size_ = tft_file_size;
|
||||
|
||||
ESP_LOGD(TAG, "Updating Nextion");
|
||||
// The Nextion will ignore the update command if it is sleeping
|
||||
|
||||
char command[128];
|
||||
// Tells the Nextion the content length of the tft file and baud rate it will be sent at
|
||||
// Once the Nextion accepts the command it will wait until the file is successfully uploaded
|
||||
// If it fails for any reason a power cycle of the display will be needed
|
||||
sprintf(command, "whmi-wris %d,%d,1", content_length_, update_baud_rate_);
|
||||
|
||||
// Clear serial receive buffer
|
||||
uint8_t d;
|
||||
while (id(tf_uart).available()) {
|
||||
id(tf_uart).read_byte(&d);
|
||||
};
|
||||
|
||||
send_nextion_command(command);
|
||||
|
||||
if (update_baud_rate_ != id(tf_uart).get_baud_rate()) {
|
||||
set_baud_rate_(update_baud_rate_);
|
||||
//id(tf_uart).set_baud_rate(update_baud_rate_);
|
||||
//id(tf_uart).setup();
|
||||
}
|
||||
|
||||
std::string response;
|
||||
ESP_LOGD(TAG, "Waiting for upgrade response");
|
||||
recv_ret_string_(response, 2000, true); // This can take some time to return
|
||||
|
||||
// The Nextion display will, if it's ready to accept data, send a 0x05 byte.
|
||||
ESP_LOGD(TAG, "Upgrade response is [%s]",
|
||||
format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str());
|
||||
|
||||
if (response.find(0x05) != std::string::npos) {
|
||||
ESP_LOGV(TAG, "Preparation for tft update done");
|
||||
} else {
|
||||
ESP_LOGE(TAG, "Preparation for tft update failed %d \"%s\"", response[0], response.c_str());
|
||||
esp_http_client_cleanup(http);
|
||||
return upload_end_(false);
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Updating tft from \"%s\" with a file size of %d, Heap Size %" PRIu32,
|
||||
url.c_str(), content_length_, esp_get_free_heap_size());
|
||||
|
||||
ESP_LOGV(TAG, "Starting transfer by chunks loop");
|
||||
int result = 0;
|
||||
while (content_length_ > 0) {
|
||||
result = upload_range_esp_idf_(url.c_str(), result);
|
||||
if (result < 0) {
|
||||
ESP_LOGE(TAG, "Error updating Nextion!");
|
||||
esp_http_client_cleanup(http);
|
||||
return upload_end_(false);
|
||||
}
|
||||
App.feed_wdt();
|
||||
ESP_LOGV(TAG, "Heap Size %" PRIu32 ", Bytes left %d", esp_get_free_heap_size(), content_length_);
|
||||
}
|
||||
|
||||
is_updating_ = false;
|
||||
ESP_LOGD(TAG, "Successfully updated Nextion!");
|
||||
|
||||
ESP_LOGD(TAG, "Close HTTP connection");
|
||||
esp_http_client_close(http);
|
||||
esp_http_client_cleanup(http);
|
||||
return upload_end_(true);
|
||||
};
|
||||
#endif
|
||||
|
||||
ESP_LOGD(TAG, "Try #1 at 921600 bps");
|
||||
if (disp1->is_setup()) {
|
||||
display_wrapped_text->execute("confirm.body", "Try #1 at 921600 bps", 18);
|
||||
delay_seconds_(1);
|
||||
}
|
||||
if (upload_tft_(url, 921600)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #1 failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #1 failed", 18);
|
||||
delay_seconds_(5);
|
||||
ESP_LOGD(TAG, "Try #2 at 921600 bps");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #2 at 921600 bps", 18);
|
||||
if (upload_tft_(url, 921600)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #2 failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #2 failed", 18);
|
||||
delay_seconds_(5);
|
||||
ESP_LOGD(TAG, "Try #3 at 115200 bps");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #3 at 115200 bps", 18);
|
||||
if (upload_tft_(url, 115200)) id(restart_nspanel).press();
|
||||
ESP_LOGW(TAG, "Try #3 failed");
|
||||
if (disp1->is_setup()) {
|
||||
display_wrapped_text->execute("confirm.body", "Try #3 failed. Restarting display.", 18);
|
||||
delay_seconds_(3);
|
||||
}
|
||||
ESP_LOGD(TAG, "Turn off Nextion");
|
||||
id(screen_power).turn_off();
|
||||
delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn on Nextion");
|
||||
id(screen_power).turn_on();
|
||||
delay_seconds_(10);
|
||||
ESP_LOGD(TAG, "Try #4 at 115200 bps");
|
||||
if (disp1->is_setup()) {
|
||||
disp1->set_backlight_brightness(1);
|
||||
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
|
||||
display_wrapped_text->execute("confirm.body", "Try #4 at 115200 bps", 18);
|
||||
disp1->goto_page("confirm");
|
||||
disp1->hide_component("bt_close");
|
||||
disp1->hide_component("bt_accept");
|
||||
disp1->hide_component("bt_clear");
|
||||
disp1->hide_component("bt_close");
|
||||
delay_seconds_(1);
|
||||
}
|
||||
if (upload_tft_(url, 115200)) id(restart_nspanel).press();
|
||||
ESP_LOGE(TAG, "TFT upload failed");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "TFT upload failed", 18);
|
||||
if (disp1->is_setup()) delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn off Nextion");
|
||||
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Restarting...", 18);
|
||||
if (disp1->is_setup()) delay_seconds_(2);
|
||||
id(screen_power).turn_off();
|
||||
delay_seconds_(2);
|
||||
ESP_LOGD(TAG, "Turn on Nextion");
|
||||
id(screen_power).turn_on();
|
||||
ESP_LOGD(TAG, "Restarting ESPHome");
|
||||
delay_seconds_(2);
|
||||
id(restart_nspanel).press();
|
||||
|
||||
ESP_LOGD(TAG, "Finished!");
|
||||
|
||||
select:
|
||||
- id: tft_list
|
||||
name: Update TFT display URL
|
||||
platform: template
|
||||
options:
|
||||
- "${nextion_update_url}"
|
||||
- "${nextion_blank_url}"
|
||||
initial_option: "${nextion_update_url}"
|
||||
optimistic: true
|
||||
restore_value: false
|
||||
internal: false
|
||||
entity_category: config
|
||||
icon: mdi:file-arrow-up-down-outline
|
||||
disabled_by_default: true
|
||||
set_action:
|
||||
- lambda: |-
|
||||
static const char *const TAG = "select.tft_list.set_action";
|
||||
ESP_LOGD(TAG, "Selected TFT URL: %s", x.c_str());
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,21 +0,0 @@
|
||||
Page page0
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
QR Code qr0
|
||||
Attributes
|
||||
ID : 1
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID: disabled
|
||||
Text : https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||
Max. Text Size : 50
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
Page screensaver
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
Events
|
||||
Preinitialize Event
|
||||
printh 92
|
||||
prints "currentpage",0
|
||||
printh 00
|
||||
prints "blank-screensaver",0
|
||||
printh 00
|
||||
printh FF FF FF
|
||||
dim=0
|
||||
printh 92
|
||||
prints "nspanelevent",0
|
||||
printh 00
|
||||
prints "{\"page\": \"blank-screensaver\", \"component\": \"currentpage\", \"value\": \"pagechange\", \"version\": \"2023.09.19\"}",0
|
||||
printh 00
|
||||
printh FF FF FF
|
||||
|
||||
Touch Press Event
|
||||
page blank
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
Page screensaver
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
Events
|
||||
Preinitialize Event
|
||||
sendme
|
||||
dim=0
|
||||
|
||||
Touch Release Event
|
||||
page orign.val
|
||||
|
||||
Variable (int32) orign
|
||||
Attributes
|
||||
ID : 2
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
TouchCap wakeup
|
||||
Attributes
|
||||
ID : 1
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
Events
|
||||
Touch Press Event
|
||||
page orign.val
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
Page notification
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
Events
|
||||
Preinitialize Event
|
||||
if(api==0)
|
||||
{
|
||||
page home
|
||||
}else
|
||||
{
|
||||
sendme
|
||||
}
|
||||
|
||||
Touch Press Event
|
||||
printh 91
|
||||
prints "touchevent",0
|
||||
printh 00
|
||||
prints rand,0
|
||||
printh FF FF FF
|
||||
|
||||
Touch Release Event
|
||||
printh 91
|
||||
prints "touchevent",0
|
||||
printh 00
|
||||
prints rand,0
|
||||
printh FF FF FF
|
||||
|
||||
Variable (string) lastclick
|
||||
Attributes
|
||||
ID : 6
|
||||
Scope : local
|
||||
Text :
|
||||
Max. Text Size: 100
|
||||
|
||||
Text notifi_text01
|
||||
Attributes
|
||||
ID : 1
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard: none
|
||||
Text :
|
||||
Max. Text Size : 250
|
||||
|
||||
Text notifi_label
|
||||
Attributes
|
||||
ID : 2
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard: none
|
||||
Text :
|
||||
Max. Text Size : 30
|
||||
|
||||
Text loading
|
||||
Attributes
|
||||
ID : 5
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard: none
|
||||
Text :
|
||||
Max. Text Size : 1
|
||||
|
||||
Button button_back
|
||||
Attributes
|
||||
ID : 7
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID: disabled
|
||||
State : unpressed
|
||||
Text :
|
||||
Max. Text Size : 3
|
||||
|
||||
Events
|
||||
Touch Press Event
|
||||
page home
|
||||
|
||||
Button bt_accept
|
||||
Attributes
|
||||
ID : 8
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID: disabled
|
||||
State : unpressed
|
||||
Text :
|
||||
Max. Text Size : 3
|
||||
|
||||
Events
|
||||
Touch Release Event
|
||||
lastclick.txt="{\"page\": \"notification\", \"component\": \"accept\", \"value\": \"release\"}"
|
||||
printh 92
|
||||
prints "nspanelevent",0
|
||||
printh 00
|
||||
prints lastclick.txt,0
|
||||
printh 00
|
||||
printh FF FF FF
|
||||
|
||||
Button bt_clear
|
||||
Attributes
|
||||
ID : 9
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID: disabled
|
||||
State : unpressed
|
||||
Text :
|
||||
Max. Text Size : 3
|
||||
|
||||
Events
|
||||
Touch Release Event
|
||||
lastclick.txt="{\"page\": \"notification\", \"component\": \"clear\", \"value\": \"release\"}"
|
||||
printh 92
|
||||
prints "nspanelevent",0
|
||||
printh 00
|
||||
prints lastclick.txt,0
|
||||
printh 00
|
||||
printh FF FF FF
|
||||
|
||||
Timer swipestore
|
||||
Attributes
|
||||
ID : 4
|
||||
Scope : local
|
||||
Period (ms): 50
|
||||
Enabled : no
|
||||
|
||||
Events
|
||||
Timer Event
|
||||
swipex=tch0
|
||||
swipey=tch1
|
||||
|
||||
Timer wakeup_timer
|
||||
Attributes
|
||||
ID : 10
|
||||
Scope : local
|
||||
Period (ms): 100
|
||||
Enabled : yes
|
||||
|
||||
Events
|
||||
Timer Event
|
||||
if(dim<brightness)
|
||||
{
|
||||
dimdelta=brightness-dim
|
||||
dimdelta/=10
|
||||
if(dimdelta<1)
|
||||
{
|
||||
dimdelta=1
|
||||
}
|
||||
dim+=dimdelta
|
||||
}else
|
||||
{
|
||||
wakeup_timer.en=0
|
||||
}
|
||||
|
||||
TouchCap swipe
|
||||
Attributes
|
||||
ID : 3
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
Events
|
||||
Touch Press Event
|
||||
swipestore.en=1 // Start swipestore timer
|
||||
|
||||
Touch Release Event
|
||||
swipestore.en=0
|
||||
// Touch has ended, x
|
||||
if(tch0==0)
|
||||
{
|
||||
swipec=swipex-tch2
|
||||
// From Left to Right
|
||||
if(swipec>swipedx)
|
||||
{
|
||||
//page
|
||||
}
|
||||
// Right to Left
|
||||
swipec2=0-swipedx
|
||||
if(swipec<swipec2)
|
||||
{
|
||||
//page
|
||||
}
|
||||
}
|
||||
// Touch has ended, y
|
||||
if(tch1==0)
|
||||
{
|
||||
swipec=swipey-tch3
|
||||
// From Up to Down
|
||||
if(swipec>100)
|
||||
{
|
||||
//page
|
||||
}
|
||||
// Down to Up
|
||||
swipec2=0-swipedy
|
||||
if(swipec<-100)
|
||||
{
|
||||
//page
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
Page screensaver
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
Events
|
||||
Preinitialize Event
|
||||
sendme
|
||||
dim=0
|
||||
|
||||
Touch Release Event
|
||||
page orign.val
|
||||
|
||||
Variable (int32) orign
|
||||
Attributes
|
||||
ID : 2
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
TouchCap wakeup
|
||||
Attributes
|
||||
ID : 1
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
Events
|
||||
Touch Press Event
|
||||
page orign.val
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# Creating `nspanel_us_land.HMI` from `nspanel_eu.HMI`:
|
||||
|
||||
## Program.s:
|
||||
Change to `display_mode=3`
|
||||
|
||||
## Page `home`:
|
||||
1. Change left_bt_pic (x,y,w,h) from ( 47,307,120,3) to (467,173,3,120)
|
||||
2. Change right_bt_pic(x,y,w,h) from (288,307,120,3) to (467, 27,3,120)
|
||||
3. Rotate pictures 30 & 31 by 90degrees - You will find the rotated pics under pics folder where this instruction file is.
|
||||
@@ -1,36 +0,0 @@
|
||||
Page screensaver
|
||||
Attributes
|
||||
ID : 0
|
||||
Scope : local
|
||||
Dragging : 0
|
||||
Send Component ID : disabled
|
||||
Locked : no
|
||||
Swide up page ID : disabled
|
||||
Swide down page ID : disabled
|
||||
Swide left page ID : disabled
|
||||
Swide right page ID: disabled
|
||||
|
||||
Events
|
||||
Preinitialize Event
|
||||
sendme
|
||||
dim=0
|
||||
|
||||
Touch Release Event
|
||||
page orign.val
|
||||
|
||||
Variable (int32) orign
|
||||
Attributes
|
||||
ID : 2
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
TouchCap wakeup
|
||||
Attributes
|
||||
ID : 1
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
Events
|
||||
Touch Press Event
|
||||
page orign.val
|
||||
|
||||
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,20 +1,24 @@
|
||||
# Manuals:
|
||||
### Setup
|
||||
## 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)
|
||||
### Common issues
|
||||
- [Common Issues | TFT Upload](tft_upload.md)
|
||||
- [Common Issues | Stuck on Initializing](error_initializing.md)
|
||||
- [Common Issues | AccuWeather Setup & Blank weather pages](weather.md)
|
||||
### Advanced settings
|
||||
- [Customization](customization.md)
|
||||
- [Add-on climate](addon_climate.md)
|
||||
- [Alarm Control Panel](alarm.md)
|
||||
- [Version compatibility matrix](version_compatibility.md)
|
||||
|
||||
|
||||
|
||||
# Setup and overview videos:
|
||||
## 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.
|
||||
238
docs/blueprint.md
Normal file
238
docs/blueprint.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# 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
|
||||
|
||||
| Entity | Description | Example |
|
||||
| --- | --- | --- |
|
||||
| Home page - Entity State 01-04 (Optional) | Up to four HA entities can be displayed on the home screen. |  |
|
||||
| Home page - Chips 01-07 (optional) | Used to display icons of HA binary entities on the home screen. The icon is displayed then the entity is on/open/true/active. Otherwise, no icon is displayed. |  |
|
||||
| Custom button 01-06 (Optional) | 7 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
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
## Attention
|
||||
|
||||
The manuals in Germany are not being updated. Please use the latest documents in English. Your browser translations can help if English is an issue for you.
|
||||
@@ -1,233 +0,0 @@
|
||||
Dieser Artikel befasst sich mit den Einstellungen in der Blueprint Automatisierung.
|
||||
|
||||
Die Blueprint Automation ist das zentrale Konfigurationselement dieser Lösung für das NSPanel.
|
||||
Im Prinzip ist die Einrichtung der Automatisierung selbsterklärend. Nachfolgend werden die einzelnen Elemente des Blueprints beschrieben.
|
||||
|
||||
|
||||
Es ist möglich, sowohl die Farbe der Labels als auch der Icons für die meisten Elemente auf den einzelnen Screens zu verändern.
|
||||
|
||||
Standard für die Farbe ist "65535". Der gewünschten Nextion Farbcode kann unter ```https://nodtem66.github.io/nextion-hmi-color-convert/index.html herausgesucht werden.```
|
||||
|
||||
Die Icons unter folgendem Link können verwendet werden:
|
||||
```https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html```
|
||||
|
||||
Es wird der Übersichtlichkeit halber in der folgenden Dokumentation nicht gesondert auf die Menüeinträge "Icon Color" und "Label Color" eingegangen.
|
||||
|
||||
|
||||
# Parameter
|
||||
### ESPhome Node Name
|
||||
|
||||
Bezieht sich auf den ESPhome-Gerätenamen. **Zulässig sind die Zeichen "__",a-z, 0-9, jedoch keine Sonder- und Leerzeichen**. Dies ist eine Einschränkung seitens HA, da aus dem Device-Name des Blueprints die jeweiligen Entity_IDs generiert werden.
|
||||
|
||||
### Language for NSPanel
|
||||
|
||||
Über das Dropdown Menü kann die Sprache ausgewählt werden. Unterstützt werden derzeit 26 Sprachen.
|
||||
|
||||
### Delay to avoid synchronization problems
|
||||
|
||||
Es kann bei schlechtem WLAN Signal vorkommen, dass Menüs nicht komplett geladen werden. Sollte dies vorkommen, kann hier ein Delay in ms Schritten eingestellt werden, um dies zu kompensieren.
|
||||
|
||||
|
||||
|
||||
## Weather and Temperature
|
||||
|
||||
### Weather Integration
|
||||
|
||||
Auswahl zwischen der HA Weather Integration oder dem genaueren Accuweather.
|
||||
|
||||
### Weather entity from HA
|
||||
|
||||
Dropdown Menü zur Auswahl der zu verwendenden Weather Entität. Beispiel: Wenn in Punkt 7 "Accuweather" ausgewählt wird, so muss hier die Entität für Accuweather ausgewählt werden.
|
||||
|
||||
### Outdoor Temperature Sensor (Optional)
|
||||
|
||||
Optional kann hier der Wert eines Aussentemperatur Sensor verwendet werden. Falls kein separater Sensor verwendet wird, wird der Wert der Wetter-Integration verwendet.
|
||||
|
||||
### Outdoor Temperature Sensor - LABEL COLOR (Optional)
|
||||
|
||||
Hier kann die Farbe der Beschriftung des Labels geändert werden. Siehe Link oben im Artikel.
|
||||
|
||||
### Indoor Temperature Sensor (Optional)
|
||||
|
||||
Optional kann hier der Wert eines InnentemperaturSensor verwendet werden. Wird das Feld leer gelassen, wird der Temperatursensor des NSPanels verwendet. Zusätzlich ist unter HA Devices eine Temperaturkorrektur für den NSPanel-Sensor möglich.
|
||||
|
||||
|
||||
|
||||
## Sensor Home Page
|
||||
|
||||
### Sensor 01-03 - Entity (Optional)
|
||||
|
||||
Bis zu drei Sensoren können auf dem Home Screen dargestellt werden. Hierzu die HA Entität auswählen.
|
||||
|
||||
|
||||
|
||||
## Chips
|
||||
|
||||
### Chip 01-07 - Entity (Optional)
|
||||
|
||||
Zur Darstellung von HA Entities auf dem Home Screen. Kann verwendet werden um bspw. den Status eines bestimmten Schalters auf dem NSPanel darzustellen.
|
||||
|
||||
|
||||
|
||||
## Climate
|
||||
|
||||
### Climate to Control (Optional)
|
||||
|
||||
Wenn eine Climate Integration gesteuert werden soll, muss diese hier eingegeben werden. Erreichbar ist diese dann über die Temperatur auf dem Home Screen des NSPanels.
|
||||
|
||||
### Climate Control optimistic Mode (Optional)
|
||||
|
||||
Abhängig von der Klima Steuerung, kann für ein besseres Ansprechverhalten der Optimistic Mode verwendet werden. Die vorgenommenen Änderungen werden erst bei verlassen des Screens auf das Device übertragen.
|
||||
|
||||
### Hot Water Charge Button (Optional)
|
||||
|
||||
Optionaler Schalter um bspw. einen Boiler an- bzw. aus zu schalten.
|
||||
|
||||
|
||||
|
||||
## QR Code
|
||||
|
||||
### Activate QR Code - TRUE/FALSE (Optional)
|
||||
|
||||
Aktiviert die QR Code Page sowie den Button auf dem Home Screen.
|
||||
|
||||
### QR Code content - VALUE (optional)
|
||||
|
||||
String, der als QR Code dargestellt werden soll. Dies kann ein Text sein, eine URL oder beispielsweise auch für einen vereinfachten Login ins WiFi verwendet werden (hier einfach SSID und Password ersetzen sowie entweder "WPA" oder "WEP" verwenden):
|
||||
|
||||
```WIFI:S:SSID;T:WPA/WEP;P:PASSWORD;;```
|
||||
|
||||
|
||||
|
||||
## Hardware Buttons
|
||||
|
||||
### Delay for HW-Buttons hold in seconds - VALUE
|
||||
|
||||
Einstellung, wie lange ein Button gedrückt bleiben muss, um einen "hold" zu erkennen. Default: 1 Sekunde.
|
||||
|
||||
### Activate Relay x local Fallback (Optional)
|
||||
|
||||
Normalerweise werden die internen Relays über HA getriggert. Ist dieser Menüpunkt aktiviert, so wird das jeweilige Relays bei betätigen des Linken bzw. Rechten Hardware Buttons geschaltet, sollte HA offline sein.
|
||||
|
||||
### Left/Right Hardware Button - Entity (Optional)
|
||||
|
||||
Hier kann die Entitiy ausgewählt werden, welche mit dem linken/rechten Hardware Button geschaltet werden soll.
|
||||
|
||||
### Left/Right Hardware Button Name - Label (Optional)
|
||||
|
||||
Text auf dem Screen über dem jeweiligen Hardware Button (Home Screen)
|
||||
|
||||
### Left/Right Hardware Button hold assignment - VALUE (optional)
|
||||
|
||||
Auswahl, welche Action passieren soll, wenn der Button länger gedrückt bleibt.
|
||||
|
||||
### Left/Right Hardware Button custom hold action - VALUE (Optional)
|
||||
|
||||
Auswahl der zu startenden Action beim Halten des Buttons.
|
||||
|
||||
|
||||
|
||||
## Button Page 01-04
|
||||
|
||||
### Button Page 01-04 name - LABEL (Optional)
|
||||
|
||||
Text auf den jeweiligen Button Screens.
|
||||
|
||||
### Buttons 01 - 32 (Optional)
|
||||
Die Buttons sind durch Wischen auf dem Home Screen zu erreichen und in ihrer Funktion völlig identisch.
|
||||
Entweder können nacheinander die einzelnen Button Pages durch Wischen nach links erreicht werden, oder direkt auf die Button Pages durch Wischen nach oben, unten oder rechts angesprungen werden.
|
||||
|
||||
Die Buttons sind wie folgt nummeriert:
|
||||
|
||||
| | Button Page 1 | Button Page 2 | Button Page 3 | Button Page 4 |
|
||||
| ------- | ------------- | ------------- | ------------- | ------------- |
|
||||
| Zeile 1 | 01 02 03 04 | 09 10 11 12 | 17 18 19 20 | 25 26 27 28 |
|
||||
| Zeile 2 | 05 06 07 08 | 13 14 15 16 | 21 22 23 24 | 29 30 31 32 |
|
||||
|
||||
Es können folgende Entitäten hinterlegt werden:
|
||||
- Light
|
||||
- Switch
|
||||
- Cover
|
||||
- Input Boolean
|
||||
- Automation
|
||||
- Button
|
||||
- Input Button
|
||||
- Scene
|
||||
- Person
|
||||
- Script
|
||||
- Binary Sensor
|
||||
- Fan
|
||||
- Climate
|
||||
|
||||
Wenn der jeweilige Button gedrückt wird, wird automatisch die korrespondierende Seite aufgerufen, bspw. bei Cover die Coversteuerung etc.
|
||||
Für jeden Button kann optional ein eigener Name angegeben werden.
|
||||
Alle Buttons bieten die Möglichkeit, die Ausführung der Aktion optional bestätigen zu lassen. Dies kann separat für jeden Button über *"Confirm execution of the button press"* aktiviert bzw. deaktiviert werden.
|
||||
|
||||
|
||||
|
||||
## Entity Page 01-04
|
||||
|
||||
### Activate Entity Page - TRUE/FALSE (Optional)
|
||||
|
||||
Hiermit können die Entity Pages auf dem Home Screen aktiviert werden. Diese können verwendet werden, um bspw. Werte oder Status von Entitäten auf den einzelnen Pages darzustellen.
|
||||
|
||||
### Entity Page 01-04 name - LABEL (Optional)
|
||||
|
||||
Text auf den jeweiligen Entity Screens.
|
||||
|
||||
### Entity 01 - 32 (Optional)
|
||||
|
||||
Die Entity Pages sind durch drücken auf das Entity Symbol auf dem Home Screen zu erreichen und in ihrer Funktion völlig identisch.
|
||||
|
||||
Die Entities sind wie folgt nummeriert:
|
||||
|
||||
| | Entity Page 1 | Entity Page 2 | Entity Page 3 | Entity Page 4 |
|
||||
| ------- | ------------- | ------------- | ------------- | ------------- |
|
||||
| Zeile 1 | 01 02 03 04 | 09 10 11 12 | 17 18 19 20 | 25 26 27 28 |
|
||||
| Zeile 2 | 05 06 07 08 | 13 14 15 16 | 21 22 23 24 | 29 30 31 32 |
|
||||
|
||||
Zusätzlich besteht die Möglichkeit, ein Icon für jede Entität aus derzeit 6896 Icons auszuwählen.
|
||||
Natürlich gibt es auch die Möglichkeit, eine eigene Entitätsbezeichnung einzugeben und eine Bezeichnung für die 4 Seiten zu vergeben. Wenn kein Entity-Label gesetzt ist, wird der Friendly Name von HA übernommen.
|
||||
|
||||
Die derzeit verfügbaren Icons finden sich hier: https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html
|
||||
|
||||
Zum Einfügen des ausgewählten Icons auf das "U" des Icons klicken und in das jeweilige Feld im Blueprint einfügen. Es wird danach ein "komisches" Symbol im Blueprint angezeigt, dies ist jedoch korrekt.
|
||||
|
||||
|
||||
|
||||
## Custom Configuration
|
||||
|
||||
### Hot Water Temperatur Sensor (Optional)
|
||||
|
||||
Optionaler Heiß Wasser Sensor.
|
||||
|
||||
### Top 04 Flame
|
||||
|
||||
Zeigt ein Flammen-Symbol auf dem Home Screen an, bspw. wenn eine Therme angeschaltet (On) ist.
|
||||
|
||||
### Nextion TFT File Folder
|
||||
|
||||
Kann freigelassen werden. Wird aber benötigt, wenn eine eigene TFT Konfiguration verwendet werden soll.
|
||||
|
||||
### Synchronization of all all values (Optional)
|
||||
|
||||
Light und Cover Seiten (Werte) werden kontinuierlich upgedatet (kann zu Flackern führen).
|
||||
|
||||
### Synchronization of all all Sliders (Optional)
|
||||
|
||||
Light und Cover Seiten (Position der Cover) werden kontinuierlich upgedatet (kann zu Flackern führen).
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
Beispiel Screenshots:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
@@ -1,29 +0,0 @@
|
||||
Es müssen verschiedene Dinge eingerichtet werden. Wenn diese nicht oder falsch eingerichtet sind, bleibt das NSPanel bei der Initialisierung stehen:<br>
|
||||

|
||||
<br><br>
|
||||
|
||||
#### 1. Wurde ESPHome korrekt geflashed
|
||||
Stellen Sie sicher, dass Sie die ESPHome-Konfiguration auf dem NSPanel installiert haben<br>
|
||||
<br>
|
||||
|
||||
#### 2. ESPHome Name
|
||||
Der Gerätename in ESPHome darf nur Kleinbuchstaben, Zahlen oder einen Unterstrich (\_) enthalten. Wenn Bindestriche (-) verwendet werden, kommt es zu Problemen.<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
#### 3. NSPanel zu HA hinzugefügt
|
||||
Die ESPHome-Integration muss für jedes NSPanel im HA hinzugefügt werden:
|
||||
<br>
|
||||
<br>
|
||||
|
||||
#### 4. Blueprint installiert und Automation aktiviert
|
||||
Sicherstellen, dass der Blueprint installiert ist:<br>
|
||||
[](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>
|
||||

|
||||
|
||||
Sicherstellen, dass eine Automatisierung für das NSPanel erstellt wurde und dass der **ESP Node Name** exakt dem Namen im ESPHome entspricht
|
||||

|
||||
|
||||
<br><br><br>
|
||||
|
||||
Sobald diese Schritte vorgenommen wurden, sollte sich das Display nach einem kurzen Delay verbinden.
|
||||
309
docs/de/howto.md
309
docs/de/howto.md
@@ -1,309 +0,0 @@
|
||||
|
||||
In diesem Beitrag werden wir alle wichtigen Dinge zu verschiedenen Themen zusammen tragen, die im Laufe der Zeit uns auffallen.
|
||||
> ### _**HINWEIS! sollte dir bei der Konfiguration etwas auffallen oder du irgendein Problem hattest und es lösen konntest, wäre es für uns und alle anderen in der Community super, wenn du dein Wissen mit uns teilst. Dazu kannst du mir ein kurze Nachricht schreiben und ich nehme es in diesem Beitrag dann mit auf.**_
|
||||
|
||||
|
||||
> ### WICHTIG! Wenn du ein Problem bei der Einrichtung oder einer Funktion hast und ein _**"Issue auf Github"**_ eröffnest, beschreibe dein Problem bitte so genau wie möglich. Auch Bilder können hier helfen.
|
||||
|
||||
|
||||
> ### WICHTIG! Wenn du ein _**"Issue"**_ eröffnest, folge bitter der Anleitung sieh hier [Wie erstelle ich "Issues"](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#1-wie-erstelle-ich-issues-wenn-ich-ein-problem-habe)
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
# Inhalt:
|
||||
|
||||
1. [Wie erstelle ich "Issues" wenn ich ein Problem habe ](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#1-wie-erstelle-ich-issues-wenn-ich-ein-problem-habe)
|
||||
1. [Update Blueprint](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#2-update-blueprint)
|
||||
1. [Update ESPHome](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#3-update-esphome)
|
||||
1. [Update TFT](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#4-update-tft)
|
||||
1. Manueller TFT Upload über lokalen HA (in Arbeit)
|
||||
1. Upload TFT Fehler und Lösung (in Arbeit)
|
||||
1. [Notification via HA](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#7-notification-via-ha)
|
||||
1. [Climate für Relays](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#8-climate-für-relays)
|
||||
1. [Interne Switches als Lampe darstellen in HA](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#9-interne-switches-als-lampe-darstellen-in-ha)
|
||||
1. Schnell Navigation (in Arbeit)
|
||||
1. [Bestimmte Seiten direkt aufrufen](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#11-bestimmte-seiten-direkt-aufrufen)
|
||||
1. [RTTTL Sound abspielen](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#12-rtttl-sound-abspielen)
|
||||
1. Erweiterte Funktionen und Automatisierungen (in Arbeit)
|
||||
1. [Automationen starten via Input_Boolean](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte#14-automationen-starten-via-input_boolean)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
## 1. Wie erstelle ich "Issues" wenn ich ein Problem habe
|
||||
> _**Um dein Problem lösen zu können, ist es für uns wichtig so viele Informationen wie möglich zu haben**_
|
||||
|
||||
* Probleme können auf DE oder EN erstellt werden.
|
||||
* Beschreibe dein Problem so genau wie möglich.
|
||||
* Schreibe bitte deine ESPHome und Home Assistant Version
|
||||
* gehe bitte auf deine Automation und dann auf die "3 Punkte" und danach auf _**Als YAML bearbeiten**_. Kopiere den kompletten Code und füge es dem Ticket bei
|
||||
* Ein wichtiger "Helfer" beim lösen der Probleme ist der Trace einer Automation. Den Trace findest du unter _**Einstellungen --> Automatisierungen & Szenen --> deine NSPanel Automatisierung --> Traces (rechts oben)**_
|
||||
|
||||
> TRACES! Bitte führe erneut aus, was nicht funktioniert und öffne danach sofort den Trace. Oft muss auch nach dem Reboot der trace geöffnet werden. Im Boot werden die meisten Dinge geladen.
|
||||
|
||||
> WICHTIG! im Trace kannst du anhand der _**"Orangen"**_ Linien sehen welchen Weg die Automation gegangen ist. Bitte teile uns diesen Weg mit. Außerdem erstelle bitte davon ein oder mehrer Screenshots die du deinem Ticket hinzufügst. Besonders wichtig ist für uns wo die _**"Orangen"**_ Linie aufhört, denn meist ist dort auch das Problem
|
||||
|
||||
> WICHTIG! Wenn du den Trace geöffnet hast, gibt es ganz oben die _**"Zeitstempel"**_. Es ist wichtig das du den richtigen Zeitstempel auswählst.
|
||||
|
||||
|
||||
### Beispiel Trace nach Reboot:
|
||||

|
||||
|
||||
### Beispiel Automatisierungen Blueprint:
|
||||
```
|
||||
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
|
||||
hotwatertemp: sensor.hotwater_temp
|
||||
hotwatercharge: switch.charge
|
||||
heatingsystemflame: binary_sensor.flamestatus
|
||||
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
|
||||
```
|
||||
|
||||
------
|
||||
|
||||
## 2. Update Blueprint
|
||||
|
||||
>Derzeit bietet HA nicht die Möglichkeit, Blueprints direkt über das UI upzudaten. Dies muss manuell bspw. über den File Editor geschehen.
|
||||
|
||||
>WICHTIG! Um eine neue Version des NSPanels zu installieren, muss zwingend der Blueprint, ESPHome sowie das TFT upgedatet werden!
|
||||
|
||||
1. Letztes Release des Blueprints von Github aus dem Repository laden.
|
||||
2. Das existierende YAML File "nspanel_blueprint.yaml" im Folder ***./config/blueprints/automation/Blackymas*** mit der neuen Version ersetzen.
|
||||
3. Automationen neu laden oder Home Assistant neu starten.
|
||||
4. Der neue Blueprint steht zur Verfügung. Bereits vorgenommene Einstellungen werden übernommen.
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/BlueprintUpdate.PNG)
|
||||
|
||||
------
|
||||
|
||||
## 3. Update ESPHome
|
||||
|
||||
>WICHTIG! Um eine neue Version des NSPanels zu installieren, muss zwingend der Blueprint, ESPHome sowie das TFT upgedatet werden!
|
||||
|
||||
Zum ESPHome Update auf die ESPHome Integration gehen.
|
||||
|
||||
Dann die Konfiguration validieren:
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/image-20230203111717731.png)
|
||||
|
||||
Wenn die Validierung durchgelaufen ist, erscheint ein grünes Checkmark im oberen Bereich des Fensters. Danach auf "Install" klicken:
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/image-20230203111838285.png)
|
||||
|
||||
Ein neues Fenster öffnet sich, hier die gewünschte Verbindung zum Panel auswählen:
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/image-20230203111919475.png)
|
||||
|
||||
Danach startet der Installationsvorgang. Dies kann ein paar Minuten in Anspruch nehmen:
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/image-20230203112632305.png)
|
||||
|
||||
------
|
||||
|
||||
## 4. Update TFT
|
||||
|
||||
>WICHTIG! Um eine neue Version des NSPanels zu installieren, muss zwingend der Blueprint, ESPHome sowie das TFT upgedatet werden!
|
||||
|
||||
Das Update des Displays kann über das UI erfolgen:
|
||||
|
||||
1. Im Menü ***Einstellungen --> Geräte & Services --> Integrationen*** unter der ESPHome Integration das Display auswählen.
|
||||
|
||||
2. Unter Configuration den Switch "Update TFT Display" drücken.
|
||||
|
||||
3. Das Display beginnt den Update Prozess und startet anschließend neu.
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/DisplayUpdate.PNG)
|
||||
|
||||
------
|
||||
|
||||
## 5. Manueller TFT Upload über lokalen HA
|
||||
|
||||
In Arbeit
|
||||
|
||||
------
|
||||
|
||||
## 6. Upload TFT Fehler und Lösung
|
||||
|
||||
In Arbeit
|
||||
|
||||
------
|
||||
|
||||
## 7. Notification via HA
|
||||
|
||||
Um eine Notification auf dem NSPanel anzeigen zu lassen, kann folgender Service Call verwendet werden:
|
||||
|
||||
```
|
||||
service: esphome.panelname_notification_show
|
||||
data:
|
||||
label: Example text
|
||||
text: Example text
|
||||
```
|
||||
|
||||
Um die Notifications auf dem Panel zu bestätigen, kann folgender Service Call verwendet werden:
|
||||
|
||||
```
|
||||
service: esphome.panelname_notification_clear
|
||||
data: {}
|
||||
```
|
||||
|
||||
|
||||
Die Notifications können einfach in eine Automation mit aufgenommen werden:
|
||||
|
||||
```
|
||||
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
|
||||
text: Example for a Notification on the Panel Screen
|
||||
```
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 8. Climate für Relays
|
||||
|
||||
Um das NSPanel zur Steuerung eines Heizkörpers oder einer Fussbodenheizung zu nutzen, muss im HA mindestens ein Generic Thermostat angelegt sein. Siehe hierzu: https://www.home-assistant.io/integrations/generic_thermostat/
|
||||
|
||||
Beispielkonfiguration Generic Thermostat:
|
||||
|
||||
```
|
||||
climate:
|
||||
- platform: generic_thermostat
|
||||
name: Study
|
||||
heater: switch.study_heater ## Wenn das NSPanel Relays den Heizkreis Regler schaltet, kann dieser 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
|
||||
```
|
||||
|
||||
Danach muss die climate.entity noch entsprechend in der Panel Configuration hinterlegt werden:-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/climate.PNG)
|
||||
|
||||
------
|
||||
|
||||
## 9. Interne Switches als Lampe darstellen in HA
|
||||
|
||||
In der Welt von Home Assistant ist das Relays im NSPanel ein Schalter. Und obwohl das im Allgemeinen richtig ist, werden diese Relays oft z. B. für eine Leuchte oder einen Ventilator verwendet. Wenn nun bspw. eine Lampe direkt mit dem Relays geschaltet wird, so ist es wünschenswert, dass auch im HA der Switch als Lampe angezeigt wird oder diese "Lampe" einer Lichter-Gruppe hinzugefügt werden soll.
|
||||
|
||||
Mit der Switch as X-Integration können diese Schalter in die Entitätstypen umwandeln, die dem jeweiligen Anwendungsfall am besten entsprechen: https://www.home-assistant.io/integrations/switch_as_x/
|
||||
|
||||
-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/Swichasx.png)
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 10. Schnell Navigation
|
||||
|
||||
In Arbeit
|
||||
|
||||
------
|
||||
|
||||
## 11. Bestimmte Seiten direkt aufrufen
|
||||
|
||||
Manchmal kann es Sinn machen, automatisch eine bestimmte Seite des Displays anzeigen zu lassen. Um dies zu tun, kann folgender Service genutzt werden:
|
||||
|
||||
```
|
||||
service: esphome.nspanel_send_command_printf
|
||||
data:
|
||||
cmd: page home
|
||||
```
|
||||
|
||||
Um bspw. direkt die Button Page 2 anzuzeigen, muss "home" durch "buttonpage02" ersetzt werden.
|
||||
|
||||
Folgende Seiten sind derzeit verfügbar:
|
||||
|
||||

|
||||
|
||||
------
|
||||
|
||||
## 12. RTTTL Sound abspielen
|
||||
|
||||
HA kann ein RTTTL an das NSPanel schicken, dabei sind eigene Melodien möglich.
|
||||
|
||||
Hierzu wird folgender Service verwendet: ***nspanel_play_rtttl***
|
||||
|
||||
Man findet viele RTTTL-Strings im Web, wichtig ist, dass diese mit dem Namen und dann einem Doppelpunkt beginnen müssen.
|
||||
|
||||
Hier ein Beispiel:
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||

|
||||
|
||||
Mehr Informationen unter: https://esphome.io/components/rtttl.html#common-beeps
|
||||
|
||||
Mehr Songs hier: https://codebender.cc/sketch:109888#RTTTL%20Songs.ino
|
||||
|
||||
------
|
||||
|
||||
## 13. Erweiterte Funktionen und Automatisierungen
|
||||
|
||||
In Arbeit
|
||||
|
||||
------
|
||||
|
||||
## 14. Automationen starten via Input_Boolean
|
||||
|
||||
Obwohl mit dem NSPanel Scripts direkt über die Buttons gestartet werden können, gibt es auch die Möglichkeit, mittels Input_Boolean direkt Automationen zu starten.
|
||||
|
||||
Hierzu muss erst ein Helper angelegt werden unter ***Settings --> Devices&Services --> Helpers***, siehe hierzu: https://www.home-assistant.io/integrations/input_boolean/-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/Toggle1.PNG)
|
||||
|
||||
Anschliessend wird der erstellte Input_Boolean als Trigger in eine beliebige Automation aufgenommen unter State:-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/Toggle2.PNG)
|
||||
|
||||
Im letzten Schritt den Trigger noch einem Button in der Panel Config zuordnen:-HowTo---Alle-wichtigen-Dinge-die-man-wissen-sollte.assets/Toggle3.PNG)
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
@@ -1,190 +0,0 @@
|
||||
In diesem Beitrag geht es um die erst Konfiguration. Hier werden alle wichtigen Schritte zur Installation und Einrichtung von ESPHome und dem Blueprint beschrieben.
|
||||
|
||||
⭐ **_Step by Step [Einrichtungs Video](https://www.youtube.com/watch?v=3afPFg6kUdc)_**
|
||||
|
||||
|
||||
> ### _**ACHTUNG! solltest du vorher bereits auf deinem NSPanel die Version "nspanel-lovelace-ui" von joBr99 eingerichtet haben, ist ein zwischen Schritt nötig - sonst ist es nicht möglich diese oder irgendeine andere Version zu installieren**_
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
# Inhalt:
|
||||
|
||||
1. [Kurz Version der Einrichtung von Esphome und Blueprint](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#1-kurz-version-der-einrichtung-von-esphome-und-blueprint)
|
||||
|
||||
2. [Version "nspanel-lovelace-ui" von joBr99 wurde vorher installiert](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#2-version-nspanel-lovelace-ui-von-jobr99-wurde-vorher-installiert)
|
||||
|
||||
3. [Advance Modus für ESPHome und HA Profis](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#3-advanced-configuration-für-alle-esphome-und-home-assistant-profis)
|
||||
|
||||
4. [Step by Step Einrichtung und Konfiguration](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#4-step-by-step-konfiguration-und-einrichtung-von-esphome-und-blueprint)
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
## 1. Kurz Version der Einrichtung von Esphome und Blueprint
|
||||
> _**(für alle die bereits mit ESPhome und Home Assistant Erfahrung haben)**_
|
||||
|
||||
#### 1. Als erstes muss das Blueprint installiert werden. Dazu nutze bitte folgenden Link
|
||||
|
||||
[](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2FBlackymas%2FNSPanel_HA_Blueprint%2Fblob%2Fmain%2Fnspanel_blueprint.yaml)
|
||||
|
||||
> Es ist auch möglich den Code aus der Datei _**"nspnael_blueprint.yaml"**_ zu kopieren und in HA einzufügen.
|
||||
> Hinweise dazu findest du unter [Using Automation Blueprints](https://www.home-assistant.io/docs/automation/using_blueprints/) und [Automation blueprint tutorial](https://www.home-assistant.io/docs/blueprint/tutorial/#create-the-blueprint-file)
|
||||
|
||||
#### 2. Nun muss von Github das File **_"nspanel_eu.tft"_** oder **_"nspanel_us.tft"_**heruntergeladen werden
|
||||
|
||||

|
||||
|
||||
|
||||
#### 3. Das File muss nun auf deinen Home Assistant Server in den Ordner **_"www"_** hochgeladen werden. Siehe dazu auch hier [Home Assistant HTTP](https://www.home-assistant.io/integrations/http/#hosting-files) 'Hosting Files' Bereich für weiter Informationen.
|
||||
|
||||

|
||||
|
||||
#### 4. im nächsten Schritt muss eine neues ESP32 Device in ESPHome erstellt werden
|
||||
|
||||
#### 5. wenn das neue ESP32 Device erstellt wurde, klicke als nächstes bei dem soeben angelegten Device auf _**"Edit"**_ um den Web-Editor zu öffnen. Nun muss folgender Code kopiert und eingesetzt werden.
|
||||
|
||||
> ❗ _**WICHTIG!**_ Der bereits vorhanden Code in der ESPHome Datei muss _**"KOMPLETT"**_ gelöscht werden und durch den unten stehenden Code _**"ERSETZT"**_ werden.
|
||||
|
||||
> ❗ _**WICHTIG!**_ im Block _**"CHANGE ME"**_ müssen alle Werte _**(device_name, wifi_ssid, wifi_password)**_ in den _**" "**_ durch deine eigenen Werte ersetzt werden. Es ist hier auch möglich mit _**"!secret"**_ zu arbeiten
|
||||
|
||||
|
||||
> ⚠️ _**ACHTUNG!**_ es dürfen bei _**"device_name"**_ max. 15 Zeichen _**[a-z] und [0-9]**_ verwendet werden und alles müssen _**"Kleinbuchstaben"**_ sein. Weiterhin sind Zeichen wie _**[-], [SONDERZEICHEN] und [LEERZEICHEN]**_ verboten und führen zu Problemen mit dem Blueprint.
|
||||
|
||||
> **Beispiel:** _**nspanel_blackymas**_
|
||||
|
||||
|
||||
### CODE:
|
||||
```
|
||||
substitutions:
|
||||
|
||||
###### CHANGE ME START ######
|
||||
|
||||
device_name: "YOUR NSPANEL_NAME"
|
||||
wifi_ssid: "YOUR WIFI SSID"
|
||||
wifi_password: "YOUR WIFI PASSWORD"
|
||||
|
||||
nextion_update_url: "http://HOME-ASSISTANT-IP:8123/local/nspanel_eu.tft" # URL to local tft File
|
||||
# nextion_update_url: "https://raw.githubusercontent.com/Blackymas/NSPanel_HA_Blueprint/main/nspanel_eu.tft" # URL to Github
|
||||
|
||||
##### CHANGE ME END #####
|
||||
|
||||
|
||||
|
||||
##### DO NOT CHANGE ANYTHING! #####
|
||||
|
||||
packages:
|
||||
##### download esphome code from Github
|
||||
remote_package:
|
||||
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
|
||||
ref: main
|
||||
files: [nspanel_esphome.yaml]
|
||||
refresh: 1s
|
||||
|
||||
esp32:
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
##### DO NOT CHANGE ANYTHING! #####
|
||||
```
|
||||
|
||||
|
||||
> Im Pfad **_http://HOME-ASSISTANT-IP:8123/local/nspanel_eu.tft_** muss nun die IP Adresse von deinem _**Home Assistant Server**_ eingetragen werden. (_**/local/**_ ist das selbe Verzeichnis wie **_"www"_**
|
||||
>
|
||||
>
|
||||
|
||||
> Das kann dann wie folgt aussehen **_http://192.168.1.1:8123/local/nspanel_eu.tft_**
|
||||
|
||||
> ⚠️ **_ACHTUNG_** Du kannst auch den Pfad zu Github verwenden **_https://raw.githubusercontent.com/Blackymas/NSPanel_HA_Blueprint/main/nspanel_eu.tft_** und das TFT direkt von Github herunter laden. Aber dabei kann es zu Problemen mit dem Upload zum NSPanel kommen. Das hängt von deinem Internet und WLAN ab. Für mehr Informationen zu diesem Thema schauen auf der **_Issue_** Seite im Github. Das ganze sollte dann so aussehen
|
||||
|
||||
```
|
||||
# nextion_update_url: "http://HOME-ASSISTANT-IP:8123/local/nspanel_eu.tft" # URL to local tft File
|
||||
nextion_update_url: "https://raw.githubusercontent.com/Blackymas/NSPanel_HA_Blueprint/main/nspanel_eu.tft" # URL to Github
|
||||
```
|
||||
|
||||
> ⚠️ **_ACHTUNG_** soll das US Layout des Panels verwendet werden, dann muss anstelle von "nspanel_eu.tft" in der nextion_update_url "nspanel_us.tft" verwendet werden!
|
||||
|
||||
#### 6. Jetzt kann das NSPanel mit dem neuen ESPHome Code geflasht werden
|
||||
> wie das NSPanel geflasht wird kannst du dir hier ansehen [Anleitung - Flash Sonoff NSPanel mit ESPHome](https://www.youtube.com/watch?v=3afPFg6kUdc)
|
||||
|
||||
#### 7. Nachdem das NSPanel fertig geflasht wurde, kannst du unter _**"Einstellungen --> Geräte & Dienste --> Integration hinzufügen"**_ dein neues Gerät hinzufügen und fertig einrichten
|
||||
|
||||
#### 8. im letzten Schritt muss nun nur noch das TFT hochgeladen werden. Dazu öffne in der Integration ESPHome dein neues Device und aktiviere unter _**"Konfiguration"**_ den Punkt _**"Update TFT display"**_. Jetzt wird von deinem lokalen Home Assistant Server oder Github das aktuelle TFT File geladen und auf dein NSPanel hochgeladen. _**ACHTUNG!**_ dieser Vorgang kann einen Moment dauern
|
||||
|
||||
#### 9. jetzt ist die Einrichtung vom ESPHome und dem NSPanel abgeschlossen.
|
||||
|
||||
#### 10. Nun kannst du über das Blueprint dein NSPanel konfigurieren. Dazu gehe auf _**"Einstellungen --> Automatisierungen & Szenen --> Vorlagen --> NSPanel Configuration --> AUTOMATISIERUNG ERSTELLEN"**_ und starte mit der Einrichtung vom NSPanel.
|
||||
|
||||
> **HINWEIS!** Trage im Blueprint im Feld _**"ESPHOME Node Name"**_ exakt den selben Namen ein, den du in der _**"ESPHome Datei"**_ vergeben hast.
|
||||
|
||||
> **Beispiel:** _**nspanel_blackymas**_
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
## 2. Version "nspanel-lovelace-ui" von joBr99 wurde vorher installiert
|
||||
> _**in der Version "nspanel-lovelace-ui" von joBr99 sind ein paar Besonderheiten eingebaut, die es nicht so einfach ermöglichen eine neue Version und TFT auf das NSPanel zu flashen. Da wir dieses Problem aber schon hatten, haben wir natürlich auch schon eine Lösung für euch ;)**_
|
||||
|
||||
### _**Es ist notwendig eine "Leeres TFT" Datei hochzuladen, solange "Lovelace ui" noch auf dem NSPanel installiert ist.**_
|
||||
|
||||
> WICHTIG! Wenn du bereits das NSPanel mit meiner Version installiert hast, musst du zuerst wieder "Lovelace ui" vollständig installieren.
|
||||
|
||||
### Folgende Schritte sind notwendig:
|
||||
|
||||
1. lade dir aus dem Ordner _**custom_configuration**_ die Datei _**"nspanel_blank.tft"**_ herunter.
|
||||
2. lade nun die TFT Datei _**"nspanel_blank.tft"**_ in den Ordner _**"www"**_ in Home Assistant hoch
|
||||
3. gehe jetzt zu dem Punkt _**"Entwicklerwerzeuge --> Dienste"**_ und suche dort nach dem Dienst
|
||||
|
||||
_**"ESPHome: DEVICE_NAME_upload_tft"**_ --> (esphome.device_name_upload_tft)
|
||||
4. unter URL musst du jetzt den Pfad zu deiner Datei _**nspanel_blank.tft**_ eingeben. Das könnte zum Beispiel so aussehen _**"http://IP_HOME_ASSISTANT:8123/local/nspanel_blank.tft"**_
|
||||
5. nun sollte die TFT Datei auf das NSPanel gespielt werden. Es kann einen Moment dauern, bis es fertig ist
|
||||
6. sollte alles funktioniert haben, sollte auf dem NSPanel nur eine weiße Seite zu sehen sein
|
||||
7. jetzt kann mit der Einrichtung und Konfiguration meiner Version fortgesetzt werden. Dazu siehe [Kurz Version der Einrichtung von Esphome und Blueprint](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#1-kurz-version-der-einrichtung-von-esphome-und-blueprint)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
## 3. Advanced configuration für alle ESPHome und Home Assistant Profis
|
||||
|
||||
* Blueprint Datei _**"nspnael_blueprint.yaml"**_ kann auch manuell installiert werden
|
||||
* ESPHome Datei_**"nspanel_esphome.yaml"**_ kann auch manuell installiert werden. Dadurch können weitere _**"Advanced"**_ Konfigurationen aktiviert oder hinzugefügt werden.
|
||||
* Außerdem besteht die Möglichkeit das TFT File _**"nspanel_eu.tft"**_ manuell hochzuladen. Das Ganze kann auch mit einem _**"Folder Watcher"**_ kombiniert werden
|
||||
* zusätzlich stellen wir die HMI Datei _**"nspanel_eu.HMI"**_ für den Nextion Editor zur Verfügung, um Grafiken und Programmierung bei bedarf anpassen zu können
|
||||
|
||||
> _**ACHTUNG!**_ Wer diesen Modus benutzt, sollte wissen was er tut. Wir geben hier keinen Support!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
## 4. Step by Step Konfiguration und Einrichtung von ESPHome und Blueprint
|
||||
> _**(für alle die neu im Thema ESPhome sind oder noch keine Erfahrungen gesammelt haben)**_
|
||||
@@ -1,29 +0,0 @@
|
||||
> ### _**ACHTUNG! Wenn bereits die Version "nspanel-lovelace-ui" von joBr99 auf dem NSPanel installiert ist, ist ein Zwischenschritt notwendig - ansonsten ist es nicht möglich, diese oder eine andere Version zu installieren.**_
|
||||
>Siehe hierzu [Installation und Einrichtung](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#2-version-nspanel-lovelace-ui-von-jobr99-wurde-vorher-installiert)
|
||||
<br>
|
||||
|
||||
> ### _**Die frühere Methode, bei der NSPanel das TFT direkt von GitHub heruntergeladen hat, wurde eingestellt, da eine große Anzahl von Benutzern langsame oder fehlgeschlagene Downloads verzeichnete. Daher muss der Upload nun mit einer lokal gehosteten tft-Datei vorgenommen werden**_
|
||||
|
||||
Es gibt eine Reihe von Problemen, die das Hochladen des TFT-Uploads beeinträchtigen können. Diese Probleme betreffen nicht das NSPanel HA Blueprint-Projekt, sondern scheinen bei Nextion-Displays und ESPhome aufzutreten. Nicht alle der unten genannten Ursachen betreffen alle Benutzer, jedoch haben die folgenden Massnahmen unter jedem Punkt zu einer Lösung geführt.
|
||||
|
||||
<br>In order of likelihood:
|
||||
|
||||
#### 1. Eine lokale Datenquelle verwenden (Home Assistant)
|
||||
Dies ist die häufigste Ursache für Probleme und der Grund, warum unsere Anleitung nicht mehr auf das Herunterladen des TFT von GitHub verweisen. Durch Ändern der nextion_update_url zum Hosten der TFT-Datei auf dem lokalen HA werden die meisten Probleme gelöst.
|
||||
|
||||
Siehe hierzu Punkt 2-4 in den [Installation und Einrichtung](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki/(DE)-Erste-Schritte---Installation-und-Einrichtung#2-version-nspanel-lovelace-ui-von-jobr99-wurde-vorher-installiert)
|
||||
<br><br>
|
||||
|
||||
#### 2. HTTP anstelle von HTTPS
|
||||
Während HTTPS für einige Benutzer funktionieren kann, mussten wir feststellen, dass es eine Reihe von Problemen verursachen kann. Eine Möglichkeit ist, das TFT-Dateihosting und nextion_update_url auf HTTPS umzustellen.
|
||||
<br><br>
|
||||
|
||||
#### 3. Netzwerkprobleme
|
||||
Eine instabile Netzwerkverbindung kann zu Verbindungsabbrüchen führen. Das NSPanel näher an den WiFi Zugangspunkt zu bringen, oder den Router neu zu starten sind zwei Möglichkeiten, dieses Problem zu lösen.
|
||||
Wenn die Fehlermeldung _Connection Refused_ oder _Connection Reset_ erscheint, ist dies das häufigste Problem.
|
||||
<br><br>
|
||||
|
||||
#### 4. DNS
|
||||
Ähnlich wie Punkt 2, sollte eine IP Adresse statt die DNS Auflösung verwendet werden:
|
||||
|
||||
also http://192.168.0.100:8123/local/nspanel.tft anstelle von http://homeassistant.local:8123/local/nspanel.tft
|
||||
@@ -1,36 +0,0 @@
|
||||
## Konfiguration
|
||||
|
||||
#### Im Home Assistant NSPanel Blueprint
|
||||
Im Blueprint muss als Integration "Accuweather" ausgewählt werden und die Weather Entitiy von AccuWeather (bspw. Home) ausgewählt werden:<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
#### AccuWeather Vorhersage aktivieren
|
||||
|
||||
Unter Settings - Devices&Services - Accuweather - Configure muss der Haken bei "Weather forecast" gesetzt sein:
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
#### Überprüfen in Developer Tools
|
||||
|
||||
#### In developer tools the weather entity should have the attribute 'attribution: Data provided by AccuWeather'<br>
|
||||
|
||||
Unter Developer Tools - States kann die AccuWeather integration überprüft werden. Die Weather Entity (hier im Beispiel weather.home) muss das Attribute "attribution: Data provided by Accuweather" haben:
|
||||
|
||||
#### <br>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
|
||||
## Wenn das Problem immer noch besteht
|
||||
Es kann in Einzelfällen vorkommen, dass mehrere Wetter Integrationen nicht zusammen funktionieren. Um dies zu beheben, empfehlen wir ALLE Wetter Integrations zu löschen und AccuWeather neu hinzuzufügen. Achtung: Dabei werden alle assoziierten Daten sowie Entities gelöscht!!
|
||||
|
||||
Das Vorgehen ist wie folgt:
|
||||
|
||||
#### 1. Löschen der Standard und AccuWeather Integration
|
||||
|
||||
#### 2. Hinzufügen der AccuWeather Integration & Aktivieren der Vorhersage
|
||||
|
||||
#### 3. In der Blueprint Automation des NSPanels AccuWeather hinzufügen und die Entität auswählen
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user