mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-19 12:27:16 +00:00
Compare commits
1539 Commits
v13.4.0
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a11e269ca0 | ||
![]() |
2831bbfd18 | ||
![]() |
92b3f7d37c | ||
![]() |
a2d1915692 | ||
![]() |
082170374c | ||
![]() |
c2628c95f3 | ||
![]() |
2bc5f682b0 | ||
![]() |
cea46bb660 | ||
![]() |
b67231483a | ||
![]() |
e6918d8b9c | ||
![]() |
7ea95ec6b2 | ||
![]() |
8921a42f79 | ||
![]() |
c8181e3290 | ||
![]() |
117e503aaa | ||
![]() |
3baa110f9d | ||
![]() |
a4096ab049 | ||
![]() |
83118b9e05 | ||
![]() |
3a28938b91 | ||
![]() |
68f019cf43 | ||
![]() |
4707cc068f | ||
![]() |
0604fac3bc | ||
![]() |
c12974366b | ||
![]() |
cced48d824 | ||
![]() |
1a8903578f | ||
![]() |
230ce2c539 | ||
![]() |
6b7606c958 | ||
![]() |
cfe1cee4d3 | ||
![]() |
2999eed8b9 | ||
![]() |
3f82228905 | ||
![]() |
7ddf8abf90 | ||
![]() |
215b37bf69 | ||
![]() |
342bb2cb7b | ||
![]() |
2096411be6 | ||
![]() |
929582b1af | ||
![]() |
4ed48feaa2 | ||
![]() |
c121dbcd4a | ||
![]() |
e8baea464f | ||
![]() |
2bf67b96a6 | ||
![]() |
0cb6a8ba24 | ||
![]() |
39494f1287 | ||
![]() |
90c690e67a | ||
![]() |
08f20b9404 | ||
![]() |
dfabe8cc0f | ||
![]() |
b43d360d37 | ||
![]() |
2f7793ddcf | ||
![]() |
3c70b728ac | ||
![]() |
289120ee92 | ||
![]() |
b77b622fbe | ||
![]() |
a47e6f1496 | ||
![]() |
74757ee7da | ||
![]() |
ea2baee3b8 | ||
![]() |
f4bb9d98b6 | ||
![]() |
87b95f798a | ||
![]() |
da4dc56b16 | ||
![]() |
714ad233e0 | ||
![]() |
2da631e442 | ||
![]() |
6f47f23f7a | ||
![]() |
69fca99ac1 | ||
![]() |
a3b564f4f3 | ||
![]() |
52f3306f15 | ||
![]() |
9d6640a42e | ||
![]() |
307e1d9c29 | ||
![]() |
f71ca3e0a2 | ||
![]() |
a3d86eebf0 | ||
![]() |
f331a64ac3 | ||
![]() |
caac9f1257 | ||
![]() |
b47a1bc1e2 | ||
![]() |
9e3ad52356 | ||
![]() |
38ceafe789 | ||
![]() |
ddc1439edf | ||
![]() |
3827bca3cc | ||
![]() |
8183a9ed3b | ||
![]() |
00e2d1d430 | ||
![]() |
863c6d1214 | ||
![]() |
73cace5274 | ||
![]() |
1ada6da6b8 | ||
![]() |
fbb752d8c2 | ||
![]() |
fb6640b91f | ||
![]() |
c0d15de965 | ||
![]() |
3764e88ed2 | ||
![]() |
0ea1f8e632 | ||
![]() |
234c5ea170 | ||
![]() |
ce92723c41 | ||
![]() |
e1f7ee26fa | ||
![]() |
a97d306a16 | ||
![]() |
508992258f | ||
![]() |
1b51aef911 | ||
![]() |
6486ba3b26 | ||
![]() |
9b4eb64caa | ||
![]() |
6d376a079e | ||
![]() |
69c3863b14 | ||
![]() |
ac8236abe1 | ||
![]() |
16e9d105ba | ||
![]() |
f3ae3bec4b | ||
![]() |
cae4551762 | ||
![]() |
007608914c | ||
![]() |
758ba17dde | ||
![]() |
08fae4bcd6 | ||
![]() |
f305113d6d | ||
![]() |
7b8d2fe93d | ||
![]() |
714435be1c | ||
![]() |
e3eb47078f | ||
![]() |
a0c8ac4f80 | ||
![]() |
c926b4b3a6 | ||
![]() |
3f93d2deee | ||
![]() |
06aa356bc3 | ||
![]() |
58632d67db | ||
![]() |
e26a2cdac9 | ||
![]() |
72535db185 | ||
![]() |
f2bf8b96e7 | ||
![]() |
549ca6e32f | ||
![]() |
72520e0743 | ||
![]() |
aed82dc8b2 | ||
![]() |
2e35a2ab93 | ||
![]() |
3c171c1ed8 | ||
![]() |
481f2cd8e1 | ||
![]() |
9a98db9773 | ||
![]() |
e92e411040 | ||
![]() |
aecba92da4 | ||
![]() |
4ee4b5908f | ||
![]() |
3f74bc83e5 | ||
![]() |
fd0501035d | ||
![]() |
670fab7ead | ||
![]() |
375864b23b | ||
![]() |
788ac574ac | ||
![]() |
5aa7d08c91 | ||
![]() |
b4c61325cb | ||
![]() |
d10eafc500 | ||
![]() |
90ebff552d | ||
![]() |
0c26698ba6 | ||
![]() |
1db796c40f | ||
![]() |
b8459eb685 | ||
![]() |
b1f3d6268d | ||
![]() |
7a4d8a5fb1 | ||
![]() |
0ab5548615 | ||
![]() |
1af1057e66 | ||
![]() |
039960153a | ||
![]() |
b4c1cd654f | ||
![]() |
c6b975561f | ||
![]() |
4306823ba6 | ||
![]() |
9b258cadcf | ||
![]() |
871723b6f7 | ||
![]() |
3c66ace01b | ||
![]() |
41af475cdb | ||
![]() |
3c5f22b31f | ||
![]() |
cb333a5a38 | ||
![]() |
c39a7d924a | ||
![]() |
f07af885a9 | ||
![]() |
f1be1b8ba9 | ||
![]() |
cfc11b5e83 | ||
![]() |
a939b4973e | ||
![]() |
d805cef66e | ||
![]() |
64ec55db4e | ||
![]() |
a2af12c969 | ||
![]() |
f383c877c6 | ||
![]() |
cc14f721f9 | ||
![]() |
ccf8902515 | ||
![]() |
f3dc35e9ca | ||
![]() |
0b3be314e7 | ||
![]() |
a9150dc703 | ||
![]() |
c076331fad | ||
![]() |
8621b9adf4 | ||
![]() |
bc7a1f5dbc | ||
![]() |
3ef9fe9f6e | ||
![]() |
1910aba79f | ||
![]() |
dbcfe486af | ||
![]() |
214b392839 | ||
![]() |
b9bc3580f4 | ||
![]() |
b07bd68046 | ||
![]() |
7a97a8fa98 | ||
![]() |
1b2fc5eccc | ||
![]() |
e7f5ecc2d0 | ||
![]() |
ff5b4956c8 | ||
![]() |
5a6b219971 | ||
![]() |
99cbdf687d | ||
![]() |
57e4d18d26 | ||
![]() |
d4a8952c34 | ||
![]() |
28b22de7e4 | ||
![]() |
f65646ba80 | ||
![]() |
f014299adc | ||
![]() |
af4ec3e0d0 | ||
![]() |
f1e5b576ba | ||
![]() |
c4dd9839c9 | ||
![]() |
db96993e50 | ||
![]() |
35a27d4541 | ||
![]() |
f727013373 | ||
![]() |
d54dfa6bc4 | ||
![]() |
a07973e866 | ||
![]() |
23ae0db9a8 | ||
![]() |
89b1df6a81 | ||
![]() |
117c1f68b7 | ||
![]() |
1988cd620d | ||
![]() |
470065e36b | ||
![]() |
d94e680b51 | ||
![]() |
c7d4a2a104 | ||
![]() |
8bf10f0b9a | ||
![]() |
ed52e711a9 | ||
![]() |
6ffb783321 | ||
![]() |
c4d2f010ef | ||
![]() |
1c0327e2c1 | ||
![]() |
63845ad3e8 | ||
![]() |
268a7267ac | ||
![]() |
a9c39fe098 | ||
![]() |
ea584f60c8 | ||
![]() |
2c0172d7d5 | ||
![]() |
94e2a91bbd | ||
![]() |
dcc407889a | ||
![]() |
97cf0a4baa | ||
![]() |
6421d6b1ab | ||
![]() |
b02ac268ad | ||
![]() |
2ac886a7f8 | ||
![]() |
8f641238b6 | ||
![]() |
2c8c5ae6b9 | ||
![]() |
892e29f599 | ||
![]() |
a9996ecc40 | ||
![]() |
9be9bb8af3 | ||
![]() |
518df07ba1 | ||
![]() |
c9cd6aae1d | ||
![]() |
ab9ad562cb | ||
![]() |
0b95779947 | ||
![]() |
0ba224bf9a | ||
![]() |
427db230fc | ||
![]() |
670d7bd8eb | ||
![]() |
cba8723c59 | ||
![]() |
c773a95ff7 | ||
![]() |
35e2d43191 | ||
![]() |
8a0e2d0604 | ||
![]() |
66a1f04414 | ||
![]() |
0c898b8d75 | ||
![]() |
299f983610 | ||
![]() |
aaa49f84ab | ||
![]() |
def7ede895 | ||
![]() |
e8ca96008f | ||
![]() |
943a0b1e6c | ||
![]() |
0bc319acb5 | ||
![]() |
d72ec454c0 | ||
![]() |
0288157fdb | ||
![]() |
7dd6b999ca | ||
![]() |
34b173e953 | ||
![]() |
9d963ce599 | ||
![]() |
f4bc628940 | ||
![]() |
0dcd38186f | ||
![]() |
9bb7b7913a | ||
![]() |
60570dec76 | ||
![]() |
95e93b8f33 | ||
![]() |
9613004bb4 | ||
![]() |
b167955e87 | ||
![]() |
18d99daa72 | ||
![]() |
4d9dd0aa3f | ||
![]() |
53dee5b002 | ||
![]() |
1065db5831 | ||
![]() |
0471f0f3c5 | ||
![]() |
beb967ccd4 | ||
![]() |
a91771e0cf | ||
![]() |
5cbe5fe9e4 | ||
![]() |
b253b344c2 | ||
![]() |
fa4f2123cf | ||
![]() |
9f3f234ac9 | ||
![]() |
4b69d30a5f | ||
![]() |
cd0743c6ed | ||
![]() |
ed1c6e2d9e | ||
![]() |
a7ee6054b5 | ||
![]() |
a49e924b53 | ||
![]() |
ebbef97cde | ||
![]() |
3068a48d90 | ||
![]() |
5ac1fdb8fe | ||
![]() |
866ffc8967 | ||
![]() |
3efdfae845 | ||
![]() |
6d7aab4662 | ||
![]() |
ec8cf6e2f0 | ||
![]() |
d176a1d65b | ||
![]() |
ddcdc85520 | ||
![]() |
fc8485d91b | ||
![]() |
e5e4c336b5 | ||
![]() |
6b3719bd9e | ||
![]() |
d0ef026bb9 | ||
![]() |
03e8497211 | ||
![]() |
cf739e9522 | ||
![]() |
e299035266 | ||
![]() |
83b09f4de1 | ||
![]() |
3365fd0d0b | ||
![]() |
ed21cfd487 | ||
![]() |
f42cb555c3 | ||
![]() |
e57b3e8b05 | ||
![]() |
76fb95b166 | ||
![]() |
d6ce776c98 | ||
![]() |
dce79fd0c3 | ||
![]() |
d3da193e39 | ||
![]() |
b73f50be6b | ||
![]() |
1fc6f5c707 | ||
![]() |
fe2f4d031f | ||
![]() |
b472e821cf | ||
![]() |
17ab5a5e83 | ||
![]() |
2263305bee | ||
![]() |
0d0b9de474 | ||
![]() |
77d98868bf | ||
![]() |
a5610eea09 | ||
![]() |
bd7e47139c | ||
![]() |
c084719b0e | ||
![]() |
124f55ca70 | ||
![]() |
50f0f8a651 | ||
![]() |
64a2fe8aee | ||
![]() |
ed7b58291a | ||
![]() |
aafe528682 | ||
![]() |
d5d757fd3d | ||
![]() |
b5c326d772 | ||
![]() |
884e795dff | ||
![]() |
8fa33ff4da | ||
![]() |
a2752bf500 | ||
![]() |
01154e9497 | ||
![]() |
1a482364bc | ||
![]() |
5f95b33220 | ||
![]() |
dc531de02b | ||
![]() |
a1aef6b39f | ||
![]() |
02225ea7c4 | ||
![]() |
2d2c732e2e | ||
![]() |
9fb8065fac | ||
![]() |
1ad89ccb3e | ||
![]() |
de3a7f3909 | ||
![]() |
17924392fa | ||
![]() |
f4d0606d06 | ||
![]() |
6d5a33772c | ||
![]() |
d1a7d70ca0 | ||
![]() |
7f8f61423a | ||
![]() |
b729886a16 | ||
![]() |
4d3a780eb1 | ||
![]() |
64f0acb0c5 | ||
![]() |
2143082aa4 | ||
![]() |
1d244fcd28 | ||
![]() |
02ae53cec5 | ||
![]() |
94f3744235 | ||
![]() |
8a37df10c6 | ||
![]() |
2024bf88ac | ||
![]() |
fc3ad45836 | ||
![]() |
4fd3d9465c | ||
![]() |
3412761881 | ||
![]() |
3457d66d1e | ||
![]() |
3b48a1c16a | ||
![]() |
27e85809b5 | ||
![]() |
f3fcbea6d1 | ||
![]() |
f59c1675eb | ||
![]() |
6745bc1b48 | ||
![]() |
9f3c7859d7 | ||
![]() |
52d4e84b39 | ||
![]() |
8311bff7ee | ||
![]() |
fde529fac4 | ||
![]() |
af724a6149 | ||
![]() |
0d9ce6de12 | ||
![]() |
df79533611 | ||
![]() |
e4ff66192f | ||
![]() |
9b6dc1f0f1 | ||
![]() |
2d3a049e59 | ||
![]() |
b7da75da30 | ||
![]() |
db29cb7152 | ||
![]() |
97b375fd57 | ||
![]() |
2c3785c1c6 | ||
![]() |
69d3fc1003 | ||
![]() |
90e0595b7f | ||
![]() |
fba6a806ac | ||
![]() |
ef7b2404d4 | ||
![]() |
6468b6edcd | ||
![]() |
c40b707b76 | ||
![]() |
af3bb96a2a | ||
![]() |
da7473e07c | ||
![]() |
b0c505d171 | ||
![]() |
6fbf8c58f7 | ||
![]() |
b3b9699782 | ||
![]() |
615c6763f6 | ||
![]() |
7cd0908c89 | ||
![]() |
bd6e7d220d | ||
![]() |
8d1b4094db | ||
![]() |
67ae7c2fe1 | ||
![]() |
5294b99ba7 | ||
![]() |
53e2fab34c | ||
![]() |
ab5208d216 | ||
![]() |
f135f46990 | ||
![]() |
9650d0f1ef | ||
![]() |
7834dbf6b6 | ||
![]() |
1099babb16 | ||
![]() |
3e3b568aeb | ||
![]() |
620fade73c | ||
![]() |
6268066bac | ||
![]() |
dc7cb05cab | ||
![]() |
d08aafd3fb | ||
![]() |
ee3fbdf4e0 | ||
![]() |
4008a4e5e6 | ||
![]() |
3c51793d5c | ||
![]() |
bdf880cf84 | ||
![]() |
c1834bd898 | ||
![]() |
a12c934a4b | ||
![]() |
71dfae2d9d | ||
![]() |
23e5a4dec2 | ||
![]() |
09f0b89ab0 | ||
![]() |
d6c1617fc5 | ||
![]() |
2969ee91a4 | ||
![]() |
364fa21fc4 | ||
![]() |
ed520140a1 | ||
![]() |
523f803b06 | ||
![]() |
aeb965435e | ||
![]() |
7df2c703a1 | ||
![]() |
54d28c9d35 | ||
![]() |
dd555a0641 | ||
![]() |
0a2fa4ec41 | ||
![]() |
6e6305f5e9 | ||
![]() |
57fc179709 | ||
![]() |
3a62cc6050 | ||
![]() |
789bbb8b97 | ||
![]() |
4ffc53b465 | ||
![]() |
f341f8d35a | ||
![]() |
9317e02f25 | ||
![]() |
b80cc6a3e6 | ||
![]() |
ccd76b26ed | ||
![]() |
f72769252e | ||
![]() |
6b753cff44 | ||
![]() |
570e2052d3 | ||
![]() |
62e4bf1acd | ||
![]() |
4046cd8ec0 | ||
![]() |
62d6a03335 | ||
![]() |
341cc87527 | ||
![]() |
ebff2d2d38 | ||
![]() |
baeaad7558 | ||
![]() |
e2bae09ded | ||
![]() |
0ea8889997 | ||
![]() |
e1fc36361e | ||
![]() |
bed14174bc | ||
![]() |
fbb2c84f29 | ||
![]() |
a838ec09f8 | ||
![]() |
038e62b72c | ||
![]() |
f176ede65d | ||
![]() |
3316bc5e70 | ||
![]() |
db0287e566 | ||
![]() |
8cb9345a97 | ||
![]() |
e8d5e442bf | ||
![]() |
5a32df5e81 | ||
![]() |
5dd132bb5f | ||
![]() |
2322646773 | ||
![]() |
155dea98cd | ||
![]() |
3ab87273e6 | ||
![]() |
e397c11e70 | ||
![]() |
2402f7cbd1 | ||
![]() |
3448e17317 | ||
![]() |
25f13e434f | ||
![]() |
b9414008df | ||
![]() |
3c703ac4d4 | ||
![]() |
f255233f90 | ||
![]() |
fb0666e6c8 | ||
![]() |
4925e9c9a8 | ||
![]() |
16b6d353f4 | ||
![]() |
bf872defab | ||
![]() |
1e9c5ad40e | ||
![]() |
3c5cbade63 | ||
![]() |
6d0467489a | ||
![]() |
fe658424b8 | ||
![]() |
ae7cba2f13 | ||
![]() |
3778f22d7b | ||
![]() |
320ad0e1d3 | ||
![]() |
3114c75a1d | ||
![]() |
873bd3f211 | ||
![]() |
7615b3c8f7 | ||
![]() |
f3bf8998ae | ||
![]() |
4e40bbf3b6 | ||
![]() |
099c68678a | ||
![]() |
6821293819 | ||
![]() |
14c0a42203 | ||
![]() |
5de16c1cca | ||
![]() |
de45fda781 | ||
![]() |
09c43fa729 | ||
![]() |
d3df759514 | ||
![]() |
0947860c83 | ||
![]() |
996ea17fb6 | ||
![]() |
ef7cd80ed8 | ||
![]() |
aeceace546 | ||
![]() |
1dff29f367 | ||
![]() |
0dcfa74ef3 | ||
![]() |
dd99642cf7 | ||
![]() |
b195bcd88d | ||
![]() |
551c919ae2 | ||
![]() |
50b6f74295 | ||
![]() |
88810fc92c | ||
![]() |
0fb39b9bac | ||
![]() |
77f9fb0783 | ||
![]() |
7dd1e2a028 | ||
![]() |
cf94ccf59c | ||
![]() |
b903c6a843 | ||
![]() |
5c3d450195 | ||
![]() |
331fd14268 | ||
![]() |
bdc7e0a65b | ||
![]() |
caa63f437c | ||
![]() |
a766947724 | ||
![]() |
043d80809b | ||
![]() |
6c4e314adc | ||
![]() |
a013c7e36d | ||
![]() |
08f99de2a5 | ||
![]() |
1b9d206dd8 | ||
![]() |
0744bf7f2b | ||
![]() |
0536cc87a0 | ||
![]() |
c86f74d456 | ||
![]() |
b40e2ec8e9 | ||
![]() |
343d9b9758 | ||
![]() |
448ca1c109 | ||
![]() |
5f9912665a | ||
![]() |
fd7554d96e | ||
![]() |
a97aeeedb7 | ||
![]() |
7e3f093dc9 | ||
![]() |
669c6e49ea | ||
![]() |
a5c33eba5e | ||
![]() |
3bc90175db | ||
![]() |
a836e841ad | ||
![]() |
c2091d7082 | ||
![]() |
7c82d3a7ae | ||
![]() |
df293dad82 | ||
![]() |
a35bb5a5c9 | ||
![]() |
19e15e21aa | ||
![]() |
feff388f03 | ||
![]() |
2f3808adc9 | ||
![]() |
5fac24a5f6 | ||
![]() |
245da3918a | ||
![]() |
ff0d003a24 | ||
![]() |
4f90c3764a | ||
![]() |
98cf7f33f7 | ||
![]() |
2fd1c0b7fb | ||
![]() |
a571ca1db5 | ||
![]() |
94c45689a6 | ||
![]() |
57d8bea761 | ||
![]() |
490c48eefe | ||
![]() |
56243ef720 | ||
![]() |
133cca3fd5 | ||
![]() |
5aaeecdbe8 | ||
![]() |
8e34864ead | ||
![]() |
2dc5c6e234 | ||
![]() |
66d69e09c9 | ||
![]() |
a463761090 | ||
![]() |
49d706f54c | ||
![]() |
deca4d9e06 | ||
![]() |
789c990c19 | ||
![]() |
5892fef63d | ||
![]() |
b89909991c | ||
![]() |
e30d88e013 | ||
![]() |
0ba0b8dada | ||
![]() |
3f4b2331ee | ||
![]() |
79a7c71145 | ||
![]() |
ccfbdd50e0 | ||
![]() |
2669cd35cf | ||
![]() |
2925836a9c | ||
![]() |
18bfda50ab | ||
![]() |
fc0dc5dfec | ||
![]() |
27db263493 | ||
![]() |
ef3c061ecf | ||
![]() |
104fec83fb | ||
![]() |
e14f014c96 | ||
![]() |
e731738385 | ||
![]() |
4f2c1f3499 | ||
![]() |
37f42b474f | ||
![]() |
faf6e66e32 | ||
![]() |
19fcaf8866 | ||
![]() |
bca4211500 | ||
![]() |
227e5f24b6 | ||
![]() |
98b04f5029 | ||
![]() |
b5a487a595 | ||
![]() |
0f2b3b1898 | ||
![]() |
41442a54ce | ||
![]() |
33e1da84e7 | ||
![]() |
73cd5cee25 | ||
![]() |
16a145f809 | ||
![]() |
0fd16f8725 | ||
![]() |
886221a1d6 | ||
![]() |
80686a8c52 | ||
![]() |
bbba5b9196 | ||
![]() |
e4f431dc7b | ||
![]() |
fd37801d53 | ||
![]() |
73897ef755 | ||
![]() |
7f6dbfbeac | ||
![]() |
5200aca185 | ||
![]() |
02972ad3ea | ||
![]() |
6b094ede16 | ||
![]() |
2b6acff4f4 | ||
![]() |
4dfa016855 | ||
![]() |
f6699b529c | ||
![]() |
bd88ddc56d | ||
![]() |
7ea96eb005 | ||
![]() |
923ed91c9c | ||
![]() |
9c24258530 | ||
![]() |
148f8350b6 | ||
![]() |
04c0aa13ea | ||
![]() |
91604b9f2a | ||
![]() |
f320ca2982 | ||
![]() |
813dc27360 | ||
![]() |
66213c88c1 | ||
![]() |
92a56a80b4 | ||
![]() |
73f755dda2 | ||
![]() |
ad65448e09 | ||
![]() |
58e3297b07 | ||
![]() |
7c3f83215a | ||
![]() |
fa7e0f938e | ||
![]() |
5a204aea48 | ||
![]() |
a35b7a9f82 | ||
![]() |
4948b70acd | ||
![]() |
e39f1cc83f | ||
![]() |
0f84211898 | ||
![]() |
aed98a6b64 | ||
![]() |
69f7f155dd | ||
![]() |
3569a22dab | ||
![]() |
763cc8319d | ||
![]() |
6a7f8b11ed | ||
![]() |
8a9bf94e58 | ||
![]() |
76d8836e6e | ||
![]() |
150d0e6220 | ||
![]() |
fa82a48789 | ||
![]() |
3969c80242 | ||
![]() |
314fcd0dbc | ||
![]() |
0c7e8c67f3 | ||
![]() |
c07b8a59c0 | ||
![]() |
63d44c8b30 | ||
![]() |
4b06cb27b0 | ||
![]() |
b53ac4a14e | ||
![]() |
154f478b5c | ||
![]() |
f9ee4198e1 | ||
![]() |
8ea4c7887f | ||
![]() |
a839144491 | ||
![]() |
f2c61c4496 | ||
![]() |
d6a15aa5dc | ||
![]() |
cc6ec3648f | ||
![]() |
db47b92bc1 | ||
![]() |
c7845f1864 | ||
![]() |
04f3df8bf6 | ||
![]() |
50ccaede60 | ||
![]() |
1ab53aabc8 | ||
![]() |
8e7c7c3af6 | ||
![]() |
f8fbe15300 | ||
![]() |
1a5e6db02d | ||
![]() |
6bc2e50d9c | ||
![]() |
0468b0e3f1 | ||
![]() |
c1f535207f | ||
![]() |
d986f7f7c7 | ||
![]() |
3e0d36af9d | ||
![]() |
abc6e46354 | ||
![]() |
4196f753c8 | ||
![]() |
efce07086c | ||
![]() |
0240da2bf7 | ||
![]() |
b5b11d6227 | ||
![]() |
d9f246f0f0 | ||
![]() |
ba687deaf5 | ||
![]() |
b09b3560b9 | ||
![]() |
bf0f7316b9 | ||
![]() |
4cbb1b1c58 | ||
![]() |
6fa38e4b83 | ||
![]() |
69c19d95ae | ||
![]() |
2d80f87fc9 | ||
![]() |
59c8d39724 | ||
![]() |
75001a024d | ||
![]() |
5d4230d39b | ||
![]() |
19d3984d6e | ||
![]() |
b2b839fa83 | ||
![]() |
5909eec188 | ||
![]() |
452031fbbd | ||
![]() |
692a0ca4b1 | ||
![]() |
1248bd138c | ||
![]() |
d716a275bf | ||
![]() |
08d75a5fe3 | ||
![]() |
27a4ea0f70 | ||
![]() |
61aeea9132 | ||
![]() |
622b8b10c0 | ||
![]() |
a306d77a5e | ||
![]() |
e3c47851b7 | ||
![]() |
ef1cbeae21 | ||
![]() |
64de5497f4 | ||
![]() |
a6075b2855 | ||
![]() |
17cc9e18b4 | ||
![]() |
2d5545997e | ||
![]() |
f3aed72f97 | ||
![]() |
330cfe8b4d | ||
![]() |
3707d4b239 | ||
![]() |
7ef93b20fd | ||
![]() |
6bb046726e | ||
![]() |
03b57179ac | ||
![]() |
8d7a27df76 | ||
![]() |
bf4d0d0890 | ||
![]() |
b00d7fd0ac | ||
![]() |
d5289e8ba9 | ||
![]() |
694691e34a | ||
![]() |
83eb8aeaa7 | ||
![]() |
be46b95d62 | ||
![]() |
f43d23e59a | ||
![]() |
a5b4490ba0 | ||
![]() |
3f56ab68ad | ||
![]() |
5d0cc8144a | ||
![]() |
3b28542d9c | ||
![]() |
9238ee73d6 | ||
![]() |
a9f0623769 | ||
![]() |
d0d075a1b4 | ||
![]() |
a30f47a901 | ||
![]() |
0dfab3684c | ||
![]() |
27611a1698 | ||
![]() |
717bc01df8 | ||
![]() |
a5730a76f9 | ||
![]() |
4f2b24f53d | ||
![]() |
fd7d2fc0a4 | ||
![]() |
97970974fc | ||
![]() |
c61dd0fd2c | ||
![]() |
a3892ecbc4 | ||
![]() |
1bfbe02a29 | ||
![]() |
1dff0b4b27 | ||
![]() |
6e4517de02 | ||
![]() |
7b8308c36a | ||
![]() |
9d012f64c8 | ||
![]() |
1edc4b57b7 | ||
![]() |
d8f01ed4c0 | ||
![]() |
07eb51764a | ||
![]() |
f0da077e78 | ||
![]() |
05e59b048e | ||
![]() |
1c730aab86 | ||
![]() |
5675f00d70 | ||
![]() |
2d522485c4 | ||
![]() |
7247cd6c44 | ||
![]() |
a75a58d591 | ||
![]() |
6650dee578 | ||
![]() |
28bbf11dbb | ||
![]() |
9ac2a69603 | ||
![]() |
1bf6a13d7c | ||
![]() |
744e50acf7 | ||
![]() |
4717d1986c | ||
![]() |
fade4f867d | ||
![]() |
2c5e8749e3 | ||
![]() |
8956b25de4 | ||
![]() |
b5f26e9210 | ||
![]() |
069f59d13f | ||
![]() |
c41e9fe010 | ||
![]() |
5f80251414 | ||
![]() |
4164887412 | ||
![]() |
b6e81c1edd | ||
![]() |
caa501b1af | ||
![]() |
d1bd31b341 | ||
![]() |
428fa95dfd | ||
![]() |
1ab9bee312 | ||
![]() |
71f0a06356 | ||
![]() |
2292006fe3 | ||
![]() |
220778a3c0 | ||
![]() |
11ed65560b | ||
![]() |
e7f120d443 | ||
![]() |
f85a96dd2d | ||
![]() |
f62496d164 | ||
![]() |
e8cdeaba6b | ||
![]() |
a44443f184 | ||
![]() |
888e1d5bb1 | ||
![]() |
a10e3b9bc5 | ||
![]() |
969611835c | ||
![]() |
f0c12b6e9c | ||
![]() |
fefd49c663 | ||
![]() |
1ad4a1377b | ||
![]() |
88c9ae3273 | ||
![]() |
c35c493809 | ||
![]() |
5c30d92627 | ||
![]() |
8d6a4bd7be | ||
![]() |
645ce4a1ee | ||
![]() |
d084be23db | ||
![]() |
e143438552 | ||
![]() |
831597e7d9 | ||
![]() |
4144f5c5ca | ||
![]() |
798edc20c2 | ||
![]() |
ba7161fb00 | ||
![]() |
ab2d6c1169 | ||
![]() |
c5b92d3ab1 | ||
![]() |
4f62a0deab | ||
![]() |
e74142724c | ||
![]() |
903686f7b5 | ||
![]() |
c0eb28dae9 | ||
![]() |
652b9cef87 | ||
![]() |
bb0db6d8f8 | ||
![]() |
6d2647fd5f | ||
![]() |
1b24378da5 | ||
![]() |
851f11dcdd | ||
![]() |
30cffa1acc | ||
![]() |
43a8e2464f | ||
![]() |
d525200a11 | ||
![]() |
102428f768 | ||
![]() |
b93e6cee7b | ||
![]() |
ff46745252 | ||
![]() |
8f75684cd7 | ||
![]() |
5bac2a2331 | ||
![]() |
cc2ea328d5 | ||
![]() |
d3f6d7d844 | ||
![]() |
85da678132 | ||
![]() |
bcd1a9c986 | ||
![]() |
de59b036d0 | ||
![]() |
663fc88373 | ||
![]() |
77669f7e20 | ||
![]() |
040ffb33e0 | ||
![]() |
6ffcc69e2d | ||
![]() |
f88a635d5d | ||
![]() |
4f035d18f6 | ||
![]() |
3473c3c1b0 | ||
![]() |
bdec6aed67 | ||
![]() |
469f12abbc | ||
![]() |
82add09bf9 | ||
![]() |
f6c3064890 | ||
![]() |
c7faff7ac6 | ||
![]() |
e5485288eb | ||
![]() |
73357b6cfd | ||
![]() |
3c884118ed | ||
![]() |
d8cac9c811 | ||
![]() |
db26f180ec | ||
![]() |
6b98a320b1 | ||
![]() |
8f74a226e7 | ||
![]() |
010ca34622 | ||
![]() |
40ee4cc316 | ||
![]() |
74551c873f | ||
![]() |
836ce9ef9b | ||
![]() |
a3ed99e549 | ||
![]() |
67fcb71c6d | ||
![]() |
ba596993a0 | ||
![]() |
4101ad7303 | ||
![]() |
b4a0e27852 | ||
![]() |
eb71fcfd2e | ||
![]() |
0c52b40f49 | ||
![]() |
b8c5e22e1b | ||
![]() |
a9a55b3ccd | ||
![]() |
a98399367b | ||
![]() |
88293d7414 | ||
![]() |
87ec0cce21 | ||
![]() |
7c1cf6a81f | ||
![]() |
0dda8fc224 | ||
![]() |
5b8638b6b8 | ||
![]() |
068e8e6cbe | ||
![]() |
a4e592c776 | ||
![]() |
a9651e1bf1 | ||
![]() |
d7c6474104 | ||
![]() |
9f99633f43 | ||
![]() |
5abff54bc6 | ||
![]() |
a95e52b375 | ||
![]() |
d4a63f791e | ||
![]() |
f1a898c5ca | ||
![]() |
e02615827b | ||
![]() |
035daa663b | ||
![]() |
4cf741e6eb | ||
![]() |
9af25c73d6 | ||
![]() |
55cb473e13 | ||
![]() |
1b12656955 | ||
![]() |
f97c47c511 | ||
![]() |
b8d7b5e2fa | ||
![]() |
1b887d7202 | ||
![]() |
2f33f8e5a8 | ||
![]() |
b9fcfa86c9 | ||
![]() |
5096a13620 | ||
![]() |
bf7fbf2cbe | ||
![]() |
db3e29dd47 | ||
![]() |
0784637f4f | ||
![]() |
ddcc7d9990 | ||
![]() |
b62b2d0d93 | ||
![]() |
8a7642f122 | ||
![]() |
895fbb2e8a | ||
![]() |
401d7b9b41 | ||
![]() |
c84faa79fb | ||
![]() |
e085cfd3ab | ||
![]() |
f42e44a69d | ||
![]() |
58485dec2a | ||
![]() |
9878a96c0b | ||
![]() |
8c9040919d | ||
![]() |
da169336ee | ||
![]() |
990a0e4257 | ||
![]() |
e2fdf18625 | ||
![]() |
00a00a3505 | ||
![]() |
ebed3ded37 | ||
![]() |
a0893c9aae | ||
![]() |
105d18b9b6 | ||
![]() |
a448f538aa | ||
![]() |
98a5bc95a9 | ||
![]() |
b23a2f2304 | ||
![]() |
85bff67d9b | ||
![]() |
9c8f3826b2 | ||
![]() |
69f1ea5627 | ||
![]() |
6673fb906b | ||
![]() |
e9fdbea091 | ||
![]() |
8f6a0b15c3 | ||
![]() |
a18be12b77 | ||
![]() |
3d34097275 | ||
![]() |
7e22861090 | ||
![]() |
36329827fc | ||
![]() |
db3d292cae | ||
![]() |
d27ca0bc89 | ||
![]() |
279d9e5824 | ||
![]() |
f68ac4377a | ||
![]() |
59de2fd979 | ||
![]() |
13330eb085 | ||
![]() |
23de275dbe | ||
![]() |
27083e3664 | ||
![]() |
5df51a9365 | ||
![]() |
b56e3c43a8 | ||
![]() |
a3048a0b25 | ||
![]() |
105a08dd20 | ||
![]() |
09b2670c45 | ||
![]() |
60d0c2208b | ||
![]() |
7cb8a3f968 | ||
![]() |
99374ae45b | ||
![]() |
2f62c156f9 | ||
![]() |
fee5251bd4 | ||
![]() |
363cd8d79e | ||
![]() |
be40830bc0 | ||
![]() |
152239c3ac | ||
![]() |
522d7f6ee4 | ||
![]() |
dfa5b46494 | ||
![]() |
04a6d5513b | ||
![]() |
843dd17aec | ||
![]() |
243df3f2cf | ||
![]() |
a260d334d0 | ||
![]() |
b1422ff6b5 | ||
![]() |
59fc68026b | ||
![]() |
9b537d81e0 | ||
![]() |
ac011132ee | ||
![]() |
1fd8de6762 | ||
![]() |
640aabe1b3 | ||
![]() |
0b54d49181 | ||
![]() |
0e6e4e8949 | ||
![]() |
344fdf94f7 | ||
![]() |
b6c488a883 | ||
![]() |
c8e29dafc6 | ||
![]() |
2cc785bf20 | ||
![]() |
6842b53425 | ||
![]() |
65588b8126 | ||
![]() |
33062dc839 | ||
![]() |
171d641092 | ||
![]() |
8d2d121b6d | ||
![]() |
117eb79953 | ||
![]() |
c58607a5b5 | ||
![]() |
8a0493b659 | ||
![]() |
8364eca708 | ||
![]() |
271446fd66 | ||
![]() |
96a45a6dde | ||
![]() |
3371fde11e | ||
![]() |
2c03980365 | ||
![]() |
621f6f59e1 | ||
![]() |
178d42c286 | ||
![]() |
20d0207890 | ||
![]() |
97017017a4 | ||
![]() |
33225bfabb | ||
![]() |
bf1dace55d | ||
![]() |
a38b885275 | ||
![]() |
0df56eaffa | ||
![]() |
af1fa724af | ||
![]() |
0bddfad14e | ||
![]() |
aa39e000f7 | ||
![]() |
ddf762b7cc | ||
![]() |
17ea732753 | ||
![]() |
25f17d7141 | ||
![]() |
f3dcbdcea9 | ||
![]() |
904fb01e75 | ||
![]() |
b853886cb7 | ||
![]() |
c96a48b9e1 | ||
![]() |
0ea245805b | ||
![]() |
3701a8cedc | ||
![]() |
5decd01299 | ||
![]() |
40fb8fa7df | ||
![]() |
9ac4712527 | ||
![]() |
aa380ea190 | ||
![]() |
d18925897a | ||
![]() |
3537d18483 | ||
![]() |
fe280fe6aa | ||
![]() |
2115e09839 | ||
![]() |
d15b88f746 | ||
![]() |
0d267a546a | ||
![]() |
2ce513f50c | ||
![]() |
bdfe3524a9 | ||
![]() |
d3f8afed29 | ||
![]() |
9499211d7d | ||
![]() |
711e283925 | ||
![]() |
94aded8d5c | ||
![]() |
b16b3859e3 | ||
![]() |
2cf0eda870 | ||
![]() |
767ac60266 | ||
![]() |
342ba2bd44 | ||
![]() |
2c1f6b24d3 | ||
![]() |
0c49262d54 | ||
![]() |
7cb8c0259d | ||
![]() |
75c47b6948 | ||
![]() |
9451f20b43 | ||
![]() |
cbff86695f | ||
![]() |
95f6032d86 | ||
![]() |
fe31d84ac6 | ||
![]() |
4fbe3590be | ||
![]() |
6e8e3cc740 | ||
![]() |
7bde0b89d1 | ||
![]() |
bd47d99ceb | ||
![]() |
87148ae0c1 | ||
![]() |
7e8bcd896a | ||
![]() |
4858ec0aef | ||
![]() |
a02e3aa651 | ||
![]() |
ae9d2a2c85 | ||
![]() |
0471ba24c1 | ||
![]() |
7471d754f7 | ||
![]() |
aa217e13b9 | ||
![]() |
d046f9c25f | ||
![]() |
ae499eb73a | ||
![]() |
a53e057d54 | ||
![]() |
9546390a1f | ||
![]() |
e4bf2a5c27 | ||
![]() |
c86e4db3a9 | ||
![]() |
bdc15960ad | ||
![]() |
ea5c9bc9b6 | ||
![]() |
8cfa6f28ea | ||
![]() |
3cae94d710 | ||
![]() |
c556c06413 | ||
![]() |
01140d3013 | ||
![]() |
c909aecd93 | ||
![]() |
4c5c6f726f | ||
![]() |
1e33b45ea8 | ||
![]() |
ff961df336 | ||
![]() |
7c48ab710a | ||
![]() |
02cd72403d | ||
![]() |
5a1ae70549 | ||
![]() |
8479da0afb | ||
![]() |
9350f68ac5 | ||
![]() |
d16a502f36 | ||
![]() |
a99c6d67bb | ||
![]() |
c7083629e1 | ||
![]() |
f68e2285e8 | ||
![]() |
0bcb981556 | ||
![]() |
e198ffb22d | ||
![]() |
f3fa9dfd9b | ||
![]() |
9e168d84d7 | ||
![]() |
89b4376e31 | ||
![]() |
7ae86d336b | ||
![]() |
dcc7021384 | ||
![]() |
7d87bf0dcc | ||
![]() |
01f9097acb | ||
![]() |
4f732477dd | ||
![]() |
a51c511d52 | ||
![]() |
243411916b | ||
![]() |
7b678ba2c8 | ||
![]() |
2d33a77ba5 | ||
![]() |
fd02f5aefc | ||
![]() |
132b98f0c2 | ||
![]() |
0249f66066 | ||
![]() |
b58615183f | ||
![]() |
979dd86730 | ||
![]() |
e13c0a7114 | ||
![]() |
8c4388bf47 | ||
![]() |
fc7638e684 | ||
![]() |
0bd5f6b27a | ||
![]() |
90e21a5902 | ||
![]() |
4d9e9198b5 | ||
![]() |
533b86d890 | ||
![]() |
ec696509b9 | ||
![]() |
f5ed2e0845 | ||
![]() |
2771827c15 | ||
![]() |
b61ea17ce1 | ||
![]() |
d134b88c68 | ||
![]() |
2347f37269 | ||
![]() |
7c98e0d303 | ||
![]() |
adcc50ac6e | ||
![]() |
b88ec44d15 | ||
![]() |
27c35befdf | ||
![]() |
f132663dfe | ||
![]() |
bc6faa733c | ||
![]() |
a4dbc57448 | ||
![]() |
7b478f718c | ||
![]() |
bb40642225 | ||
![]() |
0a2990de59 | ||
![]() |
1e42b5d131 | ||
![]() |
5085a8bbbb | ||
![]() |
2aa8787884 | ||
![]() |
0fe893b01d | ||
![]() |
33f491a8e6 | ||
![]() |
00694abbde | ||
![]() |
e07b0e42b3 | ||
![]() |
e56f6a150d | ||
![]() |
a78169b43a | ||
![]() |
25a2a46917 | ||
![]() |
662b84947b | ||
![]() |
688f3ffb19 | ||
![]() |
c161f63c9a | ||
![]() |
0d3e888147 | ||
![]() |
3e0b70af10 | ||
![]() |
e5521bb763 | ||
![]() |
1ca91a8170 | ||
![]() |
01bd6ec52a | ||
![]() |
a9e7426cff | ||
![]() |
522f6c5e00 | ||
![]() |
a14aad93cb | ||
![]() |
784bc3ea5f | ||
![]() |
da4fab66c1 | ||
![]() |
3b4035b3e2 | ||
![]() |
73350da88c | ||
![]() |
140e4791aa | ||
![]() |
08afd40823 | ||
![]() |
00a389bbb2 | ||
![]() |
a4c7add8df | ||
![]() |
2e51860464 | ||
![]() |
7824378755 | ||
![]() |
4e6ba4fccc | ||
![]() |
dc107a1a6e | ||
![]() |
2eccc96c62 | ||
![]() |
7253e83a04 | ||
![]() |
e7f69ebc5f | ||
![]() |
62af6f3a7c | ||
![]() |
239ddfc15c | ||
![]() |
7f7bcd0ab6 | ||
![]() |
009aa8d481 | ||
![]() |
ec97552c8b | ||
![]() |
0e5b2a86b8 | ||
![]() |
285a6f3532 | ||
![]() |
60a42f015e | ||
![]() |
33b0c1d5c2 | ||
![]() |
b69f9b77a7 | ||
![]() |
27c731c7b6 | ||
![]() |
ea5cc628a8 | ||
![]() |
5b207209a5 | ||
![]() |
0d225839da | ||
![]() |
2ddbc7c7fa | ||
![]() |
b9bd558abe | ||
![]() |
6ba59385d4 | ||
![]() |
f602470aeb | ||
![]() |
85a9eda143 | ||
![]() |
ec6448b353 | ||
![]() |
e4ea62cc0d | ||
![]() |
ac06195907 | ||
![]() |
1d7f3e8f07 | ||
![]() |
17a299dd00 | ||
![]() |
2705e6177d | ||
![]() |
0322eb370c | ||
![]() |
9105b56ffd | ||
![]() |
f9ca7d4821 | ||
![]() |
4cda2d7dc2 | ||
![]() |
2865630309 | ||
![]() |
15a5ef30c4 | ||
![]() |
50e9bb70aa | ||
![]() |
466dcae840 | ||
![]() |
3e8ca44681 | ||
![]() |
c7a5cd58f4 | ||
![]() |
178b11196a | ||
![]() |
141a4086b3 | ||
![]() |
584329a6c0 | ||
![]() |
2f3663b8aa | ||
![]() |
61814e79fe | ||
![]() |
1d626225de | ||
![]() |
522929384c | ||
![]() |
da0e4c433f | ||
![]() |
9314032f69 | ||
![]() |
2f59523416 | ||
![]() |
08f9b37b99 | ||
![]() |
21c7f4c81b | ||
![]() |
c5e122f922 | ||
![]() |
0d6baa00e4 | ||
![]() |
d469f2a565 | ||
![]() |
918020202d | ||
![]() |
f83c58fa0e | ||
![]() |
c07a90bea0 | ||
![]() |
dd161dc732 | ||
![]() |
e6e15a214f | ||
![]() |
7a9f60facc | ||
![]() |
57cae7c259 | ||
![]() |
cced3d1d93 | ||
![]() |
c41f18a9b6 | ||
![]() |
53073b374d | ||
![]() |
3d0532ce8c | ||
![]() |
73b0ec2c1d | ||
![]() |
a3e57d6479 | ||
![]() |
c0965f5624 | ||
![]() |
abc460575a | ||
![]() |
c4e847d288 | ||
![]() |
369e5aaef1 | ||
![]() |
ca5a2d322d | ||
![]() |
abd013eda8 | ||
![]() |
1e63c8924e | ||
![]() |
599526a90c | ||
![]() |
3be5f630e1 | ||
![]() |
545cc27ca8 | ||
![]() |
fffb43fa79 | ||
![]() |
1d7498d0b8 | ||
![]() |
9168f7b198 | ||
![]() |
9b8cd42e5f | ||
![]() |
6f20dcd0ed | ||
![]() |
041540c80c | ||
![]() |
18bdf07903 | ||
![]() |
24c8f65cb5 | ||
![]() |
d08bf78e24 | ||
![]() |
f7e285ab11 | ||
![]() |
dbafe1e167 | ||
![]() |
a67f4f0c06 | ||
![]() |
08c3416255 | ||
![]() |
fb78c3a796 | ||
![]() |
50979c328c | ||
![]() |
117cee9e6e | ||
![]() |
fd148a8d12 | ||
![]() |
5b5fdb0afe | ||
![]() |
ecf7d444c6 | ||
![]() |
852ce100db | ||
![]() |
27d2a0a2d5 | ||
![]() |
b3c075c666 | ||
![]() |
5cc5e5ef45 | ||
![]() |
71c8748def | ||
![]() |
bf01e5bb70 | ||
![]() |
311a9f18e6 | ||
![]() |
4aa2da3eb2 | ||
![]() |
e2a08d5d01 | ||
![]() |
41970f7d62 | ||
![]() |
eef4ff389f | ||
![]() |
1e64eaddf3 | ||
![]() |
466652549a | ||
![]() |
2a35f325b8 | ||
![]() |
469492a41a | ||
![]() |
582ca598f0 | ||
![]() |
91dd120aa9 | ||
![]() |
5a8d713d77 | ||
![]() |
492c6bbda2 | ||
![]() |
b9cd7bf04a | ||
![]() |
546ed9d409 | ||
![]() |
9970b9d947 | ||
![]() |
595b7f750d | ||
![]() |
157e1afb29 | ||
![]() |
805ad32a30 | ||
![]() |
ef99b40578 | ||
![]() |
f6cba1986b | ||
![]() |
cb70ff7a77 | ||
![]() |
5ecd45e2da | ||
![]() |
c4431eb6fe | ||
![]() |
bf47a1e51c | ||
![]() |
fe34b5df3d | ||
![]() |
0e273c18f6 | ||
![]() |
76970ddca9 | ||
![]() |
0f19dcdff8 | ||
![]() |
c7ff6342d8 | ||
![]() |
7e14db4091 | ||
![]() |
9b5df76860 | ||
![]() |
13cbf26b87 | ||
![]() |
f01e74f605 | ||
![]() |
042eecc378 | ||
![]() |
e6d9d826ac | ||
![]() |
b6b74ecb96 | ||
![]() |
0bb1fcbc00 | ||
![]() |
e4936f6c5f | ||
![]() |
e95c940345 | ||
![]() |
370f59dd40 | ||
![]() |
fd27a82f6b | ||
![]() |
f131db6d40 | ||
![]() |
0eff23f519 | ||
![]() |
add5b2dbaf | ||
![]() |
99b140512e | ||
![]() |
7dc9e6e0ce | ||
![]() |
04d7d188b3 | ||
![]() |
1d04c000e2 | ||
![]() |
7440970bc4 | ||
![]() |
0ed7b6e8e9 | ||
![]() |
414c231c86 | ||
![]() |
c16a8411a8 | ||
![]() |
87f5fbd5fd | ||
![]() |
c1845b952b | ||
![]() |
d9895a0fcb | ||
![]() |
2a0c53a382 | ||
![]() |
ecf2504edf | ||
![]() |
cad288bd0d | ||
![]() |
218b282396 | ||
![]() |
54bd6ca6e7 | ||
![]() |
8f9cf94e3a | ||
![]() |
cb0e2938e5 | ||
![]() |
440a7a689e | ||
![]() |
1fe18cf7b6 | ||
![]() |
8045ca20ac | ||
![]() |
d957c97c1e | ||
![]() |
6c5dee9556 | ||
![]() |
87ed42318a | ||
![]() |
5ac69b81e1 | ||
![]() |
013a14cbcb | ||
![]() |
f5b4818f34 | ||
![]() |
1582385926 | ||
![]() |
951fba99b1 | ||
![]() |
a006e5fc53 | ||
![]() |
6492596a10 | ||
![]() |
20c918ce38 | ||
![]() |
0b4cddff72 | ||
![]() |
05f4011491 | ||
![]() |
35c2d55382 | ||
![]() |
105aa03198 | ||
![]() |
a2ad349487 | ||
![]() |
ff43dc29b2 | ||
![]() |
2321d66ba6 | ||
![]() |
8acf4cd119 | ||
![]() |
a111c0ae8f | ||
![]() |
177de35fbc | ||
![]() |
31d98f3666 | ||
![]() |
5f7584efe4 | ||
![]() |
5cb3ea2114 | ||
![]() |
8736544a81 | ||
![]() |
5e5a7756c4 | ||
![]() |
0f9adae912 | ||
![]() |
7e455bad6b | ||
![]() |
5e60d5217d | ||
![]() |
918faf3af6 | ||
![]() |
7e2fff9728 | ||
![]() |
d3ab3ced1e | ||
![]() |
ce443771d9 | ||
![]() |
7072c3a0ef | ||
![]() |
7984b7513c | ||
![]() |
d5ee89677b | ||
![]() |
e98ce29fea | ||
![]() |
1b5fdb5c57 | ||
![]() |
0484299ee4 | ||
![]() |
e7368631cf | ||
![]() |
39ad5a41bb | ||
![]() |
5f6ac60d6b | ||
![]() |
1721de0b76 | ||
![]() |
54e4aba750 | ||
![]() |
56fcd0e634 | ||
![]() |
670164f4d0 | ||
![]() |
d678666ef0 | ||
![]() |
9cacf2f609 | ||
![]() |
669bb582e0 | ||
![]() |
541f3630a1 | ||
![]() |
8a06984947 | ||
![]() |
b9a0ae98df | ||
![]() |
cbd533c1e9 | ||
![]() |
787f153219 | ||
![]() |
02f6e05289 | ||
![]() |
e149a0399e | ||
![]() |
2128dfbade | ||
![]() |
8a8888a273 | ||
![]() |
06f905e0b5 | ||
![]() |
9207aa2e10 | ||
![]() |
07a2df1b74 | ||
![]() |
ed7909f23f | ||
![]() |
db92a843fc | ||
![]() |
ad3782bed1 | ||
![]() |
6558414e2b | ||
![]() |
7c36029ec2 | ||
![]() |
fe89774fe0 | ||
![]() |
fbe83585bd | ||
![]() |
52344d2cc7 | ||
![]() |
34d6bffe7a | ||
![]() |
d90f0e1cbe | ||
![]() |
31fc66f5be | ||
![]() |
1ebdbfd6a4 | ||
![]() |
781491efca | ||
![]() |
76b1f48f0c | ||
![]() |
9f4c994034 | ||
![]() |
c19391da8d | ||
![]() |
0422b25e31 | ||
![]() |
60666fa1c5 | ||
![]() |
b15a0e2f1f | ||
![]() |
e336913b32 | ||
![]() |
71e666462c | ||
![]() |
caed27645e | ||
![]() |
6ccb3ae290 | ||
![]() |
7774ce5ad8 | ||
![]() |
4b44d2fa32 | ||
![]() |
0814acb8dc | ||
![]() |
bd3c7d8ddf | ||
![]() |
894e46cb5a | ||
![]() |
ae7bed5acf | ||
![]() |
7c52906a2e | ||
![]() |
b587287ce0 | ||
![]() |
1abc4a6c30 | ||
![]() |
72968b9ee8 | ||
![]() |
aa4bdebe55 | ||
![]() |
b50d613360 | ||
![]() |
c13d3cbf1c | ||
![]() |
6ad2c4c945 | ||
![]() |
06e352dc19 | ||
![]() |
417f8b0e9b | ||
![]() |
03cf7dc460 | ||
![]() |
48aa621975 | ||
![]() |
7707473b4e | ||
![]() |
2fff690af3 | ||
![]() |
10465ce941 | ||
![]() |
28cce3f020 | ||
![]() |
bad2f4fb13 | ||
![]() |
15ae3e0fa5 | ||
![]() |
7088ee2be6 | ||
![]() |
14c48a18a0 | ||
![]() |
36cbca9004 | ||
![]() |
f10218a257 | ||
![]() |
6337c59fab | ||
![]() |
31adf74634 | ||
![]() |
c95483844a | ||
![]() |
a34f5496a1 | ||
![]() |
aad917d060 | ||
![]() |
3c70e63af8 | ||
![]() |
a38e88422f | ||
![]() |
d08461482f | ||
![]() |
c18ed34685 | ||
![]() |
46fae91e10 | ||
![]() |
9c34707401 | ||
![]() |
e644ed0724 | ||
![]() |
5338e84243 | ||
![]() |
f18bbae23a | ||
![]() |
9dd1c28cfc | ||
![]() |
70bce974b2 | ||
![]() |
1b741f4809 | ||
![]() |
ad1b8c6833 | ||
![]() |
130c3f83f1 | ||
![]() |
e218550447 | ||
![]() |
899e637bda | ||
![]() |
73a52945c2 | ||
![]() |
ca17be0e0b | ||
![]() |
bb2f31bd88 | ||
![]() |
95f7d33c20 | ||
![]() |
1a462c986c | ||
![]() |
cc8614da9c | ||
![]() |
0ac0dda5ba | ||
![]() |
5ab7ebee9d | ||
![]() |
5e8b116128 | ||
![]() |
26a3eacbd6 | ||
![]() |
0518bd6c64 | ||
![]() |
4d7036db3b | ||
![]() |
f488ef922a | ||
![]() |
f7ae60a9e4 | ||
![]() |
8b7cd2de44 | ||
![]() |
309ac81e22 | ||
![]() |
190493c747 | ||
![]() |
79d02e772c | ||
![]() |
9e8bd2156b | ||
![]() |
268fad6d0d | ||
![]() |
8ff9fffa0a | ||
![]() |
bc9fd3cd92 | ||
![]() |
2cc87b086b | ||
![]() |
bb07ded475 | ||
![]() |
224a9fb717 | ||
![]() |
14f976b8a4 | ||
![]() |
e77a5f57ff | ||
![]() |
8231a0429c | ||
![]() |
3429ebd359 | ||
![]() |
16afaf3c59 | ||
![]() |
6d82997fde | ||
![]() |
93e27654e6 | ||
![]() |
99f4774e14 | ||
![]() |
2544cf0305 | ||
![]() |
9b2720c64d | ||
![]() |
804ee37098 | ||
![]() |
47ae5bc9c8 | ||
![]() |
bb790efefd | ||
![]() |
ee6863ffd9 | ||
![]() |
d4720d9378 | ||
![]() |
24372207de | ||
![]() |
10fff01c80 | ||
![]() |
29a8f82421 | ||
![]() |
9759cca4f4 | ||
![]() |
174caf2251 | ||
![]() |
9c4dfd28ef | ||
![]() |
27ccf0490b | ||
![]() |
6a35795178 | ||
![]() |
b06c310305 | ||
![]() |
d394eef7c8 | ||
![]() |
715ca102c7 | ||
![]() |
54b1a94379 | ||
![]() |
3162282f91 | ||
![]() |
9bb8d6e1ff | ||
![]() |
92b9190817 | ||
![]() |
e55471e084 | ||
![]() |
3c43486cf5 | ||
![]() |
adfbf6508a | ||
![]() |
ce419cce81 | ||
![]() |
021294bcd9 | ||
![]() |
6032104cfd | ||
![]() |
db572b1125 | ||
![]() |
d52fd2050a | ||
![]() |
ed782c6606 | ||
![]() |
c002bf2d21 | ||
![]() |
f2f78c4cee | ||
![]() |
4fb1d3a65d | ||
![]() |
34561db70c | ||
![]() |
89aa392a46 | ||
![]() |
daa24af6f6 | ||
![]() |
401f240a7c | ||
![]() |
9026b95f45 | ||
![]() |
3bbc33f554 | ||
![]() |
a2bb0afea2 | ||
![]() |
7ad95faad2 | ||
![]() |
24b59376bb | ||
![]() |
77cba87994 | ||
![]() |
a4397b26b8 | ||
![]() |
bf91af0c07 | ||
![]() |
8f1cb3431f | ||
![]() |
2e9e2da291 | ||
![]() |
51e712f68a | ||
![]() |
35492afd89 | ||
![]() |
aba06bb465 | ||
![]() |
6f28b5ab2c | ||
![]() |
d61c96a485 | ||
![]() |
34f7ecf31a | ||
![]() |
62d37e9fcf | ||
![]() |
100869a40f | ||
![]() |
3d3280eb8e | ||
![]() |
55be1866ad | ||
![]() |
3dcd8d7f13 | ||
![]() |
7402fe06fd | ||
![]() |
389bf124bf | ||
![]() |
c9c1eee302 | ||
![]() |
b218f6bff1 | ||
![]() |
87567b25b2 | ||
![]() |
e152a3cbf7 | ||
![]() |
d130a637da | ||
![]() |
cadea7540a | ||
![]() |
4bc8a41502 | ||
![]() |
4dc827f431 | ||
![]() |
9aff378ef8 | ||
![]() |
30dd5e6a55 | ||
![]() |
9608bc5799 | ||
![]() |
ae01d4ccd5 | ||
![]() |
87f17404c0 | ||
![]() |
90b3f0f62b | ||
![]() |
0632f4e7d6 | ||
![]() |
d258b9a758 | ||
![]() |
d4980b9957 | ||
![]() |
06d7d3ba74 | ||
![]() |
772a1533a6 | ||
![]() |
0ecefe4c20 | ||
![]() |
59653c7bff | ||
![]() |
7ae074b4f2 | ||
![]() |
af7f2a02d1 | ||
![]() |
9a5217bf90 | ||
![]() |
d30c634515 | ||
![]() |
5f07afab1b | ||
![]() |
fb003e006e | ||
![]() |
920967506b | ||
![]() |
d77cf7d2f0 | ||
![]() |
d8d1b1d131 | ||
![]() |
9a12192fa9 | ||
![]() |
c7894181b7 | ||
![]() |
30f650ebb2 | ||
![]() |
1661ebb02e | ||
![]() |
456ce5cd31 | ||
![]() |
d774643b9c | ||
![]() |
236eb77af1 | ||
![]() |
2068879c23 | ||
![]() |
1abaf146b5 | ||
![]() |
7216db339e | ||
![]() |
733b9254a5 | ||
![]() |
0faef8e4dd | ||
![]() |
d3093a13c2 | ||
![]() |
c93d6676b9 | ||
![]() |
6732db8803 | ||
![]() |
a51b08b36c | ||
![]() |
b91f93062a | ||
![]() |
f05cb6d50b | ||
![]() |
c0ae3dcaca | ||
![]() |
97821ab925 | ||
![]() |
cbc9796c92 | ||
![]() |
1d1d785f51 | ||
![]() |
036723ddb5 | ||
![]() |
bee3b5b66a | ||
![]() |
4cb53fef06 | ||
![]() |
080cdb4f0d |
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@ -32,6 +32,7 @@ _Make sure your have performed every step and checked the applicable boxes befor
|
||||
- [ ] Searched the problem in [discussions](https://github.com/arendst/Tasmota/discussions)
|
||||
- [ ] Searched the problem in the [docs](https://tasmota.github.io/docs/FAQ)
|
||||
- [ ] Searched the problem in the [chat](https://discord.gg/Ks2Kzd4)
|
||||
- [ ] Problem is not scripter related, in this case open a discussion and tag gemu2015
|
||||
- [ ] Device used (e.g., Sonoff Basic): _____
|
||||
- [ ] Tasmota binary firmware version number used: _____
|
||||
- [ ] Pre-compiled
|
||||
|
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -6,8 +6,8 @@
|
||||
- [ ] The pull request is done against the latest development branch
|
||||
- [ ] Only relevant files were touched
|
||||
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings
|
||||
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.6
|
||||
- [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.14
|
||||
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.8
|
||||
- [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.3.250411
|
||||
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
|
||||
|
||||
_NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_
|
||||
|
139
.github/workflows/Tasmota_build_devel.yml
vendored
139
.github/workflows/Tasmota_build_devel.yml
vendored
@ -25,31 +25,31 @@ jobs:
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Install clang compiler
|
||||
run: |
|
||||
sudo apt-get install -f clang
|
||||
- name: Make Berry and Tasmota Berry code
|
||||
|
||||
- name: Make Berry and Solidify code
|
||||
run: |
|
||||
cd lib/libesp32/berry
|
||||
make
|
||||
cd ../berry_tasmota
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: Matter Berry Code
|
||||
run: |
|
||||
cd lib/libesp32/berry_matter
|
||||
cd ../berry_matter
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: Berry Animate Code
|
||||
run: |
|
||||
cd lib/libesp32/berry_animate
|
||||
cd ../berry_animate
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: LVGL Berry Code
|
||||
run: |
|
||||
cd lib/libesp32_lvgl/lv_binding_berry
|
||||
cd ../../libesp32_lvgl/lv_binding_berry
|
||||
../../libesp32/berry/berry -s -g solidify_all.be
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
cd ../lv_haspmota
|
||||
../../libesp32/berry/berry -s -g solidify_all.be
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: '["berry_tasmota", "berry_matter", "berry_animate", "berry_lvgl", "berry_header"]'
|
||||
path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_animate/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]'
|
||||
name: berry
|
||||
path: |
|
||||
./lib/libesp32/berry_tasmota/src/solidify
|
||||
./lib/libesp32/berry_matter/src/solidify
|
||||
./lib/libesp32/berry_animate/src/solidify
|
||||
./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
./lib/libesp32_lvgl/lv_haspmota/src/solidify
|
||||
./lib/libesp32/berry/generate
|
||||
|
||||
push_solidified:
|
||||
needs: be_solidify
|
||||
@ -62,20 +62,19 @@ jobs:
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- uses: jason2866/download-artifact@v3.0.4
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: |
|
||||
berry_tasmota
|
||||
berry_matter
|
||||
berry_animate
|
||||
berry_lvgl
|
||||
berry_header
|
||||
path: |
|
||||
./lib/libesp32/berry_tasmota/src/solidify
|
||||
./lib/libesp32/berry_matter/src/solidify
|
||||
./lib/libesp32/berry_animate/src/solidify
|
||||
./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
./lib/libesp32/berry/generate
|
||||
pattern: berry
|
||||
path: berry
|
||||
- name: Move solidified Berry files back
|
||||
run: |
|
||||
ls -R ./berry
|
||||
mv berry/berry/libesp32/berry_tasmota/src/solidify/* ./lib/libesp32/berry_tasmota/src/solidify
|
||||
mv berry/berry/libesp32/berry_matter/src/solidify/* ./lib/libesp32/berry_matter/src/solidify
|
||||
mv berry/berry/libesp32/berry_animate/src/solidify/* ./lib/libesp32/berry_animate/src/solidify
|
||||
mv berry/berry/libesp32_lvgl/lv_binding_berry/src/solidify/* ./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
mv berry/berry/libesp32_lvgl/lv_haspmota/src/solidify/* ./lib/libesp32_lvgl/lv_haspmota/src/solidify
|
||||
mv berry/berry/libesp32/berry/generate/* ./lib/libesp32/berry/generate
|
||||
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
commit_message: Solidified Code updated
|
||||
@ -88,17 +87,17 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32-safeboot
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32c2-safeboot
|
||||
- tasmota32c3-safeboot
|
||||
- tasmota32c3cdc-safeboot
|
||||
- tasmota32c3ser-safeboot
|
||||
- tasmota32s2-safeboot
|
||||
- tasmota32s2cdc-safeboot
|
||||
- tasmota32s3-safeboot
|
||||
- tasmota32s3cdc-safeboot
|
||||
- tasmota32c2-safeboot
|
||||
- tasmota32s3ser-safeboot
|
||||
- tasmota32c6-safeboot
|
||||
- tasmota32c6cdc-safeboot
|
||||
- tasmota32c6ser-safeboot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -111,14 +110,21 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_tasmota_core3_env_sample.ini ./platformio_tasmota_core3_env.ini
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
SHA=${COMMIT_SHA_LONG::7}
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT $SHA-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
#- name: Use esp32-solo1 safeboot for esp32 too
|
||||
#run: |
|
||||
#cp ./build_output/firmware/tasmota32solo1-safeboot.bin ./build_output/firmware/tasmota32-safeboot.bin
|
||||
- name: Upload safeboot firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -151,12 +157,17 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
SHA=${COMMIT_SHA_LONG::7}
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT $SHA-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base32-images:
|
||||
@ -175,15 +186,13 @@ jobs:
|
||||
- tasmota32-display
|
||||
- tasmota32-ir
|
||||
- tasmota32-lvgl
|
||||
- tasmota32c2
|
||||
- tasmota32c3
|
||||
- tasmota32c3cdc
|
||||
- tasmota32c6
|
||||
- tasmota32s2
|
||||
- tasmota32s2cdc
|
||||
- tasmota32s3
|
||||
- tasmota32s3cdc
|
||||
- tasmota32solo1
|
||||
- tasmota32c2-arduino30
|
||||
- tasmota32c6cdc-arduino30
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -196,22 +205,27 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_tasmota_core3_env_sample.ini ./platformio_tasmota_core3_env.ini
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
SHA=${COMMIT_SHA_LONG::7}
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT $SHA-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -222,7 +236,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant: [ tasmota, tasmota32 ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -235,22 +249,27 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_tasmota_core3_env_sample.ini ./platformio_tasmota_core3_env.ini
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
SHA=${COMMIT_SHA_LONG::7}
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT $SHA-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- name: Upload language firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
||||
Start_final_copy:
|
||||
|
94
.github/workflows/Tasmota_build_master.yml
vendored
94
.github/workflows/Tasmota_build_master.yml
vendored
@ -21,17 +21,17 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32-safeboot
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32c2-safeboot
|
||||
- tasmota32c3-safeboot
|
||||
- tasmota32c3cdc-safeboot
|
||||
- tasmota32c3ser-safeboot
|
||||
- tasmota32s2-safeboot
|
||||
- tasmota32s2cdc-safeboot
|
||||
- tasmota32s3-safeboot
|
||||
- tasmota32s3cdc-safeboot
|
||||
- tasmota32c2-safeboot
|
||||
- tasmota32s3ser-safeboot
|
||||
- tasmota32c6-safeboot
|
||||
- tasmota32c6cdc-safeboot
|
||||
- tasmota32c6ser-safeboot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -44,14 +44,16 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_tasmota_core3_env_sample.ini ./platformio_tasmota_core3_env.ini
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload safeboot firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -83,12 +85,16 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base32-images:
|
||||
@ -107,12 +113,12 @@ jobs:
|
||||
- tasmota32-display
|
||||
- tasmota32-ir
|
||||
- tasmota32-lvgl
|
||||
- tasmota32c2
|
||||
- tasmota32c3
|
||||
- tasmota32c3cdc
|
||||
- tasmota32c6
|
||||
- tasmota32s2
|
||||
- tasmota32s2cdc
|
||||
- tasmota32s3
|
||||
- tasmota32s3cdc
|
||||
- tasmota32solo1
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@ -126,20 +132,25 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -150,7 +161,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant: [ tasmota, tasmota32 ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -163,20 +174,25 @@ jobs:
|
||||
run: |
|
||||
pip install wheel
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- name: Upload language firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
||||
Release:
|
||||
@ -185,28 +201,24 @@ jobs:
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download Tasmota firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
- name: Download all Tasmota artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
path: ./mv_firmware
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./mv_firmware
|
||||
pattern: tasmota*
|
||||
path: ./temp
|
||||
- name: Move files
|
||||
run: |
|
||||
mkdir -p ./release
|
||||
find ./temp -type f -exec cp -t ./release {} +
|
||||
- name: Display structure of downloaded files
|
||||
run: ls -R ./mv_firmware/
|
||||
- name: Zip all map.gz files in one file -> map_all.zip
|
||||
run: 7z a -mx=9 -tzip -xr'!.*' map_all.zip mv_firmware/map
|
||||
run: ls -R ./release/
|
||||
- name: Release
|
||||
uses: jason2866/action-gh-release@v1.2
|
||||
#if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
tag_name: ${{ github.run_number }}
|
||||
files: |
|
||||
./mv_firmware/firmware/*
|
||||
map_all.zip
|
||||
./release/tasmota*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
40
.github/workflows/build_all_the_things.yml
vendored
40
.github/workflows/build_all_the_things.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32-safeboot
|
||||
- tasmota32-webcam
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -41,9 +41,9 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
os-check-mac:
|
||||
@ -53,7 +53,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32-webcam
|
||||
- tasmota32solo1-safeboot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -69,9 +69,9 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -91,32 +91,27 @@ jobs:
|
||||
- tasmota-sensors
|
||||
- tasmota-zbbridge
|
||||
- tasmota32
|
||||
- tasmota32solo1
|
||||
- tasmota32c2
|
||||
- tasmota32c3
|
||||
- tasmota32c6cdc-arduino30
|
||||
- tasmota32c6
|
||||
- tasmota32s2
|
||||
- tasmota32s2cdc
|
||||
- tasmota32s3
|
||||
- tasmota32-zbbrdgpro
|
||||
- tasmota-zigbee
|
||||
- tasmota32-bluetooth
|
||||
- tasmota32-core2
|
||||
- tasmota32-nspanel
|
||||
- tasmota32-display
|
||||
- tasmota32-ir
|
||||
- tasmota32-lvgl
|
||||
- tasmota32c3cdc
|
||||
- tasmota32s2cdc
|
||||
- tasmota32s3cdc
|
||||
- tasmota32solo1
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32c3-safeboot
|
||||
- tasmota32c3cdc-safeboot
|
||||
- tasmota32-safeboot
|
||||
- tasmota32s2-safeboot
|
||||
- tasmota32s2cdc-safeboot
|
||||
- tasmota32s3-safeboot
|
||||
- tasmota32s3cdc-safeboot
|
||||
- tasmota32c2-safeboot
|
||||
- tasmota32c3-safeboot
|
||||
- tasmota32c6-safeboot
|
||||
- tasmota32c6cdc-safeboot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -130,13 +125,12 @@ jobs:
|
||||
pip install -U platformio
|
||||
#platformio upgrade --dev
|
||||
#platformio update
|
||||
cp ./platformio_tasmota_core3_env_sample.ini ./platformio_tasmota_core3_env.ini
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -146,7 +140,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant: [ tasmota ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -162,7 +156,7 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
61
.github/workflows/pr_comment.yml.off
vendored
Normal file
61
.github/workflows/pr_comment.yml.off
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
name: Comment on pull request
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: [Tasmota CI]
|
||||
types: [completed]
|
||||
jobs:
|
||||
pr_comment:
|
||||
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/github-script@v7
|
||||
with:
|
||||
# This snippet is public-domain, taken from
|
||||
# https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml
|
||||
script: |
|
||||
async function upsertComment(owner, repo, issue_number, purpose, body) {
|
||||
const {data: comments} = await github.rest.issues.listComments(
|
||||
{owner, repo, issue_number});
|
||||
|
||||
const marker = `<!-- bot: ${purpose} -->`;
|
||||
body = marker + "\n" + body;
|
||||
|
||||
const existing = comments.filter((c) => c.body.includes(marker));
|
||||
if (existing.length > 0) {
|
||||
const last = existing[existing.length - 1];
|
||||
core.info(`Updating comment ${last.id}`);
|
||||
await github.rest.issues.updateComment({
|
||||
owner, repo,
|
||||
body,
|
||||
comment_id: last.id,
|
||||
});
|
||||
} else {
|
||||
core.info(`Creating a comment in issue / PR #${issue_number}`);
|
||||
await github.rest.issues.createComment({issue_number, body, owner, repo});
|
||||
}
|
||||
}
|
||||
|
||||
const {owner, repo} = context.repo;
|
||||
const run_id = ${{github.event.workflow_run.id}};
|
||||
|
||||
const pull_requests = ${{ toJSON(github.event.workflow_run.pull_requests) }};
|
||||
if (!pull_requests.length) {
|
||||
return core.error("This workflow doesn't match any pull requests!");
|
||||
}
|
||||
|
||||
const artifacts = await github.paginate(
|
||||
github.rest.actions.listWorkflowRunArtifacts, {owner, repo, run_id});
|
||||
if (!artifacts.length) {
|
||||
return core.error(`No artifacts found`);
|
||||
}
|
||||
let body = `Download the artifacts for this pull request:\n`;
|
||||
for (const art of artifacts) {
|
||||
body += `\n* [${art.name}.zip](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
||||
}
|
||||
|
||||
core.info("Review thread message body:", body);
|
||||
|
||||
for (const pr of pull_requests) {
|
||||
await upsertComment(owner, repo, pr.number,
|
||||
"nightly-link", body);
|
||||
}
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -8,17 +8,23 @@
|
||||
*.o
|
||||
*.gcno
|
||||
*.gcda
|
||||
dependencies.lock
|
||||
|
||||
## Project files ######
|
||||
managed_components
|
||||
.platformio
|
||||
.pio
|
||||
.clang_complete
|
||||
.gcc-flags.json
|
||||
.cache
|
||||
.dummy
|
||||
sdkconfig.*
|
||||
data
|
||||
unpacked_fs
|
||||
unpacked_boards
|
||||
tasmota/user_config_override.h
|
||||
tasmota/include/local_ca_data.h
|
||||
tasmota/include/local_ca_descriptor.h
|
||||
variants
|
||||
variants3
|
||||
build
|
||||
@ -42,3 +48,10 @@ lib/libesp32/berry/berry
|
||||
.vscode/extensions.json
|
||||
*.bak
|
||||
*.code-workspace
|
||||
|
||||
## IntelliJ ######
|
||||
.idea
|
||||
|
||||
## Python virtual environments for Platformio ##
|
||||
venv
|
||||
.venv
|
||||
|
574
BUILDS.md
574
BUILDS.md
@ -2,282 +2,302 @@
|
||||
|
||||
l = lite, t = tasmota (ESP8266 / ESP32), k = knx, s = sensors, i = ir, d = display
|
||||
|
||||
Note: `minimal` variant is not listed as it shouldn't be used outside of the [upgrading](https://tasmota.github.io/docs/Upgrading/) process.
|
||||
Note: the `minimal` variant is not listed as it shouldn't be used outside of the [upgrading](https://tasmota.github.io/docs/Upgrading/) process.
|
||||
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
|---------------------------|---|-------|---|---|---|---|--------
|
||||
| MY_LANGUAGE en_GB | x | x / x | x | x | x | x |
|
||||
| USE_IMPROV | x | x / x | x | x | x | x |
|
||||
| USE_UFILESYS | - | - / x | - | - | - | - |
|
||||
| USE_ARDUINO_OTA | - | - / - | - | - | - | - |
|
||||
| USE_DOMOTICZ | - | x / x | x | x | x | - |
|
||||
| USE_HOME_ASSISTANT | - | - / - | - | - | - | - |
|
||||
| USE_TASMOTA_DISCOVERY | x | x / x | x | x | x | x |
|
||||
| USE_MQTT_TLS* | - | - / x | - | - | - | - |
|
||||
| USE_MQTT_AWS_IOT | - | - / - | - | - | - | - |
|
||||
| USE_4K_RSA | - | - / - | - | - | - | - |
|
||||
| USE_TELEGRAM | - | - / - | - | - | - | - |
|
||||
| USE_KNX | - | - / x | x | - | - | - |
|
||||
| USE_WEBSERVER | x | x / x | x | x | x | x |
|
||||
| USE_WEBSEND_RESPONSE | - | - / - | - | - | - | - |
|
||||
| USE_EMULATION_HUE | x | x / x | - | x | - | - |
|
||||
| USE_EMULATION_WEMO | x | x / x | - | x | - | - |
|
||||
| USE_DISCOVERY | - | - / - | - | - | - | - |
|
||||
| WEBSERVER_ADVERTISE | - | x / - | x | - | - | x |
|
||||
| MQTT_HOST_DISCOVERY | - | - / - | - | - | - | - |
|
||||
| USE_TIMERS | x | x / x | x | x | x | x |
|
||||
| USE_TIMERS_WEB | x | x / x | x | x | x | x |
|
||||
| USE_SUNRISE | x | x / x | x | x | x | x |
|
||||
| USE_RULES | x | x / x | x | x | x | x |
|
||||
| USE_SCRIPT | - | - / - | - | - | - | - |
|
||||
| USE_EXPRESSION | - | - / x | - | - | - | - | Every ESP32 + ESP8266 > 1MB
|
||||
| SUPPORT_IF_STATEMENT | - | - / x | - | - | - | - | Every ESP32 + ESP8266 > 1MB
|
||||
| USE_HOTPLUG | - | - / - | - | - | - | - |
|
||||
| USE_PROMETHEUS | - | - / - | - | - | - | - |
|
||||
| USE_PING | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| ROTARY_V1 | - | x / x | - | x | - | - |
|
||||
| USE_SONOFF_RF | - | x / - | x | x | - | - |
|
||||
| USE_RF_FLASH | - | x / - | x | x | - | - |
|
||||
| USE_SONOFF_SC | - | x / - | x | x | - | - |
|
||||
| USE_TUYA_MCU | x | x / - | x | x | - | x |
|
||||
| USE_ARMTRONIX_DIMMERS | - | x / - | x | - | - | - |
|
||||
| USE_PS_16_DZ | - | x / - | x | - | - | - |
|
||||
| USE_SONOFF_IFAN | - | x / - | x | - | - | - |
|
||||
| USE_BUZZER | - | x / x | x | x | - | - |
|
||||
| USE_ARILUX_RF | - | x / - | x | - | - | - |
|
||||
| USE_SHUTTER | - | x / x | x | - | - | - |
|
||||
| USE_DEEPSLEEP | - | x / x | - | x | - | - |
|
||||
| USE_EXS_DIMMER | - | x / - | x | - | - | - |
|
||||
| USE_DEVICE_GROUPS | - | x / x | - | - | - | - |
|
||||
| USE_PWM_DIMMER | - | x / - | x | - | - | - |
|
||||
| USE_KEELOQ | - | - / - | - | - | - | - |
|
||||
| USE_SONOFF_D1 | - | x / - | x | - | - | - |
|
||||
| USE_SHELLY_DIMMER | - | x / - | - | - | - | - |
|
||||
| USE_AC_ZERO_CROSS_DIMMER | - | x / x | x | x | x | x |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| USE_LIGHT | x | x / x | x | x | x | x |
|
||||
| USE_WS2812 | - | x / x | x | x | - | x |
|
||||
| USE_WS2812_DMA | - | - / - | - | - | - | - |
|
||||
| USE_MY92X1 | - | x / - | x | x | - | x |
|
||||
| USE_SM16716 | - | x / - | x | x | - | x |
|
||||
| USE_SM2135 | - | x / - | x | x | - | x |
|
||||
| USE_SM2335 | - | x / - | x | x | - | x |
|
||||
| USE_BP5758D | - | x / - | x | x | - | x |
|
||||
| USE_BP1658CJ | - | x / - | x | x | - | x |
|
||||
| USE_SONOFF_L1 | - | x / - | x | x | - | x |
|
||||
| USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x |
|
||||
| | | | | | | |
|
||||
| USE_ENERGY_SENSOR | - | x / x | x | x | - | - |
|
||||
| USE_ENERGY_DUMMY | - | x / x | x | x | - | - |
|
||||
| USE_PZEM004T | - | x / x | x | x | - | - |
|
||||
| USE_PZEM_AC | - | x / x | x | x | - | - |
|
||||
| USE_PZEM_DC | - | x / x | x | x | - | - |
|
||||
| USE_MCP39F501 | - | x / - | x | x | - | - |
|
||||
| USE_SDM72 | - | - / x | - | x | - | - |
|
||||
| USE_SDM120 | - | - / x | - | x | - | - |
|
||||
| USE_SDM230 | - | - / x | - | - | - | - |
|
||||
| USE_SDM630 | - | - / x | - | x | - | - |
|
||||
| USE_DDS2382 | - | - / x | - | x | - | - |
|
||||
| USE_DDSU666 | - | - / x | - | x | - | - |
|
||||
| USE_SOLAX_X1 | - | - / - | - | - | - | - |
|
||||
| USE_LE01MR | - | - / - | - | - | - | - |
|
||||
| USE_BL09XX | - | x / x | x | x | - | - |
|
||||
| USE_TELEINFO | - | - / - | - | - | - | - |
|
||||
| USE_IEM3000 | - | - / - | - | - | - | - |
|
||||
| USE_WE517 | - | - / x | - | - | - | - |
|
||||
| USE_MODBUS_ENERGY | - | - / x | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_ADC_VCC | x | - / - | - | - | x | - |
|
||||
| USE_COUNTER | - | x / x | x | x | - | x |
|
||||
| USE_DS18x20 | - | x / x | x | x | - | x |
|
||||
| USE_DHT | - | x / x | x | x | - | x |
|
||||
| USE_MAX31855 | - | - / x | - | x | - | - |
|
||||
| USE_MAX31865 | - | - / - | - | - | - | - |
|
||||
| USE_THERMOSTAT | - | - / - | - | - | - | - |
|
||||
| USE_LMT01 | - | - / x | - | x | - | - |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| USE_I2C | - | x / x | x | x | - | x |
|
||||
| USE_SHT | - | - / x | - | x | - | - |
|
||||
| USE_HTU | - | - / x | - | x | - | - |
|
||||
| USE_BMP | - | - / x | - | x | - | - |
|
||||
| USE_BME68X | - | - / x | - | x | - | - |
|
||||
| USE_BH1750 | - | - / x | - | x | - | - |
|
||||
| USE_VEML6070 | - | - / x | - | x | - | - |
|
||||
| USE_ADS1115 | - | - / x | - | x | - | - |
|
||||
| USE_INA219 | - | - / x | - | x | - | - |
|
||||
| USE_INA226 | - | - / - | - | - | - | - |
|
||||
| USE_INA3221 | - | - / - | - | - | - | - |
|
||||
| USE_SHT3X | - | - / x | - | x | - | - |
|
||||
| USE_TSL2561 | - | - / - | - | - | - | - |
|
||||
| USE_TSL2591 | - | - / - | - | - | - | - |
|
||||
| USE_MGS | - | - / x | - | x | - | - |
|
||||
| USE_SGP30 | - | - / x | - | x | - | - |
|
||||
| USE_SGP40 | - | - / x | - | x | - | - |
|
||||
| USE_SGP4X | - | - / x | - | - | - | - |
|
||||
| USE_SEN5X | - | - / x | - | x | - | - |
|
||||
| USE_SI1145 | - | - / - | - | - | - | - |
|
||||
| USE_LM75AD | - | - / x | - | x | - | - |
|
||||
| USE_APDS9960 | - | - / - | - | - | - | - |
|
||||
| USE_MCP230xx | - | - / - | - | - | - | - |
|
||||
| USE_MCP23XXX_DRV | - | - / - | - | - | - | - |
|
||||
| USE_PCA9632 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9685 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9685_V2 | - | - / - | - | - | - | - |
|
||||
| USE_MPR121 | - | - / - | - | - | - | - |
|
||||
| USE_CCS811 | - | - / - | - | x | - | - |
|
||||
| USE_CCS811_V2 | - | - / x | - | - | - | - |
|
||||
| USE_ENS16x | - | - / - | - | - | - | - |
|
||||
| USE_ENS210 | - | - / - | - | - | - | - |
|
||||
| USE_MPU6050 | - | - / - | - | - | - | - |
|
||||
| USE_DS3231 | - | - / - | - | - | - | - |
|
||||
| USE_MGC3130 | - | - / - | - | - | - | - |
|
||||
| USE_MAX44009 | - | - / - | - | - | - | - |
|
||||
| USE_SCD30 | - | - / x | - | x | - | - |
|
||||
| USE_SCD40 | - | - / x | - | - | - | - |
|
||||
| USE_SPS30 | - | - / - | - | - | - | - |
|
||||
| USE_ADE7880 | - | - / - | - | - | - | - |
|
||||
| USE_ADE7953 | - | x / x | x | x | - | x |
|
||||
| USE_VL53L0X | - | - / x | - | x | - | - |
|
||||
| USE_VL53L1X | - | - / - | - | - | - | - |
|
||||
| USE_MLX90614 | - | - / - | - | - | - | - |
|
||||
| USE_CHIRP | - | - / - | - | - | - | - |
|
||||
| USE_PAJ7620 | - | - / - | - | - | - | - |
|
||||
| USE_PCF8574 | - | - / - | - | - | - | - |
|
||||
| USE_PMSA003I | - | - / - | - | - | - | - |
|
||||
| USE_LOX_O2 | - | - / x | - | x | - | - |
|
||||
| USE_GDK101 | - | - / - | - | - | - | - |
|
||||
| USE_TC74 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9557 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| USE_HIH6 | - | - / x | - | x | - | - |
|
||||
| USE_DHT12 | - | - / x | - | x | - | - |
|
||||
| USE_DS1624 | - | - / x | - | x | - | - |
|
||||
| USE_AHT1x | - | - / - | - | - | - | - |
|
||||
| USE_HDC1080 | - | - / - | - | - | - | - |
|
||||
| USE_WEMOS_MOTOR_V1 | - | - / x | - | x | - | - |
|
||||
| USE_IAQ | - | - / x | - | x | - | - |
|
||||
| USE_AS3935 | - | - / x | - | x | - | - |
|
||||
| USE_VEML6075 | - | - / - | - | - | - | - |
|
||||
| USE_VEML7700 | - | - / - | - | - | - | - |
|
||||
| USE_MCP9808 | - | - / - | - | - | - | - |
|
||||
| USE_MLX90640 | - | - / - | - | - | - | - |
|
||||
| USE_HP303B | - | - / - | - | - | - | - |
|
||||
| USE_EZOCO2 | - | - / - | - | - | - | - |
|
||||
| USE_EZODO | - | - / - | - | - | - | - |
|
||||
| USE_EZOEC | - | - / - | - | - | - | - |
|
||||
| USE_EZOFLO | - | - / - | - | - | - | - |
|
||||
| USE_EZOHUM | - | - / - | - | - | - | - |
|
||||
| USE_EZOO2 | - | - / - | - | - | - | - |
|
||||
| USE_EZOORP | - | - / - | - | - | - | - |
|
||||
| USE_EZOPH | - | - / - | - | - | - | - |
|
||||
| USE_EZOPMP | - | - / - | - | - | - | - |
|
||||
| USE_EZOPRS | - | - / - | - | - | - | - |
|
||||
| USE_EZORGB | - | - / - | - | - | - | - |
|
||||
| USE_EZORTD | - | - / - | - | - | - | - |
|
||||
| USE_SEESAW_SOIL | - | - / - | - | - | - | - |
|
||||
| USE_TOF10120 | - | - / - | - | - | - | - |
|
||||
| USE_BM8563 | - | - / - | - | - | - | - |
|
||||
| USE_AM2320 | - | - / - | - | - | - | - |
|
||||
| USE_T67XX | - | - / - | - | - | - | - |
|
||||
| USE_HM330X | - | - / - | - | - | - | - |
|
||||
| USE_HDC2010 | - | - / - | - | - | - | - |
|
||||
| USE_PCF85363 | - | - / - | - | - | - | - |
|
||||
| USE_DS3502 | - | - / - | - | - | - | - |
|
||||
| USE_HYT | - | - / - | - | - | - | - |
|
||||
| USE_LUXV30B | - | - / - | - | - | - | - |
|
||||
| USE_HMC5883L | - | - / - | - | - | - | - |
|
||||
| USE_QMC5883L | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| USE_SPI | - | - / - | - | - | - | x |
|
||||
| USE_RC522 | - | - / - | - | - | - | - |
|
||||
| USE_CANSNIFFER | - | - / - | - | - | - | - |
|
||||
| USE_MHZ19 | - | - / x | - | x | - | - |
|
||||
| USE_SENSEAIR | - | - / x | - | x | - | - |
|
||||
| USE_PMS5003 | - | - / x | - | x | - | - |
|
||||
| USE_NOVA_SDS | - | - / x | - | x | - | - |
|
||||
| USE_HPMA | - | - / x | - | x | - | - |
|
||||
| USE_SERIAL_BRIDGE | - | x / x | x | x | - | x |
|
||||
| USE_MODBUS_BRIDGE | - | - / x | - | - | - | - |
|
||||
| USE_MP3_PLAYER | - | - / x | - | x | - | - |
|
||||
| USE_AZ7798 | - | - / - | - | - | - | - |
|
||||
| USE_PN532_HSU | - | - / x | - | x | - | - |
|
||||
| USE_RDM6300 | - | - / x | - | x | - | - |
|
||||
| USE_IBEACON | - | - / x | - | x | - | - |
|
||||
| USE_GPS | - | - / - | - | - | - | - |
|
||||
| USE_HM10 | - | - / - | - | x | - | - |
|
||||
| USE_HRXL | - | - / x | - | x | - | - |
|
||||
| USE_TASMOTA_CLIENT | - | - / - | - | - | - | - |
|
||||
| USE_OPENTHERM | - | - / - | - | - | - | - |
|
||||
| USE_MIEL_HVAC | - | - / - | - | - | - | - |
|
||||
| USE_PROJECTOR_CTRL | - | - / - | - | - | - | - |
|
||||
| USE_AS608 | - | - / - | - | - | - | - |
|
||||
| USE_LD2410 | - | - / - | - | - | - | - |
|
||||
| USE_GM861 | - | - / - | - | - | - | - |
|
||||
| USE_TCP_BRIDGE | - | - / - | - | - | - | - | zbbridge / zbbrdgpro
|
||||
| | | | | | | |
|
||||
| USE_NRF24 | - | - / - | - | - | - | - |
|
||||
| USE_MIBLE | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE_ZNP | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE_EZSP | - | - / - | - | - | - | - | Sonoff ZbBridge
|
||||
| | | | | | | |
|
||||
| USE_IR_REMOTE | - | x / - | x | x | x | x |
|
||||
| USE_IR_RECEIVE | - | x / - | x | x | x | x |
|
||||
| USE_IR_REMOTE_FULL | - | - / - | - | - | x | - | Enable ALL protocols
|
||||
| | | | | | | |
|
||||
| USE_SR04 | - | - / - | - | x | - | - |
|
||||
| USE_ME007 | - | - / - | - | - | - | - |
|
||||
| USE_DYP | - | - / - | - | - | - | - |
|
||||
| USE_TM1638 | - | - / x | - | x | - | - |
|
||||
| USE_HX711 | - | - / x | - | x | - | - |
|
||||
| USE_TX2x_WIND_SENSOR | - | - / - | - | - | - | - |
|
||||
| USE_WINDMETER | - | - / - | - | - | - | - |
|
||||
| USE_RC_SWITCH | - | - / x | - | x | - | - |
|
||||
| USE_RF_SENSOR | - | - / x | - | x | - | - | AlectoV2 only
|
||||
| USE_HRE | - | - / x | - | x | - | - |
|
||||
| USE_A4988_STEPPER | - | - / - | - | - | - | - |
|
||||
| USE_NEOPOOL | - | - / - | - | - | - | - |
|
||||
| USE_FLOWRATEMETER | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| Feature or Sensor | l | t | k | s | i | d | Remarks
|
||||
| USE_DISPLAY | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_LCD | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_SSD1306 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_SH1106 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_ILI9341 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_SSD1351 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_RA8876 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_ST7789 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_TM1637 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_TM1621_SONOFF | - | - / x | - | - | - | - |
|
||||
| USE_DISPLAY_TM1650 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_FT5206 | - | - / - | - | - | - | - |
|
||||
| USE_FTC532 | - | - / - | - | - | - | - |
|
||||
| USE_BS814A2 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| ESP32 Feature | l | t | k | s | i | d | Remarks
|
||||
| USE_HALLEFFECT | | / x | | | | |
|
||||
| USE_MI_ESP32 | | / x | | | | | See SetOption115
|
||||
| USE_IBEACON_ESP32 | | / - | | | | |
|
||||
| USE_WEBCAM | | / - | | | | |
|
||||
| USE_ETHERNET | | / x | | | | |
|
||||
| USE_I2S_AUDIO | | / - | | | | |
|
||||
| USE_TTGO_WATCH | | / - | | | | |
|
||||
| USE_SONOFF_SPM | | / x | | | | |
|
||||
| USE_DISPLAY_TM1621_SONOFF | | / x | | | | |
|
||||
| USE_SHELLY_PRO | | / x | | | | |
|
||||
| USE_DALI | | / - | | | | |
|
||||
| USE_DINGTIAN_RELAY | | / - | | | | |
|
||||
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| ------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | --------------------------- |
|
||||
| MY_LANGUAGE en_GB | x | x / x | x | x | x | x |
|
||||
| USE_IMPROV | x | x / x | x | x | x | x |
|
||||
| USE_UFILESYS | - | - / x | - | - | - | - | Every ESP8266 > 1MB |
|
||||
| USE_ARDUINO_OTA | - | - / - | - | - | - | - |
|
||||
| USE_DOMOTICZ | - | x / x | x | x | x | - |
|
||||
| USE_HOME_ASSISTANT | - | - / - | - | - | - | - |
|
||||
| USE_TASMOTA_DISCOVERY | x | x / x | x | x | x | x |
|
||||
| USE_MQTT_TLS\* | - | - / x | - | - | - | - |
|
||||
| USE_MQTT_CLIENT_CERT | - | - / - | - | - | - | - |
|
||||
| USE_MQTT_AWS_IOT | - | - / - | - | - | - | - |
|
||||
| USE_4K_RSA | - | - / - | - | - | - | - |
|
||||
| USE_TELEGRAM | - | - / - | - | - | - | - |
|
||||
| USE_KNX | - | - / x | x | - | - | - |
|
||||
| USE_TELNET | - | - / - | - | - | - | - |
|
||||
| USE_XYZMODEM | - | - / - | - | - | - | - |
|
||||
| USE_WEBSERVER | x | x / x | x | x | x | x |
|
||||
| USE_WEBSEND_RESPONSE | - | - / - | - | - | - | - |
|
||||
| USE_EMULATION_HUE | x | x / x | - | x | - | - |
|
||||
| USE_EMULATION_WEMO | x | x / x | - | x | - | - |
|
||||
| USE_DISCOVERY | - | - / - | - | - | - | - |
|
||||
| WEBSERVER_ADVERTISE | - | x / - | x | - | - | x |
|
||||
| MQTT_HOST_DISCOVERY | - | - / - | - | - | - | - |
|
||||
| USE_TIMERS | x | x / x | x | x | x | x |
|
||||
| USE_TIMERS_WEB | x | x / x | x | x | x | x |
|
||||
| USE_SUNRISE | x | x / x | x | x | x | x |
|
||||
| USE_RULES | x | x / x | x | x | x | x |
|
||||
| USE_SCRIPT | - | - / - | - | - | - | - |
|
||||
| USE_EXPRESSION | - | x / x | - | - | - | - |
|
||||
| SUPPORT_IF_STATEMENT | - | x / x | - | - | - | - |
|
||||
| USE_HOTPLUG | - | - / - | - | - | - | - |
|
||||
| USE_PROMETHEUS | - | - / - | - | - | - | - |
|
||||
| USE_PING | - | - / - | - | - | - | - |
|
||||
| USE_HDMI_CEC | - | - / - | - | - | - | - |
|
||||
| USE_MAGIC_SWITCH | - | - / x | - | - | - | - |
|
||||
| USE_GPIO_VIEWER | - | - / x | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| ROTARY_V1 | - | x / x | - | x | - | - |
|
||||
| USE_SONOFF_RF | - | x / - | x | x | - | - |
|
||||
| USE_RF_FLASH | - | x / - | x | x | - | - |
|
||||
| USE_SONOFF_SC | - | x / - | x | x | - | - |
|
||||
| USE_TUYA_MCU | x | x / - | x | x | - | x |
|
||||
| USE_ARMTRONIX_DIMMERS | - | x / - | x | - | - | - |
|
||||
| USE_PS_16_DZ | - | x / - | x | - | - | - |
|
||||
| USE_SONOFF_IFAN | - | x / - | x | - | - | - |
|
||||
| USE_BUZZER | - | x / x | x | x | - | - |
|
||||
| USE_ARILUX_RF | - | x / - | x | - | - | - |
|
||||
| USE_SHUTTER | - | x / x | x | - | - | - |
|
||||
| USE_DEEPSLEEP | - | x / x | - | x | - | - |
|
||||
| USE_EXS_DIMMER | - | x / - | x | - | - | - |
|
||||
| USE_DEVICE_GROUPS | - | x / x | - | - | - | - |
|
||||
| USE_PWM_DIMMER | - | x / - | x | - | - | - |
|
||||
| USE_KEELOQ | - | - / - | - | - | - | - |
|
||||
| USE_SONOFF_D1 | - | x / - | x | - | - | - |
|
||||
| USE_SHELLY_DIMMER | - | x / - | - | - | - | - |
|
||||
| USE_AC_ZERO_CROSS_DIMMER | - | x / x | x | x | x | x |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_LIGHT | x | x / x | x | x | x | x |
|
||||
| USE_WS2812 | - | x / x | x | x | - | x |
|
||||
| USE_WS2812_DMA | - | - / - | - | - | - | - |
|
||||
| USE_MY92X1 | - | x / - | x | x | - | x |
|
||||
| USE_SM16716 | - | x / - | x | x | - | x |
|
||||
| USE_SM2135 | - | x / - | x | x | - | x |
|
||||
| USE_SM2335 | - | x / - | x | x | - | x |
|
||||
| USE_BP5758D | - | x / - | x | x | - | x |
|
||||
| USE_BP1658CJ | - | x / - | x | x | - | x |
|
||||
| USE_SONOFF_L1 | - | x / - | x | x | - | x |
|
||||
| USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x |
|
||||
| | | | | | | |
|
||||
| USE_ENERGY_SENSOR | - | x / x | x | x | - | - |
|
||||
| USE_ENERGY_DUMMY | - | x / x | x | x | - | - |
|
||||
| USE_PZEM004T | - | x / x | x | x | - | - |
|
||||
| USE_PZEM_AC | - | x / x | x | x | - | - |
|
||||
| USE_PZEM_DC | - | x / x | x | x | - | - |
|
||||
| USE_MCP39F501 | - | x / - | x | x | - | - |
|
||||
| USE_SDM72 | - | - / x | - | x | - | - |
|
||||
| USE_SDM120 | - | - / x | - | x | - | - |
|
||||
| USE_SDM230 | - | - / x | - | - | - | - |
|
||||
| USE_SDM630 | - | - / x | - | x | - | - |
|
||||
| USE_DDS2382 | - | - / x | - | x | - | - |
|
||||
| USE_DDSU666 | - | - / x | - | x | - | - |
|
||||
| USE_SOLAX_X1 | - | - / - | - | - | - | - |
|
||||
| USE_LE01MR | - | - / - | - | - | - | - |
|
||||
| USE_BL09XX | - | x / x | x | x | - | - |
|
||||
| USE_TELEINFO | - | - / - | - | - | - | - |
|
||||
| USE_IEM3000 | - | - / - | - | - | - | - |
|
||||
| USE_WE517 | - | - / x | - | - | - | - |
|
||||
| USE_MODBUS_ENERGY | - | - / x | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_ADC_VCC | x | - / - | - | - | x | - |
|
||||
| USE_COUNTER | - | x / x | x | x | - | x |
|
||||
| USE_DS18x20 | - | x / x | x | x | - | x |
|
||||
| USE_DHT | - | x / x | x | x | - | x |
|
||||
| USE_MAX31855 | - | - / x | - | x | - | - |
|
||||
| USE_MAX31865 | - | - / - | - | - | - | - |
|
||||
| USE_THERMOSTAT | - | - / - | - | - | - | - |
|
||||
| USE_LMT01 | - | - / x | - | x | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_I2C | - | x / x | x | x | - | x |
|
||||
| USE_RTC_CHIPS | - | - / x | - | - | - | - |
|
||||
| -USE_BM8563 | - | - / x | - | - | - | - |
|
||||
| -USE_DS3231 | - | - / - | - | - | - | - |
|
||||
| -USE_PCF85063 | - | - / - | - | - | - | - |
|
||||
| -USE_PCF85363 | - | - / - | - | - | - | - |
|
||||
| -USE_RX8010 | - | - / - | - | - | - | - |
|
||||
| USE_SHT | - | - / x | - | x | - | - |
|
||||
| USE_HTU | - | - / x | - | x | - | - |
|
||||
| USE_BMP | - | - / x | - | x | - | - |
|
||||
| -USE_BME68X | - | - / x | - | x | - | - |
|
||||
| USE_AMSX915 | - | - / - | - | - | - | - |
|
||||
| USE_SPL06_007 | - | - / - | - | - | - | - |
|
||||
| USE_QMP6988 | - | - / - | - | - | - | - |
|
||||
| USE_BH1750 | - | - / x | - | x | - | - |
|
||||
| USE_VEML6070 | - | - / x | - | x | - | - |
|
||||
| USE_ADS1115 | - | - / x | - | x | - | - |
|
||||
| USE_INA219 | - | - / x | - | x | - | - |
|
||||
| USE_INA226 | - | - / - | - | - | - | - |
|
||||
| USE_INA3221 | - | - / - | - | - | - | - |
|
||||
| USE_SHT3X | - | - / x | - | x | - | - |
|
||||
| USE_TSL2561 | - | - / - | - | - | - | - |
|
||||
| USE_TSL2591 | - | - / - | - | - | - | - |
|
||||
| USE_MGS | - | - / x | - | x | - | - |
|
||||
| USE_SGP30 | - | - / x | - | x | - | - |
|
||||
| USE_SGP40 | - | - / x | - | x | - | - |
|
||||
| USE_SGP4X | - | - / x | - | - | - | - |
|
||||
| USE_SEN5X | - | - / x | - | x | - | - |
|
||||
| USE_SI1145 | - | - / - | - | - | - | - |
|
||||
| USE_LM75AD | - | - / x | - | x | - | - |
|
||||
| USE_APDS9960 | - | - / - | - | - | - | - |
|
||||
| USE_MCP230xx | - | - / - | - | - | - | - |
|
||||
| USE_MCP23XXX_DRV | - | - / - | - | - | - | - |
|
||||
| USE_PCA9632 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9685 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9685_V2 | - | - / - | - | - | - | - |
|
||||
| USE_MPR121 | - | - / - | - | - | - | - |
|
||||
| USE_CCS811 | - | - / - | - | x | - | - |
|
||||
| USE_CCS811_V2 | - | - / x | - | - | - | - |
|
||||
| USE_ENS16x | - | - / - | - | - | - | - |
|
||||
| USE_ENS210 | - | - / - | - | - | - | - |
|
||||
| USE_MPU6050 | - | - / - | - | - | - | - |
|
||||
| USE_MGC3130 | - | - / - | - | - | - | - |
|
||||
| USE_MAX44009 | - | - / - | - | - | - | - |
|
||||
| USE_SCD30 | - | - / x | - | x | - | - |
|
||||
| USE_SCD40 | - | - / x | - | - | - | - |
|
||||
| USE_SPS30 | - | - / - | - | - | - | - |
|
||||
| USE_ADE7880 | - | - / - | - | - | - | - |
|
||||
| USE_ADE7953 | - | x / x | x | x | - | x |
|
||||
| USE_VL53L0X | - | - / x | - | x | - | - |
|
||||
| USE_VL53L1X | - | - / - | - | - | - | - |
|
||||
| USE_MLX90614 | - | - / - | - | - | - | - |
|
||||
| USE_CHIRP | - | - / - | - | - | - | - |
|
||||
| USE_PAJ7620 | - | - / - | - | - | - | - |
|
||||
| USE_PCF8574 | - | - / - | - | - | - | - |
|
||||
| USE_PMSA003I | - | - / - | - | - | - | - |
|
||||
| USE_LOX_O2 | - | - / x | - | x | - | - |
|
||||
| USE_GDK101 | - | - / - | - | - | - | - |
|
||||
| USE_TC74 | - | - / - | - | - | - | - |
|
||||
| USE_PCA9557 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_HIH6 | - | - / x | - | x | - | - |
|
||||
| USE_DHT12 | - | - / x | - | x | - | - |
|
||||
| USE_DS1624 | - | - / x | - | x | - | - |
|
||||
| USE_AHT1x | - | - / - | - | - | - | - |
|
||||
| USE_HDC1080 | - | - / - | - | - | - | - |
|
||||
| USE_WEMOS_MOTOR_V1 | - | - / x | - | x | - | - |
|
||||
| USE_IAQ | - | - / x | - | x | - | - |
|
||||
| USE_AS3935 | - | - / x | - | x | - | - |
|
||||
| USE_VEML6075 | - | - / - | - | - | - | - |
|
||||
| USE_VEML7700 | - | - / - | - | - | - | - |
|
||||
| USE_MCP9808 | - | - / - | - | - | - | - |
|
||||
| USE_MLX90640 | - | - / - | - | - | - | - |
|
||||
| USE_HP303B | - | - / - | - | - | - | - |
|
||||
| USE_EZOCO2 | - | - / - | - | - | - | - |
|
||||
| USE_EZODO | - | - / - | - | - | - | - |
|
||||
| USE_EZOEC | - | - / - | - | - | - | - |
|
||||
| USE_EZOFLO | - | - / - | - | - | - | - |
|
||||
| USE_EZOHUM | - | - / - | - | - | - | - |
|
||||
| USE_EZOO2 | - | - / - | - | - | - | - |
|
||||
| USE_EZOORP | - | - / - | - | - | - | - |
|
||||
| USE_EZOPH | - | - / - | - | - | - | - |
|
||||
| USE_EZOPMP | - | - / - | - | - | - | - |
|
||||
| USE_EZOPRS | - | - / - | - | - | - | - |
|
||||
| USE_EZORGB | - | - / - | - | - | - | - |
|
||||
| USE_EZORTD | - | - / - | - | - | - | - |
|
||||
| USE_SEESAW_SOIL | - | - / - | - | - | - | - |
|
||||
| USE_TOF10120 | - | - / - | - | - | - | - |
|
||||
| USE_AM2320 | - | - / - | - | - | - | - |
|
||||
| USE_T67XX | - | - / - | - | - | - | - |
|
||||
| USE_HM330X | - | - / - | - | - | - | - |
|
||||
| USE_HDC2010 | - | - / - | - | - | - | - |
|
||||
| USE_DS3502 | - | - / - | - | - | - | - |
|
||||
| USE_HYT | - | - / - | - | - | - | - |
|
||||
| USE_LUXV30B | - | - / - | - | - | - | - |
|
||||
| USE_HMC5883L | - | - / - | - | - | - | - |
|
||||
| USE_QMC5883L | - | - / - | - | - | - | - |
|
||||
| USE_MAX17043 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_SPI | - | - / x | - | - | - | x |
|
||||
| USE_RC522 | - | - / - | - | - | - | - |
|
||||
| USE_CANSNIFFER | - | - / - | - | - | - | - |
|
||||
| USE_SPI_LORA | - | - / x | - | - | - | - |
|
||||
| USE_MHZ19 | - | - / x | - | x | - | - |
|
||||
| USE_SENSEAIR | - | - / x | - | x | - | - |
|
||||
| USE_PMS5003 | - | - / x | - | x | - | - |
|
||||
| USE_NOVA_SDS | - | - / x | - | x | - | - |
|
||||
| USE_HPMA | - | - / x | - | x | - | - |
|
||||
| USE_SERIAL_BRIDGE | - | x / x | x | x | - | x |
|
||||
| USE_MODBUS_BRIDGE | - | - / x | - | - | - | - |
|
||||
| USE_MP3_PLAYER | - | - / x | - | x | - | - |
|
||||
| USE_AZ7798 | - | - / - | - | - | - | - |
|
||||
| USE_PN532_HSU | - | - / x | - | x | - | - |
|
||||
| USE_RDM6300 | - | - / x | - | x | - | - |
|
||||
| USE_IBEACON | - | - / x | - | x | - | - |
|
||||
| USE_GPS | - | - / - | - | - | - | - |
|
||||
| USE_HM10 | - | - / - | - | x | - | - |
|
||||
| USE_HRXL | - | - / x | - | x | - | - |
|
||||
| USE_TASMOTA_CLIENT | - | - / - | - | - | - | - |
|
||||
| USE_OPENTHERM | - | - / - | - | - | - | - |
|
||||
| USE_MIEL_HVAC | - | - / - | - | - | - | - |
|
||||
| USE_PROJECTOR_CTRL | - | - / - | - | - | - | - |
|
||||
| USE_AS608 | - | - / - | - | - | - | - |
|
||||
| USE_LD2402 | - | - / - | - | - | - | - |
|
||||
| USE_LD2410 | - | - / - | - | - | - | - |
|
||||
| USE_LD2410S | - | - / - | - | - | - | - |
|
||||
| USE_GM861 | - | - / - | - | - | - | - |
|
||||
| USE_TCP_BRIDGE | - | - / - | - | - | - | - | zbbridge / zbbrdgpro |
|
||||
| USE_HC8 | - | - / - | - | - | - | - |
|
||||
| USE_PIPSOLAR | - | - / - | - | - | - | - |
|
||||
| USE_WOOLIIS | - | - / - | - | - | - | - |
|
||||
| USE_C8_CO2_5K | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_NRF24 | - | - / - | - | - | - | - |
|
||||
| USE_MIBLE | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE_ZNP | - | - / - | - | - | - | - |
|
||||
| USE_ZIGBEE_EZSP | - | - / - | - | - | - | - | Sonoff ZbBridge |
|
||||
| | | | | | | |
|
||||
| USE_IR_REMOTE | - | x / - | x | x | x | x |
|
||||
| USE_IR_RECEIVE | - | x / - | x | x | x | x |
|
||||
| USE_IR_REMOTE_FULL | - | - / - | - | - | x | - | Enable ALL protocols |
|
||||
| | | | | | | |
|
||||
| USE_WIZMOTE | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_SR04 | - | - / - | - | x | - | - |
|
||||
| USE_ME007 | - | - / - | - | - | - | - |
|
||||
| USE_DYP | - | - / - | - | - | - | - |
|
||||
| USE_TM1638 | - | - / x | - | x | - | - |
|
||||
| USE_HX711 | - | - / x | - | x | - | - |
|
||||
| -USE_HX711_M5SCALES | - | - / - | - | - | - | - |
|
||||
| USE_TX2x_WIND_SENSOR | - | - / - | - | - | - | - |
|
||||
| USE_WINDMETER | - | - / - | - | - | - | - |
|
||||
| USE_RC_SWITCH | - | - / x | - | x | - | - |
|
||||
| USE_RF_SENSOR | - | - / x | - | x | - | - | AlectoV2 only |
|
||||
| USE_HRE | - | - / x | - | x | - | - |
|
||||
| USE_A4988_STEPPER | - | - / - | - | - | - | - |
|
||||
| USE_NEOPOOL | - | - / - | - | - | - | - |
|
||||
| USE_FLOWRATEMETER | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_DISPLAY | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_LCD | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_RA8876 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_TM1637 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_TM1621_SONOFF | - | - / x | - | - | - | - |
|
||||
| USE_DISPLAY_TM1650 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_FT5206 | - | - / - | - | - | - | - |
|
||||
| USE_FTC532 | - | - / - | - | - | - | - |
|
||||
| USE_BS814A2 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **ESP32 Feature** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_HALLEFFECT | | / x | | | | |
|
||||
| USE_MI_ESP32 | | / x | | | | | See SetOption115 |
|
||||
| USE_IBEACON_ESP32 | | / - | | | | |
|
||||
| USE_WEBCAM | | / - | | | | |
|
||||
| USE_ETHERNET | | / x | | | | |
|
||||
| USE_I2S_AUDIO | | / - | | | | |
|
||||
| USE_SONOFF_SPM | | / x | | | | |
|
||||
| USE_DISPLAY_TM1621_SONOFF | | / x | | | | |
|
||||
| USE_SHELLY_PRO | | / x | | | | |
|
||||
| USE_ESP32_TWAI | | / x | | | | |
|
||||
| USE_DALI | | / x | | | | |
|
||||
| USE_DINGTIAN_RELAY | | / - | | | | |
|
||||
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
|
||||
|
||||
* USE_MQTT_TLS is enabled by default in every ESP32 variants
|
||||
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`, `USE_DISPLAY_SSD1306`, `USE_DISPLAY_SH1106`, `USE_DISPLAY_SSD1351`, `USE_DISPLAY_ST7789`
|
||||
|
||||
- USE_MQTT_TLS is enabled by default in every ESP32 variants
|
||||
|
983
CHANGELOG.md
983
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
8
CMakeLists.txt
Normal file
8
CMakeLists.txt
Normal file
@ -0,0 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.16.0)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
|
||||
project(tasmota)
|
||||
|
||||
if(CONFIG_IDF_TARGET_ESP32C2)
|
||||
include(relinker)
|
||||
endif()
|
@ -84,13 +84,14 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xdrv_70_1_hdmi_cec | @s-hadinger
|
||||
| xdrv_71_magic_switch | @barbudor
|
||||
| xdrv_72_pipsolar | @chefpro
|
||||
| xdrv_73 |
|
||||
| xdrv_74 |
|
||||
| xdrv_75 |
|
||||
| xdrv_76 |
|
||||
| xdrv_77 |
|
||||
| xdrv_78 |
|
||||
| xdrv_73_lora | @arendst
|
||||
| xdrv_74_lorawan | @arendst
|
||||
| xdrv_75_dali | @eeak, @arendst
|
||||
| xdrv_76_serial_i2c | @s-hadinger
|
||||
| xdrv_77_wizmote | @arendst
|
||||
| xdrv_78_telnet | @arendst
|
||||
| xdrv_79_esp32_ble | @staars, @btsimonh
|
||||
| xdrv_80 |
|
||||
| xdrv_81_esp32_webcam | @gemu, @philrich
|
||||
| xdrv_82_esp32_ethernet | @arendst
|
||||
| xdrv_83_esp32_watch | @gemu
|
||||
@ -98,15 +99,17 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xdrv_86_esp32_sonoff_spm | @arendst
|
||||
| xdrv_87_esp32_sonoff_tm1621 | @arendst
|
||||
| xdrv_88_esp32_shelly_pro | @arendst
|
||||
| xdrv_89_esp32_dali | @eeak
|
||||
| xdrv_89_ |
|
||||
| xdrv_90_esp32_dingtian_relay | @barbudor
|
||||
| xdrv_91_ |
|
||||
| xdrv_92_ |
|
||||
| xdrv_93_ |
|
||||
| xdrv_94_ |
|
||||
| |
|
||||
| xdrv_120_xyzmodem | @arendst
|
||||
| xdrv_121_gpioviewer | @arendst
|
||||
| xdrv_122_file_settings_demo | @arendst
|
||||
| xdrv_122_file_json_settings_demo | @arendst
|
||||
| xdrv_127_debug | @arendst
|
||||
| |
|
||||
| Tasmota Sensors |
|
||||
@ -135,10 +138,10 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xsns_22_sr04 | Nuno Ferreira, @arendst
|
||||
| xsns_23_me007 | Mathias Buder
|
||||
| xsns_24_si1145 |
|
||||
| xsns_25 |
|
||||
| xsns_25_spl06-007_sensor | @rai68
|
||||
| xsns_26_lm75ad | Andre Thomas
|
||||
| xsns_27_apds9960 | Shawn Hymel
|
||||
| xsns_28 |
|
||||
| xsns_28_qmp6988 | @arendst
|
||||
| xsns_29_mcp230xx | Andre Thomas
|
||||
| xsns_30_mpr121 | Rene 'Renne' Bartsch
|
||||
| xsns_31_ccs811 | Gerhard Mutz
|
||||
@ -224,6 +227,14 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xsns_108_tc74 | Michael Loftis
|
||||
| xsns_109_sgp4x | Andrew Klaus
|
||||
| xsns_110_max17043 | Vincent de Groot
|
||||
| xsns_111_ens16x | Christoph Friese
|
||||
| xsns_112_ens210 | Christoph Friese
|
||||
| xsns_113_hc8 | Daniel Maier
|
||||
| xsns_114_amsx915 | Bastian Urschel
|
||||
| xsns_115_wooliis | Luca Melette
|
||||
| xsns_117_c8_co2_5k | @jeroenvermeulen
|
||||
| |
|
||||
| xsns_127_esp32_sensors | @arendst
|
||||
| |
|
||||
| Libraries |
|
||||
| |
|
||||
|
@ -14,11 +14,11 @@ If you like **Tasmota**, give it a star, or fork it and contribute!
|
||||
[](https://github.com/arendst/Tasmota/network)
|
||||
[](https://paypal.me/tasmota)
|
||||
|
||||
See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/CHANGELOG.md) for changes since last release.
|
||||
See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/CHANGELOG.md) for changes since last release.
|
||||
|
||||
## Development
|
||||
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](http://ota.tasmota.com/tasmota/)
|
||||
[](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+CI%22)
|
||||
[](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+ESP32+CI%22)
|
||||
|
@ -13,9 +13,9 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||
2 | USE_PCF8574 | xdrv_28 | PCF8574 | 0x20 - 0x26 | | 8-bit I/O expander (address range overridable)
|
||||
2 | USE_PCF8574 | xdrv_28 | PCF8574A | 0x39 - 0x3F | | 8-bit I/O expander (address range overridable)
|
||||
3 | USE_DISPLAY_LCD | xdsp_01 | | 0x27, 0x3F | | LCD display
|
||||
4 | USE_DISPLAY_SSD1306 | xdsp_02 | SSD1306 | 0x3C - 0x3D | | Oled display
|
||||
4 | REMOVED | | | | | USE_DISPLAY_SSD1306 - REMOVED
|
||||
5 | USE_DISPLAY_MATRIX | xdsp_03 | HT16K33 | 0x70 - 0x77 | | 8x8 led matrix
|
||||
6 | USE_DISPLAY_SH1106 | xdsp_07 | SH1106 | 0x3C - 0x3D | | Oled display
|
||||
6 | REMOVED | | SH1106 | 0x3C - 0x3D | | USE_DISPLAY_SH1106 - REMOVED
|
||||
7 | USE_ADE7953 | xnrg_07 | ADE7953 | 0x38 | | Energy monitor
|
||||
8 | USE_SHT | xsns_07 | SHT1X | Any | | Temperature and Humidity sensor
|
||||
9 | USE_HTU | xsns_08 | HTU21 | 0x40 | Yes | Temperature and Humidity sensor
|
||||
@ -32,7 +32,7 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||
13 | USE_ADS1115 | xsns_12 | ADS1115 | 0x48 - 0x4B | Yes | 4-channel 16-bit A/D converter
|
||||
14 | USE_INA219 | xsns_13 | INA219 | 0x40 - 0x41, 0x44 - 0x45 | | Low voltage current sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT3X | 0x44 - 0x45 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT4X | 0x44 - 0x45 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT4X | 0x44 - 0x46 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHTCX | 0x70 | Yes | Temperature and Humidity sensor
|
||||
16 | USE_TSL2561 | xsns_16 | TSL2561 | 0x29, 0x39, 0x49 | | Light intensity sensor
|
||||
17 | USE_MGS | xsns_19 | Grove | 0x04 | | Multichannel gas sensor
|
||||
@ -123,5 +123,12 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||
83 | USE_MAX17043 | xsns_110 | MAX17043 | 0x36 | | Fuel-gauge for 3.7 Volt Lipo battery
|
||||
84 | USE_ENS16x | xsns_111 | ENS16x | 0x52 - 0x53 | | Gas (TVOC, eCO2) and air quality sensor
|
||||
85 | USE_ENS210 | xsns_112 | ENS210 | 0x43 - 0x44 | | Temperature and humidity sensor
|
||||
|
||||
86 | USE_AMSX915 | xsns_114 | AMS6915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
||||
87 | USE_SPL06_007 | xsns_25 | SPL06-007 | 0x76 | | Pressure and temperature sensor
|
||||
88 | USE_QMP6988 | xsns_28 | QMP6988 | 0x56, 0x70 | Yes | Pressure and temperature sensor
|
||||
89 | USE_HX711_M5SCALES | xsns_34 | M5SCALES | 0x26 | Yes | M5Unit (Mini)Scales(HX711 STM32) U177
|
||||
90 | USE_RX8010 | xdrv_56 | RX8010 | 0x32 | Yes | RX8010 RTC from IOTTIMER
|
||||
91 | USE_MS5837 | xsns_116 | MS5837 | 0x76 | | Pressure and temperature sensor
|
||||
92 | USE_PCF85063 | xdrv_56 | PCF85063 | 0x51 | | PCF85063 Real time clock
|
||||
|
||||
NOTE: Bus2 supported on ESP32 only.
|
||||
|
@ -94,4 +94,4 @@ Module | LCode | Description
|
||||
06 TTGO Watch | x | TTGO Watch
|
||||
07 M5Stack Core2 | x | M5Stack Core2
|
||||
|
||||
Over 2500 additional devices are supported using [templates](TEMPLATES.md).
|
||||
Over 2800 additional devices are supported using [templates](TEMPLATES.md).
|
||||
|
@ -31,7 +31,7 @@ Firmware binaries can be downloaded from http://ota.tasmota.com/tasmota/release/
|
||||
|
||||
## Development
|
||||
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](http://ota.tasmota.com/tasmota/)
|
||||
[](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml)
|
||||
[](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml)
|
||||
|
126
RELEASENOTES.md
126
RELEASENOTES.md
@ -34,11 +34,11 @@ While fallback or downgrading is common practice it was never supported due to S
|
||||
|
||||
## Supported Core versions
|
||||
|
||||
This release will be supported from ESP8266/Arduino library Core version **2.7.6** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
|
||||
This release will be supported from ESP8266/Arduino library Core version **2.7.8** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
|
||||
|
||||
This release will be supported from ESP32/Arduino library Core version **2.0.14**.
|
||||
This release will be supported from ESP32/Arduino library Core version **v3.1.3.250411**.
|
||||
|
||||
Support of ESP8266 Core versions before 2.7.6 and ESP32 Core versions before 2.0.14 have been removed.
|
||||
Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.3.250411 have been removed.
|
||||
|
||||
## Support of TLS
|
||||
|
||||
@ -55,7 +55,7 @@ Easy initial installation of Tasmota can be performed using the [Tasmota WebInst
|
||||
## Provided Binary Downloads
|
||||
|
||||
### ESP8266 or ESP8285 based
|
||||
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.6**.
|
||||
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.8**.
|
||||
|
||||
- **tasmota.bin** = The Tasmota version with most drivers for 1M+ flash. **RECOMMENDED RELEASE BINARY**
|
||||
- **tasmota-4M.bin** = The Tasmota version with most drivers and filesystem for 4M+ flash.
|
||||
@ -71,21 +71,25 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
|
||||
Above binaries are also available as gzipped version allowing faster uploads.
|
||||
|
||||
Latest released binaries can be downloaded from
|
||||
- https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware
|
||||
- https://github.com/arendst/Tasmota-firmware/tree/firmware/release-firmware
|
||||
- http://ota.tasmota.com/tasmota/release
|
||||
|
||||
Historical binaries can be downloaded from
|
||||
- http://ota.tasmota.com/tasmota/release-13.3.0
|
||||
- http://ota.tasmota.com/tasmota/release-14.6.0
|
||||
|
||||
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
|
||||
|
||||
### ESP32, ESP32-C3, ESP32-S2 and ESP32-S3 based
|
||||
The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.14**.
|
||||
### ESP32, ESP32-C2, ESP32-C3, ESP32-C6, ESP32-S2 and ESP32-S3 based
|
||||
The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.3.250411**.
|
||||
|
||||
- **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY**
|
||||
- **tasmota32xy.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 and 4M+ flash.
|
||||
- **tasmota32xycdc.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 with serial over embedded USB CDC only and 4M+ flash.
|
||||
- **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash.
|
||||
- **tasmota32s2.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-S2 with serial and 4M+ flash.
|
||||
- **tasmota32s2cdc.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-S2 with serial over embedded USB CDC only and 4M+ flash.
|
||||
- **tasmota32s3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-S3 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32c2.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C2 with serial and 4M+ flash.
|
||||
- **tasmota32c3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32c6.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C6 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32-AD.bin** to **tasmota32-VN.bin** = The Tasmota version in different languages for 4M+ flash.
|
||||
- **tasmota32-bluetooth.bin** = The Bluetooth version adds BLE support for 4M+ flash.
|
||||
- **tasmota32-display.bin** = The Display version without Energy Monitoring but adds display support for 4M+ flash.
|
||||
@ -95,18 +99,12 @@ The following binary downloads have been compiled with ESP32/Arduino library cor
|
||||
- **tasmota32-webcam.bin** = The Webcam version adds webcam support for 4M+ flash.
|
||||
- **tasmota32-zbbridgepro.bin** - The Sonoff Zigbee Bridge Pro version with CC2652P firmware load support.
|
||||
|
||||
### ESP32-C2 and ESP32-C6 based
|
||||
The following binary downloads have been compiled with ESP32/Arduino library core version **3.0.0-alpha3**.
|
||||
|
||||
- **tasmota32c2-arduino30.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C2 and 4M+ flash.
|
||||
- **tasmota32c6cdc-arduino30.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C6 with serial over embedded USB CDC or hardware USB and 4M+ flash.
|
||||
|
||||
Latest released binaries can be downloaded from
|
||||
- https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware
|
||||
- https://github.com/arendst/Tasmota-firmware/tree/firmware/release-firmware
|
||||
- https://ota.tasmota.com/tasmota32/release
|
||||
|
||||
Historical binaries can be downloaded from
|
||||
- https://ota.tasmota.com/tasmota32/release-13.3.0
|
||||
- https://ota.tasmota.com/tasmota32/release-14.6.0
|
||||
|
||||
The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasmota.com/tasmota32/release/tasmota32.bin``
|
||||
|
||||
@ -116,100 +114,16 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
|
||||
|
||||
[Complete list](BUILDS.md) of available feature and sensors.
|
||||
|
||||
## Changelog v13.3.0.5
|
||||
## Changelog v14.6.0.1
|
||||
### Added
|
||||
- Command ``TimedPower<index> <milliseconds>[,ON|OFF|TOGGLE|BLINK]`` executes ``Power<index> [ON|OFF|TOGGLE|BLINK] `` and after <millisecond> executes ``Power<index> [OFF|ON|TOGGLE|OFF]``
|
||||
- Command ``SetOption158 1`` to disable publish of ModbusReceived MQTT messages [#20678](https://github.com/arendst/Tasmota/issues/20678)
|
||||
- Command ``SetOption159 1`` to enable counting on both rising and falling edge [#20712](https://github.com/arendst/Tasmota/issues/20712)
|
||||
- Display of active drivers using command ``status 4``
|
||||
- GPIO Viewer to see realtime GPIO states using assets from `https://ota.tasmota.com/tasmota/gpioviewer/gpio_viewer_13_4_0/` v2.0.8
|
||||
- Support for CST816S touch interface [#20213](https://github.com/arendst/Tasmota/issues/20213)
|
||||
- Support for Sonoff Basic R4 Magic Switch [#20247](https://github.com/arendst/Tasmota/issues/20247)
|
||||
- Support negative power on BL0942 using index 5..8 [#20322](https://github.com/arendst/Tasmota/issues/20322)
|
||||
- Support for pipsolar inverter [#20408](https://github.com/arendst/Tasmota/issues/20408)
|
||||
- Support for HardwareSerial invert [#15461](https://github.com/arendst/Tasmota/issues/15461)
|
||||
- NeoPool hydrolysis FL1 and Redox flag [#20258](https://github.com/arendst/Tasmota/issues/20258)
|
||||
- SML support for IM350 [#20474](https://github.com/arendst/Tasmota/issues/20474)
|
||||
- GUI sensor separators [#20495](https://github.com/arendst/Tasmota/issues/20495)
|
||||
- ESP32 used UART information
|
||||
- ESP32 support GPIOViewer when ``define USE_ESP32_GPIO_VIEWER`` is enabled
|
||||
- ESP32 MI BLE support for Xiaomi LYWSD02MMC [#20381](https://github.com/arendst/Tasmota/issues/20381)
|
||||
- ESP32 support for Shelly Plus Add-On using DS18x20 or DHT11/AM2301/DHT21/DHT22/AM2302/AM2321/SI7021 on GPIO0/1 [#20580](https://github.com/arendst/Tasmota/issues/20580)
|
||||
- ESP32 MI32 Legacy initial support for sensors using BTHOME packet format [#20625](https://github.com/arendst/Tasmota/issues/20625)
|
||||
- ESP32 Core3 support for SPI ethernet on DM9051, W5500 and KSZ8851
|
||||
- ESP32-C3 support for GPIO11 [#18350](https://github.com/arendst/Tasmota/issues/18350)
|
||||
- Berry GPIO viewer initial version using async webserver [#20416](https://github.com/arendst/Tasmota/issues/20416)
|
||||
- Berry `introspect.set()` for class attributes [#20339](https://github.com/arendst/Tasmota/issues/20339)
|
||||
- Berry support for `tcpclientasync` in `tcpserver` [#20401](https://github.com/arendst/Tasmota/issues/20401)
|
||||
- Berry `tasmota.urlbecload(url:string) -> bool` [#20412](https://github.com/arendst/Tasmota/issues/20412)
|
||||
- Berry `gpio.read_pwm` and `gpio.read_pwm_resolution` [#20414](https://github.com/arendst/Tasmota/issues/20414)
|
||||
- Berry `gpio.get_pin_type` and `gpio.ger_pin_type_index` [#20415](https://github.com/arendst/Tasmota/issues/20415)
|
||||
- Berry `string` to `bytes()` [#20420](https://github.com/arendst/Tasmota/issues/20420)
|
||||
- Berry button to dynamically load GPIO Viewer with Berry backend [#20424](https://github.com/arendst/Tasmota/issues/20424)
|
||||
- Berry `debug_panel.tapp` to display real-time heap and wifi rssi [#20436](https://github.com/arendst/Tasmota/issues/20436)
|
||||
- Berry `webserver.header` to read browser sent headers [#20447](https://github.com/arendst/Tasmota/issues/20447)
|
||||
- Berry provide lightweight options for `tasmota.wifi/eth/memory/rtc` [#20448](https://github.com/arendst/Tasmota/issues/20448)
|
||||
- Berry `tasmota.webcolor` [#20454](https://github.com/arendst/Tasmota/issues/20454)
|
||||
- Berry `debug.caller` [#20470](https://github.com/arendst/Tasmota/issues/20470)
|
||||
- Berry solidification of strings longer than 255 bytes [#20529](https://github.com/arendst/Tasmota/issues/20529)
|
||||
- Berry syntax coloring for Notepad++ by FransO [#20541](https://github.com/arendst/Tasmota/issues/20541)
|
||||
- Berry/Zigbee web hook per device for customized status display [#20542](https://github.com/arendst/Tasmota/issues/20542)
|
||||
- Berry `introspect.contains` and `bytes.addfloat` [#20635](https://github.com/arendst/Tasmota/issues/20635)
|
||||
- Zigbee ``ZbEmulation`` to selectively exclude some devices from Hue/Alexa emulation [#20552](https://github.com/arendst/Tasmota/issues/20552)
|
||||
- LVGL `lv.str_arr` [#20480](https://github.com/arendst/Tasmota/issues/20480)
|
||||
- LVGL option to add `lv.keyboard` extra widget [#20496](https://github.com/arendst/Tasmota/issues/20496)
|
||||
- HASPmota `haspmota.page_show()` to change page [#20333](https://github.com/arendst/Tasmota/issues/20333)
|
||||
- HASPmota type `chart` [#20372](https://github.com/arendst/Tasmota/issues/20372)
|
||||
- HASPmota support for `min` and `max` attribute in `slider` [#20582](https://github.com/arendst/Tasmota/issues/20582)
|
||||
- Matter support for password for remote Tasmota devices [#20296](https://github.com/arendst/Tasmota/issues/20296)
|
||||
- Matter add human readable names for TimeSync cluster [#20666](https://github.com/arendst/Tasmota/issues/20666)
|
||||
- Command `JsonPP 0..7` to enable (>0) JSON Pretty Print on user interfaces and set number of indents
|
||||
|
||||
### Breaking Changed
|
||||
- ESP32 LVGL library from v8.3.11 to v9.0.0, some small breaking changes in C, none in HASPmota [#20659](https://github.com/arendst/Tasmota/issues/20659)
|
||||
- Refactoring of Berry `animate` module for WS2812 Leds [#20236](https://github.com/arendst/Tasmota/issues/20236)
|
||||
- Matter aggregator relocated to endpoint 1 for Google compatibility, may break existing associations [#20654](https://github.com/arendst/Tasmota/issues/20654)
|
||||
|
||||
### Changed
|
||||
- ESP8266 platform update from 2023.04.00 to 2024.01.01 [#20539](https://github.com/arendst/Tasmota/issues/20539)
|
||||
- ESP8266 Framework (Arduino Core) from v2.7.4.9 to v2.7.6 [#20539](https://github.com/arendst/Tasmota/issues/20539)
|
||||
- ESP32 Core2 platform update from 2023.11.01 to 2024.01.01 [#20473](https://github.com/arendst/Tasmota/issues/20473)
|
||||
- ESP32 Core3 platform update from 2024.01.11 to 2024.01.12 [#20576](https://github.com/arendst/Tasmota/issues/20576)
|
||||
- Library OneWire-Stickbreaker by TasmotaOneWire supporting Shelly Plus Add-On [#20580](https://github.com/arendst/Tasmota/issues/20580)
|
||||
- Renamed button "Consoles" to "Tools"
|
||||
- Refactored rule ``Subscribe`` using LList allowing full message size and enabled by default
|
||||
- Refactored rules USE_EXPRESSION and SUPPORT_IF_STATEMENT replacing LinkedList with arrays and enabled by default
|
||||
- Support syslog updates every sleep or every second if `#define SYSLOG_UPDATE_SECOND` [#20260](https://github.com/arendst/Tasmota/issues/20260)
|
||||
- Web file upload response on upload error [#20340](https://github.com/arendst/Tasmota/issues/20340)
|
||||
- Header `Host` is now collected by Webserver [#20446](https://github.com/arendst/Tasmota/issues/20446)
|
||||
- Utouch optimizations, rgb i2c init [#20596](https://github.com/arendst/Tasmota/issues/20596)
|
||||
- Miel HVAC lower the minimum temperature to 10C [#20628](https://github.com/arendst/Tasmota/issues/20628)
|
||||
- Webcam tweaks [#20451](https://github.com/arendst/Tasmota/issues/20451)
|
||||
- IP stack compatible with new Core3 IPv6 implementation [#20509](https://github.com/arendst/Tasmota/issues/20509)
|
||||
- Refactored Pio filesystem download script [#20544](https://github.com/arendst/Tasmota/issues/20544)
|
||||
- Matter improve `MtrInfo` [#20686](https://github.com/arendst/Tasmota/issues/20686)
|
||||
- Matter redirects for Advanced Matter configuration UI [#20690](https://github.com/arendst/Tasmota/issues/20690)
|
||||
- Matter implement auto-attributes [#20694](https://github.com/arendst/Tasmota/issues/20694)
|
||||
|
||||
### Fixed
|
||||
- CVE-2021-36603 Cross Site Scripting (XSS) vulnerability [#12221](https://github.com/arendst/Tasmota/issues/12221)
|
||||
- Syslog server warning caused by lack of <PRI> field and hostname starting with 'z' [#14689](https://github.com/arendst/Tasmota/issues/14689)
|
||||
- Support for Domoticz floor/room topics. Regression from v12.0.1 [#20299](https://github.com/arendst/Tasmota/issues/20299)
|
||||
- Scripter memory leak in `>w x` [#20473](https://github.com/arendst/Tasmota/issues/20473)
|
||||
- Zigbee ramdom crash in main page [#20481](https://github.com/arendst/Tasmota/issues/20481)
|
||||
- ESP8266 IPv6 support [#20539](https://github.com/arendst/Tasmota/issues/20539)
|
||||
- ESP32 piezo ceramic buzzer doesn't buzz [#20118](https://github.com/arendst/Tasmota/issues/20118)
|
||||
- ESP32 shutter exception 6 (divide by zero) on ``ShutterMode 4`` [#20524](https://github.com/arendst/Tasmota/issues/20524)
|
||||
- ESP32 Zigbee Aqara attributes [#20452](https://github.com/arendst/Tasmota/issues/20452)
|
||||
- ESP32 Audio for Core3, MP3Stream and Shine [#20540](https://github.com/arendst/Tasmota/issues/20540)
|
||||
- ESP32 Core3 reset GPIOs 16/17 when PSRAM is not used [#20547](https://github.com/arendst/Tasmota/issues/20547)
|
||||
- LVGL fix type for lv_imgbtn [#20354](https://github.com/arendst/Tasmota/issues/20354)
|
||||
- Berry claiming UART0 if needed [#20324](https://github.com/arendst/Tasmota/issues/20324)
|
||||
- Berry assigment to list with negative index [#20537](https://github.com/arendst/Tasmota/issues/20537)
|
||||
- Berry C mapping, raise an error if too many arguments are sent [#20604](https://github.com/arendst/Tasmota/issues/20604)
|
||||
- Matter Contact sensor was not triggering any update [#20232](https://github.com/arendst/Tasmota/issues/20232)
|
||||
- Matter support for Alexa [#20545](https://github.com/arendst/Tasmota/issues/20545)
|
||||
- Matter error when removing device from Google Home [#20665](https://github.com/arendst/Tasmota/issues/20665)
|
||||
- Matter exception when fabrics is not initialized [#20667](https://github.com/arendst/Tasmota/issues/20667)
|
||||
- Berry `bytes().asstring()` now truncates a string if buffer contains NULL [#23311](https://github.com/arendst/Tasmota/issues/23311)
|
||||
- Berry string literals containing NULL are truncated [#23312](https://github.com/arendst/Tasmota/issues/23312)
|
||||
|
||||
### Removed
|
||||
- Max number of 30 backlog entries
|
||||
|
83
TEMPLATES.md
83
TEMPLATES.md
@ -5,7 +5,7 @@
|
||||
|
||||
# Templates
|
||||
|
||||
Find below the available templates as of February 2024. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
|
||||
Find below the available templates as of April 2025. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
|
||||
|
||||
## Adapter Board
|
||||
```
|
||||
@ -97,7 +97,7 @@ Iotton 9W 700lm {"NAME":"Iotton Light","GPIO":[0,0,0,0,416,417,0,0,
|
||||
iQtech 10W 900lm {"NAME":"iQ-Tech CCT 10W 900LM","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
iView 10W 1050lm {"NAME":"iView ISB1000-D","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 10W Cool & Warm White 1050lm {"NAME":"Kogan 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Kogan 4.5W 330lm 110 {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110° {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 5W {"NAME":"Kogan Co/Wa","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kruidvat A60 9W 806lm {"NAME":"Kruidvat E27 806 Lumens","GPIO":[0,0,0,0,416,449,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Laser 10W 1000lm {"NAME":"Laser 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
@ -131,7 +131,7 @@ Nedis C10 350lm {"NAME":"WIFILW10WTE14","GPIO":[0,0,0,0,0,416,0,0,0
|
||||
Nedis G125 5.5W 350lm Twisted Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 330lm {"NAME":"Nedis WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4,5W 380lm {"NAME":"Nedis WIFILW10WTGU10","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4.5W 330lm 110 {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4.5W 330lm 110° {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nous P2 {"NAME":"NOUS-P2","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":37}
|
||||
Philips Zhirui Candle 250lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48}
|
||||
Phillips Zhirui 450lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48}
|
||||
@ -150,7 +150,7 @@ Sulion Morgan C37 5W 470lm {"NAME":"Sulion Bombilla C37","GPIO":[0,0,0,0,0,0,0
|
||||
Swisstone 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18}
|
||||
Swisstone SH 310 {"NAME":"Swisstone SH 310","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Treatlife A19 9W 800lm {"NAME":"Treatlife SL20","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 300lm 110 {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 300lm 110° {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vestaiot BR30 800lm {"NAME":"Vesta BR30 CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Wipro Garnet NS9100 810lm {"NAME":"Wipro 9W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Wyze A19 800lm {"NAME":"Wyze Bulb","GPIO":[5728,0,0,0,0,0,0,0,0,416,417,0,0,0],"FLAG":0,"BASE":48}
|
||||
@ -186,7 +186,6 @@ LE lampUX 15W RGBCCT {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,416,419,0,0
|
||||
LightZone MeLiTec {"NAME":"LightZone MeLiTec D114 Light ","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,417,416,0,0,419,418,420,0,0,0],"FLAG":0,"BASE":18}
|
||||
LOLAsmart Uranus White 70 cm {"NAME":"lola smart","GPIO":[0,0,0,1088,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
LSC 20W 1400lm White Ambiance {"NAME":"LSC RGBCW LED","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
Luminea 24W CCT {"NAME":"Luminea NX6205-944","GPIO":[0,0,0,0,0,0,0,0,449,0,416,0,0,0],"FLAG":0,"BASE":48}
|
||||
LVL 300mm Round {"NAME":"LVL 300m Round 24W Ceiling LED","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Nedis CCT 800lm {"NAME":"NEDIS WIFILAW10WT","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -266,6 +265,9 @@ EARU DIN Circuit Breaker 2P 63/80A eWeLink White {"NAME":"RDCBC-2P","GPIO":[32,
|
||||
Hoch Circuit Breaker 1P {"NAME":"HOCH ZJSB9","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Ketotek Single Phase Energy Monitor {"NAME":"Ketotek KTEM06","GPIO":[0,2272,0,2304,0,0,0,0,0,0,320,0,32,0],"FLAG":0,"BASE":54}
|
||||
Martin Jerry 30A Circuit Breaker {"NAME":"30A Breaker","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18}
|
||||
Nous DIN Smart Switch 16A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous DIN Smart Switch 20A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous DIN Smart Switch 25A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
OpenEnergyMonitor WiFi MQTT Thermostat {"NAME":"MQTT-RELAY","GPIO":[32,0,1,0,0,224,0,0,0,0,0,0,320,0],"FLAG":0,"BASE":18}
|
||||
RocketController ASTRA Controller {"NAME":"ASTRA R4A4","GPIO":[1,1,1,1,576,1,1,1,480,1,1,1,3232,3200,1,1,0,640,608,1,0,224,225,1152,0,0,0,0,227,226,160,161,162,0,0,163],"FLAG":0,"BASE":1}
|
||||
Shelly Pro 1 {"NAME":"Shelly Pro 1","GPIO":[0,1,0,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,0,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"}
|
||||
@ -281,7 +283,7 @@ TOMZN 1P 63A Circuit Breaker {"NAME":"TOB8-63WiFi","GPIO":[32,0,0,3104,0,0,0,0,
|
||||
TOMZN 2P 63A/80A Circuit Breaker {"NAME":"TOWBC-2P-T","GPIO":[0,0,0,0,0,0,0,0,64,224,0,0,288,0],"FLAG":0,"BASE":18}
|
||||
TOMZN 4P 80A Circuit Breaker {"NAME":"TOWBC-4P-T","GPIO":[288,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
TOMZN 4P 80A Circuit Breaker {"NAME":"TOMZN4","GPIO":[32,0,0,0,0,0,0,0,224,288,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Tongou 2P 63A Circuit Breaker {"NAME":"RCD_CONTACTOR","GPIO":[32,224,0,0,0,0,0,0,288,544,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Tongou 2P 63A Circuit Breaker {"NAME":"RCD_CONTACTOR","GPIO":[32,224,0,3104,0,0,0,0,288,544,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
```
|
||||
|
||||
## Dehumidifier
|
||||
@ -311,7 +313,7 @@ LilyGo 4G GPS {"NAME":"LiLyGo A7608EH","GPIO":[1,1,672,1,226,225,
|
||||
LilyGO RGB LED Ring Encoder {"NAME":"T-Encoder","GPIO":[0,0,1,0,1,0,0,0,1,1,1,1,0,0,0,480,6212,0,0,0,0,449,450,448,0,0,0,0,0,0,0,0,3296,3264,32,0],"FLAG":0,"BASE":1,"CMND":"BuzzerPwm 1"}
|
||||
LilyGO T7 Mini32 V1.5 {"NAME":"LilyGO T7 V1.5","GPIO":[1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,544,0,0,0,1,0,1,1,1,0,0,0,0,0,1,1,4704,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LilyGO TTGO ESP32 Ethernet {"NAME":"T-Internet-POE v1.2","GPIO":[0,1,1,1,1,1,1,1,1,1,1,1,1,1,5600,1,0,1,1,5568,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1,"CMND":"EthType 0|EthClockMode 1|EthAddress 0"}
|
||||
M5Stack Atom Lite ESP32 {"NAME":"M5Stack Atom Lite","GPIO":[1,1,1,1,1,1,1,1,1056,1,1,1,1,1,1,1,0,1,1,1,0,1,640,1376,0,0,0,0,608,1,1,1,1,0,0,32],"FLAG":0,"BASE":1}
|
||||
M5Stack Atom Lite ESP32 {"NAME":"M5Stack Atom Lite","GPIO":[0,0,0,0,0,0,0,0,1056,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1376,0,0,0,0,1,1,1,0,0,0,0,32],"FLAG":0,"BASE":1}
|
||||
M5Stack AtomU USB-A ESP32 "Not available"
|
||||
Mostly Robots Wemos D1 4 Channel MOSFET Shield {"NAME":"MOSFET","GPIO":[1,1,288,1,1,1,1,1,226,225,227,224,1,1],"FLAG":0,"BASE":18}
|
||||
Olimex ESP32-POE Ethernet {"NAME":"Olimex ESP32-PoE","GPIO":[1,1,1,1,1,1,0,0,5536,1,1,1,1,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
@ -395,7 +397,7 @@ Nedis A60 Warm White 9W 800lm {"NAME":"WIFILW11WTE27","GPIO":[0,0,0,0,0,416,0,0
|
||||
Nedis G125 Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 330lm {"NAME":"Nedis WIFILW31","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis ST64 5W 500lm Filament {"NAME":"WIFILF10GDST64","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Positivo Smart Lampada Retro {"NAME":"POSITIVO SMART LAMPADA RETRO","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Positivo Smart Lâmpada Retrô {"NAME":"POSITIVO SMART LAMPADA RETRO","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Sealight Vintage Edison A19 {"NAME":"SealightEdison","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Vintage 4W 260lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -558,7 +560,7 @@ Goldair SleepSmart GCPF315 {"NAME":"Goldair Fan","GPIO":[0,0,0,0,0,0,0,0,0,230
|
||||
Holmes 36" Oscillating Tower {"NAME":"Generic","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":54,"CMND":"TuyaMcu 11,1 | TuyaMcu 12,5 | WebButton1 Power | WebButton2 Oscillation "}
|
||||
Lucci Connect Remote Control {"NAME":"Lucci Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
|
||||
QuietCool Gable Mount Attic {"NAME":"QuietCool-AFG-SMT-PRO-2.0","GPIO":[0,0,0,0,0,224,0,0,0,0,0,0,0,0,640,608,0,0,0,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Interlock 1|WebButton1 Low|WebButton2 High|SO8 1"}
|
||||
Sichler Haushaltsgeraete Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Sichler Haushaltsgeräte Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Technical Pro {"NAME":"FXA16 Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 12,8"}
|
||||
Zemismart Bladeless {"NAME":"Bladeless Fan","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54}
|
||||
```
|
||||
@ -601,6 +603,7 @@ EBERG ROT 720 Infrared {"NAME":"Tuya MCU","GPIO":[0,2272,0,2304,0,0,0,0,0,
|
||||
Klarstein Bornholm Smart 2000W {"NAME":"Klarstein Bornholm","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Kogan 1500W Panel {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
|
||||
LSC Smart Connect 500W IR Panel {"NAME":"LSC Connect Smart IR Panel Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Mursche 450W Infrared Heater {"NAME":"Mursche Infrared Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
SmartMi Electric Air {"NAME":"ZNNFJ07ZM","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,3200,3232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
```
|
||||
|
||||
@ -622,7 +625,7 @@ Antsig Universal Remote Controller {"NAME":"Antsig Smart Wi-Fi IR","GPIO":[1,1,
|
||||
Athom {"NAME":"Athom_IR_Remote","GPIO":[32,0,0,0,1056,1088,0,0,0,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Automate Things IR Bridge {"NAME":"AT-IRBR-1.0","GPIO":[0,0,0,0,1056,1088,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"Module 0"}
|
||||
Automate Things IR Bridge {"NAME":"AT-IRBR-1.4","GPIO":[1088,0,0,0,1056,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"Module 0"}
|
||||
auvisio S06 {"NAME":"NX-4519-675","GPIO":[0,0,0,0,288,1088,0,0,0,0,1056,0,0,0],"FLAG":0,"BASE":18}
|
||||
auvisio S06 {"NAME":"NX-4519-675","GPIO":[0,0,0,0,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":18}
|
||||
Avatto Temperature and Humidity Sensor and {"NAME":"S08Pro","GPIO":[0,640,0,608,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":18}
|
||||
BlitzWolf BW-RC1 {"NAME":"BW-RC1","GPIO":[0,0,0,0,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
|
||||
Connect SmartHome Universal Remote {"NAME":"CSH IR Controller","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
|
||||
@ -656,6 +659,10 @@ Uniplay Universal Remote {"NAME":"Uniplay IR","GPIO":[1,3200,1,3232,576,1088
|
||||
YTF Universal Remote {"NAME":"YTF IR Controller","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
|
||||
```
|
||||
|
||||
## IR Remote
|
||||
```
|
||||
```
|
||||
|
||||
## Illuminance Sensor
|
||||
```
|
||||
Tuya {"NAME":"Lightsensor","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -873,7 +880,7 @@ PCI-e Desktop PC Remote Control {"NAME":"PC-Switch-01","GPIO":[32,0,0,0,0,0,0,0
|
||||
Petoneer Smart Dot Cat Toy {"NAME":"Petoneer Smart Dot","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Proscenic T21 Air Fryer {"NAME":"Proscenic T21","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
RainPoint Indoor Water Pump {"NAME":"RainPoint","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 81,107|TuyaMCU 12,109|TuyaMCU 11,1|TuyaMCU 82,104"}
|
||||
Sinilink PCIe Computer Remote {"NAME":"XY-WPCE","GPIO":[1,1,320,1,32,224,0,0,160,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | SwitchMode1 2"}
|
||||
Sinilink PCIe Computer Remote {"NAME":"XY-WPCE","GPIO":[1,1,320,1,160,224,0,161,162,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | Pulsetime 10 | SwitchMode1 2 | SwitchMode2 2 | SwitchMode3 2"}
|
||||
Sinilink USB Computer Remote {"NAME":"XY-WPCL","GPIO":[0,0,320,0,0,224,0,32,160,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | Pulsetime 10 | SwitchMode1 2"}
|
||||
Sinilink XY-Clock Clock Alarm Module {"NAME":"XY-Clock","GPIO":[288,0,289,0,0,416,32,33,608,640,0,0,34,0],"FLAG":0,"BASE":18}
|
||||
Sunbeam LoftTec Electric Blanket {"NAME":"Sunbeam Heated Blanket","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -923,7 +930,7 @@ Zemismart Updated RF Remote Roller Shade {"NAME":"Zemismart M515EGB","GPIO":[1,
|
||||
## Other
|
||||
```
|
||||
Kogan SmarterHome 1.9L Pet Water Fountain {"NAME":"WaterFountain","GPIO":[257,0,259,0,576,32,0,0,224,161,0,480,226,4704],"FLAG":0,"BASE":18}
|
||||
Tetra Connect Automatic Feeder {"NAME":"Tetra Connect","GPIO":[0,0,0,0,224,288,0,0,98,96,97,0,289,0],"FLAG":0,"BASE":18}
|
||||
Tetra® Connect Automatic Feeder {"NAME":"Tetra Connect","GPIO":[0,0,0,0,224,288,0,0,98,96,97,0,289,0],"FLAG":0,"BASE":18}
|
||||
```
|
||||
|
||||
## Outdoor Plug
|
||||
@ -985,6 +992,8 @@ Merkury {"NAME":"Merkury Switch","GPIO":[0,0,0,0,32,0,0,0,0
|
||||
Meross MSS620 16A IP44 {"NAME":"MSS620","GPIO":[0,320,0,320,225,0,0,0,224,576,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
Minoston MP22W {"NAME":"Minoston MP22W","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PO120 IP44 {"NAME":"WIFIPO120FWT","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49}
|
||||
Nous A6T Smart Socket {"NAME":"NOUS A5T","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,35,4704],"FLAG":1,"BASE":18}
|
||||
Nous Dual Smart Socket {"NAME":"NOUS A4T","GPIO":[0,2624,0,576,2656,2720,0,0,224,225,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
Obi Stecker IP44 {"NAME":"OBI-Outdoor-Socket2","GPIO":[0,0,0,0,224,32,0,0,576,288,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
Oittm IP44 15A {"NAME":"Oittm Outdoor","GPIO":[576,0,320,0,2688,2656,0,0,224,2592,0,0,0,0],"FLAG":0,"BASE":57}
|
||||
Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[32,0,0,0,0,0,0,0,0,0,320,224,1,0],"FLAG":0,"BASE":18}
|
||||
@ -1069,6 +1078,7 @@ Arlec Twin Socket with Energy Meter {"NAME":"Arlec PC287HA","GPIO":[0,32,0,320,
|
||||
Athom 16A {"NAME":"Athom Power Monitoring Plug","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,1],"FLAG":0,"BASE":18}
|
||||
Athom 16A AU {"NAME":"Athom PG05-AU16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A AU {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A AU V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A BR V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A Brazil {"NAME":"Athom PG05-BR16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A EU V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1078,8 +1088,10 @@ Athom 16A Italy {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,26
|
||||
Athom 16A Switzerland v2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK {"NAME":"Athom PG04-UK16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A US {"NAME":"Athom PG03-US16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A US V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A US V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Atlantis {"NAME":"Atlantis Smart Plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Aubess 16A {"NAME":"Aubess 16A Power Monitoring Plug","GPIO":[0,32,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1221,8 +1233,8 @@ Epicka {"NAME":"Epicka","GPIO":[1,1,1,1,321,320,0,0,224,32
|
||||
Eques Elf Smart Plug {"NAME":"EQP01WTGY","GPIO":[0,0,0,320,0,0,0,0,96,0,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Esicoo JSM-WF02 {"NAME":"Esicoo Plug","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Estink C178 {"NAME":"Estink C178","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Etekcity 15A {"NAME":"ESW15-US","GPIO":[0,0,0,0,0,224,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":18}
|
||||
Etekcity 8A {"NAME":"ESW01-USA","GPIO":[0,0,0,0,224,544,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":55}
|
||||
ETEKCITY Voltson Smart Wi-Fi Outlet {"NAME":"ESW15-USA","GPIO":[0,0,0,0,416,224,0,0,2656,2688,32,2592,544,4704],"FLAG":0,"BASE":18}
|
||||
EU3S {"NAME":"AWOW BSD33","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18}
|
||||
Eva Logik {"NAME":"EVA LOGIK Plug","GPIO":[1,32,1,1,1,1,0,0,1,288,224,1,1,0],"FLAG":0,"BASE":18}
|
||||
Ewelink EU 20A {"NAME":"Ewelink Smart Socket 20A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1250,7 +1262,7 @@ Geeni Spot {"NAME":"Geeni Spot","GPIO":[576,0,0,0,320,0,0,0,0,
|
||||
Geeni Spot Glo {"NAME":"Geeni Glo","GPIO":[0,0,0,0,320,0,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18}
|
||||
Geeni SWITCH {"NAME":"Geeni Switch","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Geeni Switch Duo {"NAME":"Geeni Duo","GPIO":[0,0,0,0,33,225,0,0,32,288,224,0,289,0],"FLAG":0,"BASE":18}
|
||||
GHome EP2-A {"NAME":"GHome EP2-A","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45}
|
||||
GHome EP2-A {"NAME":"GHome EP2-A","GPIO":[576,0,320,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45}
|
||||
Girier 16A {"NAME":"Girier - JR-PM01","GPIO":[0,544,0,2624,2720,2656,0,0,224,32,320,0,0,0],"FLAG":0,"BASE":68}
|
||||
Globe 15A {"NAME":"Globe 50329","GPIO":[0,0,0,0,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
Globe 2 Outlet {"NAME":"Globe 50020","GPIO":[0,576,0,321,33,32,0,0,224,320,225,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1454,6 +1466,7 @@ Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[1,1,1,1,1,1,1,1,224,288
|
||||
Nivian {"NAME":"Nivian Smart Socket","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18}
|
||||
Nous A1 {"NAME":"NOUS A1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45}
|
||||
Nous A1T 16A {"NAME":"NOUS A1T","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49}
|
||||
Nous A8T 10A {"NAME":"NOUS A8T","GPIO":[1,1,320,1,32,1,1,1,1,224,2624,1,1,1,1,1,0,1,1,1,0,1,2656,2720,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,2720,2656,0,0,576,32,2592,224,0,0],"FLAG":0,"BASE":45}
|
||||
NX-SM200 {"NAME":"NX-SM200","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18}
|
||||
NX-SM210 {"NAME":"NX-SM210","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1624,7 +1637,7 @@ Vettora Smart Plug {"NAME":"Vettora","GPIO":[0,0,0,32,0,0,0,0,0,320,22
|
||||
Vingo {"NAME":"Karpal-01","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vivanco 39625 Smart Home Power Adapter {"NAME":"Vivianco","GPIO":[0,0,0,32,2688,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar {"NAME":"Vivitar HA1003","GPIO":[576,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar {"NAME":"Vivitar HA1004","GPIO":[576,0,0,0,0,320,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar {"NAME":"Vivitar HA-1004","GPIO":[320,0,321,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar HA-1006 {"NAME":"HA-1006","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar HA-1006-AU {"NAME":"HA-1006-AU","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vivitar Plug {"NAME":"HA-1005N-AU","GPIO":[0,0,0,0,544,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1829,6 +1842,7 @@ ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,320,0,32,225,224,0,0
|
||||
|
||||
## Presence Sensor
|
||||
```
|
||||
Athom Human Presence Sensor {"NAME":"Athom PS01 Sensor","GPIO":[32,0,0,0,640,608,0,0,161,3232,160,3200,576,0],"FLAG":0,"BASE":18}
|
||||
Everything Presence Lite {"NAME":"Everything Presence Lite","GPIO":[0,0,0,0,0,0,0,0,0,0,544,0,3232,3200,160,161,0,640,608,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Everything Presence One {"NAME":"Everything Presence One","GPIO":[0,0,0,0,0,0,0,0,0,3200,3232,160,0,1,1,1,0,0,1,1,0,608,640,0,0,0,0,0,544,161,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"SO114 1 | SwitchMode1 1 | SwitchMode2 1"}
|
||||
Tuya mmWave {"NAME":"ZY-M100","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"SO97 1 | TuyaMCU 99,1 | TuyaMCU 75,104"}
|
||||
@ -2033,7 +2047,7 @@ Teckin SB53 1300lm {"NAME":"Teckin SB53","GPIO":[0,0,0,0,416,419,0,0,4
|
||||
Treatlife A19 8W 650lm {"NAME":"Treatlife RGBW","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-TAC 10W 806lm {"NAME":"V-TAC VT-5119","GPIO":[0,0,0,0,4032,0,0,0,0,0,4064,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac A60 10W 806lm {"NAME":"V-Tac A60","GPIO":[0,0,0,0,416,417,0,0,418,419,420,0,0,0],"FLAG":0,"BASE":18,"CMND":"SetOption37 13"}
|
||||
V-Tac PAR16 4.5W 400lm 100 {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 400lm 100° {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vizia 5W GU10 {"NAME":"Vizia RGBWW","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,1],"FLAG":0,"BASE":18}
|
||||
WdtPro 8W 800lm {"NAME":"WdtPro","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Wipro Garnet 9W 810lm {"NAME":"Wipro","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2136,7 +2150,7 @@ Kainsy 600lm {"NAME":"KAINSY","GPIO":[32,0,0,0,3008,3040,0,0,0,0
|
||||
Kkmoon 9W 800lm {"NAME":"KKMOON V21","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Koaanw 650lm {"NAME":"KOAANW Bulb","GPIO":[0,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
|
||||
Kogan 10W Ambient 1050lm {"NAME":"Kogan RGB","GPIO":[0,0,0,0,2912,416,0,0,0,0,2944,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110 {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110° {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan Ambient Candle {"NAME":"Kogan_E14","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kuled 800lm {"NAME":"KULED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18}
|
||||
Laideyi 7W {"NAME":"7W-E14-RGBW-La","GPIO":[0,0,0,0,417,416,0,0,418,0,419,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2205,7 +2219,7 @@ Rogoei EBE-QPZ04 6.5W 450lm {"NAME":"EBE-QPZ04","GPIO":[0,0,0,0,4032,0,0,0,0,0,
|
||||
Saudio 7W 700lm {"NAME":"X002BU0DOL","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Sengled {"NAME":"Sengled RGBW","GPIO":[0,0,0,0,0,0,0,0,417,416,419,418,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 5W 400lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,4736],"FLAG":0,"BASE":18,"CMND":"AdcParam 2, 32000, 1000, 3950|SetOption37 128|SetOption106 1|SetOption107 0|WebButton1 COLOR|WebButton2 WHITE|SetOption42 85|Fade ON|Speed 2|SetOption91 1|Rule1 ON POWER2#state=1 DO POWER1 OFF ENDON ON POWER1#state=1 DO POWER2 OFF ENDON ON Dimmer1#State DO POWER2 OFF ENDON ON Dimmer2#State DO POWER1 OFF ENDON|Rule1 ON"}
|
||||
Smart 810lm {"NAME":"OOOLED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18}
|
||||
SmartLED 9W 400lm {"NAME":"SmartLED RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Smartyfi 600lm {"NAME":"SMARTYFI 9W","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2262,11 +2276,13 @@ Anmbest 2 Channel Inching Self-locking Switch Module {"NAME":"Generic","GPIO":[
|
||||
Aptinex IOT RelayNode 4 Channel {"NAME":"APTINEX","GPIO":[0,0,1,0,0,0,0,0,224,225,226,227,0,0],"FLAG":0,"BASE":18}
|
||||
Armtronix Quad {"NAME":"Armtronix Wifi Four Relay Board","GPIO":[1,0,0,0,224,1,0,0,225,226,227,0,1,0],"FLAG":0,"BASE":7}
|
||||
Athom 1Ch Inching/Self-locking {"NAME":"Athom R01","GPIO":[1,1,1,1,1,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18}
|
||||
Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom R08","GPIO":[229,1,1,1,230,231,1,1,226,227,225,228,224,0],"FLAG":0,"BASE":18}
|
||||
Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom 8CH Relay Board","GPIO":[0,0,228,0,229,230,1,1,226,227,225,544,1,1152,231,0,0,0,0,0,0,33,32,224,0,0,0,0,35,34,37,36,39,0,0,38],"FLAG":0,"BASE":1}
|
||||
Claudy 5V {"NAME":"CLAUDY","GPIO":[0,0,225,0,0,0,0,0,0,0,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Devantech 8x16A {"NAME":"ESP32LR88","GPIO":[0,0,231,0,32,35,0,0,229,230,228,0,33,34,36,37,0,38,39,544,0,225,226,227,0,0,0,0,0,224,3232,3200,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Dingtian 16 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9729,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Dingtian 2 Channel {"NAME":"Dingtian DT-R002","GPIO":[5536,9408,225,9440,0,0,0,0,0,9952,0,0,224,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,576,0,0,0,160,0,0,161],"FLAG":0,"BASE":1}
|
||||
Dingtian 32 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9731,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Dingtian 4 Channel {"NAME":"Dingtian DT-R004","GPIO":[0,9408,225,9440,0,0,0,0,227,9952,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,162,0,163,160,0,0,161],"FLAG":0,"BASE":1}
|
||||
Dingtian 8 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9728,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
DoHome HomeKit DIY Switch {"NAME":"DoHome DIY","GPIO":[1,1,0,1,96,544,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Eachen ST-DC2 {"NAME":"Garage Control","GPIO":[162,0,0,0,226,225,33,0,224,288,163,227,0,4704],"FLAG":0,"BASE":18}
|
||||
@ -2315,7 +2331,7 @@ LC Technology 5V/8-80V 1 Channel {"NAME":"LC-Relay-ESP12-1R-MV","GPIO":[1,1,544
|
||||
LC Technology 5V/8-80V 1 Channel {"NAME":"LC-Relay-ESP12-1R-D8","GPIO":[1,1,544,1,1,224,1,1,1,1,1,1,321,1],"FLAG":0,"BASE":18}
|
||||
LC Technology AC90V-250V 1 Channel {"NAME":"ESP32_Relay_AC_X1","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,224,1,1,1,0,1,1,544,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 1 Channel {"NAME":"ESP32_Relay_X1","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,224,1,1,1,0,1,1,544,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 2 Channel {"NAME":"ESP32_Relay_X2","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,544,0,225,224,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 2 Channel {"NAME":"ESP32_Relay_X2","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,224,225,0,0,0,0,0,544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 4 Channel {"NAME":"ESP32_Relay_X4","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,544,0,226,227,1,0,0,0,0,224,225,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology ESP8266 5V {"NAME":"ESP8266-01S","GPIO":[224,3200,0,3232,0,0,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18}
|
||||
LilyGo T-Relay 5V 8 Channel {"NAME":"LilyGo ESP32 Relay 8","GPIO":[1,1,1,1,1,231,1,1,227,226,1,1,1,1,230,229,0,228,1,1,0,544,1,1,0,0,0,0,225,224,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
@ -2360,6 +2376,10 @@ Connex Smart Indoor {"NAME":"Connex Siren","GPIO":[0,2272,0,2304,0,0,0,
|
||||
NEO Coolcam Temperature and Humidity 3in1 Alarm {"NAME":"Neo Siren 3in1","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
```
|
||||
|
||||
## Smart Meter
|
||||
```
|
||||
```
|
||||
|
||||
## Smoke Sensor
|
||||
```
|
||||
Nedis Smoke Detector {"NAME":"Nedis WIFIDS10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -2436,7 +2456,6 @@ Connect SmartHome 3 Gang Wall Switch () {"NAME":"CSH-SWTCH3","GPIO":[0,0,288,0,
|
||||
Csmart US-B2 {"NAME":"Csmart US-B2","GPIO":[0,544,0,33,32,0,0,0,0,225,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Delock WLAN EASY-USB {"NAME":"Delock 11828","GPIO":[0,0,0,32,0,0,0,0,0,576,224,0,0,0],"FLAG":0,"BASE":53}
|
||||
Deta 1 Gang {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,544,0,0,0,0,224,0,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 2 Gang {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,544,0,0,0,65,224,225,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 3 Gang {"NAME":"DETA 3G Switch","GPIO":[544,0,0,66,65,224,0,0,226,0,225,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 4 Gang {"NAME":"Deta 4G Switch","GPIO":[576,0,0,34,33,224,0,0,226,35,225,227,32,0],"FLAG":0,"BASE":18}
|
||||
DETA Mechanism {"NAME":"Deta 6014HA","GPIO":[0,0,0,0,0,0,0,0,320,0,32,0,224,0],"FLAG":0,"BASE":18}
|
||||
@ -2585,7 +2604,7 @@ Nedis Dual {"NAME":"SM-SW102U-2","GPIO":[576,0,0,33,225,0,0,0,
|
||||
NEO Coolcam 2Ch Touch Light {"NAME":"Neo NAS-SC01W-2","GPIO":[0,0,0,0,225,0,0,0,32,224,33,0,544,0],"FLAG":0,"BASE":18}
|
||||
Nexete DS-123 {"NAME":"DS-123","GPIO":[544,321,1,32,224,33,0,0,1,225,320,1,1,0],"FLAG":0,"BASE":18}
|
||||
Nexete DS-123 Single {"NAME":"DS-123","GPIO":[544,0,1,33,0,32,0,0,1,224,320,1,1,0],"FLAG":0,"BASE":18}
|
||||
Novadigital Interruptor Touch Led 1 Boto {"NAME":"Nova Digital Switch 1 Gang","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
Novadigital Interruptor Touch Led 1 Botão {"NAME":"Nova Digital Switch 1 Gang","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
PNI SmartHome 1 Key {"NAME":"Tuya Switch 1 key","GPIO":[544,1,1,32,224,1,1,1,1,1,288,1,1,1],"FLAG":0,"BASE":18}
|
||||
PNI SmartHome 2 Keys {"NAME":"Tuya switch 2 key","GPIO":[544,0,289,0,0,32,0,0,33,225,0,224,288,0],"FLAG":0,"BASE":18}
|
||||
Prosto {"NAME":"Prosto WFS-T10","GPIO":[0,0,0,0,0,224,0,0,320,0,64,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2598,7 +2617,7 @@ QNCX Smart Breaker {"NAME":"QNCX Smart breaker","GPIO":[0,0,0,0,160,22
|
||||
Qualitel 1 Gang {"NAME":"Qualitel 1 Gang","GPIO":[544,0,0,160,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
Qualitel 2-Gang {"NAME":"Qualitel 2 Gang","GPIO":[544,0,289,0,0,161,0,0,160,224,0,225,288,0],"FLAG":0,"BASE":18}
|
||||
Qualitel 3 Gang {"NAME":"Qualitel 3 Gang","GPIO":[544,0,290,161,225,162,0,0,160,224,289,226,288,0],"FLAG":0,"BASE":18}
|
||||
Refoss AC/DC {"NAME":"Refoss-R10","GPIO":[0,1,3104,0,224,192,0,0,2720,0,0,0,0,4736],"FLAG":0,"BASE":18}
|
||||
Refoss AC/DC {"NAME":"Refoss-R10","GPIO":[1,1,0,1,224,192,0,0,2656,2720,32,1,2624,4736],"FLAG":0,"BASE":18}
|
||||
RY-RSM104 Light Touch {"NAME":"RY-RSM104","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Sainko 1-Way {"NAME":"SAINKO 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28}
|
||||
Sainko 2 Way {"NAME":"Sainko 2-Way","GPIO":[0,1,320,0,0,32,0,0,224,225,0,0,33,0],"FLAG":0,"BASE":18}
|
||||
@ -2631,7 +2650,7 @@ Smatrul 5A RF433MHz 4 Gang Touch {"NAME":"Smatrul RF433MHz 3 Gang Touch Switch
|
||||
Smatrul Infrared Sensor {"NAME":"WHS-2","GPIO":[0,0,0,160,288,0,0,0,0,224,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SwitchMode1 4 | SO13 1"}
|
||||
Sonoff IW101 {"NAME":"Sonoff IW101","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41}
|
||||
Sonoff SwitchMan M5-1C 1 Gang {"NAME":"Sonoff SwitchMan M5-1C-86","GPIO":[32,0,0,0,288,576,0,0,0,0,0,0,0,0,416,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,289,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-3C 3 Gang {"NAME":"Sonoff M5-3C","GPIO":[33,0,0,0,32,576,0,0,0,0,0,34,0,0,416,225,0,0,226,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff T1 EU 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28}
|
||||
Sonoff T1 EU 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29}
|
||||
@ -2693,7 +2712,6 @@ TreatLife 3-Way {"NAME":"Treatlife 3-Way","GPIO":[0,0,0,0,224,576,0
|
||||
TreatLife Single Pole ON/OFF {"NAME":"Treatlife SS02","GPIO":[0,0,0,0,288,576,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Tuya 20A {"NAME":"DS-161","GPIO":[544,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
|
||||
Tuya 3 Gang {"NAME":"KING-Tuya-key","GPIO":[0,0,0,0,226,225,0,0,224,32,34,0,33,0],"FLAG":0,"BASE":18}
|
||||
Tuya 4 Gang {"NAME":"Tuya 4 Gang Switch","GPIO":[1,34,224,32,33,0,0,0,225,576,0,0,0,0,0,0,0,0,226,227,35,1],"FLAG":0,"BASE":1}
|
||||
Tuya T1 2 Gang No Neutral {"NAME":"Tuya T1 Wifi 2 Gang No Neutral Switch","GPIO":[32,0,0,0,0,225,33,0,224,544,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Tuya T1 3 Gang No Neutral {"NAME":"Tuya T1 Wifi 3 Gang No Neutral Switch","GPIO":[32,0,0,0,226,225,33,34,224,544,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
TY-US-L1-W {"NAME":"TY-US-L1-W","GPIO":[0,0,0,0,0,32,0,0,0,224,0,0,576,0],"FLAG":0,"BASE":18}
|
||||
@ -2735,12 +2753,12 @@ ZUCZUG 3 Gang {"NAME":"2ph105626a x3","GPIO":[0,288,0,32,34,33,0,
|
||||
## Switch Module
|
||||
```
|
||||
2 CH Smart Switch {"NAME":"Generic","GPIO":[32,1,1,1,1,225,33,1,224,288,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
AGL Modulo Relay 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18}
|
||||
AGL Módulo Relé 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18}
|
||||
Albohes 2 Channel {"NAME":"Albohes SH-08","GPIO":[0,3200,33,3232,321,320,0,0,224,544,32,0,225,1],"FLAG":0,"BASE":18}
|
||||
Athom 10A {"NAME":"CB01-TAS-1","GPIO":[0,0,0,32,320,0,0,0,0,224,0,0,0,1],"FLAG":0,"BASE":18}
|
||||
Athom 2Ch Inching/Self-locking {"NAME":"Athom R02","GPIO":[1,1,1,1,225,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18}
|
||||
Athom 2Ch Inching/Self-locking {"NAME":"Athom 2CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,0,0,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,32,0,0,33],"FLAG":0,"BASE":1}
|
||||
Athom 3-Way Mini Relay {"NAME":"RS01-TAS-1","GPIO":[0,0,0,32,576,0,0,0,0,224,160,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom R04","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18}
|
||||
Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom 4CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,226,227,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,34,35,32,0,0,33],"FLAG":0,"BASE":1}
|
||||
Athom 4Ch Inching/Self-locking 30A {"NAME":"Athom R04-30A","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18}
|
||||
ATMS1601 230VAC DIN Timer/Switch {"NAME":"ATMS1601","GPIO":[1,1,1,1,544,320,1,1,224,32,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
Aubess Power Monitor Switch 16A {"NAME":"Aubess with (BL0942)","GPIO":[0,3200,0,7520,0,0,0,0,160,0,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2754,7 +2772,7 @@ Century Aoke Smart Switch {"NAME":"CenturyAoke","GPIO":[0,1,0,1,224,0,0,0,32,
|
||||
Deta 6000HA Smart Inline Switch {"NAME":"DETA-6000HA","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
dewenwils Outdoor Timer Box {"NAME":"Dewenwils50054","GPIO":[0,0,290,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
EDM Low Voltage {"NAME":"HVAC Switch","GPIO":[0,0,0,0,288,321,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo 2 Channel {"NAME":"eMylo XL9252WI","GPIO":[0,1,0,0,320,225,0,0,224,0,163,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo 2 Channel {"NAME":"eMylo XL9252WI","GPIO":[0,1,0,0,320,225,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo Single Channel Switch {"NAME":"eMylo XL9251WI","GPIO":[0,1,0,0,320,0,0,0,224,0,35,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo SS-8839-02 {"NAME":"SS-8839-02","GPIO":[0,1,0,1,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo SS-8839-03 {"NAME":"SS-8839-03","GPIO":[0,1,0,1,288,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2778,8 +2796,11 @@ Moes {"NAME":"Moes MS-104B","GPIO":[0,0,32,0,480,0,0,0,1
|
||||
Moes 10A {"NAME":"Moes MS-101","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Moes Mini 3 Gang 1/2 Way {"NAME":"Moes MS-104C","GPIO":[0,0,0,34,32,33,0,0,224,225,226,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis 10A {"NAME":"Nedis WIFIPS10WT","GPIO":[0,0,0,0,224,0,0,0,32,321,0,288,0,0],"FLAG":0,"BASE":18}
|
||||
Nous 1 Channel {"NAME":"NOUS B1T","GPIO":[544,0,1,0,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 1 Channel Touch {"NAME":"NOUS L1T","GPIO":[544,0,1,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
|
||||
Nous 1/2 Channel {"NAME":"NOUS L13T Smart Switch Module","GPIO":[1,161,1,160,225,224,1,1,544,1,32,1,1,1],"FLAG":0,"BASE":18}
|
||||
Nous 2 Channel {"NAME":"NOUS B2T","GPIO":[544,3200,1,8160,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 2 Channel / Curtain {"NAME":"NOUS B3T","GPIO":[544,3200,1,8128,32,160,1,1,224,225,0,1,1,1,161,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 2 Channel Touch {"NAME":"NOUS L2T","GPIO":[544,289,1,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
|
||||
Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[0,1,0,1,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
ONiOFF Smart Switch {"NAME":"ONOFF SmartSwitch","GPIO":[1,320,1,1,1,32,0,0,224,1,1,0,0,0],"FLAG":0,"BASE":1}
|
||||
@ -2933,6 +2954,10 @@ Xenon {"NAME":"Xenon SM-PM801-K1","GPIO":[0,320,0,32,2720
|
||||
Xenon 2AC 1USB {"NAME":"Xenon SM-PW801-U1","GPIO":[0,0,0,0,288,32,0,0,224,0,225,0,226,0],"FLAG":0,"BASE":18}
|
||||
```
|
||||
|
||||
## Wall Switch
|
||||
```
|
||||
```
|
||||
|
||||
## Water Sensor
|
||||
```
|
||||
Nedis SmartLife Water Detector {"NAME":"Nedis WIFIDW10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 51,21"}
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DHAS_PSRAM_FIX -mfix-esp32-psram-cache-issue -mfix-esp32-psram-cache-strategy=memw -DESP32_4M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DHAS_PSRAM_FIX -mfix-esp32-psram-cache-issue -mfix-esp32-psram-cache-strategy=memw -DESP32_4M",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dio",
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DESP32_4M -DCORE32SOLO1",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP32_4M -DCORE32SOLO1",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dio",
|
||||
@ -25,7 +22,7 @@
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"name": "Espressif Generic ESP32-solo1 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
@ -44,6 +41,6 @@
|
||||
"download": {
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://en.wikipedia.org/wiki/ESP32",
|
||||
"url": "https://www.espressif.com/sites/default/files/documentation/esp32-solo-1_datasheet_en.pdf",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DESP32_4M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dio",
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c2_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DESP32_4M -DESP32C2",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP32_4M -DESP32C2",
|
||||
"f_cpu": "120000000L",
|
||||
"f_flash": "60000000L",
|
||||
"flash_mode": "qio",
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c2_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DESP32_2M -DESP32C2",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP32_2M -DESP32C2",
|
||||
"f_cpu": "120000000L",
|
||||
"f_flash": "60000000L",
|
||||
"flash_mode": "qio",
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c3_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DESP32_4M -DESP32C3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DARDUINO_USB_MODE=1 -DESP32_4M -DESP32C3 -DUSE_USB_CDC_CONSOLE",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dio",
|
||||
@ -37,10 +34,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
|
||||
"vendor": "Espressif"
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c3_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DARDUINO_USB_MODE=1 -DESP32_4M -DESP32C3 -DUSE_USB_CDC_CONSOLE",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP32_4M -DESP32C3",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dio",
|
||||
@ -17,10 +14,6 @@
|
||||
"bluetooth"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32c3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
@ -33,7 +26,7 @@
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32c3cdc-safeboot.bin"
|
||||
"tasmota32c3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -41,10 +34,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
|
||||
"vendor": "Espressif"
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c6_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DESP32_4M -DESP32C6",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DARDUINO_USB_MODE=1 -DESP32_4M -DESP32C6 -DUSE_USB_CDC_CONSOLE",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
@ -37,10 +34,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/espressif-esp-dev-kits/en/latest/esp32c6/esp32-c6-devkitc-1/index.html",
|
||||
"vendor": "Espressif"
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32c6_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DARDUINO_USB_MODE=1 -DESP32_4M -DESP32C6 -DUSE_USB_CDC_CONSOLE",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP32_4M -DESP32C6",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
@ -17,10 +14,6 @@
|
||||
"bluetooth"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32c6.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
@ -33,7 +26,7 @@
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32c6cdc-safeboot.bin"
|
||||
"tasmota32c6ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -41,10 +34,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/espressif-esp-dev-kits/en/latest/esp32c6/esp32-c6-devkitc-1/index.html",
|
||||
"vendor": "Espressif"
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s2_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DESP32_4M -DESP32S2",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S2",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dio",
|
||||
@ -19,8 +16,8 @@
|
||||
"openocd_target": "esp32s2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S2 >= 4M Flash PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -1,10 +1,7 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s2_out.ld"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S2",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S2",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dio",
|
||||
@ -19,8 +16,8 @@
|
||||
"openocd_target": "esp32s2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S2 >= 4M Flash PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -1,11 +1,10 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "opi_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dout",
|
||||
@ -22,8 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -39,11 +38,11 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
||||
}
|
||||
|
50
boards/esp32s3-opi_opi_120.json
Normal file
50
boards/esp32s3-opi_opi_120.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"memory_type": "opi_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"f_boot": "120000000L",
|
||||
"boot": "opi",
|
||||
"flash_mode": "dout",
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi",
|
||||
"bluetooth",
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
"flash_size": "4MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,11 +1,10 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "qio_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
@ -22,8 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -39,10 +38,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
|
50
boards/esp32s3-qio_opi_120.json
Normal file
50
boards/esp32s3-qio_opi_120.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"memory_type": "qio_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"f_boot": "120000000L",
|
||||
"boot": "qio",
|
||||
"flash_mode": "qio",
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi",
|
||||
"bluetooth",
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
"flash_size": "4MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,11 +1,10 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "qio_qspi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
@ -22,8 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -39,10 +38,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
|
50
boards/esp32s3-qio_qspi_120.json
Normal file
50
boards/esp32s3-qio_qspi_120.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"memory_type": "qio_qspi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"f_boot": "120000000L",
|
||||
"boot": "qio",
|
||||
"flash_mode": "qio",
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi",
|
||||
"bluetooth",
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
"flash_size": "4MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,20 +1,13 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "opi_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dout",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -25,15 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -41,7 +30,7 @@
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3cdc-safeboot.bin"
|
||||
"tasmota32s3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -49,11 +38,11 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
||||
}
|
50
boards/esp32s3ser-opi_opi_120.json
Normal file
50
boards/esp32s3ser-opi_opi_120.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"memory_type": "opi_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"f_boot": "120000000L",
|
||||
"boot": "opi",
|
||||
"flash_mode": "dout",
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi",
|
||||
"bluetooth",
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
"flash_size": "4MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,20 +1,13 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "qio_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -25,15 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -41,7 +30,7 @@
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3cdc-safeboot.bin"
|
||||
"tasmota32s3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -49,10 +38,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
50
boards/esp32s3ser-qio_opi_120.json
Normal file
50
boards/esp32s3ser-qio_opi_120.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"memory_type": "qio_opi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"f_boot": "120000000L",
|
||||
"boot": "qio",
|
||||
"flash_mode": "qio",
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi",
|
||||
"bluetooth",
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
"arduino": {
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
"flash_size": "4MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -1,20 +1,13 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino":{
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "qio_qspi"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -25,15 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"espidf",
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
@ -41,7 +30,7 @@
|
||||
"flash_extra_images": [
|
||||
[
|
||||
"0x10000",
|
||||
"tasmota32s3cdc-safeboot.bin"
|
||||
"tasmota32s3ser-safeboot.bin"
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -49,10 +38,10 @@
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 4194304,
|
||||
"require_upload_port": true,
|
||||
"speed": 2000000
|
||||
"speed": 460800
|
||||
},
|
||||
"download": {
|
||||
"speed": 2000000
|
||||
"speed": 230400
|
||||
},
|
||||
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
|
||||
"vendor": "Espressif"
|
30
boards/esp8266_16M14M.json
Normal file
30
boards/esp8266_16M14M.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino": {
|
||||
"ldscript": "eagle.flash.16m14m.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_16M -DESP8266_16M14M",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
"mcu": "esp8266",
|
||||
"variant": "generic"
|
||||
},
|
||||
"connectivity": [
|
||||
"wifi"
|
||||
],
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
],
|
||||
"name": "Espressif Generic ESP8266 Tasmota 1M sketch 1M OTA 14M FS",
|
||||
"upload": {
|
||||
"maximum_ram_size": 81920,
|
||||
"maximum_size": 995326,
|
||||
"require_upload_port": true,
|
||||
"resetmethod": "ck",
|
||||
"speed": 115200
|
||||
},
|
||||
"url": "http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family",
|
||||
"vendor": "Espressif"
|
||||
}
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.1m.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_1M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_1M",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.2m1m.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M1M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M1M",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.2m256.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M256",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M256",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.4m2m.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_4M -DESP8266_4M2M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_4M -DESP8266_4M2M",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.4m3m.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_4M -DESP8266_4M3M",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_4M -DESP8266_4M3M",
|
||||
"f_cpu": "80000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -4,7 +4,7 @@
|
||||
"ldscript": "eagle.flash.2m256.ld"
|
||||
},
|
||||
"core": "esp8266",
|
||||
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M256",
|
||||
"extra_flags": "-DARDUINO_TASMOTA -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DESP8266_2M -DESP8266_2M256",
|
||||
"f_cpu": "160000000L",
|
||||
"f_flash": "40000000L",
|
||||
"flash_mode": "dout",
|
||||
|
@ -70,3 +70,10 @@
|
||||
#define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x)
|
||||
|
||||
#endif // TARGET
|
||||
|
||||
// This trick makes sure that 'lto' optimizer does not inline `delay()
|
||||
// so we can override it with `-Wl,--wrap=delay` linker directive
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif // _cplusplus
|
||||
void delay(__UINT32_TYPE__ ms) __attribute__((noinline)) __attribute__ ((noclone));
|
||||
|
@ -157,6 +157,42 @@ char * U64toHex(uint64_t value, char *str) {
|
||||
}
|
||||
*/
|
||||
|
||||
char * ToBinary(uint32_t value, char *str, int32_t digits) {
|
||||
if (digits > 32) { digits = 32; }
|
||||
if (digits < 1) { digits = 1; }
|
||||
int32_t digits_to_one = 1; // how many digits until we find the last `1`
|
||||
str[32] = 0; // end of string
|
||||
for (uint32_t i=0; i<32; i++) { // 32 digits in uint32_t
|
||||
if ((value & 1) && (i+1 > digits_to_one)) {
|
||||
digits_to_one = i+1;
|
||||
}
|
||||
str[31 - i] = (char)(value & 1)+'0';
|
||||
value = value >> 1;
|
||||
}
|
||||
// adjust digits to always show the total value
|
||||
if (digits_to_one > digits) { digits = digits_to_one; }
|
||||
if (digits < 32) {
|
||||
memmove(str, str + 32 - digits, digits + 1);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
char * U64toStr(uint64_t value, char *str) {
|
||||
// str must be at least 24 bytes long
|
||||
uint32_t i = 23;
|
||||
str[--i] = 0; // end of string
|
||||
do {
|
||||
uint64_t m = value;
|
||||
value /= 10;
|
||||
char c = m - 10 * value;
|
||||
str[--i] = c < 10 ? c + '0' : c + 'A' - 10;
|
||||
} while (value);
|
||||
if (i) {
|
||||
memmove(str, str +i, 23 -i);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
char * U64toHex(uint64_t value, char *str, uint32_t zeroleads) {
|
||||
// str must be at least 17 bytes long
|
||||
str[16] = 0; // end of string
|
||||
@ -235,7 +271,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
const uint32_t ALLOC_SIZE = 12;
|
||||
static const char * allocs[ALLOC_SIZE] = {}; // initialized to zeroes
|
||||
uint32_t alloc_idx = 0;
|
||||
static char hex[20]; // buffer used for 64 bits, favor RAM instead of stack to remove pressure
|
||||
static char hex[34]; // buffer used for 64 bits, favor RAM instead of stack to remove pressure
|
||||
|
||||
for (; *fmt != 0; ++fmt) {
|
||||
int32_t decimals = -2; // default to 2 decimals and remove trailing zeros
|
||||
@ -290,6 +326,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B': // Pointer to SBuffer
|
||||
{
|
||||
if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; }
|
||||
@ -306,6 +343,17 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_b' outputs a uint32_t to binary
|
||||
// '%8_b' outputs a uint8_t to binary
|
||||
case 'b': // Binary, decimals indicates the zero prefill
|
||||
{
|
||||
ToBinary(cur_val, hex, decimals);
|
||||
new_val_str = copyStr(hex);
|
||||
if (new_val_str == nullptr) { goto free_allocs; }
|
||||
allocs[alloc_idx++] = new_val_str;
|
||||
}
|
||||
break;
|
||||
/*
|
||||
case 'V': // 2-byte values, decimals indicates the length, default 2
|
||||
{
|
||||
@ -386,6 +434,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_X' outputs a 64 bits unsigned int to uppercase HEX with 16 digits
|
||||
case 'X': // input is `uint64_t*`, printed as 16 hex digits (no prefix 0x)
|
||||
{
|
||||
@ -399,6 +448,20 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_U' outputs a 64 bits unsigned int to decimal
|
||||
case 'U': // input is `uint64_t*`, printed as decimal
|
||||
{
|
||||
if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; }
|
||||
else {
|
||||
U64toStr(*(uint64_t*)cur_val, hex);
|
||||
new_val_str = copyStr(hex);
|
||||
if (new_val_str == nullptr) { goto free_allocs; }
|
||||
allocs[alloc_idx++] = new_val_str;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
*cur_val_ptr = new_val_str;
|
||||
*fmt = 's'; // replace `%_X` with `%0s` to display a string instead
|
||||
|
@ -66,11 +66,14 @@ void test_ext_snprintf_P(void) {
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", 1, &fpi, 4, &f3, -4, &f3, -4, &f31, -8, &fpi);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
uint64_t u641 = 0x1122334455667788LL;
|
||||
uint64_t u642 = 0x0123456789ABCDEFLL;
|
||||
uint64_t u643 = 0xFEDCBA9876543210LL;
|
||||
|
||||
uint64_t u641 = 0x1122334455667788LL; // 1234605616436508552
|
||||
uint64_t u642 = 0x0123456789ABCDEFLL; // 81985529216486895
|
||||
uint64_t u643 = 0xFEDCBA9876543210LL; // 18364758544493064720
|
||||
ext_snprintf_P(c, sizeof(c), "Int64 0x%_X 0x%_X 0x%_X", &u641, &u642, &u643);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
ext_snprintf_P(c, sizeof(c), "Int64 decimal %_U %_U %_U", &u641, &u642, &u643);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
|
||||
// ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", &fpi, &f3, &f3, &f31, &fpi);
|
||||
|
||||
|
@ -123,7 +123,9 @@ void TasmotaSerial::end(void) {
|
||||
}
|
||||
|
||||
TasmotaSerial::~TasmotaSerial(void) {
|
||||
end();
|
||||
if (m_valid) {
|
||||
end();
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaSerial::isValidGPIOpin(int pin) {
|
||||
@ -136,7 +138,12 @@ bool TasmotaSerial::isValidGPIOpin(int pin) {
|
||||
}
|
||||
|
||||
void TasmotaSerial::setTransmitEnablePin(int tx_enable_pin) {
|
||||
#ifdef ESP8266
|
||||
if ((tx_enable_pin > -1) && (isValidGPIOpin(tx_enable_pin) || (16 == tx_enable_pin))) {
|
||||
#endif
|
||||
#ifdef ESP32
|
||||
if ((tx_enable_pin > -1) && isValidGPIOpin(tx_enable_pin)) {
|
||||
#endif
|
||||
m_tx_enable_pin = tx_enable_pin;
|
||||
pinMode(m_tx_enable_pin, OUTPUT);
|
||||
digitalWrite(m_tx_enable_pin, LOW);
|
||||
@ -145,9 +152,9 @@ void TasmotaSerial::setTransmitEnablePin(int tx_enable_pin) {
|
||||
|
||||
#ifdef ESP32
|
||||
bool TasmotaSerial::freeUart(void) {
|
||||
for (uint32_t i = SOC_UART_NUM -1; i >= 0; i--) {
|
||||
for (uint32_t i = SOC_UART_HP_NUM -1; i >= 0; i--) {
|
||||
if (0 == bitRead(tasmota_serial_uart_bitmap, i)) {
|
||||
m_uart = i;
|
||||
m_uart = uart_port_t(i);
|
||||
bitSet(tasmota_serial_uart_bitmap, m_uart);
|
||||
return true;
|
||||
}
|
||||
@ -161,15 +168,25 @@ void TasmotaSerial::Esp32Begin(void) {
|
||||
if (m_speed <= 9600) {
|
||||
// At 9600, 10 chars are ~10ms
|
||||
uart_set_rx_full_threshold(m_uart, 10);
|
||||
} else {
|
||||
// At 19200, 120 chars are ~60ms
|
||||
// At 76800, 120 chars are ~15ms
|
||||
uart_set_rx_full_threshold(m_uart, 120);
|
||||
}
|
||||
/*
|
||||
} else if (m_speed < 115200) {
|
||||
// At 19200, 120 chars are ~60ms
|
||||
// At 76800, 120 chars are ~15ms
|
||||
uart_set_rx_full_threshold(m_uart, 120);
|
||||
} else {
|
||||
} else if (m_speed == 115200) {
|
||||
// At 115200, 256 chars are ~20ms
|
||||
// Zigbee requires to keep frames together, i.e. 256 bytes max
|
||||
uart_set_rx_full_threshold(m_uart, 256);
|
||||
} else {
|
||||
// At even higher speeds set 75% of the buffer
|
||||
uart_set_rx_full_threshold(m_uart, serial_buffer_size * 3 / 4);
|
||||
}
|
||||
*/
|
||||
// For bitrate below 115200, set the Rx time out to 6 chars instead of the default 10
|
||||
if (m_speed < 115200) {
|
||||
// At 76800 the timeout is ~1ms
|
||||
@ -469,6 +486,42 @@ size_t TasmotaSerial::write(uint8_t b) {
|
||||
return size;
|
||||
}
|
||||
|
||||
#ifdef ESP32
|
||||
// Add ability to change parity on the fly, for RS-485
|
||||
// See https://github.com/arendst/Tasmota/discussions/22272
|
||||
int32_t TasmotaSerial::setConfig(uint32_t config) {
|
||||
|
||||
uint32_t data_bits_before = (m_config & 0xc) >> 2;
|
||||
uint32_t parity_before = m_config & 0x3;
|
||||
uint32_t stop_bits_before = (m_config & 0x30) >> 4;
|
||||
|
||||
uint32_t data_bits = (config & 0xc) >> 2;
|
||||
uint32_t parity = config & 0x3;
|
||||
uint32_t stop_bits = (config & 0x30) >> 4;
|
||||
|
||||
esp_err_t err;
|
||||
|
||||
if (data_bits_before != data_bits) {
|
||||
if (err = uart_set_word_length(m_uart, (uart_word_length_t) data_bits)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
if (parity_before != parity) {
|
||||
if (err = uart_set_parity(m_uart, (uart_parity_t) parity)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
if (stop_bits_before != stop_bits) {
|
||||
if (err = uart_set_stop_bits(m_uart, (uart_stop_bits_t) stop_bits)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
|
||||
m_config = config;
|
||||
return 0; // no error
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ESP8266
|
||||
void IRAM_ATTR TasmotaSerial::rxRead(void) {
|
||||
if (!m_nwmode) {
|
||||
|
@ -33,6 +33,12 @@
|
||||
|
||||
#ifdef ESP32
|
||||
#include <HardwareSerial.h>
|
||||
|
||||
// IDF 5.2 has changed counting UART channels, SOC_UART_NUM includes now LP UARTS too for ESP32-C6 and -P4
|
||||
#ifndef SOC_UART_HP_NUM
|
||||
#define SOC_UART_HP_NUM SOC_UART_NUM // Set new define SOC_UART_HP_NUM in pre IDF 5.2 to SOC_UART_NUM
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
class TasmotaSerial : public Stream {
|
||||
@ -40,6 +46,7 @@ class TasmotaSerial : public Stream {
|
||||
TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0, int nwmode = 0, int buffer_size = TM_SERIAL_BUFFER_SIZE, bool invert = false);
|
||||
virtual ~TasmotaSerial();
|
||||
void setTransmitEnablePin(int tx_enable_pin);
|
||||
void clearTransmitEnablePin(void) { m_tx_enable_pin = -1; }
|
||||
|
||||
size_t setRxBufferSize(size_t size);
|
||||
size_t getRxBufferSize() { return serial_buffer_size; }
|
||||
@ -65,6 +72,7 @@ class TasmotaSerial : public Stream {
|
||||
#ifdef ESP32
|
||||
uint32_t getUart(void) const { return m_uart; }
|
||||
HardwareSerial *getesp32hws(void) { return TSerial; }
|
||||
int32_t setConfig(uint32_t config);
|
||||
#endif
|
||||
bool isValid(void) { return m_valid; }
|
||||
bool overflow(void);
|
||||
@ -108,7 +116,7 @@ class TasmotaSerial : public Stream {
|
||||
uint32_t m_speed;
|
||||
uint32_t m_config;
|
||||
HardwareSerial *TSerial;
|
||||
int m_uart = 0;
|
||||
uart_port_t m_uart = uart_port_t(0);
|
||||
#endif
|
||||
|
||||
};
|
||||
|
19
lib/default/WiFiHelper/README.adoc
Normal file
19
lib/default/WiFiHelper/README.adoc
Normal file
@ -0,0 +1,19 @@
|
||||
Wifi Helper for Tasmota bridging differences between ESP8266 and ESP32
|
||||
|
||||
This Class is for compatibility with esp8266 code
|
||||
|
||||
== License ==
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
8
lib/default/WiFiHelper/library.json
Normal file
8
lib/default/WiFiHelper/library.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "WiFiHelper",
|
||||
"keywords": "esp32, esp8266",
|
||||
"description": "Bridges differences in Arduino WiFi between ESP32 and ESP8266",
|
||||
"version": "1.0.0",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "*"
|
||||
}
|
97
lib/default/WiFiHelper/src/WiFiHelper.h
Normal file
97
lib/default/WiFiHelper/src/WiFiHelper.h
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
WiFiHelper.h - provide a wrapper for differences between ESP8266 and ESP32 WiFi
|
||||
|
||||
Copyright (C) 2024 Theo Arends / Stephan Hadinger
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef WIFIHELPER_H
|
||||
#define WIFIHELPER_H
|
||||
|
||||
|
||||
// ======================================================
|
||||
// ESP8266 specific section
|
||||
// ======================================================
|
||||
#ifdef ESP8266
|
||||
#include "ESP8266WiFi.h"
|
||||
#endif
|
||||
|
||||
|
||||
// ======================================================
|
||||
// ESP32 specific section
|
||||
// ======================================================
|
||||
#ifdef ESP32
|
||||
#include <WiFi.h>
|
||||
|
||||
#define ENC_TYPE_NONE WIFI_AUTH_OPEN
|
||||
#define ENC_TYPE_WEP WIFI_AUTH_WEP
|
||||
#define ENC_TYPE_CCMP WIFI_AUTH_WPA2_PSK
|
||||
#define ENC_TYPE_TKIP WIFI_AUTH_WPA_WPA2_PSK
|
||||
#define ENC_TYPE_AUTO WIFI_AUTH_MAX + 1
|
||||
|
||||
#define WIFI_NONE_SLEEP 0
|
||||
#define WIFI_LIGHT_SLEEP 1
|
||||
#define WIFI_MODEM_SLEEP 2
|
||||
|
||||
// ESP8266
|
||||
typedef enum WiFiPhyMode
|
||||
{
|
||||
TAS_WIFI_PHY_MODE_LR = 0, TAS_WIFI_PHY_MODE_11B = 1, TAS_WIFI_PHY_MODE_11G = 2, TAS_WIFI_PHY_MODE_11N = 3
|
||||
#if ESP_IDF_VERSION_MAJOR >= 5
|
||||
, TAS_WIFI_PHY_MODE_11AX = 4
|
||||
#endif
|
||||
} WiFiPhyMode_t;
|
||||
|
||||
#endif // ESP32
|
||||
|
||||
// This is an abstract class containing wrappers to call WiFi
|
||||
class WiFiHelper {
|
||||
public:
|
||||
#ifdef ESP32
|
||||
static wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int ttls_phase2_type=-1, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
|
||||
#endif
|
||||
static wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
|
||||
static wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
|
||||
static wl_status_t begin();
|
||||
|
||||
static void hostname(const char* aHostname);
|
||||
static void setSleepMode(int iSleepMode);
|
||||
static int getPhyMode();
|
||||
static bool setPhyMode(WiFiPhyMode_t mode);
|
||||
|
||||
static void setOutputPower(int n);
|
||||
static void forceSleepBegin();
|
||||
static void forceSleepWake();
|
||||
static bool getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &hidden_scan);
|
||||
|
||||
static int hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms);
|
||||
static int hostByName(const char* aHostname, IPAddress& aResult);
|
||||
|
||||
static void scrubDNS(void);
|
||||
|
||||
// With ESP32 Core3, the WiFi mac address is not valid until the wifi is actually started
|
||||
// this helper function always provide a valid mac address
|
||||
static String macAddress(void);
|
||||
|
||||
// Auto-fix zone
|
||||
//
|
||||
// After a reconnect, the zone id may not be valid anymore
|
||||
// In such case we detect any "%st<n>" or "%en<n>" zone identifier
|
||||
// and replace with the current zone id
|
||||
static void IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // WIFIHELPER_H
|
@ -16,48 +16,50 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
//
|
||||
#ifdef ESP32
|
||||
|
||||
#include "Arduino.h"
|
||||
#include <ESP8266WiFi.h>
|
||||
#include "WiFiHelper.h"
|
||||
#include <esp_wifi.h>
|
||||
|
||||
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||
|
||||
//
|
||||
// Wifi
|
||||
//
|
||||
#ifdef WiFi
|
||||
#undef WiFi
|
||||
#endif
|
||||
|
||||
#ifdef USE_IPV6
|
||||
ip_addr_t dns_save4[DNS_MAX_SERVERS] = {}; // IPv4 DNS servers
|
||||
ip_addr_t dns_save6[DNS_MAX_SERVERS] = {}; // IPv6 DNS servers
|
||||
#endif // USE_IPV6
|
||||
|
||||
#include "tasmota_options.h"
|
||||
#include "lwip/dns.h"
|
||||
|
||||
wl_status_t WiFiClass32::begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity, const char* wpa2_username, const char *wpa2_password, const char* ca_pem, const char* client_crt, const char* client_key, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
scrubDNS();
|
||||
wl_status_t ret = WiFiClass::begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, channel, bssid, connect);
|
||||
scrubDNS();
|
||||
#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT
|
||||
wl_status_t WiFiHelper::begin(const char *wpa2_ssid, wpa2_auth_method_t method, const char *wpa2_identity, const char *wpa2_username, const char *wpa2_password, const char *ca_pem, const char *client_crt, const char *client_key, int ttls_phase2_type, int32_t channel, const uint8_t *bssid, bool connect) {
|
||||
WiFiHelper::scrubDNS();
|
||||
wl_status_t ret = WiFi.begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, ttls_phase2_type, channel, bssid, connect);
|
||||
WiFiHelper::scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
#endif // CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT
|
||||
|
||||
wl_status_t WiFiHelper::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
WiFiHelper::scrubDNS();
|
||||
wl_status_t ret = WiFi.begin(ssid, passphrase, channel, bssid, connect);
|
||||
WiFiHelper::scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
|
||||
wl_status_t WiFiClass32::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
scrubDNS();
|
||||
wl_status_t ret = WiFiClass::begin(ssid, passphrase, channel, bssid, connect);
|
||||
scrubDNS();
|
||||
wl_status_t WiFiHelper::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
WiFiHelper::scrubDNS();
|
||||
wl_status_t ret = WiFi.begin(ssid, passphrase, channel, bssid, connect);
|
||||
WiFiHelper::scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
|
||||
wl_status_t WiFiClass32::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
scrubDNS();
|
||||
wl_status_t ret = WiFiClass::begin(ssid, passphrase, channel, bssid, connect);
|
||||
scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
wl_status_t WiFiClass32::begin() {
|
||||
scrubDNS();
|
||||
wl_status_t ret = WiFiClass::begin();
|
||||
scrubDNS();
|
||||
wl_status_t WiFiHelper::begin() {
|
||||
WiFiHelper::scrubDNS();
|
||||
wl_status_t ret = WiFi.begin();
|
||||
WiFiHelper::scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -73,7 +75,7 @@ extern bool EthernetHasIPv4(void);
|
||||
extern bool WifiHasIPv6(void);
|
||||
extern bool EthernetHasIPv6(void);
|
||||
|
||||
void WiFiClass32::scrubDNS(void) {
|
||||
void WiFiHelper::scrubDNS(void) {
|
||||
// String dns_entry0 = IPAddress(dns_getserver(0)).toString();
|
||||
// String dns_entry1 = IPAddress(dns_getserver(1)).toString();
|
||||
// scan DNS entries
|
||||
@ -118,36 +120,52 @@ void WiFiClass32::scrubDNS(void) {
|
||||
// AddLog(LOG_LEVEL_DEBUG, "IP>: DNS: from(%s %s) to (%s %s) has4/6:%i-%i", dns_entry0.c_str(), dns_entry1.c_str(), IPAddress(dns_getserver(0)).toString().c_str(), IPAddress(dns_getserver(1)).toString().c_str(), has_v4, has_v6);
|
||||
}
|
||||
|
||||
void WiFiClass32::setSleepMode(int iSleepMode) {
|
||||
|
||||
void WiFiHelper::hostname(const char* aHostname) {
|
||||
WiFi.setHostname(aHostname);
|
||||
}
|
||||
|
||||
void WiFiHelper::setSleepMode(int iSleepMode) {
|
||||
// WIFI_LIGHT_SLEEP and WIFI_MODEM_SLEEP
|
||||
WiFi.setSleep(iSleepMode != WIFI_NONE_SLEEP);
|
||||
}
|
||||
|
||||
int WiFiClass32::getPhyMode() {
|
||||
int phy_mode = 0; // " BGNL"
|
||||
uint8_t protocol_bitmap;
|
||||
if (esp_wifi_get_protocol(WIFI_IF_STA, &protocol_bitmap) == ESP_OK) {
|
||||
if (protocol_bitmap & 1) { phy_mode = TAS_WIFI_PHY_MODE_11B; } // 1 = 11b (WIFI_PHY_MODE_11B)
|
||||
if (protocol_bitmap & 2) { phy_mode = TAS_WIFI_PHY_MODE_11G; } // 2 = 11bg (WIFI_PHY_MODE_11G)
|
||||
if (protocol_bitmap & 4) { phy_mode = TAS_WIFI_PHY_MODE_11N; } // 3 = 11bgn (WIFI_PHY_MODE_11N)
|
||||
if (protocol_bitmap & 8) { phy_mode = 4; } // Low rate (WIFI_PHY_MODE_LR)
|
||||
int WiFiHelper::getPhyMode() {
|
||||
/*
|
||||
typedef enum
|
||||
{
|
||||
WIFI_PHY_MODE_LR, // PHY mode for Low Rate
|
||||
WIFI_PHY_MODE_11B, // PHY mode for 11b
|
||||
WIFI_PHY_MODE_11G, // PHY mode for 11g
|
||||
WIFI_PHY_MODE_HT20, // PHY mode for Bandwidth HT20 (11n)
|
||||
WIFI_PHY_MODE_HT40, // PHY mode for Bandwidth HT40 (11n)
|
||||
WIFI_PHY_MODE_HE20, // PHY mode for Bandwidth HE20 (11ax)
|
||||
} wifi_phy_mode_t;
|
||||
*/
|
||||
int phy_mode = 0; // "low rate|11b|11g|HT20|HT40|HE20"
|
||||
wifi_phy_mode_t WiFiMode;
|
||||
if (esp_wifi_sta_get_negotiated_phymode(&WiFiMode) == ESP_OK) {
|
||||
phy_mode = (int)WiFiMode;
|
||||
if (phy_mode > 5) {
|
||||
phy_mode = 5;
|
||||
}
|
||||
}
|
||||
return phy_mode;
|
||||
}
|
||||
|
||||
bool WiFiClass32::setPhyMode(WiFiPhyMode_t mode) {
|
||||
uint8_t protocol_bitmap = WIFI_PROTOCOL_11B; // 1
|
||||
bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) {
|
||||
uint8_t protocol_bitmap = WIFI_PROTOCOL_11B; // 1
|
||||
switch (mode) {
|
||||
case 3: protocol_bitmap |= WIFI_PROTOCOL_11N; // 4
|
||||
case 2: protocol_bitmap |= WIFI_PROTOCOL_11G; // 2
|
||||
#if ESP_IDF_VERSION_MAJOR >= 5
|
||||
case 4: protocol_bitmap |= WIFI_PROTOCOL_11AX; // 16
|
||||
#endif
|
||||
case 3: protocol_bitmap |= WIFI_PROTOCOL_11N; // 4
|
||||
case 2: protocol_bitmap |= WIFI_PROTOCOL_11G; // 2
|
||||
}
|
||||
return (ESP_OK == esp_wifi_set_protocol(WIFI_IF_STA, protocol_bitmap));
|
||||
}
|
||||
|
||||
void WiFiClass32::wps_disable() {
|
||||
}
|
||||
|
||||
void WiFiClass32::setOutputPower(int n) {
|
||||
void WiFiHelper::setOutputPower(int n) {
|
||||
wifi_power_t p = WIFI_POWER_2dBm;
|
||||
if (n > 19)
|
||||
p = WIFI_POWER_19_5dBm;
|
||||
@ -170,13 +188,13 @@ void WiFiClass32::setOutputPower(int n) {
|
||||
WiFi.setTxPower(p);
|
||||
}
|
||||
|
||||
void WiFiClass32::forceSleepBegin() {
|
||||
void WiFiHelper::forceSleepBegin() {
|
||||
}
|
||||
|
||||
void WiFiClass32::forceSleepWake() {
|
||||
void WiFiHelper::forceSleepWake() {
|
||||
}
|
||||
|
||||
bool WiFiClass32::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t *&bssid, int32_t &channel, bool &hidden_scan) {
|
||||
bool WiFiHelper::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t *&bssid, int32_t &channel, bool &hidden_scan) {
|
||||
hidden_scan = false;
|
||||
return WiFi.getNetworkInfo(i, ssid, encType, rssi, bssid, channel);
|
||||
}
|
||||
@ -199,6 +217,16 @@ static volatile uint32_t ip_addr_counter = 0; // counter for requests
|
||||
extern int32_t WifiDNSGetTimeout(void);
|
||||
extern bool WifiDNSGetIPv6Priority(void);
|
||||
|
||||
static volatile bool dns_found = false;
|
||||
|
||||
bool DNS_TimeReached(uint32_t timer)
|
||||
{
|
||||
// Check if a certain timeout has been reached.
|
||||
int32_t passed = ((int32_t) (millis() - timer));
|
||||
return (passed >= 0);
|
||||
}
|
||||
|
||||
|
||||
static void wifi32_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
|
||||
{
|
||||
// Serial.printf("DNS: cb name=%s ipaddr=%s arg=%i counter=%i\n", name ? name : "<null>", IPAddress(ipaddr).toString().c_str(), (int) callback_arg, ip_addr_counter);
|
||||
@ -210,12 +238,46 @@ static void wifi32_dns_found_callback(const char *name, const ip_addr_t *ipaddr,
|
||||
} else {
|
||||
dns_ipaddr = *IP4_ADDR_ANY; // set to IPv4 0.0.0.0
|
||||
}
|
||||
WiFiClass32::dnsDone();
|
||||
dns_found = true;
|
||||
// AddLog(LOG_LEVEL_DEBUG, "WIF: dns_found=%s", ipaddr ? IPAddress(*ipaddr).toString().c_str() : "<null>");
|
||||
}
|
||||
// We need this helper method to access protected methods from WiFiGeneric
|
||||
void WiFiClass32::dnsDone(void) {
|
||||
setStatusBits(NET_DNS_DONE_BIT);
|
||||
|
||||
// Auto-fix zone
|
||||
//
|
||||
// After a reconnect, the zone id may not be valid anymore
|
||||
// In such case we detect any "%st<n>" or "%en<n>" zone identifier
|
||||
// and replace with the current zone id
|
||||
extern bool WifiGetIPv6LinkLocal(IPAddress *ip);
|
||||
extern bool EthernetGetIPv6LinkLocal(IPAddress *ip);
|
||||
void WiFiHelper::IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname) {
|
||||
#ifdef USE_IPV6
|
||||
if ((addr.type() == IPv6) && (addr.zone() == 0)) {
|
||||
// check if hostname contains '%'
|
||||
const char *zone_identifier = strchr(aHostname, '%');
|
||||
if (zone_identifier != nullptr) {
|
||||
uint8_t zone_id = 0;
|
||||
// check if zone id is valid
|
||||
if (strncmp(zone_identifier, "%st", 3) == 0) {
|
||||
IPAddress wifi_link_local;
|
||||
if (WifiGetIPv6LinkLocal(&wifi_link_local)) {
|
||||
zone_id = wifi_link_local.zone();
|
||||
}
|
||||
} else if (strncmp(zone_identifier, "%en", 3) == 0) {
|
||||
IPAddress eth_link_local;
|
||||
if (EthernetGetIPv6LinkLocal(ð_link_local)) {
|
||||
zone_id = eth_link_local.zone();
|
||||
}
|
||||
}
|
||||
if (zone_id) {
|
||||
// convert to ip_addr_t which is currently the only way to change the zone_id
|
||||
ip_addr_t ip_addr;
|
||||
addr.to_ip_addr_t(&ip_addr);
|
||||
ip_addr.u_addr.ip6.zone = zone_id;
|
||||
addr = IPAddress(&ip_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@ -225,19 +287,22 @@ void WiFiClass32::dnsDone(void) {
|
||||
* @return 1 if aIPAddrString was successfully converted to an IP address,
|
||||
* else error code
|
||||
*/
|
||||
int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms)
|
||||
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms)
|
||||
{
|
||||
// return WiFi.hostByName(aHostname, aResult);
|
||||
// #if 0
|
||||
ip_addr_t addr;
|
||||
aResult = (uint32_t) 0; // by default set to IPv4 0.0.0.0
|
||||
dns_ipaddr = *IP4_ADDR_ANY; // by default set to IPv4 0.0.0.0
|
||||
|
||||
scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
|
||||
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
|
||||
ip_addr_counter++; // increase counter, from now ignore previous responses
|
||||
clearStatusBits(NET_DNS_IDLE_BIT | NET_DNS_DONE_BIT);
|
||||
// clearStatusBits(NET_DNS_IDLE_BIT | NET_DNS_DONE_BIT);
|
||||
uint8_t v4v6priority = LWIP_DNS_ADDRTYPE_IPV4;
|
||||
#ifdef USE_IPV6
|
||||
v4v6priority = WifiDNSGetIPv6Priority() ? LWIP_DNS_ADDRTYPE_IPV6_IPV4 : LWIP_DNS_ADDRTYPE_IPV4_IPV6;
|
||||
#endif // USE_IPV6
|
||||
dns_found = false;
|
||||
err_t err = dns_gethostbyname_addrtype(aHostname, &dns_ipaddr, &wifi32_dns_found_callback, (void*) ip_addr_counter, v4v6priority);
|
||||
// Serial.printf("DNS: dns_gethostbyname_addrtype errg=%i counter=%i\n", err, ip_addr_counter);
|
||||
if(err == ERR_OK && !ip_addr_isany_val(dns_ipaddr)) {
|
||||
@ -247,32 +312,45 @@ int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult, int32_t t
|
||||
aResult = ip_addr_get_ip4_u32(&dns_ipaddr);
|
||||
#endif // USE_IPV6
|
||||
} else if(err == ERR_INPROGRESS) {
|
||||
waitStatusBits(NET_DNS_DONE_BIT, timer_ms); //real internal timeout in lwip library is 14[s]
|
||||
clearStatusBits(NET_DNS_DONE_BIT);
|
||||
uint32_t deadline = millis() + timer_ms;
|
||||
while ((!DNS_TimeReached(deadline)) && !dns_found) {
|
||||
delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ip_addr_isany_val(dns_ipaddr)) {
|
||||
#ifdef USE_IPV6
|
||||
aResult.from_ip_addr_t(&dns_ipaddr);
|
||||
WiFiHelper::IPv6ZoneAutoFix(aResult, aHostname);
|
||||
#else // USE_IPV6
|
||||
aResult = ip_addr_get_ip4_u32(&dns_ipaddr);
|
||||
#endif // USE_IPV6
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
// #endif
|
||||
}
|
||||
|
||||
int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult)
|
||||
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult)
|
||||
{
|
||||
return hostByName(aHostname, aResult, WifiDNSGetTimeout());
|
||||
return WiFiHelper::hostByName(aHostname, aResult, WifiDNSGetTimeout());
|
||||
}
|
||||
|
||||
void wifi_station_disconnect() {
|
||||
// erase ap: empty ssid, ...
|
||||
WiFi.disconnect(true, true);
|
||||
#if (ESP_IDF_VERSION_MAJOR >= 5)
|
||||
#include "esp_mac.h"
|
||||
#endif
|
||||
|
||||
String WiFiHelper::macAddress(void) {
|
||||
#if (ESP_IDF_VERSION_MAJOR < 5)
|
||||
return WiFi.macAddress();
|
||||
#else
|
||||
uint8_t mac[6] = {0,0,0,0,0,0};
|
||||
char macStr[18] = { 0 };
|
||||
|
||||
esp_read_mac(mac, ESP_MAC_WIFI_STA);
|
||||
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
return String(macStr);
|
||||
#endif
|
||||
}
|
||||
|
||||
void wifi_station_dhcpc_start() {
|
||||
}
|
||||
|
||||
WiFiClass32 WiFi32;
|
||||
#endif // ESP32
|
82
lib/default/WiFiHelper/src/WiFiHelper_ESP8266.cpp
Normal file
82
lib/default/WiFiHelper/src/WiFiHelper_ESP8266.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
WiFi compat with ESP32
|
||||
|
||||
Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
//
|
||||
#ifdef ESP8266
|
||||
#include "Arduino.h"
|
||||
#include "WiFiHelper.h"
|
||||
|
||||
wl_status_t WiFiHelper::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
return WiFi.begin(ssid, passphrase, channel, bssid, connect);
|
||||
}
|
||||
|
||||
wl_status_t WiFiHelper::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
return WiFi.begin(ssid, passphrase, channel, bssid, connect);
|
||||
}
|
||||
|
||||
wl_status_t WiFiHelper::begin() {
|
||||
return WiFi.begin();
|
||||
}
|
||||
|
||||
void WiFiHelper::scrubDNS(void) {
|
||||
}
|
||||
|
||||
|
||||
void WiFiHelper::hostname(const char* aHostname) {
|
||||
WiFi.hostname(aHostname);
|
||||
}
|
||||
|
||||
void WiFiHelper::setSleepMode(int iSleepMode) {
|
||||
WiFi.setSleepMode((WiFiSleepType_t)iSleepMode);
|
||||
}
|
||||
|
||||
int WiFiHelper::getPhyMode() {
|
||||
return WiFi.getPhyMode();
|
||||
}
|
||||
|
||||
bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) {
|
||||
return WiFi.setPhyMode(mode);
|
||||
}
|
||||
|
||||
void WiFiHelper::setOutputPower(int n) {
|
||||
WiFi.setOutputPower(n);
|
||||
}
|
||||
void WiFiHelper::forceSleepBegin() {
|
||||
WiFi.forceSleepBegin();
|
||||
}
|
||||
void WiFiHelper::forceSleepWake() {
|
||||
WiFi.forceSleepWake();
|
||||
}
|
||||
bool WiFiHelper::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &hidden_scan) {
|
||||
return WiFi.getNetworkInfo(i, ssid, encType, rssi, bssid, channel, hidden_scan);
|
||||
}
|
||||
|
||||
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms) {
|
||||
return WiFi.hostByName(aHostname, aResult, timer_ms);
|
||||
}
|
||||
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult) {
|
||||
return WiFi.hostByName(aHostname, aResult);
|
||||
}
|
||||
|
||||
String WiFiHelper::macAddress(void) {
|
||||
return WiFi.macAddress();
|
||||
}
|
||||
|
||||
void WiFiHelper::IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname) {
|
||||
}
|
||||
#endif // ESP8266
|
128
lib/default/base64-1.1.1/src/base64.cpp
Normal file
128
lib/default/base64-1.1.1/src/base64.cpp
Normal file
@ -0,0 +1,128 @@
|
||||
/**
|
||||
* Base64 encoding and decoding of strings. Uses '+' for 62, '/' for 63, '=' for padding
|
||||
*/
|
||||
|
||||
#include "base64.hpp"
|
||||
|
||||
unsigned char binary_to_base64(unsigned char v) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if(v < 26) return v + 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if(v < 52) return v + 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if(v < 62) return v - 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(v == 62) return '+';
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(v == 63) return '/';
|
||||
|
||||
return 64;
|
||||
}
|
||||
|
||||
unsigned char base64_to_binary(unsigned char c) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if('A' <= c && c <= 'Z') return c - 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if('a' <= c && c <= 'z') return c - 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if('0' <= c && c <= '9') return c + 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(c == '+') return 62;
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(c == '/') return 63;
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
unsigned int encode_base64_length(unsigned int input_length) {
|
||||
return (input_length + 2)/3*4;
|
||||
}
|
||||
|
||||
unsigned int decode_base64_length(unsigned char input[]) {
|
||||
unsigned char *start = input;
|
||||
|
||||
while(base64_to_binary(input[0]) < 64) {
|
||||
++input;
|
||||
}
|
||||
|
||||
unsigned int input_length = input - start;
|
||||
|
||||
unsigned int output_length = input_length/4*3;
|
||||
|
||||
switch(input_length % 4) {
|
||||
default: return output_length;
|
||||
case 2: return output_length + 1;
|
||||
case 3: return output_length + 2;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) {
|
||||
unsigned int full_sets = input_length/3;
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 0; i < full_sets; ++i) {
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6);
|
||||
output[3] = binary_to_base64( input[2] & 0x3F);
|
||||
|
||||
input += 3;
|
||||
output += 4;
|
||||
}
|
||||
|
||||
switch(input_length % 3) {
|
||||
case 0:
|
||||
output[0] = '\0';
|
||||
break;
|
||||
case 1:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4);
|
||||
output[2] = '=';
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
case 2:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2);
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
return encode_base64_length(input_length);
|
||||
}
|
||||
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]) {
|
||||
unsigned int output_length = decode_base64_length(input);
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 2; i < output_length; i += 3) {
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
output[2] = base64_to_binary(input[2]) << 6 | base64_to_binary(input[3]);
|
||||
|
||||
input += 4;
|
||||
output += 3;
|
||||
}
|
||||
|
||||
switch(output_length % 3) {
|
||||
case 1:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
break;
|
||||
case 2:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return output_length;
|
||||
}
|
@ -69,127 +69,4 @@ unsigned int encode_base64(unsigned char input[], unsigned int input_length, uns
|
||||
*/
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]);
|
||||
|
||||
unsigned char binary_to_base64(unsigned char v) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if(v < 26) return v + 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if(v < 52) return v + 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if(v < 62) return v - 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(v == 62) return '+';
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(v == 63) return '/';
|
||||
|
||||
return 64;
|
||||
}
|
||||
|
||||
unsigned char base64_to_binary(unsigned char c) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if('A' <= c && c <= 'Z') return c - 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if('a' <= c && c <= 'z') return c - 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if('0' <= c && c <= '9') return c + 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(c == '+') return 62;
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(c == '/') return 63;
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
unsigned int encode_base64_length(unsigned int input_length) {
|
||||
return (input_length + 2)/3*4;
|
||||
}
|
||||
|
||||
unsigned int decode_base64_length(unsigned char input[]) {
|
||||
unsigned char *start = input;
|
||||
|
||||
while(base64_to_binary(input[0]) < 64) {
|
||||
++input;
|
||||
}
|
||||
|
||||
unsigned int input_length = input - start;
|
||||
|
||||
unsigned int output_length = input_length/4*3;
|
||||
|
||||
switch(input_length % 4) {
|
||||
default: return output_length;
|
||||
case 2: return output_length + 1;
|
||||
case 3: return output_length + 2;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) {
|
||||
unsigned int full_sets = input_length/3;
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 0; i < full_sets; ++i) {
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6);
|
||||
output[3] = binary_to_base64( input[2] & 0x3F);
|
||||
|
||||
input += 3;
|
||||
output += 4;
|
||||
}
|
||||
|
||||
switch(input_length % 3) {
|
||||
case 0:
|
||||
output[0] = '\0';
|
||||
break;
|
||||
case 1:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4);
|
||||
output[2] = '=';
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
case 2:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2);
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
return encode_base64_length(input_length);
|
||||
}
|
||||
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]) {
|
||||
unsigned int output_length = decode_base64_length(input);
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 2; i < output_length; i += 3) {
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
output[2] = base64_to_binary(input[2]) << 6 | base64_to_binary(input[3]);
|
||||
|
||||
input += 4;
|
||||
output += 3;
|
||||
}
|
||||
|
||||
switch(output_length % 3) {
|
||||
case 1:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
break;
|
||||
case 2:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return output_length;
|
||||
}
|
||||
|
||||
#endif // ifndef
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
#if defined(CAMERA_MODEL_WROVER_KIT)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
@ -14,6 +13,7 @@
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 5
|
||||
#define Y2_GPIO_NUM 4
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
@ -33,12 +33,12 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32S3_EYE)
|
||||
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 15
|
||||
@ -73,6 +73,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -92,6 +93,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -111,6 +113,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -130,6 +133,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 17
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -149,6 +153,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -168,6 +173,7 @@
|
||||
#define Y4_GPIO_NUM 19
|
||||
#define Y3_GPIO_NUM 18
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
@ -187,6 +193,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -206,6 +213,7 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -225,6 +233,7 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -244,6 +253,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -263,6 +273,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -282,6 +293,7 @@
|
||||
#define Y4_GPIO_NUM 26
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -302,12 +314,12 @@
|
||||
#define Y4_GPIO_NUM 8
|
||||
#define Y3_GPIO_NUM 9
|
||||
#define Y2_GPIO_NUM 11
|
||||
|
||||
#define VSYNC_GPIO_NUM 6
|
||||
#define HREF_GPIO_NUM 7
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#elif defined(CAMERA_MODEL_TTGO_T_CAM_SIM)
|
||||
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 18
|
||||
#define XCLK_GPIO_NUM 14
|
||||
@ -322,6 +334,7 @@
|
||||
#define Y4_GPIO_NUM 8
|
||||
#define Y3_GPIO_NUM 9
|
||||
#define Y2_GPIO_NUM 11
|
||||
|
||||
#define VSYNC_GPIO_NUM 6
|
||||
#define HREF_GPIO_NUM 7
|
||||
#define PCLK_GPIO_NUM 13
|
||||
@ -332,6 +345,27 @@
|
||||
#define PCIE_TX_PIN 45
|
||||
#define PCIE_RX_PIN 46
|
||||
#define PCIE_LED_PIN 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_XIAO_ESP32S3_SENSE)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 10
|
||||
#define SIOD_GPIO_NUM 40
|
||||
#define SIOC_GPIO_NUM 39
|
||||
|
||||
#define Y9_GPIO_NUM 48
|
||||
#define Y8_GPIO_NUM 11
|
||||
#define Y7_GPIO_NUM 12
|
||||
#define Y6_GPIO_NUM 14
|
||||
#define Y5_GPIO_NUM 16
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 17
|
||||
#define Y2_GPIO_NUM 15
|
||||
|
||||
#define VSYNC_GPIO_NUM 38
|
||||
#define HREF_GPIO_NUM 47
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#else
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
@ -347,6 +381,7 @@
|
||||
#define Y4_GPIO_NUM -1
|
||||
#define Y3_GPIO_NUM -1
|
||||
#define Y2_GPIO_NUM -1
|
||||
|
||||
#define VSYNC_GPIO_NUM -1
|
||||
#define HREF_GPIO_NUM -1
|
||||
#define PCLK_GPIO_NUM -1
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <Arduino.h>
|
||||
#ifdef ESP32
|
||||
#include <HTTPClient.h>
|
||||
#include <WiFi.h>
|
||||
#else
|
||||
#include <ESP8266HTTPClient.h>
|
||||
#endif
|
||||
|
@ -45,17 +45,15 @@ bool AudioFileSourceICYStream::open(const char *url)
|
||||
{
|
||||
static const char *hdr[] = { "icy-metaint", "icy-name", "icy-genre", "icy-br" };
|
||||
pos = 0;
|
||||
http.begin(client, url);
|
||||
if (!http.begin(client, url)) {
|
||||
cb.st(STATUS_HTTPFAIL, PSTR("Can't connect to url"));
|
||||
return false;
|
||||
}
|
||||
http.addHeader("Icy-MetaData", "1");
|
||||
http.collectHeaders( hdr, 4 );
|
||||
http.setReuse(true);
|
||||
http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);
|
||||
int code = http.GET();
|
||||
if (code != HTTP_CODE_OK) {
|
||||
http.end();
|
||||
cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request"));
|
||||
return false;
|
||||
}
|
||||
if (http.hasHeader(hdr[0])) {
|
||||
String ret = http.header(hdr[0]);
|
||||
icyMetaInt = ret.toInt();
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <Arduino.h>
|
||||
#ifdef ESP32
|
||||
#include <HTTPClient.h>
|
||||
#include <WiFi.h>
|
||||
#else
|
||||
#include <ESP8266HTTPClient.h>
|
||||
#endif
|
||||
|
@ -18,7 +18,7 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
#pragma GCC optimize ("Os")
|
||||
|
||||
#include "AudioGeneratorAAC.h"
|
||||
|
||||
|
@ -58,6 +58,10 @@
|
||||
|
||||
#include "AudioGeneratorMIDI.h"
|
||||
|
||||
#if defined(ESP32)
|
||||
// Do not build, Espressif's GCC8+ has a compiler bug
|
||||
#else // __GNUC__ == 8
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
|
||||
#define TSF_NO_STDIO
|
||||
@ -637,3 +641,4 @@ void AudioGeneratorMIDI::MakeStreamFromAFS(AudioFileSource *src, tsf_stream *afs
|
||||
afs->size = &afs_size;
|
||||
}
|
||||
|
||||
#endif //__GNUC__ == 8
|
||||
|
@ -21,6 +21,10 @@
|
||||
#ifndef _AUDIOGENERATORMIDI_H
|
||||
#define _AUDIOGENERATORMIDI_H
|
||||
|
||||
#if defined(ESP32)
|
||||
// Do not build, Espressif's GCC8+ has a compiler bug
|
||||
#else // __GNUC__ == 8
|
||||
|
||||
#include "AudioGenerator.h"
|
||||
|
||||
#define TSF_NO_STDIO
|
||||
@ -90,7 +94,7 @@ class AudioGeneratorMIDI : public AudioGenerator
|
||||
unsigned long earliest_time = 0;
|
||||
|
||||
struct tonegen_status { /* current status of a tone generator */
|
||||
bool playing; /* is it playing? */
|
||||
bool playing; /* is it playing? */
|
||||
char track; /* if so, which track is the note from? */
|
||||
char note; /* what note is playing? */
|
||||
char instrument; /* what instrument? */
|
||||
@ -176,6 +180,7 @@ class AudioGeneratorMIDI : public AudioGenerator
|
||||
short samplesRendered[256];
|
||||
};
|
||||
|
||||
#endif //__GNUC__ == 8
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -186,7 +186,9 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2])
|
||||
// If we're here, we have one decoded frame and sent 0 or more samples out
|
||||
if (samplePtr < synth->pcm.length) {
|
||||
sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr];
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
if(lastChannels == 2) {
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
}
|
||||
samplePtr++;
|
||||
} else {
|
||||
samplePtr = 0;
|
||||
@ -200,7 +202,9 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2])
|
||||
}
|
||||
// for IGNORE and CONTINUE, just play what we have now
|
||||
sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr];
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
if(lastChannels == 2) {
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
}
|
||||
samplePtr++;
|
||||
}
|
||||
return true;
|
||||
|
@ -190,7 +190,7 @@ bool AudioOutputMixer::loop()
|
||||
}
|
||||
}
|
||||
if (avail) {
|
||||
int16_t s[2];
|
||||
int16_t s[2] = {0};
|
||||
if (leftAccum[readPtr] > 32767) {
|
||||
s[LEFTCHANNEL] = 32767;
|
||||
} else if (leftAccum[readPtr] < -32767) {
|
||||
|
@ -54,7 +54,7 @@
|
||||
#define AAC_ENABLE_SBR 1
|
||||
#endif
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
#pragma GCC optimize ("Os")
|
||||
|
||||
#include "aacdec.h"
|
||||
#include "statname.h"
|
||||
|
@ -482,7 +482,7 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
|
||||
int pitch_index;
|
||||
VARDECL( opus_val16, lp_pitch_buf );
|
||||
SAVE_STACK;
|
||||
opus_val16 *lp_pitch_buf = (opus_val16*)malloc((DECODE_BUFFER_SIZE>>1) * sizeof(opus_val16)); //ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
|
||||
ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
|
||||
pitch_downsample(decode_mem, lp_pitch_buf,
|
||||
DECODE_BUFFER_SIZE, C, arch);
|
||||
pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
|
||||
@ -490,7 +490,6 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
|
||||
PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch);
|
||||
pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
|
||||
RESTORE_STACK;
|
||||
free(lp_pitch_buf);
|
||||
return pitch_index;
|
||||
}
|
||||
|
||||
|
@ -207,4 +207,3 @@
|
||||
# define __restrict__
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -171,7 +171,7 @@ extern "C" {
|
||||
#define OPUS_GET_IN_DTX_REQUEST 4049
|
||||
|
||||
/** Defines for the presence of extended APIs. */
|
||||
#define OPUS_HAVE_OPUS_PROJECTION_H
|
||||
// #define OPUS_HAVE_OPUS_PROJECTION_H
|
||||
|
||||
/* Macros to trigger compilation errors when the wrong types are provided to a CTL */
|
||||
#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))
|
||||
|
@ -239,30 +239,21 @@ opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus
|
||||
|
||||
int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len)
|
||||
{
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
opus_int32 ret;
|
||||
if (len < 1) {
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
if (len==new_len) {
|
||||
free(rp);
|
||||
if (len==new_len)
|
||||
return OPUS_OK;
|
||||
}
|
||||
else if (len > new_len) {
|
||||
free(rp);
|
||||
else if (len > new_len)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
/* Moving payload to the end of the packet so we can do in-place padding */
|
||||
OPUS_MOVE(data+new_len-len, data, len);
|
||||
ret = opus_repacketizer_cat(rp, data+new_len-len, len);
|
||||
if (ret != OPUS_OK) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_cat(&rp, data+new_len-len, len);
|
||||
if (ret != OPUS_OK)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, new_len, 0, 1);
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1);
|
||||
if (ret > 0)
|
||||
return OPUS_OK;
|
||||
else
|
||||
@ -271,20 +262,15 @@ int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len)
|
||||
|
||||
opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len)
|
||||
{
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
opus_int32 ret;
|
||||
if (len < 1) {
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
ret = opus_repacketizer_cat(rp, data, len);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
ret = opus_repacketizer_cat(&rp, data, len);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, len, 0, 0);
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0);
|
||||
celt_assert(ret > 0 && ret <= len);
|
||||
return ret;
|
||||
}
|
||||
@ -326,14 +312,12 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in
|
||||
unsigned char toc;
|
||||
opus_int16 size[48];
|
||||
opus_int32 packet_offset;
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
unsigned char *dst;
|
||||
opus_int32 dst_len;
|
||||
|
||||
if (len < 1){
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
dst = data;
|
||||
dst_len = 0;
|
||||
/* Unpad all frames */
|
||||
@ -341,34 +325,25 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in
|
||||
{
|
||||
opus_int32 ret;
|
||||
int self_delimited = s!=nb_streams-1;
|
||||
if (len<=0) {
|
||||
free(rp);
|
||||
if (len<=0)
|
||||
return OPUS_INVALID_PACKET;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
ret = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL,
|
||||
size, NULL, &packet_offset);
|
||||
if (ret<0) {
|
||||
free(rp);
|
||||
if (ret<0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_cat_impl(rp, data, packet_offset, self_delimited);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_cat_impl(&rp, data, packet_offset, self_delimited);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, dst, len, self_delimited, 0);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, dst, len, self_delimited, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
dst_len += ret;
|
||||
dst += ret;
|
||||
data += packet_offset;
|
||||
len -= packet_offset;
|
||||
}
|
||||
free(rp);
|
||||
return dst_len;
|
||||
}
|
||||
|
||||
|
@ -80,11 +80,10 @@ void silk_NLSF2A(
|
||||
};
|
||||
const unsigned char *ordering;
|
||||
opus_int k, i, dd;
|
||||
opus_int32 *cos_LSF_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC );
|
||||
opus_int32 *P = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1));
|
||||
opus_int32 *Q= (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1));
|
||||
opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ];
|
||||
opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta;
|
||||
opus_int32 *a32_QA1 = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC );
|
||||
opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ];
|
||||
|
||||
silk_assert( LSF_COS_TAB_SZ_FIX == 128 );
|
||||
celt_assert( d==10 || d==16 );
|
||||
@ -138,9 +137,5 @@ void silk_NLSF2A(
|
||||
a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */
|
||||
}
|
||||
}
|
||||
free(cos_LSF_QA);
|
||||
free(P);
|
||||
free(Q);
|
||||
free(a32_QA1);
|
||||
}
|
||||
|
||||
|
@ -57,12 +57,12 @@ void silk_burg_modified_c(
|
||||
opus_int k, n, s, lz, rshifts, reached_max_gain;
|
||||
opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2;
|
||||
const opus_int16 *x_ptr;
|
||||
opus_int32 *C_first_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *C_last_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *Af_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *CAf = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1));
|
||||
opus_int32 *CAb = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1));
|
||||
opus_int32 *xcorr = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ];
|
||||
opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ];
|
||||
opus_int32 xcorr[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int64 C0_64;
|
||||
|
||||
celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
|
||||
@ -277,10 +277,4 @@ void silk_burg_modified_c(
|
||||
*res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */
|
||||
*res_nrg_Q = -rshifts;
|
||||
}
|
||||
free(C_first_row);
|
||||
free(C_last_row);
|
||||
free(Af_QA);
|
||||
free(CAf);
|
||||
free(CAb);
|
||||
free(xcorr);
|
||||
}
|
||||
|
@ -49,8 +49,8 @@ void silk_warped_autocorrelation_FIX_c(
|
||||
{
|
||||
opus_int n, i, lsh;
|
||||
opus_int32 tmp1_QS, tmp2_QS;
|
||||
opus_int32 *state_QS = (opus_int32*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int32));
|
||||
opus_int64 *corr_QC = (opus_int64*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int64));
|
||||
opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
|
||||
opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
|
||||
|
||||
/* Order must be even */
|
||||
celt_assert( ( order & 1 ) == 0 );
|
||||
@ -88,7 +88,5 @@ void silk_warped_autocorrelation_FIX_c(
|
||||
}
|
||||
}
|
||||
silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/
|
||||
free(state_QS);
|
||||
free(corr_QC);
|
||||
}
|
||||
#endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */
|
||||
|
@ -48,8 +48,7 @@ void silk_resampler_down2_3(
|
||||
opus_int32 *buf_ptr;
|
||||
SAVE_STACK;
|
||||
|
||||
// ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 );
|
||||
opus_int32 *buf = (opus_int32*)malloc((RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR) * sizeof(opus_int32));
|
||||
ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 );
|
||||
|
||||
/* Copy buffered samples to start of buffer */
|
||||
silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) );
|
||||
@ -100,6 +99,5 @@ void silk_resampler_down2_3(
|
||||
|
||||
/* Copy last part of filtered signal to the state for the next call */
|
||||
silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) );
|
||||
free(buf);
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
@ -42,6 +42,16 @@
|
||||
|
||||
*/
|
||||
|
||||
// ESP32 as of 3.x has a compiler bug in this section, with the G++ generated assembly
|
||||
// being illegal. There's nothing wrong with the code here, it just looks like an
|
||||
// Xtensa backend issue. Until that's fixed, no MIDI for you!
|
||||
///home/earle/Arduino/libraries/ESP8266Audio/src/libtinysoundfont/tsf.h: In function 'void tsf_channel_midi_control(tsf*, int, int, int)':
|
||||
// /home/earle/Arduino/libraries/ESP8266Audio/src/libtinysoundfont/tsf.h:2101:1: error: insn does not satisfy its constraints:
|
||||
// 2101 | }
|
||||
// | ^
|
||||
|
||||
#if !defined(ESP32)
|
||||
|
||||
#ifndef TSF_INCLUDE_TSF_INL
|
||||
#define TSF_INCLUDE_TSF_INL
|
||||
|
||||
@ -2149,3 +2159,5 @@ TSFDEF float tsf_channel_get_tuning(tsf* f, int channel)
|
||||
#endif
|
||||
|
||||
#endif //TSF_IMPLEMENTATION
|
||||
|
||||
#endif // ! ESP32
|
||||
|
35
lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format
Normal file
35
lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
Language: Cpp
|
||||
BasedOnStyle: Google
|
||||
AlignTrailingComments: false
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
|
||||
# A separate 'Other libraries' grouping is added before libwebm's headers for
|
||||
# gtest and gmock includes. This is based on the suggested grouping in the
|
||||
# Google C++ Style Guide:
|
||||
# https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes
|
||||
# The other categories come from `clang-format-14 --dump-config --style=Google`.
|
||||
# See the clang-format documentation for more information on this option:
|
||||
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html#includecategories
|
||||
IncludeCategories:
|
||||
- Regex: '^<ext/.*\.h>'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^<.*\.h>'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^<.*'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^((<|")(gtest|gmock)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '.*'
|
||||
Priority: 4
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
6
lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes
vendored
Normal file
6
lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
*.sln eol=crlf
|
||||
*.vcproj eol=crlf
|
||||
*.vsprops eol=crlf
|
||||
*.vcxproj eol=crlf
|
||||
*.mkv -text -diff
|
||||
*.webm -text -diff
|
36
lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore
vendored
Normal file
36
lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
*.MKV
|
||||
*.a
|
||||
*.cmake
|
||||
*.d
|
||||
*.exe
|
||||
*.mkv
|
||||
*.ncb
|
||||
*.o
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.so*
|
||||
*.suo
|
||||
*.swp
|
||||
*.user
|
||||
*~
|
||||
.vscode
|
||||
/*.webm
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
Debug
|
||||
Makefile
|
||||
Release
|
||||
core
|
||||
dumpvtt
|
||||
ipch
|
||||
mkvmuxer_sample
|
||||
mkvmuxer_tests
|
||||
mkvparser_sample
|
||||
mkvparser_tests
|
||||
vp9_header_parser_tests
|
||||
vp9_level_stats_tests
|
||||
vttdemux
|
||||
webm2pes
|
||||
webm2pes_tests
|
||||
webm2ts
|
||||
webm_info
|
6
lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap
Normal file
6
lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap
Normal file
@ -0,0 +1,6 @@
|
||||
Hui Su <huisu@google.com>
|
||||
Matthew Heaney <matthewjheaney@google.com>
|
||||
Neil Birkbeck <birkbeck@google.com>
|
||||
Patrik Carlsson <patrik2.carlsson@sonymobile.com>
|
||||
Roberto Alanis Baez <alanisbaez@google.com>
|
||||
Tom Finegan <tomfinegan@google.com> <tomfinegan@chromium.org>
|
441
lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc
Normal file
441
lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc
Normal file
@ -0,0 +1,441 @@
|
||||
# This Pylint rcfile contains a best-effort configuration to uphold the
|
||||
# best-practices and style described in the Google Python style guide:
|
||||
# https://google.github.io/styleguide/pyguide.html
|
||||
#
|
||||
# Its canonical open-source location is:
|
||||
# https://google.github.io/styleguide/pylintrc
|
||||
|
||||
[MASTER]
|
||||
|
||||
# Files or directories to be skipped. They should be base names, not paths.
|
||||
ignore=third_party
|
||||
|
||||
# Files or directories matching the regex patterns are skipped. The regex
|
||||
# matches against base names, not paths.
|
||||
ignore-patterns=
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=no
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
# Use multiple processes to speed up Pylint.
|
||||
jobs=4
|
||||
|
||||
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||
# active Python interpreter and may run arbitrary code.
|
||||
unsafe-load-any-extension=no
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||
confidence=
|
||||
|
||||
# Enable the message, report, category or checker with the given id(s). You can
|
||||
# either give multiple identifier separated by comma (,) or put this option
|
||||
# multiple time (only on the command line, not in the configuration file where
|
||||
# it should appear only once). See also the "--disable" option for examples.
|
||||
#enable=
|
||||
|
||||
# Disable the message, report, category or checker with the given id(s). You
|
||||
# can either give multiple identifiers separated by comma (,) or put this
|
||||
# option multiple times (only on the command line, not in the configuration
|
||||
# file where it should appear only once).You can also use "--disable=all" to
|
||||
# disable everything first and then reenable specific checks. For example, if
|
||||
# you want to run only the similarities checker, you can use "--disable=all
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=abstract-method,
|
||||
apply-builtin,
|
||||
arguments-differ,
|
||||
attribute-defined-outside-init,
|
||||
backtick,
|
||||
bad-option-value,
|
||||
basestring-builtin,
|
||||
buffer-builtin,
|
||||
c-extension-no-member,
|
||||
consider-using-enumerate,
|
||||
cmp-builtin,
|
||||
cmp-method,
|
||||
coerce-builtin,
|
||||
coerce-method,
|
||||
delslice-method,
|
||||
div-method,
|
||||
duplicate-code,
|
||||
eq-without-hash,
|
||||
execfile-builtin,
|
||||
file-builtin,
|
||||
filter-builtin-not-iterating,
|
||||
fixme,
|
||||
getslice-method,
|
||||
global-statement,
|
||||
hex-method,
|
||||
idiv-method,
|
||||
implicit-str-concat-in-sequence,
|
||||
import-error,
|
||||
import-self,
|
||||
import-star-module-level,
|
||||
inconsistent-return-statements,
|
||||
input-builtin,
|
||||
intern-builtin,
|
||||
invalid-str-codec,
|
||||
locally-disabled,
|
||||
long-builtin,
|
||||
long-suffix,
|
||||
map-builtin-not-iterating,
|
||||
misplaced-comparison-constant,
|
||||
missing-function-docstring,
|
||||
metaclass-assignment,
|
||||
next-method-called,
|
||||
next-method-defined,
|
||||
no-absolute-import,
|
||||
no-else-break,
|
||||
no-else-continue,
|
||||
no-else-raise,
|
||||
no-else-return,
|
||||
no-init, # added
|
||||
no-member,
|
||||
no-name-in-module,
|
||||
no-self-use,
|
||||
nonzero-method,
|
||||
oct-method,
|
||||
old-division,
|
||||
old-ne-operator,
|
||||
old-octal-literal,
|
||||
old-raise-syntax,
|
||||
parameter-unpacking,
|
||||
print-statement,
|
||||
raising-string,
|
||||
range-builtin-not-iterating,
|
||||
raw_input-builtin,
|
||||
rdiv-method,
|
||||
reduce-builtin,
|
||||
relative-import,
|
||||
reload-builtin,
|
||||
round-builtin,
|
||||
setslice-method,
|
||||
signature-differs,
|
||||
standarderror-builtin,
|
||||
suppressed-message,
|
||||
sys-max-int,
|
||||
too-few-public-methods,
|
||||
too-many-ancestors,
|
||||
too-many-arguments,
|
||||
too-many-boolean-expressions,
|
||||
too-many-branches,
|
||||
too-many-instance-attributes,
|
||||
too-many-locals,
|
||||
too-many-nested-blocks,
|
||||
too-many-public-methods,
|
||||
too-many-return-statements,
|
||||
too-many-statements,
|
||||
trailing-newlines,
|
||||
unichr-builtin,
|
||||
unicode-builtin,
|
||||
unnecessary-pass,
|
||||
unpacking-in-except,
|
||||
useless-else-on-loop,
|
||||
useless-object-inheritance,
|
||||
useless-suppression,
|
||||
using-cmp-argument,
|
||||
wrong-import-order,
|
||||
xrange-builtin,
|
||||
zip-builtin-not-iterating,
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||
# (visual studio) and html. You can also give a reporter class, eg
|
||||
# mypackage.mymodule.MyReporterClass.
|
||||
output-format=text
|
||||
|
||||
# Put messages in a separate file for each module / package specified on the
|
||||
# command line instead of printing them on stdout. Reports (if any) will be
|
||||
# written in a file name "pylint_global.[txt|html]". This option is deprecated
|
||||
# and it will be removed in Pylint 2.0.
|
||||
files-output=no
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=no
|
||||
|
||||
# Python expression which should return a note less than 10 (10 is the highest
|
||||
# note). You have access to the variables errors warning, statement which
|
||||
# respectively contain the number of errors / warnings messages and the total
|
||||
# number of statements analyzed. This is used by the global evaluation report
|
||||
# (RP0004).
|
||||
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||
|
||||
# Template used to display messages. This is a python new-style format string
|
||||
# used to format the message information. See doc for all details
|
||||
#msg-template=
|
||||
|
||||
|
||||
[BASIC]
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=main,_,PRESUBMIT
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=
|
||||
|
||||
# Colon-delimited sets of names that determine each other's naming style when
|
||||
# the name regexes allow several styles.
|
||||
name-group=
|
||||
|
||||
# Include a hint for the correct naming format with invalid-name
|
||||
include-naming-hint=no
|
||||
|
||||
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||
# to this list to register other decorators that produce valid properties.
|
||||
property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl
|
||||
|
||||
# Regular expression matching correct function names
|
||||
function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$
|
||||
|
||||
# Regular expression matching correct variable names
|
||||
variable-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct constant names
|
||||
const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||
|
||||
# Regular expression matching correct attribute names
|
||||
attr-rgx=^_{0,2}[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct argument names
|
||||
argument-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct class attribute names
|
||||
class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||
|
||||
# Regular expression matching correct inline iteration names
|
||||
inlinevar-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct class names
|
||||
class-rgx=^_?[A-Z][a-zA-Z0-9]*$
|
||||
|
||||
# Regular expression matching correct module names
|
||||
module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
|
||||
|
||||
# Regular expression matching correct method names
|
||||
method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
|
||||
|
||||
# Regular expression which should only match function or class names that do
|
||||
# not require a docstring.
|
||||
no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$
|
||||
|
||||
# Minimum line length for functions/classes that require docstrings, shorter
|
||||
# ones are exempt.
|
||||
docstring-min-length=10
|
||||
|
||||
|
||||
[TYPECHECK]
|
||||
|
||||
# List of decorators that produce context managers, such as
|
||||
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||
# produce valid context managers.
|
||||
contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# List of module names for which member attributes should not be checked
|
||||
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||
# and thus existing member attributes cannot be deduced by static analysis. It
|
||||
# supports qualified module names, as well as Unix pattern matching.
|
||||
ignored-modules=
|
||||
|
||||
# List of class names for which member attributes should not be checked (useful
|
||||
# for classes with dynamically set attributes). This supports the use of
|
||||
# qualified names.
|
||||
ignored-classes=optparse.Values,thread._local,_thread._local
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||
# expressions are accepted.
|
||||
generated-members=
|
||||
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt
|
||||
# lines made too long by directives to pytype.
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=(?x)(
|
||||
^\s*(\#\ )?<?https?://\S+>?$|
|
||||
^\s*(from\s+\S+\s+)?import\s+.+$)
|
||||
|
||||
# Allow the body of an if to be on the same line as the test if there is no
|
||||
# else.
|
||||
single-line-if-stmt=yes
|
||||
|
||||
# List of optional constructs for which whitespace checking is disabled. `dict-
|
||||
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
|
||||
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
|
||||
# `empty-line` allows space-only lines.
|
||||
no-space-check=
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=99999
|
||||
|
||||
# String used as indentation unit. The internal Google style guide mandates 2
|
||||
# spaces. Google's externaly-published style guide says 4, consistent with
|
||||
# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google
|
||||
# projects (like TensorFlow).
|
||||
indent-string=' '
|
||||
|
||||
# Number of spaces of indent required inside a hanging or continued line.
|
||||
indent-after-paren=4
|
||||
|
||||
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||
expected-line-ending-format=
|
||||
|
||||
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=TODO
|
||||
|
||||
|
||||
[STRING]
|
||||
|
||||
# This flag controls whether inconsistent-quotes generates a warning when the
|
||||
# character used as a quote delimiter is used inconsistently within a module.
|
||||
check-quote-consistency=yes
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=no
|
||||
|
||||
# A regular expression matching the name of dummy variables (i.e. expectedly
|
||||
# not used).
|
||||
dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_)
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
# List of strings which can identify a callback function by name. A callback
|
||||
# name must start or end with one of those strings.
|
||||
callbacks=cb_,_cb
|
||||
|
||||
# List of qualified module names which can have objects that can redefine
|
||||
# builtins.
|
||||
redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools
|
||||
|
||||
|
||||
[LOGGING]
|
||||
|
||||
# Logging modules to check that the string format arguments are in logging
|
||||
# function parameter format
|
||||
logging-modules=logging,absl.logging,tensorflow.io.logging
|
||||
|
||||
|
||||
[SIMILARITIES]
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
||||
|
||||
# Ignore imports when computing similarities.
|
||||
ignore-imports=no
|
||||
|
||||
|
||||
[SPELLING]
|
||||
|
||||
# Spelling dictionary name. Available dictionaries: none. To make it working
|
||||
# install python-enchant package.
|
||||
spelling-dict=
|
||||
|
||||
# List of comma separated words that should not be checked.
|
||||
spelling-ignore-words=
|
||||
|
||||
# A path to a file that contains private dictionary; one word per line.
|
||||
spelling-private-dict-file=
|
||||
|
||||
# Tells whether to store unknown words to indicated private dictionary in
|
||||
# --spelling-private-dict-file option instead of raising a message.
|
||||
spelling-store-unknown-words=no
|
||||
|
||||
|
||||
[IMPORTS]
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,
|
||||
TERMIOS,
|
||||
Bastion,
|
||||
rexec,
|
||||
sets
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report RP0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
# Force import order to recognize a module as part of the standard
|
||||
# compatibility libraries.
|
||||
known-standard-library=
|
||||
|
||||
# Force import order to recognize a module as part of a third party library.
|
||||
known-third-party=enchant, absl
|
||||
|
||||
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||
# 3 compatible code, which means that the block might have code that exists
|
||||
# only in one or another interpreter, leading to false positives when analysed.
|
||||
analyse-fallback-blocks=no
|
||||
|
||||
|
||||
[CLASSES]
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,
|
||||
__new__,
|
||||
setUp
|
||||
|
||||
# List of member names, which should be excluded from the protected access
|
||||
# warning.
|
||||
exclude-protected=_asdict,
|
||||
_fields,
|
||||
_replace,
|
||||
_source,
|
||||
_make
|
||||
|
||||
# List of valid names for the first argument in a class method.
|
||||
valid-classmethod-first-arg=cls,
|
||||
class_
|
||||
|
||||
# List of valid names for the first argument in a metaclass class method.
|
||||
valid-metaclass-classmethod-first-arg=mcs
|
||||
|
||||
|
||||
[EXCEPTIONS]
|
||||
|
||||
# Exceptions that will emit a warning when being caught. Defaults to
|
||||
# "Exception"
|
||||
overgeneral-exceptions=StandardError,
|
||||
Exception,
|
||||
BaseException
|
5
lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT
Normal file
5
lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT
Normal file
@ -0,0 +1,5 @@
|
||||
# Names should be added to this file like so:
|
||||
# Name or Organization <email address>
|
||||
|
||||
Google Inc.
|
||||
Elijah Cirioli <eli.cirioli@gmail.com>
|
41
lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md
Normal file
41
lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md
Normal file
@ -0,0 +1,41 @@
|
||||
# How to Contribute
|
||||
|
||||
We'd love to accept your patches and contributions to this project. There are
|
||||
just a few small guidelines you need to follow.
|
||||
|
||||
## Contributor License Agreement
|
||||
|
||||
Contributions to this project must be accompanied by a Contributor License
|
||||
Agreement. You (or your employer) retain the copyright to your contribution;
|
||||
this simply gives us permission to use and redistribute your contributions as
|
||||
part of the project. Head over to <https://cla.developers.google.com/> to see
|
||||
your current agreements on file or to sign a new one.
|
||||
|
||||
You generally only need to submit a CLA once, so if you've already submitted one
|
||||
(even if it was for a different project), you probably don't need to do it
|
||||
again.
|
||||
|
||||
## Code reviews
|
||||
|
||||
All submissions, including submissions by project members, require review. We
|
||||
use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
|
||||
https://chromium-review.googlesource.com for this purpose. See the
|
||||
[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
|
||||
for additional details.
|
||||
|
||||
## Code Style
|
||||
|
||||
The C++ code style is based on the
|
||||
[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) and
|
||||
`clang-format --style=Google`. `clang-format -i --style=file` can be used to
|
||||
format individual files, it will use the settings from `.clang-format`.
|
||||
|
||||
CMake files are formatted with
|
||||
[cmake-format](https://cmake-format.readthedocs.io/en/latest/). `cmake-format
|
||||
-i` can be used to format individual files, it will use the settings from
|
||||
`.cmake-format.py`.
|
||||
|
||||
## Community Guidelines
|
||||
|
||||
This project follows
|
||||
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
|
30
lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT
Normal file
30
lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT
Normal file
@ -0,0 +1,30 @@
|
||||
Copyright (c) 2010, Google Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of Google nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
23
lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT
Normal file
23
lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT
Normal file
@ -0,0 +1,23 @@
|
||||
Additional IP Rights Grant (Patents)
|
||||
------------------------------------
|
||||
|
||||
"These implementations" means the copyrightable works that implement the WebM
|
||||
codecs distributed by Google as part of the WebM Project.
|
||||
|
||||
Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge,
|
||||
royalty-free, irrevocable (except as stated in this section) patent license to
|
||||
make, have made, use, offer to sell, sell, import, transfer, and otherwise
|
||||
run, modify and propagate the contents of these implementations of WebM, where
|
||||
such license applies only to those patent claims, both currently owned by
|
||||
Google and acquired in the future, licensable by Google that are necessarily
|
||||
infringed by these implementations of WebM. This grant does not include claims
|
||||
that would be infringed only as a consequence of further modification of these
|
||||
implementations. If you or your agent or exclusive licensee institute or order
|
||||
or agree to the institution of patent litigation or any other patent
|
||||
enforcement activity against any entity (including a cross-claim or
|
||||
counterclaim in a lawsuit) alleging that any of these implementations of WebM
|
||||
or any code incorporated within any of these implementations of WebM
|
||||
constitute direct or contributory patent infringement, or inducement of
|
||||
patent infringement, then any patent rights granted to you under this License
|
||||
for these implementations of WebM shall terminate as of the date such
|
||||
litigation is filed.
|
202
lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py
Normal file
202
lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py
Normal file
@ -0,0 +1,202 @@
|
||||
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
#
|
||||
# * Neither the name of Google nor the names of its contributors may
|
||||
# be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""Top-level presubmit script for libwebm.
|
||||
|
||||
See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
|
||||
details on the presubmit API built into depot_tools.
|
||||
"""
|
||||
import re
|
||||
import subprocess2
|
||||
|
||||
USE_PYTHON3 = True
|
||||
_BASH_INDENTATION = "2"
|
||||
_GIT_COMMIT_SUBJECT_LENGTH = 65
|
||||
_INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"]
|
||||
_INCLUDE_SOURCE_FILES_ONLY = [r".*\.(c|cc|[hc]pp|h)$"]
|
||||
_LIBWEBM_MAX_LINE_LENGTH = 80
|
||||
|
||||
|
||||
def _CheckCommitSubjectLength(input_api, output_api):
|
||||
"""Ensures commit's subject length is no longer than 65 chars."""
|
||||
name = "git-commit subject"
|
||||
cmd = ["git", "log", "-1", "--pretty=%s"]
|
||||
start = input_api.time.time()
|
||||
proc = subprocess2.Popen(
|
||||
cmd,
|
||||
stderr=subprocess2.PIPE,
|
||||
stdout=subprocess2.PIPE,
|
||||
universal_newlines=True)
|
||||
|
||||
stdout, _ = proc.communicate()
|
||||
duration = input_api.time.time() - start
|
||||
|
||||
if not re.match(r"^Revert",
|
||||
stdout) and (len(stdout) - 1) > _GIT_COMMIT_SUBJECT_LENGTH:
|
||||
failure_msg = (
|
||||
"The commit subject: %s is too long (%d chars)\n"
|
||||
"Try to keep this to 50 or less (up to 65 is permitted for "
|
||||
"non-reverts).\n"
|
||||
"https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-"
|
||||
"Project#_commit_guidelines") % (stdout, len(stdout) - 1)
|
||||
return output_api.PresubmitError("%s\n (%4.2fs) failed\n%s" %
|
||||
(name, duration, failure_msg))
|
||||
|
||||
return output_api.PresubmitResult("%s\n (%4.2fs) success" % (name, duration))
|
||||
|
||||
|
||||
def _GetFilesToSkip(input_api):
|
||||
"""Skips libwebm-specific files."""
|
||||
return list(input_api.DEFAULT_FILES_TO_SKIP) + [
|
||||
r"\.pylintrc$",
|
||||
]
|
||||
|
||||
|
||||
def _CheckChangeLintsClean(input_api, output_api):
|
||||
"""Makes sure that libwebm/ code is cpplint clean."""
|
||||
sources = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_check=_INCLUDE_SOURCE_FILES_ONLY, files_to_skip=None)
|
||||
return input_api.canned_checks.CheckChangeLintsClean(input_api, output_api,
|
||||
sources)
|
||||
|
||||
|
||||
def _RunShellCheckCmd(input_api, output_api, bash_file):
|
||||
"""shellcheck command wrapper."""
|
||||
cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file]
|
||||
name = "Check %s file." % bash_file
|
||||
start = input_api.time.time()
|
||||
output, rc = subprocess2.communicate(
|
||||
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||
duration = input_api.time.time() - start
|
||||
if rc == 0:
|
||||
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||
(name, " ".join(cmd), duration))
|
||||
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||
(name, " ".join(cmd), duration, output[1]))
|
||||
|
||||
|
||||
def _RunShfmtCheckCmd(input_api, output_api, bash_file):
|
||||
"""shfmt command wrapper."""
|
||||
cmd = [
|
||||
"shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d",
|
||||
bash_file
|
||||
]
|
||||
name = "Check %s file." % bash_file
|
||||
start = input_api.time.time()
|
||||
output, rc = subprocess2.communicate(
|
||||
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||
duration = input_api.time.time() - start
|
||||
if rc == 0:
|
||||
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||
(name, " ".join(cmd), duration))
|
||||
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||
(name, " ".join(cmd), duration, output[1]))
|
||||
|
||||
|
||||
def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check):
|
||||
"""Ensure that libwebm/ files are clean."""
|
||||
file_filter = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_check=files_to_check, files_to_skip=None)
|
||||
|
||||
affected_files = input_api.change.AffectedFiles(file_filter=file_filter)
|
||||
results = [
|
||||
run_cmd(input_api, output_api, f.AbsoluteLocalPath())
|
||||
for f in affected_files
|
||||
]
|
||||
return results
|
||||
|
||||
|
||||
def _CommonChecks(input_api, output_api):
|
||||
results = []
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
|
||||
input_api, output_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
|
||||
input_api, output_api))
|
||||
results.append(_CheckCommitSubjectLength(input_api, output_api))
|
||||
|
||||
source_file_filter = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_skip=_GetFilesToSkip(input_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckLongLines(
|
||||
input_api,
|
||||
output_api,
|
||||
maxlen=_LIBWEBM_MAX_LINE_LENGTH,
|
||||
source_file_filter=source_file_filter))
|
||||
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckPatchFormatted(
|
||||
input_api,
|
||||
output_api,
|
||||
check_clang_format=True,
|
||||
check_python=True,
|
||||
result_factory=output_api.PresubmitError))
|
||||
results.extend(_CheckChangeLintsClean(input_api, output_api))
|
||||
|
||||
# Run pylint.
|
||||
results.extend(
|
||||
input_api.canned_checks.RunPylint(
|
||||
input_api,
|
||||
output_api,
|
||||
files_to_skip=_GetFilesToSkip(input_api),
|
||||
pylintrc=".pylintrc",
|
||||
version="2.7"))
|
||||
|
||||
# Binaries shellcheck and shfmt are not installed in depot_tools.
|
||||
# Installation is needed
|
||||
try:
|
||||
subprocess2.communicate(["shellcheck", "--version"])
|
||||
results.extend(
|
||||
_RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd,
|
||||
_INCLUDE_BASH_FILES_ONLY))
|
||||
print("shfmt")
|
||||
subprocess2.communicate(["shfmt", "-version"])
|
||||
results.extend(
|
||||
_RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd,
|
||||
_INCLUDE_BASH_FILES_ONLY))
|
||||
except OSError as os_error:
|
||||
results.append(
|
||||
output_api.PresubmitPromptWarning(
|
||||
"%s\nPlease install missing binaries locally." % os_error.args[0]))
|
||||
return results
|
||||
|
||||
|
||||
def CheckChangeOnUpload(input_api, output_api):
|
||||
results = []
|
||||
results.extend(_CommonChecks(input_api, output_api))
|
||||
return results
|
||||
|
||||
|
||||
def CheckChangeOnCommit(input_api, output_api):
|
||||
results = []
|
||||
results.extend(_CommonChecks(input_api, output_api))
|
||||
return results
|
148
lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm
Normal file
148
lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm
Normal file
@ -0,0 +1,148 @@
|
||||
Building Libwebm
|
||||
|
||||
To build libwebm you must first create project files. To do this run cmake
|
||||
and pass it the path to your libwebm repo.
|
||||
|
||||
Makefile.unix can be used as a fallback on systems that cmake does not
|
||||
support.
|
||||
|
||||
|
||||
CMake Basics
|
||||
|
||||
To generate project/make files for the default toolchain on your system simply
|
||||
run cmake with the path to the libwebm repo:
|
||||
|
||||
$ cmake path/to/libwebm
|
||||
|
||||
On Windows the above command will produce Visual Studio project files for the
|
||||
newest Visual Studio detected on the system. On Mac OS X and Linux systems, the
|
||||
above command will produce a makefile.
|
||||
|
||||
To control what types of projects are generated the -G parameter is added to
|
||||
the cmake command line. This argument must be followed by the name of a
|
||||
generator. Running cmake with the --help argument will list the available
|
||||
generators for your system.
|
||||
|
||||
On Mac OS X you would run the following command to generate Xcode projects:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode
|
||||
|
||||
On a Windows box you would run the following command to generate Visual Studio
|
||||
2013 projects:
|
||||
|
||||
$ cmake path/to/libwebm -G "Visual Studio 12"
|
||||
|
||||
To generate 64-bit Windows Visual Studio 2013 projects:
|
||||
|
||||
$ cmake path/to/libwebm "Visual Studio 12 Win64"
|
||||
|
||||
|
||||
CMake Makefiles: Debugging and Optimization
|
||||
|
||||
Unlike Visual Studio and Xcode projects, the build configuration for make builds
|
||||
is controlled when you run cmake. The following examples demonstrate various
|
||||
build configurations.
|
||||
|
||||
Omitting the build type produces makefiles that use build flags containing
|
||||
neither optimization nor debug flags:
|
||||
$ cmake path/to/libwebm
|
||||
|
||||
A makefile using release (optimized) flags is produced like this:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=release
|
||||
|
||||
A release build with debug info can be produced as well:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=relwithdebinfo
|
||||
|
||||
And your standard debug build will be produced using:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=debug
|
||||
|
||||
|
||||
Tests
|
||||
|
||||
To enable libwebm tests add -DENABLE_TESTS=ON CMake generation command line. For
|
||||
example:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON
|
||||
|
||||
Libwebm tests depend on googletest. By default googletest is expected to be a
|
||||
sibling directory of the Libwebm repository. To change that, update your CMake
|
||||
command to be similar to the following:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON \
|
||||
-DGTEST_SRC_DIR=/path/to/googletest
|
||||
|
||||
The tests rely upon the LIBWEBM_TEST_DATA_PATH environment variable to locate
|
||||
test input. The following example demonstrates running the muxer tests from the
|
||||
build directory:
|
||||
|
||||
$ LIBWEBM_TEST_DATA_PATH=path/to/libwebm/testing/testdata ./mkvmuxer_tests
|
||||
|
||||
Note: Libwebm Googletest integration was built with googletest from
|
||||
https://github.com/google/googletest.git at git revision
|
||||
ddb8012eb48bc203aa93dcc2b22c1db516302b29.
|
||||
|
||||
|
||||
CMake Include-what-you-use integration
|
||||
|
||||
Include-what-you-use is an analysis tool that helps ensure libwebm includes the
|
||||
C/C++ header files actually in use. To enable the integration support
|
||||
ENABLE_IWYU must be turned on at cmake run time:
|
||||
|
||||
$ cmake path/to/libwebm -G "Unix Makefiles" -DENABLE_IWYU=ON
|
||||
|
||||
This adds the iwyu target to the build. To run include-what-you-use:
|
||||
|
||||
$ make iwyu
|
||||
|
||||
The following requirements must be met for ENABLE_IWYU to enable the iwyu
|
||||
target:
|
||||
|
||||
1. include-what-you-use and iwyu_tool.py must be in your PATH.
|
||||
2. A python interpreter must be on the system and available to CMake.
|
||||
|
||||
The values of the following variables are used to determine if the requirements
|
||||
have been met. Values to the right of the equals sign are what a successful run
|
||||
might look like:
|
||||
iwyu_path=/path/to/iwyu_tool.py
|
||||
iwyu_tool_path=/path/to/include-what-you-use
|
||||
PYTHONINTERP_FOUND=TRUE
|
||||
|
||||
An empty PYTHONINTERP_FOUND, or iwyu_path/iwyu_tool_path suffixed with NOTFOUND
|
||||
are failures.
|
||||
|
||||
For Include-what-you-use setup instructions, see:
|
||||
https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/InstructionsForUsers.md
|
||||
|
||||
If, when building the iwyu target, compile errors reporting failures loading
|
||||
standard include files occur, one solution can be found here:
|
||||
https://github.com/include-what-you-use/include-what-you-use/issues/100
|
||||
|
||||
|
||||
CMake cross compile
|
||||
To cross compile libwebm for Windows using mingw-w64 run cmake with the
|
||||
following arguments:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
path/to/libwebm
|
||||
|
||||
Note1: As of this writing googletest will not build via mingw-w64 without
|
||||
disabling pthreads.
|
||||
googletest hash: d225acc90bc3a8c420a9bcd1f033033c1ccd7fe0
|
||||
|
||||
To build with tests when using mingw-w64 use the following arguments when
|
||||
running CMake:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
-DENABLE_TESTS=ON -Dgtest_disable_pthreads=ON path/to/libwebm
|
||||
|
||||
Note2: i686-w64-mingw32 is the default compiler. This can be controlled using
|
||||
the MINGW_PREFIX variable:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
-DMINGW_PREFIX=x86_64-w64-mingw32 path/to/libwebm
|
||||
|
||||
Bug reports
|
||||
|
||||
Bug reports can be filed in the libwebm issue tracker:
|
||||
https://issues.webmproject.org/.
|
||||
For security reports, select 'Security report' from the Template dropdown.
|
@ -0,0 +1,4 @@
|
||||
# This file is used by git cl to get repository specific information.
|
||||
GERRIT_HOST: True
|
||||
CODE_REVIEW_SERVER: chromium-review.googlesource.com
|
||||
GERRIT_SQUASH_UPLOADS: False
|
193
lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h
Normal file
193
lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h
Normal file
@ -0,0 +1,193 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef COMMON_WEBMIDS_H_
|
||||
#define COMMON_WEBMIDS_H_
|
||||
|
||||
namespace libwebm {
|
||||
|
||||
enum MkvId {
|
||||
kMkvEBML = 0x1A45DFA3,
|
||||
kMkvEBMLVersion = 0x4286,
|
||||
kMkvEBMLReadVersion = 0x42F7,
|
||||
kMkvEBMLMaxIDLength = 0x42F2,
|
||||
kMkvEBMLMaxSizeLength = 0x42F3,
|
||||
kMkvDocType = 0x4282,
|
||||
kMkvDocTypeVersion = 0x4287,
|
||||
kMkvDocTypeReadVersion = 0x4285,
|
||||
kMkvVoid = 0xEC,
|
||||
kMkvSignatureSlot = 0x1B538667,
|
||||
kMkvSignatureAlgo = 0x7E8A,
|
||||
kMkvSignatureHash = 0x7E9A,
|
||||
kMkvSignaturePublicKey = 0x7EA5,
|
||||
kMkvSignature = 0x7EB5,
|
||||
kMkvSignatureElements = 0x7E5B,
|
||||
kMkvSignatureElementList = 0x7E7B,
|
||||
kMkvSignedElement = 0x6532,
|
||||
// segment
|
||||
kMkvSegment = 0x18538067,
|
||||
// Meta Seek Information
|
||||
kMkvSeekHead = 0x114D9B74,
|
||||
kMkvSeek = 0x4DBB,
|
||||
kMkvSeekID = 0x53AB,
|
||||
kMkvSeekPosition = 0x53AC,
|
||||
// Segment Information
|
||||
kMkvInfo = 0x1549A966,
|
||||
kMkvTimecodeScale = 0x2AD7B1,
|
||||
kMkvDuration = 0x4489,
|
||||
kMkvDateUTC = 0x4461,
|
||||
kMkvTitle = 0x7BA9,
|
||||
kMkvMuxingApp = 0x4D80,
|
||||
kMkvWritingApp = 0x5741,
|
||||
// Cluster
|
||||
kMkvCluster = 0x1F43B675,
|
||||
kMkvTimecode = 0xE7,
|
||||
kMkvPrevSize = 0xAB,
|
||||
kMkvBlockGroup = 0xA0,
|
||||
kMkvBlock = 0xA1,
|
||||
kMkvBlockDuration = 0x9B,
|
||||
kMkvReferenceBlock = 0xFB,
|
||||
kMkvLaceNumber = 0xCC,
|
||||
kMkvSimpleBlock = 0xA3,
|
||||
kMkvBlockAdditions = 0x75A1,
|
||||
kMkvBlockMore = 0xA6,
|
||||
kMkvBlockAddID = 0xEE,
|
||||
kMkvBlockAdditional = 0xA5,
|
||||
kMkvDiscardPadding = 0x75A2,
|
||||
// Track
|
||||
kMkvTracks = 0x1654AE6B,
|
||||
kMkvTrackEntry = 0xAE,
|
||||
kMkvTrackNumber = 0xD7,
|
||||
kMkvTrackUID = 0x73C5,
|
||||
kMkvTrackType = 0x83,
|
||||
kMkvFlagEnabled = 0xB9,
|
||||
kMkvFlagDefault = 0x88,
|
||||
kMkvFlagForced = 0x55AA,
|
||||
kMkvFlagLacing = 0x9C,
|
||||
kMkvDefaultDuration = 0x23E383,
|
||||
kMkvMaxBlockAdditionID = 0x55EE,
|
||||
kMkvName = 0x536E,
|
||||
kMkvLanguage = 0x22B59C,
|
||||
kMkvCodecID = 0x86,
|
||||
kMkvCodecPrivate = 0x63A2,
|
||||
kMkvCodecName = 0x258688,
|
||||
kMkvCodecDelay = 0x56AA,
|
||||
kMkvSeekPreRoll = 0x56BB,
|
||||
// video
|
||||
kMkvVideo = 0xE0,
|
||||
kMkvFlagInterlaced = 0x9A,
|
||||
kMkvStereoMode = 0x53B8,
|
||||
kMkvAlphaMode = 0x53C0,
|
||||
kMkvPixelWidth = 0xB0,
|
||||
kMkvPixelHeight = 0xBA,
|
||||
kMkvPixelCropBottom = 0x54AA,
|
||||
kMkvPixelCropTop = 0x54BB,
|
||||
kMkvPixelCropLeft = 0x54CC,
|
||||
kMkvPixelCropRight = 0x54DD,
|
||||
kMkvDisplayWidth = 0x54B0,
|
||||
kMkvDisplayHeight = 0x54BA,
|
||||
kMkvDisplayUnit = 0x54B2,
|
||||
kMkvAspectRatioType = 0x54B3,
|
||||
kMkvColourSpace = 0x2EB524,
|
||||
kMkvFrameRate = 0x2383E3,
|
||||
// end video
|
||||
// colour
|
||||
kMkvColour = 0x55B0,
|
||||
kMkvMatrixCoefficients = 0x55B1,
|
||||
kMkvBitsPerChannel = 0x55B2,
|
||||
kMkvChromaSubsamplingHorz = 0x55B3,
|
||||
kMkvChromaSubsamplingVert = 0x55B4,
|
||||
kMkvCbSubsamplingHorz = 0x55B5,
|
||||
kMkvCbSubsamplingVert = 0x55B6,
|
||||
kMkvChromaSitingHorz = 0x55B7,
|
||||
kMkvChromaSitingVert = 0x55B8,
|
||||
kMkvRange = 0x55B9,
|
||||
kMkvTransferCharacteristics = 0x55BA,
|
||||
kMkvPrimaries = 0x55BB,
|
||||
kMkvMaxCLL = 0x55BC,
|
||||
kMkvMaxFALL = 0x55BD,
|
||||
// mastering metadata
|
||||
kMkvMasteringMetadata = 0x55D0,
|
||||
kMkvPrimaryRChromaticityX = 0x55D1,
|
||||
kMkvPrimaryRChromaticityY = 0x55D2,
|
||||
kMkvPrimaryGChromaticityX = 0x55D3,
|
||||
kMkvPrimaryGChromaticityY = 0x55D4,
|
||||
kMkvPrimaryBChromaticityX = 0x55D5,
|
||||
kMkvPrimaryBChromaticityY = 0x55D6,
|
||||
kMkvWhitePointChromaticityX = 0x55D7,
|
||||
kMkvWhitePointChromaticityY = 0x55D8,
|
||||
kMkvLuminanceMax = 0x55D9,
|
||||
kMkvLuminanceMin = 0x55DA,
|
||||
// end mastering metadata
|
||||
// end colour
|
||||
// projection
|
||||
kMkvProjection = 0x7670,
|
||||
kMkvProjectionType = 0x7671,
|
||||
kMkvProjectionPrivate = 0x7672,
|
||||
kMkvProjectionPoseYaw = 0x7673,
|
||||
kMkvProjectionPosePitch = 0x7674,
|
||||
kMkvProjectionPoseRoll = 0x7675,
|
||||
// end projection
|
||||
// audio
|
||||
kMkvAudio = 0xE1,
|
||||
kMkvSamplingFrequency = 0xB5,
|
||||
kMkvOutputSamplingFrequency = 0x78B5,
|
||||
kMkvChannels = 0x9F,
|
||||
kMkvBitDepth = 0x6264,
|
||||
// end audio
|
||||
// ContentEncodings
|
||||
kMkvContentEncodings = 0x6D80,
|
||||
kMkvContentEncoding = 0x6240,
|
||||
kMkvContentEncodingOrder = 0x5031,
|
||||
kMkvContentEncodingScope = 0x5032,
|
||||
kMkvContentEncodingType = 0x5033,
|
||||
kMkvContentCompression = 0x5034,
|
||||
kMkvContentCompAlgo = 0x4254,
|
||||
kMkvContentCompSettings = 0x4255,
|
||||
kMkvContentEncryption = 0x5035,
|
||||
kMkvContentEncAlgo = 0x47E1,
|
||||
kMkvContentEncKeyID = 0x47E2,
|
||||
kMkvContentSignature = 0x47E3,
|
||||
kMkvContentSigKeyID = 0x47E4,
|
||||
kMkvContentSigAlgo = 0x47E5,
|
||||
kMkvContentSigHashAlgo = 0x47E6,
|
||||
kMkvContentEncAESSettings = 0x47E7,
|
||||
kMkvAESSettingsCipherMode = 0x47E8,
|
||||
kMkvAESSettingsCipherInitData = 0x47E9,
|
||||
// end ContentEncodings
|
||||
// Cueing Data
|
||||
kMkvCues = 0x1C53BB6B,
|
||||
kMkvCuePoint = 0xBB,
|
||||
kMkvCueTime = 0xB3,
|
||||
kMkvCueTrackPositions = 0xB7,
|
||||
kMkvCueTrack = 0xF7,
|
||||
kMkvCueClusterPosition = 0xF1,
|
||||
kMkvCueBlockNumber = 0x5378,
|
||||
// Chapters
|
||||
kMkvChapters = 0x1043A770,
|
||||
kMkvEditionEntry = 0x45B9,
|
||||
kMkvChapterAtom = 0xB6,
|
||||
kMkvChapterUID = 0x73C4,
|
||||
kMkvChapterStringUID = 0x5654,
|
||||
kMkvChapterTimeStart = 0x91,
|
||||
kMkvChapterTimeEnd = 0x92,
|
||||
kMkvChapterDisplay = 0x80,
|
||||
kMkvChapString = 0x85,
|
||||
kMkvChapLanguage = 0x437C,
|
||||
kMkvChapCountry = 0x437E,
|
||||
// Tags
|
||||
kMkvTags = 0x1254C367,
|
||||
kMkvTag = 0x7373,
|
||||
kMkvSimpleTag = 0x67C8,
|
||||
kMkvTagName = 0x45A3,
|
||||
kMkvTagString = 0x4487
|
||||
};
|
||||
|
||||
} // namespace libwebm
|
||||
|
||||
#endif // COMMON_WEBMIDS_H_
|
4207
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc
Normal file
4207
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc
Normal file
File diff suppressed because it is too large
Load Diff
1926
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h
Normal file
1926
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef MKVMUXER_MKVMUXERTYPES_H_
|
||||
#define MKVMUXER_MKVMUXERTYPES_H_
|
||||
|
||||
namespace mkvmuxer {
|
||||
typedef unsigned char uint8;
|
||||
typedef short int16;
|
||||
typedef int int32;
|
||||
typedef unsigned int uint32;
|
||||
typedef long long int64;
|
||||
typedef unsigned long long uint64;
|
||||
} // namespace mkvmuxer
|
||||
|
||||
// Copied from Chromium basictypes.h
|
||||
// A macro to disallow the copy constructor and operator= functions
|
||||
// This should be used in the private: declarations for a class
|
||||
#define LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&); \
|
||||
void operator=(const TypeName&)
|
||||
|
||||
#endif // MKVMUXER_MKVMUXERTYPES_HPP_
|
739
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc
Normal file
739
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc
Normal file
@ -0,0 +1,739 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#include "mkvmuxerutil.h"
|
||||
#ifdef ESP32
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
#include <new>
|
||||
|
||||
#include "../common/webmids.h"
|
||||
#include "mkvmuxer.h"
|
||||
#include "mkvwriter.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
namespace {
|
||||
|
||||
// Date elements are always 8 octets in size.
|
||||
const int kDateElementSize = 8;
|
||||
|
||||
uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode,
|
||||
uint64 timecode_scale) {
|
||||
uint64 block_additional_elem_size = 0;
|
||||
uint64 block_addid_elem_size = 0;
|
||||
uint64 block_more_payload_size = 0;
|
||||
uint64 block_more_elem_size = 0;
|
||||
uint64 block_additions_payload_size = 0;
|
||||
uint64 block_additions_elem_size = 0;
|
||||
if (frame->additional()) {
|
||||
block_additional_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvBlockAdditional, frame->additional(),
|
||||
frame->additional_length());
|
||||
block_addid_elem_size = EbmlElementSize(
|
||||
libwebm::kMkvBlockAddID, static_cast<uint64>(frame->add_id()));
|
||||
|
||||
block_more_payload_size =
|
||||
block_addid_elem_size + block_additional_elem_size;
|
||||
block_more_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlockMore, block_more_payload_size) +
|
||||
block_more_payload_size;
|
||||
block_additions_payload_size = block_more_elem_size;
|
||||
block_additions_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlockAdditions,
|
||||
block_additions_payload_size) +
|
||||
block_additions_payload_size;
|
||||
}
|
||||
|
||||
uint64 discard_padding_elem_size = 0;
|
||||
if (frame->discard_padding() != 0) {
|
||||
discard_padding_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvDiscardPadding,
|
||||
static_cast<int64>(frame->discard_padding()));
|
||||
}
|
||||
|
||||
const uint64 reference_block_timestamp =
|
||||
frame->reference_block_timestamp() / timecode_scale;
|
||||
uint64 reference_block_elem_size = 0;
|
||||
if (!frame->is_key()) {
|
||||
reference_block_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvReferenceBlock, reference_block_timestamp);
|
||||
}
|
||||
|
||||
const uint64 duration = frame->duration() / timecode_scale;
|
||||
uint64 block_duration_elem_size = 0;
|
||||
if (duration > 0)
|
||||
block_duration_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvBlockDuration, duration);
|
||||
|
||||
const uint64 block_payload_size = 4 + frame->length();
|
||||
const uint64 block_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlock, block_payload_size) +
|
||||
block_payload_size;
|
||||
|
||||
const uint64 block_group_payload_size =
|
||||
block_elem_size + block_additions_elem_size + block_duration_elem_size +
|
||||
discard_padding_elem_size + reference_block_elem_size;
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockGroup,
|
||||
block_group_payload_size)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlock, block_payload_size))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, frame->track_number()))
|
||||
return 0;
|
||||
|
||||
if (SerializeInt(writer, timecode, 2))
|
||||
return 0;
|
||||
|
||||
// For a Block, flags is always 0.
|
||||
if (SerializeInt(writer, 0, 1))
|
||||
return 0;
|
||||
|
||||
if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
|
||||
return 0;
|
||||
|
||||
if (frame->additional()) {
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockAdditions,
|
||||
block_additions_payload_size)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockMore,
|
||||
block_more_payload_size))
|
||||
return 0;
|
||||
|
||||
if (!WriteEbmlElement(writer, libwebm::kMkvBlockAddID,
|
||||
static_cast<uint64>(frame->add_id())))
|
||||
return 0;
|
||||
|
||||
if (!WriteEbmlElement(writer, libwebm::kMkvBlockAdditional,
|
||||
frame->additional(), frame->additional_length())) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (frame->discard_padding() != 0 &&
|
||||
!WriteEbmlElement(writer, libwebm::kMkvDiscardPadding,
|
||||
static_cast<int64>(frame->discard_padding()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!frame->is_key() && !WriteEbmlElement(writer, libwebm::kMkvReferenceBlock,
|
||||
reference_block_timestamp)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (duration > 0 &&
|
||||
!WriteEbmlElement(writer, libwebm::kMkvBlockDuration, duration)) {
|
||||
return false;
|
||||
}
|
||||
return EbmlMasterElementSize(libwebm::kMkvBlockGroup,
|
||||
block_group_payload_size) +
|
||||
block_group_payload_size;
|
||||
}
|
||||
|
||||
uint64 WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame,
|
||||
int64 timecode) {
|
||||
if (WriteID(writer, libwebm::kMkvSimpleBlock))
|
||||
return 0;
|
||||
|
||||
const int32 size = static_cast<int32>(frame->length()) + 4;
|
||||
if (WriteUInt(writer, size))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, static_cast<uint64>(frame->track_number())))
|
||||
return 0;
|
||||
|
||||
if (SerializeInt(writer, timecode, 2))
|
||||
return 0;
|
||||
|
||||
uint64 flags = 0;
|
||||
if (frame->is_key())
|
||||
flags |= 0x80;
|
||||
|
||||
if (SerializeInt(writer, flags, 1))
|
||||
return 0;
|
||||
|
||||
if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
|
||||
return 0;
|
||||
|
||||
return GetUIntSize(libwebm::kMkvSimpleBlock) + GetCodedUIntSize(size) + 4 +
|
||||
frame->length();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int32 GetCodedUIntSize(uint64 value) {
|
||||
if (value < 0x000000000000007FULL)
|
||||
return 1;
|
||||
else if (value < 0x0000000000003FFFULL)
|
||||
return 2;
|
||||
else if (value < 0x00000000001FFFFFULL)
|
||||
return 3;
|
||||
else if (value < 0x000000000FFFFFFFULL)
|
||||
return 4;
|
||||
else if (value < 0x00000007FFFFFFFFULL)
|
||||
return 5;
|
||||
else if (value < 0x000003FFFFFFFFFFULL)
|
||||
return 6;
|
||||
else if (value < 0x0001FFFFFFFFFFFFULL)
|
||||
return 7;
|
||||
return 8;
|
||||
}
|
||||
|
||||
int32 GetUIntSize(uint64 value) {
|
||||
if (value < 0x0000000000000100ULL)
|
||||
return 1;
|
||||
else if (value < 0x0000000000010000ULL)
|
||||
return 2;
|
||||
else if (value < 0x0000000001000000ULL)
|
||||
return 3;
|
||||
else if (value < 0x0000000100000000ULL)
|
||||
return 4;
|
||||
else if (value < 0x0000010000000000ULL)
|
||||
return 5;
|
||||
else if (value < 0x0001000000000000ULL)
|
||||
return 6;
|
||||
else if (value < 0x0100000000000000ULL)
|
||||
return 7;
|
||||
return 8;
|
||||
}
|
||||
|
||||
int32 GetIntSize(int64 value) {
|
||||
// Doubling the requested value ensures positive values with their high bit
|
||||
// set are written with 0-padding to avoid flipping the signedness.
|
||||
const uint64 v = (value < 0) ? value ^ -1LL : value;
|
||||
return GetUIntSize(2 * v);
|
||||
}
|
||||
|
||||
uint64 EbmlMasterElementSize(uint64 type, uint64 value) {
|
||||
// Size of EBML ID
|
||||
int32 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += GetCodedUIntSize(value);
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, int64 value) {
|
||||
// Size of EBML ID
|
||||
int32 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += GetIntSize(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value) {
|
||||
return EbmlElementSize(type, value, 0);
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += (fixed_size > 0) ? fixed_size : GetUIntSize(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, float /* value */) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += sizeof(float);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, const char* value) {
|
||||
if (!value)
|
||||
return 0;
|
||||
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += strlen(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size += GetCodedUIntSize(strlen(value));
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) {
|
||||
if (!value)
|
||||
return 0;
|
||||
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += size;
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size += GetCodedUIntSize(size);
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlDateElementSize(uint64 type) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += kDateElementSize;
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) {
|
||||
if (!writer || size < 1 || size > 8)
|
||||
return -1;
|
||||
|
||||
for (int32 i = 1; i <= size; ++i) {
|
||||
const int32 byte_count = size - i;
|
||||
const int32 bit_count = byte_count * 8;
|
||||
|
||||
const int64 bb = value >> bit_count;
|
||||
const uint8 b = static_cast<uint8>(bb);
|
||||
|
||||
const int32 status = writer->Write(&b, 1);
|
||||
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 SerializeFloat(IMkvWriter* writer, float f) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
assert(sizeof(uint32) == sizeof(float));
|
||||
// This union is merely used to avoid a reinterpret_cast from float& to
|
||||
// uint32& which will result in violation of strict aliasing.
|
||||
union U32 {
|
||||
uint32 u32;
|
||||
float f;
|
||||
} value;
|
||||
value.f = f;
|
||||
|
||||
for (int32 i = 1; i <= 4; ++i) {
|
||||
const int32 byte_count = 4 - i;
|
||||
const int32 bit_count = byte_count * 8;
|
||||
|
||||
const uint8 byte = static_cast<uint8>(value.u32 >> bit_count);
|
||||
|
||||
const int32 status = writer->Write(&byte, 1);
|
||||
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 WriteUInt(IMkvWriter* writer, uint64 value) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
int32 size = GetCodedUIntSize(value);
|
||||
|
||||
return WriteUIntSize(writer, value, size);
|
||||
}
|
||||
|
||||
int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) {
|
||||
if (!writer || size < 0 || size > 8)
|
||||
return -1;
|
||||
|
||||
if (size > 0) {
|
||||
const uint64 bit = 1LL << (size * 7);
|
||||
|
||||
if (value > (bit - 2))
|
||||
return -1;
|
||||
|
||||
value |= bit;
|
||||
} else {
|
||||
size = 1;
|
||||
int64 bit;
|
||||
|
||||
for (;;) {
|
||||
bit = 1LL << (size * 7);
|
||||
const uint64 max = bit - 2;
|
||||
|
||||
if (value <= max)
|
||||
break;
|
||||
|
||||
++size;
|
||||
}
|
||||
|
||||
if (size > 8)
|
||||
return false;
|
||||
|
||||
value |= bit;
|
||||
}
|
||||
|
||||
return SerializeInt(writer, value, size);
|
||||
}
|
||||
|
||||
int32 WriteID(IMkvWriter* writer, uint64 type) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
writer->ElementStartNotify(type, writer->Position());
|
||||
|
||||
const int32 size = GetUIntSize(type);
|
||||
|
||||
return SerializeInt(writer, type, size);
|
||||
}
|
||||
|
||||
bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value) {
|
||||
return WriteEbmlElement(writer, type, value, 0);
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value,
|
||||
uint64 fixed_size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
uint64 size = GetUIntSize(value);
|
||||
if (fixed_size > 0) {
|
||||
if (size > fixed_size)
|
||||
return false;
|
||||
size = fixed_size;
|
||||
}
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, static_cast<int32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return 0;
|
||||
|
||||
const uint64 size = GetIntSize(value);
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, static_cast<int32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, 4))
|
||||
return false;
|
||||
|
||||
if (SerializeFloat(writer, value))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) {
|
||||
if (!writer || !value)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
const uint64 length = strlen(value);
|
||||
if (WriteUInt(writer, length))
|
||||
return false;
|
||||
|
||||
if (writer->Write(value, static_cast<uint32>(length)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
|
||||
uint64 size) {
|
||||
if (!writer || !value || size < 1)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (writer->Write(value, static_cast<uint32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, kDateElementSize))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, kDateElementSize))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame,
|
||||
Cluster* cluster) {
|
||||
if (!writer || !frame || !frame->IsValid() || !cluster ||
|
||||
!cluster->timecode_scale())
|
||||
return 0;
|
||||
|
||||
// Technically the timecode for a block can be less than the
|
||||
// timecode for the cluster itself (remember that block timecode
|
||||
// is a signed, 16-bit integer). However, as a simplification we
|
||||
// only permit non-negative cluster-relative timecodes for blocks.
|
||||
const int64 relative_timecode = cluster->GetRelativeTimecode(
|
||||
frame->timestamp() / cluster->timecode_scale());
|
||||
if (relative_timecode < 0 || relative_timecode > kMaxBlockTimecode)
|
||||
return 0;
|
||||
|
||||
return frame->CanBeSimpleBlock()
|
||||
? WriteSimpleBlock(writer, frame, relative_timecode)
|
||||
: WriteBlock(writer, frame, relative_timecode,
|
||||
cluster->timecode_scale());
|
||||
}
|
||||
|
||||
uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
// Subtract one for the void ID and the coded size.
|
||||
uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1);
|
||||
uint64 void_size = EbmlMasterElementSize(libwebm::kMkvVoid, void_entry_size) +
|
||||
void_entry_size;
|
||||
|
||||
if (void_size != size)
|
||||
return 0;
|
||||
|
||||
const int64 payload_position = writer->Position();
|
||||
if (payload_position < 0)
|
||||
return 0;
|
||||
|
||||
if (WriteID(writer, libwebm::kMkvVoid))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, void_entry_size))
|
||||
return 0;
|
||||
|
||||
const uint8 value = 0;
|
||||
for (int32 i = 0; i < static_cast<int32>(void_entry_size); ++i) {
|
||||
if (writer->Write(&value, 1))
|
||||
return 0;
|
||||
}
|
||||
|
||||
const int64 stop_position = writer->Position();
|
||||
if (stop_position < 0 ||
|
||||
stop_position - payload_position != static_cast<int64>(void_size))
|
||||
return 0;
|
||||
|
||||
return void_size;
|
||||
}
|
||||
|
||||
void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision) {
|
||||
*major = 0;
|
||||
*minor = 3;
|
||||
*build = 3;
|
||||
*revision = 0;
|
||||
}
|
||||
|
||||
uint64 MakeUID(unsigned int* seed) {
|
||||
uint64 uid = 0;
|
||||
|
||||
for (int i = 0; i < 7; ++i) { // avoid problems with 8-byte values
|
||||
uid <<= 8;
|
||||
|
||||
// TODO(fgalligan): Move random number generation to platform specific code.
|
||||
#ifdef _WIN32
|
||||
(void)seed;
|
||||
const int32 nn = rand();
|
||||
#elif defined(__ANDROID__)
|
||||
(void)seed;
|
||||
int32 temp_num = 1;
|
||||
int fd = open("/dev/urandom", O_RDONLY);
|
||||
if (fd != -1) {
|
||||
read(fd, &temp_num, sizeof(temp_num));
|
||||
close(fd);
|
||||
}
|
||||
const int32 nn = temp_num;
|
||||
#else
|
||||
const int32 nn = rand_r(seed);
|
||||
#endif
|
||||
const int32 n = 0xFF & (nn >> 4); // throw away low-order bits
|
||||
|
||||
uid |= n;
|
||||
}
|
||||
|
||||
return uid;
|
||||
}
|
||||
|
||||
bool IsMatrixCoefficientsValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kGbr:
|
||||
case mkvmuxer::Colour::kBt709:
|
||||
case mkvmuxer::Colour::kUnspecifiedMc:
|
||||
case mkvmuxer::Colour::kReserved:
|
||||
case mkvmuxer::Colour::kFcc:
|
||||
case mkvmuxer::Colour::kBt470bg:
|
||||
case mkvmuxer::Colour::kSmpte170MMc:
|
||||
case mkvmuxer::Colour::kSmpte240MMc:
|
||||
case mkvmuxer::Colour::kYcocg:
|
||||
case mkvmuxer::Colour::kBt2020NonConstantLuminance:
|
||||
case mkvmuxer::Colour::kBt2020ConstantLuminance:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsChromaSitingHorzValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCsh:
|
||||
case mkvmuxer::Colour::kLeftCollocated:
|
||||
case mkvmuxer::Colour::kHalfCsh:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsChromaSitingVertValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCsv:
|
||||
case mkvmuxer::Colour::kTopCollocated:
|
||||
case mkvmuxer::Colour::kHalfCsv:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsColourRangeValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCr:
|
||||
case mkvmuxer::Colour::kBroadcastRange:
|
||||
case mkvmuxer::Colour::kFullRange:
|
||||
case mkvmuxer::Colour::kMcTcDefined:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsTransferCharacteristicsValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kIturBt709Tc:
|
||||
case mkvmuxer::Colour::kUnspecifiedTc:
|
||||
case mkvmuxer::Colour::kReservedTc:
|
||||
case mkvmuxer::Colour::kGamma22Curve:
|
||||
case mkvmuxer::Colour::kGamma28Curve:
|
||||
case mkvmuxer::Colour::kSmpte170MTc:
|
||||
case mkvmuxer::Colour::kSmpte240MTc:
|
||||
case mkvmuxer::Colour::kLinear:
|
||||
case mkvmuxer::Colour::kLog:
|
||||
case mkvmuxer::Colour::kLogSqrt:
|
||||
case mkvmuxer::Colour::kIec6196624:
|
||||
case mkvmuxer::Colour::kIturBt1361ExtendedColourGamut:
|
||||
case mkvmuxer::Colour::kIec6196621:
|
||||
case mkvmuxer::Colour::kIturBt202010bit:
|
||||
case mkvmuxer::Colour::kIturBt202012bit:
|
||||
case mkvmuxer::Colour::kSmpteSt2084:
|
||||
case mkvmuxer::Colour::kSmpteSt4281Tc:
|
||||
case mkvmuxer::Colour::kAribStdB67Hlg:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsPrimariesValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kReservedP0:
|
||||
case mkvmuxer::Colour::kIturBt709P:
|
||||
case mkvmuxer::Colour::kUnspecifiedP:
|
||||
case mkvmuxer::Colour::kReservedP3:
|
||||
case mkvmuxer::Colour::kIturBt470M:
|
||||
case mkvmuxer::Colour::kIturBt470Bg:
|
||||
case mkvmuxer::Colour::kSmpte170MP:
|
||||
case mkvmuxer::Colour::kSmpte240MP:
|
||||
case mkvmuxer::Colour::kFilm:
|
||||
case mkvmuxer::Colour::kIturBt2020:
|
||||
case mkvmuxer::Colour::kSmpteSt4281P:
|
||||
case mkvmuxer::Colour::kJedecP22Phosphors:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace mkvmuxer
|
||||
#endif // ESP32
|
117
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h
Normal file
117
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h
Normal file
@ -0,0 +1,117 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
#ifndef MKVMUXER_MKVMUXERUTIL_H_
|
||||
#define MKVMUXER_MKVMUXERUTIL_H_
|
||||
#ifdef ESP32
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "mkvmuxertypes.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
class Cluster;
|
||||
class Frame;
|
||||
class IMkvWriter;
|
||||
|
||||
// TODO(tomfinegan): mkvmuxer:: integer types continue to be used here because
|
||||
// changing them causes pain for downstream projects. It would be nice if a
|
||||
// solution that allows removal of the mkvmuxer:: integer types while avoiding
|
||||
// pain for downstream users of libwebm. Considering that mkvmuxerutil.{cc,h}
|
||||
// are really, for the great majority of cases, EBML size calculation and writer
|
||||
// functions, perhaps a more EBML focused utility would be the way to go as a
|
||||
// first step.
|
||||
|
||||
const uint64 kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL;
|
||||
const int64 kMaxBlockTimecode = 0x07FFFLL;
|
||||
|
||||
// Writes out |value| in Big Endian order. Returns 0 on success.
|
||||
int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size);
|
||||
|
||||
// Writes out |f| in Big Endian order. Returns 0 on success.
|
||||
int32 SerializeFloat(IMkvWriter* writer, float f);
|
||||
|
||||
// Returns the size in bytes of the element.
|
||||
int32 GetUIntSize(uint64 value);
|
||||
int32 GetIntSize(int64 value);
|
||||
int32 GetCodedUIntSize(uint64 value);
|
||||
uint64 EbmlMasterElementSize(uint64 type, uint64 value);
|
||||
uint64 EbmlElementSize(uint64 type, int64 value);
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value);
|
||||
uint64 EbmlElementSize(uint64 type, float value);
|
||||
uint64 EbmlElementSize(uint64 type, const char* value);
|
||||
uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size);
|
||||
uint64 EbmlDateElementSize(uint64 type);
|
||||
|
||||
// Returns the size in bytes of the element assuming that the element was
|
||||
// written using |fixed_size| bytes. If |fixed_size| is set to zero, then it
|
||||
// computes the necessary number of bytes based on |value|.
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size);
|
||||
|
||||
// Creates an EBML coded number from |value| and writes it out. The size of
|
||||
// the coded number is determined by the value of |value|. |value| must not
|
||||
// be in a coded form. Returns 0 on success.
|
||||
int32 WriteUInt(IMkvWriter* writer, uint64 value);
|
||||
|
||||
// Creates an EBML coded number from |value| and writes it out. The size of
|
||||
// the coded number is determined by the value of |size|. |value| must not
|
||||
// be in a coded form. Returns 0 on success.
|
||||
int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size);
|
||||
|
||||
// Output an Mkv master element. Returns true if the element was written.
|
||||
bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 value, uint64 size);
|
||||
|
||||
// Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the
|
||||
// ID to |SerializeInt|. Returns 0 on success.
|
||||
int32 WriteID(IMkvWriter* writer, uint64 type);
|
||||
|
||||
// Output an Mkv non-master element. Returns true if the element was written.
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
|
||||
uint64 size);
|
||||
bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value);
|
||||
|
||||
// Output an Mkv non-master element using fixed size. The element will be
|
||||
// written out using exactly |fixed_size| bytes. If |fixed_size| is set to zero
|
||||
// then it computes the necessary number of bytes based on |value|. Returns true
|
||||
// if the element was written.
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value,
|
||||
uint64 fixed_size);
|
||||
|
||||
// Output a Mkv Frame. It decides the correct element to write (Block vs
|
||||
// SimpleBlock) based on the parameters of the Frame.
|
||||
uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame,
|
||||
Cluster* cluster);
|
||||
|
||||
// Output a void element. |size| must be the entire size in bytes that will be
|
||||
// void. The function will calculate the size of the void header and subtract
|
||||
// it from |size|.
|
||||
uint64 WriteVoidElement(IMkvWriter* writer, uint64 size);
|
||||
|
||||
// Returns the version number of the muxer in |major|, |minor|, |build|,
|
||||
// and |revision|.
|
||||
void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision);
|
||||
|
||||
// Returns a random number to be used for UID, using |seed| to seed
|
||||
// the random-number generator (see POSIX rand_r() for semantics).
|
||||
uint64 MakeUID(unsigned int* seed);
|
||||
|
||||
// Colour field validation helpers. All return true when |value| is valid.
|
||||
bool IsMatrixCoefficientsValueValid(uint64_t value);
|
||||
bool IsChromaSitingHorzValueValid(uint64_t value);
|
||||
bool IsChromaSitingVertValueValid(uint64_t value);
|
||||
bool IsColourRangeValueValid(uint64_t value);
|
||||
bool IsTransferCharacteristicsValueValid(uint64_t value);
|
||||
bool IsPrimariesValueValid(uint64_t value);
|
||||
|
||||
} // namespace mkvmuxer
|
||||
|
||||
#endif // ESP32
|
||||
#endif // MKVMUXER_MKVMUXERUTIL_H_
|
101
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc
Normal file
101
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc
Normal file
@ -0,0 +1,101 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#include "mkvwriter.h"
|
||||
#ifdef ESP32
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <share.h> // for _SH_DENYWR
|
||||
#endif
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
|
||||
|
||||
MkvWriter::MkvWriter(File* fp) : file_(fp), writer_owns_file_(false), use_write_cb_(false) {}
|
||||
|
||||
MkvWriter::MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length)) : write_cb_(cb), cb_userdata_(userdata), writer_owns_file_(false), use_write_cb_(true) {}
|
||||
|
||||
MkvWriter::~MkvWriter() { Close(); }
|
||||
|
||||
int32 MkvWriter::Write(const void* buffer, uint32 length) {
|
||||
if (!file_ && !write_cb_)
|
||||
return -1;
|
||||
|
||||
if (length == 0)
|
||||
return 0;
|
||||
|
||||
if (buffer == NULL)
|
||||
return -1;
|
||||
|
||||
size_t bytes_written = 0;
|
||||
if(!use_write_cb_){
|
||||
bytes_written = file_->write((const uint8_t *)buffer, (size_t)length);
|
||||
} else {
|
||||
bytes_written = write_cb_(cb_userdata_, buffer, length);
|
||||
write_cb_written_ += bytes_written;
|
||||
}
|
||||
|
||||
return (bytes_written == length) ? 0 : -1;
|
||||
}
|
||||
|
||||
bool MkvWriter::Open(const char* filename) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void MkvWriter::Close() {
|
||||
if (file_ && writer_owns_file_) {
|
||||
file_->close();
|
||||
}
|
||||
file_ = NULL;
|
||||
}
|
||||
|
||||
int64 MkvWriter::Position() const {
|
||||
if (!file_ || use_write_cb_)
|
||||
return write_cb_written_;
|
||||
|
||||
return file_->position();
|
||||
}
|
||||
|
||||
int32 MkvWriter::Position(int64 position) {
|
||||
if (use_write_cb_ && write_cb_written_ == position)
|
||||
return 0;
|
||||
if (!file_ || use_write_cb_)
|
||||
return -1;
|
||||
|
||||
return file_->seek(position);
|
||||
|
||||
// #ifdef _MSC_VER
|
||||
// return _fseeki64(file_, position, SEEK_SET);
|
||||
// #elif defined(_WIN32)
|
||||
// return fseeko64(file_, static_cast<off_t>(position), SEEK_SET);
|
||||
// #elif !(defined(__ANDROID__) && __ANDROID_API__ < 24 && !defined(__LP64__) && \
|
||||
// defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64)
|
||||
// // POSIX.1 has fseeko and ftello. fseeko and ftello are not available before
|
||||
// // Android API level 24. See
|
||||
// // https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md
|
||||
// // return fseeko(file_, static_cast<off_t>(position), SEEK_SET);
|
||||
// #else
|
||||
// return fseek(file_, static_cast<long>(position), SEEK_SET);
|
||||
// #endif
|
||||
// return -1;
|
||||
}
|
||||
|
||||
bool MkvWriter::Seekable() const {
|
||||
if (!file_ || use_write_cb_)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MkvWriter::ElementStartNotify(uint64, int64) {}
|
||||
|
||||
} // namespace mkvmuxer
|
||||
#endif // ESP32
|
60
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h
Normal file
60
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h
Normal file
@ -0,0 +1,60 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef MKVMUXER_MKVWRITER_H_
|
||||
#define MKVMUXER_MKVWRITER_H_
|
||||
|
||||
#ifdef ESP32
|
||||
#include <stdio.h>
|
||||
|
||||
#include <FS.h>
|
||||
#include "mkvmuxer.h"
|
||||
#include "mkvmuxertypes.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
// Default implementation of the IMkvWriter interface on Windows.
|
||||
class MkvWriter : public IMkvWriter {
|
||||
public:
|
||||
MkvWriter();
|
||||
MkvWriter(File* fp);
|
||||
MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length));
|
||||
virtual ~MkvWriter();
|
||||
|
||||
// IMkvWriter interface
|
||||
virtual int64 Position() const;
|
||||
virtual int32 Position(int64 position);
|
||||
virtual bool Seekable() const;
|
||||
virtual int32 Write(const void* buffer, uint32 length);
|
||||
virtual void ElementStartNotify(uint64 element_id, int64 position);
|
||||
|
||||
// Creates and opens a file for writing. |filename| is the name of the file
|
||||
// to open. This function will overwrite the contents of |filename|. Returns
|
||||
// true on success.
|
||||
bool Open(const char* filename);
|
||||
|
||||
// Closes an opened file.
|
||||
void Close();
|
||||
|
||||
private:
|
||||
// File handle to output file.
|
||||
File* file_;
|
||||
// Callback function to output stream.
|
||||
int(*write_cb_)(void* userdata, const void* buffer, uint32 length);
|
||||
void* cb_userdata_;
|
||||
bool writer_owns_file_;
|
||||
bool use_write_cb_;
|
||||
uint32_t write_cb_written_ = 0;
|
||||
|
||||
LIBWEBM_DISALLOW_COPY_AND_ASSIGN(MkvWriter);
|
||||
};
|
||||
|
||||
} // namespace mkvmuxer
|
||||
|
||||
#endif // ESP32
|
||||
#endif // MKVMUXER_MKVWRITER_H_
|
8107
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc
Normal file
8107
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc
Normal file
File diff suppressed because it is too large
Load Diff
1147
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h
Normal file
1147
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -90,12 +90,12 @@ int op_test(OpusHead *_head,
|
||||
ogg_sync_init(&oy);
|
||||
data=ogg_sync_buffer(&oy,(long)_initial_bytes);
|
||||
if(data!=NULL){
|
||||
ogg_stream_state *os = (ogg_stream_state*)malloc(sizeof(ogg_stream_state));
|
||||
ogg_stream_state os;
|
||||
ogg_page og;
|
||||
int ret;
|
||||
memcpy(data,_initial_data,_initial_bytes);
|
||||
ogg_sync_wrote(&oy,(long)_initial_bytes);
|
||||
ogg_stream_init(os,-1);
|
||||
ogg_stream_init(&os,-1);
|
||||
err=OP_FALSE;
|
||||
do{
|
||||
ogg_packet op;
|
||||
@ -104,11 +104,11 @@ int op_test(OpusHead *_head,
|
||||
if(ret<0)continue;
|
||||
/*Stop if we run out of data.*/
|
||||
if(!ret)break;
|
||||
ogg_stream_reset_serialno(os,ogg_page_serialno(&og));
|
||||
ogg_stream_pagein(os,&og);
|
||||
ogg_stream_reset_serialno(&os,ogg_page_serialno(&og));
|
||||
ogg_stream_pagein(&os,&og);
|
||||
/*Only process the first packet on this page (if it's a BOS packet,
|
||||
it's required to be the only one).*/
|
||||
if(ogg_stream_packetout(os,&op)==1){
|
||||
if(ogg_stream_packetout(&os,&op)==1){
|
||||
if(op.b_o_s){
|
||||
ret=opus_head_parse(_head,op.packet,op.bytes);
|
||||
/*If this didn't look like Opus, keep going.*/
|
||||
@ -122,8 +122,7 @@ int op_test(OpusHead *_head,
|
||||
}
|
||||
}
|
||||
while(err==OP_FALSE);
|
||||
ogg_stream_clear(os);
|
||||
free(os);
|
||||
ogg_stream_clear(&os);
|
||||
}
|
||||
else err=OP_EFAULT;
|
||||
ogg_sync_clear(&oy);
|
||||
@ -836,7 +835,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
ogg_int64_t cur_page_gp;
|
||||
ogg_uint32_t serialno;
|
||||
opus_int32 total_duration;
|
||||
int *durations = (int*)malloc(255 * sizeof(int));
|
||||
int durations[255];
|
||||
int cur_page_eos;
|
||||
int op_count;
|
||||
int pi;
|
||||
@ -853,31 +852,26 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
Otherwise there are no audio data packets in the whole logical stream.*/
|
||||
if(OP_UNLIKELY(page_offset<0)){
|
||||
/*Fail if there was a read error.*/
|
||||
if(page_offset<OP_FALSE) { free(durations); return (int)page_offset; }
|
||||
if(page_offset<OP_FALSE)return (int)page_offset;
|
||||
/*Fail if the pre-skip is non-zero, since it's asking us to skip more
|
||||
samples than exist.*/
|
||||
if(_link->head.pre_skip>0) {free(durations); return OP_EBADTIMESTAMP;}
|
||||
if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP;
|
||||
_link->pcm_file_offset=0;
|
||||
/*Set pcm_end and end_offset so we can skip the call to
|
||||
op_find_final_pcm_offset().*/
|
||||
_link->pcm_start=_link->pcm_end=0;
|
||||
_link->end_offset=_link->data_offset;
|
||||
free(durations);
|
||||
return 0;
|
||||
}
|
||||
/*Similarly, if we hit the next link in the chain, we've gone too far.*/
|
||||
if(OP_UNLIKELY(ogg_page_bos(_og))){
|
||||
if(_link->head.pre_skip>0) {
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP;
|
||||
/*Set pcm_end and end_offset so we can skip the call to
|
||||
op_find_final_pcm_offset().*/
|
||||
_link->pcm_file_offset=0;
|
||||
_link->pcm_start=_link->pcm_end=0;
|
||||
_link->end_offset=_link->data_offset;
|
||||
/*Tell the caller we've got a buffered page for them.*/
|
||||
free(durations);
|
||||
return 1;
|
||||
}
|
||||
/*Ignore pages from other streams (not strictly necessary, because of the
|
||||
@ -907,10 +901,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
cur_page_gp=_of->op[op_count-1].granulepos;
|
||||
/*But getting a packet without a valid granule position on the page is not
|
||||
okay.*/
|
||||
if(cur_page_gp==-1) {
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
if(cur_page_gp==-1)return OP_EBADTIMESTAMP;
|
||||
cur_page_eos=_of->op[op_count-1].e_o_s;
|
||||
if(OP_LIKELY(!cur_page_eos)){
|
||||
/*The EOS flag wasn't set.
|
||||
@ -919,7 +910,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
if(OP_UNLIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){
|
||||
/*The starting granule position MUST not be smaller than the amount of
|
||||
audio on the first page with completed packets.*/
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
}
|
||||
@ -933,7 +923,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
/*However, the end-trimming MUST not ask us to trim more samples than
|
||||
exist after applying the pre-skip.*/
|
||||
if(OP_UNLIKELY(op_granpos_cmp(cur_page_gp,_link->head.pre_skip)<0)){
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
}
|
||||
@ -968,7 +957,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
_link->pcm_file_offset=0;
|
||||
_of->prev_packet_gp=_link->pcm_start=pcm_start;
|
||||
_of->prev_page_offset=page_offset;
|
||||
free(durations);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1403,34 +1391,32 @@ static int op_open_seekable2_impl(OggOpusFile *_of){
|
||||
/*64 seek records should be enough for anybody.
|
||||
Actually, with a bisection search in a 63-bit range down to OP_CHUNK_SIZE
|
||||
granularity, much more than enough.*/
|
||||
OpusSeekRecord *sr = (OpusSeekRecord*)malloc(64 * sizeof(OpusSeekRecord));
|
||||
OpusSeekRecord sr[64];
|
||||
opus_int64 data_offset;
|
||||
int ret;
|
||||
/*We can seek, so set out learning all about this file.*/
|
||||
(*_of->callbacks.seek)(_of->stream,0,SEEK_END);
|
||||
_of->offset=_of->end=(*_of->callbacks.tell)(_of->stream);
|
||||
if(OP_UNLIKELY(_of->end<0)){free(sr); return OP_EREAD;}
|
||||
if(OP_UNLIKELY(_of->end<0))return OP_EREAD;
|
||||
data_offset=_of->links[0].data_offset;
|
||||
if(OP_UNLIKELY(_of->end<data_offset)){ free(sr); return OP_EBADLINK;}
|
||||
if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK;
|
||||
/*Get the offset of the last page of the physical bitstream, or, if we're
|
||||
lucky, the last Opus page of the first link, as most Ogg Opus files will
|
||||
contain a single logical bitstream.*/
|
||||
ret=op_get_prev_page_serial(_of,sr,_of->end,
|
||||
_of->links[0].serialno,_of->serialnos,_of->nserialnos);
|
||||
if(OP_UNLIKELY(ret<0)){free(sr); return ret;}
|
||||
if(OP_UNLIKELY(ret<0))return ret;
|
||||
/*If there's any trailing junk, forget about it.*/
|
||||
_of->end=sr[0].offset+sr[0].size;
|
||||
if(OP_UNLIKELY(_of->end<data_offset)){free(sr); return OP_EBADLINK;}
|
||||
if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK;
|
||||
/*Now enumerate the bitstream structure.*/
|
||||
ret = op_bisect_forward_serialno(_of,data_offset,sr,sizeof(sr)/sizeof(*sr),
|
||||
return op_bisect_forward_serialno(_of,data_offset,sr,sizeof(sr)/sizeof(*sr),
|
||||
&_of->serialnos,&_of->nserialnos,&_of->cserialnos);
|
||||
free(sr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int op_open_seekable2(OggOpusFile *_of){
|
||||
ogg_sync_state oy_start;
|
||||
ogg_stream_state *os_start = (ogg_stream_state*)malloc(sizeof(ogg_stream_state));
|
||||
ogg_stream_state os_start;
|
||||
ogg_packet *op_start;
|
||||
opus_int64 prev_page_offset;
|
||||
opus_int64 start_offset;
|
||||
@ -1449,9 +1435,9 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
start_op_count=_of->op_count;
|
||||
/*This is a bit too large to put on the stack unconditionally.*/
|
||||
op_start=(ogg_packet *)_ogg_malloc(sizeof(*op_start)*start_op_count);
|
||||
if(op_start==NULL){free(os_start); return OP_EFAULT;}
|
||||
if(op_start==NULL)return OP_EFAULT;
|
||||
*&oy_start=_of->oy;
|
||||
*os_start=_of->os;
|
||||
*&os_start=_of->os;
|
||||
prev_page_offset=_of->prev_page_offset;
|
||||
start_offset=_of->offset;
|
||||
memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count);
|
||||
@ -1463,7 +1449,7 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
ogg_stream_clear(&_of->os);
|
||||
ogg_sync_clear(&_of->oy);
|
||||
*&_of->oy=*&oy_start;
|
||||
*&_of->os=*os_start;
|
||||
*&_of->os=*&os_start;
|
||||
_of->offset=start_offset;
|
||||
_of->op_count=start_op_count;
|
||||
memcpy(_of->op,op_start,sizeof(*_of->op)*start_op_count);
|
||||
@ -1471,10 +1457,9 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
_of->prev_packet_gp=_of->links[0].pcm_start;
|
||||
_of->prev_page_offset=prev_page_offset;
|
||||
_of->cur_discard_count=_of->links[0].head.pre_skip;
|
||||
if(OP_UNLIKELY(ret<0)){free(os_start); return ret;}
|
||||
if(OP_UNLIKELY(ret<0))return ret;
|
||||
/*And restore the position indicator.*/
|
||||
ret=(*_of->callbacks.seek)(_of->stream,op_position(_of),SEEK_SET);
|
||||
free(os_start);
|
||||
return OP_UNLIKELY(ret<0)?OP_EREAD:0;
|
||||
}
|
||||
|
||||
@ -1995,7 +1980,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
ogg_stream_pagein(&_of->os,&og);
|
||||
if(OP_LIKELY(_of->ready_state>=OP_INITSET)){
|
||||
opus_int32 total_duration;
|
||||
int *durations = (int*)malloc(255 * sizeof(int));
|
||||
int durations[255];
|
||||
int op_count;
|
||||
int report_hole;
|
||||
report_hole=0;
|
||||
@ -2052,7 +2037,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
Proceed to the next link, rather than risk playing back some
|
||||
samples that shouldn't have been played.*/
|
||||
_of->op_count=0;
|
||||
if(report_hole){ free(durations); return OP_HOLE; }
|
||||
if(report_hole)return OP_HOLE;
|
||||
continue;
|
||||
}
|
||||
/*By default discard 80 ms of data after a seek, unless we seek
|
||||
@ -2160,9 +2145,9 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
_of->prev_page_offset=_page_offset;
|
||||
_of->op_count=op_count=pi;
|
||||
}
|
||||
if(report_hole) { free(durations); return OP_HOLE; }
|
||||
if(report_hole)return OP_HOLE;
|
||||
/*If end-trimming didn't trim all the packets, we're done.*/
|
||||
if(op_count>0) { free(durations); return 0; }
|
||||
if(op_count>0)return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3016,7 +3001,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
#endif
|
||||
|
||||
#if defined(OP_FIXED_POINT)
|
||||
#if 0
|
||||
|
||||
/*Matrices for downmixing from the supported channel counts to stereo.
|
||||
The matrices with 5 or more channels are normalized to a total volume of 2.0,
|
||||
since most mixes sound too quiet if normalized to 1.0 (as there is generally
|
||||
@ -3025,6 +3010,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
32-bit number.*/
|
||||
static const opus_int16 OP_STEREO_DOWNMIX_Q14
|
||||
[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
#if OP_NCHANNELS_MAX>2
|
||||
/*3.0*/
|
||||
{
|
||||
{9598,0},{6786,6786},{0,9598}
|
||||
@ -3051,8 +3037,9 @@ static const opus_int16 OP_STEREO_DOWNMIX_Q14
|
||||
{6368,0},{4502,4502},{0,6368},{5515,3183},{3183,5515},{5515,3183},
|
||||
{3183,5515},{4502,4502}
|
||||
}
|
||||
#endif // OP_NCHANNELS_MAX>2
|
||||
};
|
||||
#endif
|
||||
|
||||
int op_read(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size,int *_li){
|
||||
return op_read_native(_of,_pcm,_buf_size,_li);
|
||||
}
|
||||
@ -3070,7 +3057,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz,
|
||||
for(i=0;i<_nsamples;i++)dst[2*i+0]=dst[2*i+1]=_src[i];
|
||||
}
|
||||
else{
|
||||
#if 0
|
||||
for(i=0;i<_nsamples;i++){
|
||||
opus_int32 l;
|
||||
opus_int32 r;
|
||||
@ -3086,8 +3072,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz,
|
||||
dst[2*i+0]=(opus_int16)OP_CLAMP(-32768,l+8192>>14,32767);
|
||||
dst[2*i+1]=(opus_int16)OP_CLAMP(-32768,r+8192>>14,32767);
|
||||
}
|
||||
#endif
|
||||
// noop, removed for RAM savings
|
||||
}
|
||||
}
|
||||
return _nsamples;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user