ADVERTISEMENT

espurna-dev-2020-01-31.zip

Mini-test i teardown wtyczkowego watomierza/licznika energii na układzie V9261F

https://obrazki.elektroda.pl/8528415000_1580309773_thumb.jpg Witajcie moi drodzy. Dzisiaj przedstawię wtyczkowy miernik energii który zakupiłem w Chinach. Jest to proste urządzenie, które może nam pokazać jakie mamy napięcie w sieci oraz jaki prąd i moc pobiera podłączone przez niego urządzenie. Dodatkowo wykonam mini-test jego dokładności z żarówkami, by chociaż troszkę określić czy daje on sensowne rezultaty. Na koniec go rozkręcę i pokażę dobrej jakości zdjęcia płytek ze środka. Oferta zakupu watomierza Watomierz znalazłem na eBayu. Niestety nie posiada żadnego dobrze widocznego modelu. Trudno też określić jego producenta. Znalazłem go pod hasłem: Plug in Power Meter Measuring Current Voltage Watt Analyzer Energy Meter Socket Tak wygląda oferta na której go kupiłem: https://obrazki.elektroda.pl/9977711900_1580309060_thumb.jpg Cena trochę wzrosła od czasu gdy go kupiłem. Poniższy zrzut ekranu przedstawia stan oferty z dnia kupna: https://obrazki.elektroda.pl/9516904400_1580309149_thumb.jpg Oferta pozwala nam wybrać jaki rodzaj wtyczki/gniazda potrzebujemy. https://obrazki.elektroda.pl/2894863600_1580309586_thumb.jpg Poszczególne wersje watomierza prezentują się tak: - wersja z wtyczką EU: https://obrazki.elektroda.pl/8528415000_1580309773_thumb.jpg - wersja z wtyczką US: https://obrazki.elektroda.pl/8162502300_1580309799_thumb.jpg - wersja z wtyczką UK: https://obrazki.elektroda.pl/2090502800_1580309818_thumb.jpg Wybrałem oczywiście wersję z wtyczką EU, z tą z bolcem od uziemienia, tak jak na obrazku z oferty. Przesyłka i pierwszy testy Paczka przyszła po ponad miesiącu. Listonosz po prostu wsadził ją do skrzynki. https://obrazki.elektroda.pl/3997327000_1580310885_thumb.jpg W środku paczki było zabezpieczone folią bąbelkową pudełko: https://obrazki.elektroda.pl/3642503600_1580310924_thumb.jpg To dość nietypowe, jak na paczki z Chin. Z reguły przesyłają produkty nawet bez pudełek. https://obrazki.elektroda.pl/9137062400_1580310993_thumb.jpg https://obrazki.elektroda.pl/1711390700_1580310993_thumb.jpg W pudełku był odpowiednio zabezpieczony miernik i instrukcja: https://obrazki.elektroda.pl/4341637700_1580311059_thumb.jpg Załączona instrukcja jest tylko w języku angielskim, napisana dość poprawnie, a nawet bardzo dobrze jak na produkt z Chin: https://obrazki.elektroda.pl/4175046600_1580310116_thumb.jpg https://obrazki.elektroda.pl/9785892900_1580310115_thumb.jpg Miernik po wypakowaniu. Tutaj nastąpiła trochę niemiła niespodzianka, bo dostałem nieco inny typ gniazda/wtyku niż na zdjęciach z oferty. Mam na myśli podłączenie ziemi, co zresztą widać na zdjęciach. Miałem dostać tzw. gniazdo francuskie/belgijskie (z bolcem) a dostałem niemieckie/schuko. https://obrazki.elektroda.pl/7585240900_1580311215_thumb.jpg https://obrazki.elektroda.pl/3046763700_1580311214_thumb.jpg Miernik do działania wymaga baterii, które tutaj były załączone w zestawie, ale zabezpieczone przed zużyciem poprzez mały pasek folii: https://obrazki.elektroda.pl/6308680500_1580311292_thumb.jpg Miernik korzysta z dwóch baterii LR44 MAXTEL MADE IN PRC: https://obrazki.elektroda.pl/3337504700_1580337677_thumb.jpg https://obrazki.elektroda.pl/5794948000_1580337676_thumb.jpg Specyfikacja tych baterii: https://obrazki.elektroda.pl/5849359700_1580381304_thumb.jpg Po wyjęciu folii zabezpieczającej baterie miernik jest gotowy do pracy. Nie trzeba niczego dokupować. Dodatkowo sprawdziłem, czy miernik działa bez tych baterii - tak, działa i poprawnie mierzy zużycie energii. Te baterie pewnie tylko podtrzymują jego pamięć i/lub czas. Co pokazuje miernik? Na początek sprawdziłem co w praktyce pokazuje miernik i na ile jest to zgodne z opisem z instrukcji. Użyłem do tego takiej żarówki: https://obrazki.elektroda.pl/8316901500_1580316279_thumb.jpg I gniazda na nią (swoją drogą też kupionego na eBayu): https://obrazki.elektroda.pl/9239807300_1580315794_thumb.jpg https://obrazki.elektroda.pl/2722657300_1580315795_thumb.jpg https://obrazki.elektroda.pl/4801492600_1580315795_thumb.jpg Cały układ gotowy do testów: https://obrazki.elektroda.pl/1565297900_1580316279_thumb.jpg Miernik pokazuje: - (oczywiście) moc: https://obrazki.elektroda.pl/1279306400_1580316141_thumb.jpg - napięcie sieciowe: https://obrazki.elektroda.pl/9120573400_1580315858_thumb.jpg - częstotliwość z sieci: https://obrazki.elektroda.pl/8133666300_1580315911_thumb.jpg - prąd pobierany z sieci: https://obrazki.elektroda.pl/7431912900_1580315947_thumb.jpg - "cos phi" (cos φ, współczynnik mocy): https://obrazki.elektroda.pl/4138829000_1580316105_thumb.jpg Na każdym zdjęciu widać też że miernik mierzy czas jak długo jest włączony do sieci. Dodatkowo miernik pokazuje maksymalne wartości mocy, prądu itp. pamiętane od początku pomiaru (z adnotacją MAX.): https://obrazki.elektroda.pl/4114671900_1580469720_thumb.jpg Bardziej zainteresowanych zaawansowanymi funkcjami (zliczaniem kosztu energii) odsyłam do instrukcji miernika załączonej w tym temacie jako zdjęcia. Mini-test: pomiary zużycia energii przez żarówki Najbardziej interesowała mnie kwestia dokładności pomiaru mocy przez ten miernik. Nie mam innych mierników, których mógłbym użyć w celu porównania wyników, więc uznałem że po prostu potestuję go z różnymi żarówkami jakie mam w warsztacie. Nie jest to najlepszy sposób ale musiałem się do niego uciec z braku lepszych rozwiązań. Na początek świetlówka OSRAM DULUXSTAR 21W/825 220-240V Made in China: https://obrazki.elektroda.pl/8922439300_1580312316_thumb.jpg Testujemy: https://obrazki.elektroda.pl/1963330000_1580312340_thumb.jpg https://obrazki.elektroda.pl/5906908800_1580312343_thumb.jpg Wyniki pomiaru: 20.4W Moc z etykiety: 21W Dalej żarówka ledowa AMM-E14-G45 -5W-CW G45 5W 6500K E14 AC 220-240V 50Z: https://obrazki.elektroda.pl/7796326100_1580312769_thumb.jpg https://obrazki.elektroda.pl/1824423900_1580312771_thumb.jpg https://obrazki.elektroda.pl/5678376900_1580312767_thumb.jpg Wyniki pomiaru: 4.9W Moc z etykiety: 5W Następnie żarówka biała zimna LED AMM 12W E27 LITE: https://obrazki.elektroda.pl/4636132500_1580313164_thumb.jpg https://obrazki.elektroda.pl/7715847400_1580313165_thumb.jpg https://obrazki.elektroda.pl/8261318700_1580313155_thumb.jpg Wyniki pomiaru: 11.5W Moc z etykiety: 12W Teraz klasyczna żarówka Spectrum 230V/40W z gwintem E14: https://obrazki.elektroda.pl/5282533300_1580312563_thumb.jpg https://obrazki.elektroda.pl/3906592400_1580312562_thumb.jpg https://obrazki.elektroda.pl/7368334100_1580312558_thumb.jpg Wyniki pomiaru: 38W Moc z etykiety: 40W Dalej bratnia dla niej żarówka Spectrum 230V/60W: https://obrazki.elektroda.pl/3820906000_1580312478_thumb.jpg https://obrazki.elektroda.pl/7667140600_1580312479_thumb.jpg https://obrazki.elektroda.pl/7883803200_1580312477_thumb.jpg Wyniki pomiaru: 57.4W Moc z etykiety: 60W Klasyczna żarówka 60W z gwintem E27 (napisy na niej się niestety zamazały ze starości): https://obrazki.elektroda.pl/3097577900_1580346559_thumb.jpg https://obrazki.elektroda.pl/4629635200_1580346522_thumb.jpg Wyniki pomiaru: 53.7W Moc z etykiety: 60W Wyniki wszystkich powyższych testów umieściłem w tabelce: Żarówka Moc z opakowania Wynik pomiaru RóżnicaOSRAM DULUXSTAR 21W/82521W20.4W3%AMM-E14-G45 -5W-CW5W4.9W2%LED AMM 12W E27 LITE12W11.5W 4%Spectrum 230V/40W40W38W5%Spectrum 230V/60W60W57.4W4%Klasyczna 60W E2760W53.7W 10% Od razu rzuca się w oczy, że zmierzona moc jest zawsze mniejsza niż oczekiwana. Przy interpretowaniu tej tabeli należy pamiętać, że na uzyskane wyniki wpływają co najmniej dwie niepewności: pomiaru mocy przez miernik i nominalnej mocy pobieranej przez żarówkę. Do tego jeszcze jest kwestia bieżącej wartości napięcia w sieci. Dlatego uważam, że wyniki są dość dobre, błąd jest praktycznie dla każdego wiersza mniejszy niż 5%. Test z czajnikiem (prawie 2000W) Dodatkowo sprawdziłem jeszcze jak miernik radzi sobie z większymi mocami. Tu nie chodziło już o dokładność, bo w tej kwestii test był niemiarodajny, ale ogólnie o to czy podoła i czy przypadkiem nagle nie zadymi. Do testu użyłem czajnika elektrycznego orava o mocy "max. 2000W": https://obrazki.elektroda.pl/4610677500_1580374151_thumb.jpg https://obrazki.elektroda.pl/4913747800_1580374169_thumb.jpg Miernik pokazał jakieś 1700W. Test ze sztucznym obciążeniem 6.2kOhm Myślałem jeszcze co mogę zrobić by sprawdzić dokładność tego miernika i uznałem, że spróbuję zmierzyć moc/prąd jaka wydzieli się na rezystorze odpowiedniej mocy podłączonym do sieci. Rezystor odpowiedniej mocy wziąłem z mojej kolekcji wylutów ze starych telewizorów CRT: https://obrazki.elektroda.pl/8687152500_1580424059_thumb.jpg Wybrałem wartość 6.2kOhm (akurat miałem taką, z tolerancją 5%): https://obrazki.elektroda.pl/4608288200_1580424121_thumb.jpg https://obrazki.elektroda.pl/4088665900_1580424121_thumb.jpg Zweryfikowałem jego rezystancję multimetrem: https://obrazki.elektroda.pl/2270390900_1580424175_thumb.jpg Przygotowałem z niego (i z kabla od starego telewizora) najprostsze obciążenie, całość zaizolowałem koszulkami termokurczliwymi, ale i tak odradzam jakiekolwiek próby replikowania tego co robię. https://obrazki.elektroda.pl/6692302900_1580424310_thumb.jpg https://obrazki.elektroda.pl/4060121800_1580424311_thumb.jpg Zmierzyłem też napięcie w sieci. Tutaj bardzo przydałoby się mieć lepszy sprzęt pomiarowy, jakiś dobry voltomierz TrueRMS, ale skorzystałem z tego co miałem: https://obrazki.elektroda.pl/5282392100_1580424238_thumb.jpg I ostatecznie rozpocząłem test. Oto wyniki pomiarów miernikiem energii: https://obrazki.elektroda.pl/5402852800_1580424440_thumb.jpg https://obrazki.elektroda.pl/3079432000_1580424442_thumb.jpg https://obrazki.elektroda.pl/4925601000_1580424445_thumb.jpg https://obrazki.elektroda.pl/1554188700_1580424447_thumb.jpg Podsumowując, wtyczkowy watomierz pokazał: - moc 7.6W - napięcie 220.6V - prąd 0.034A - współczynnik mocy 1 (nic dziwnego, to obciążenie ma czysto rezystancyjny charakter) Mój multimetr UT10A pokazał: - napięcie 222.6V - rezystancja 6.2kOhm Bazując na pomiarach UT10A można wyliczyć, że zużycie mocy powinno wynosić: I = U/R I = 222.6V/6200Ohm I = 0.036A P = IU P = 0.036A*222.6V P= 8.0136W Wyliczona, oczekiwana moc wynosi 8.0136W a wtyczkowy watomierz pokazuje 7.6W. Czyli wartość znów zaniżona, jakieś 9% błędu. Zaglądamy do środka miernika - czyli tzw. 'teardown' Na koniec pozwoliłem sobie rozebrać miernik na części i dokładnie obejrzeć jak jest zrobiony. Oczywiście po całym procesie udało się go z powrotem złożyć i dalej jest w pełni funkcjonalny. Obudowa trzyma się na trzech śrubach krzyżakowych oraz na kilku zaczepach. Najpierw odkręciłem śruby: https://obrazki.elektroda.pl/8334432600_1580341567_thumb.jpg https://obrazki.elektroda.pl/9415507000_1580341607_thumb.jpg Potem delikatnie podważyłem pokrywę płaskim śrubokrętem. Trzymała się jeszcze na zaczepach: https://obrazki.elektroda.pl/2058146400_1580341655_thumb.jpg W ten sposób ukazał mi się środek miernika: https://obrazki.elektroda.pl/5834490500_1580341778_thumb.jpg Moduł gniazda jest ściągany - nic dziwnego, zapewne w produkcji są dwie wersje z różnym rozmieszczeniem uziemienia (gniazdo 'francuskie' z bolcem uziemiającym oraz gniazdo 'niemieckie' z uziemieniem na blaszkach po bokach). Różnią się one tylko tym modułem. https://obrazki.elektroda.pl/2934488600_1580341777_thumb.jpg W środku znajdują się dwie płytki. Większa z nich to tylko wyświetlacz i przyciski: https://obrazki.elektroda.pl/2058381800_1580343864_thumb.jpg https://obrazki.elektroda.pl/9026805400_1580343864_thumb.jpg Druga, mniejsza płytka, ma bardzo dużo elementów po spodniej stronie. Nie widać tego na pierwszy rzut oka. https://obrazki.elektroda.pl/7631820600_1580343922_thumb.jpg Na tym etapie musiałem skorzystać z lutownicy by odlutować kabelki do gniazda baterii. Bez tego nie dałoby się zdjąć głównej płytki: https://obrazki.elektroda.pl/9199704800_1580342248_thumb.jpg I oto główna płytka na zdjęciach dobrej jakości. Najpierw z wierzchu: https://obrazki.elektroda.pl/7552487600_1580371883_thumb.jpg https://obrazki.elektroda.pl/4819408600_1580371872_thumb.jpg Od razu rzuca się w oczy bocznik (ang. shunt) będący precyzyjnym rezystorem o małym oporze służącym do pomiaru prądu. Pomiar prądu jest realizowany jako pomiar spadku napięcia na nim a potem prąd liczony jest z prawa Ohma (znamy spadek napięcia i rezystancję, więc prąd można policzyć). Oczywiście miernik musi wykonywać dużo pomiarów w jednostce czasu ze względu na to, że w sieci mamy (mniej lub bardziej) sinusoidę. Widać też rezonator kwarcowy 6.5536MHz (ta wartość nie jest przypadkowa - 2^16 = 65536, używają go do zliczania czasu). https://obrazki.elektroda.pl/1883540000_1580371984_thumb.jpg Obok widoczny jest kondensator elektrolityczny 220uF 35V. A ten duży żółty kondensator to MEX/TENTA MKP 0.33uF X2 275VAC: https://obrazki.elektroda.pl/6309135700_1580372067_thumb.jpg I co najważniejsze - od spodu. Widać bardzo dużo elementów SMD (w montażu powierzchniowym): https://obrazki.elektroda.pl/7569284800_1580342491_thumb.jpg https://obrazki.elektroda.pl/2523869200_1580342494_thumb.jpg https://obrazki.elektroda.pl/7989879300_1580342496_thumb.jpg Pierwszą rzeczą na jaką zwróciłem uwagę był brak jakiegokolwiek zasilacza impulsowego wewnątrz konstrukcji. Obudowa jest dość duża i z pewnością taki by się tu zmieścił. Ale jak widać nie było potrzeby - tutaj użyty został tzw. 'capacitive dropper', czyli mniej więcej taki układ: https://obrazki.elektroda.pl/4813246100_1580344665_thumb.jpg Ten 'capacitive dropper' tworzony jest zapewne przez ten duży kondensator 0.33uF MKP 275VAC widoczny na zdjęciach wcześniej i rezystor obok niego. Nieco dalej za nim znajdują się diody prostownicze i kondensatory elektrolityczne. Na płytce widać co najmniej dwie diody z oznaczeniem ||A7, czyli po prostu zapewne 1N4007 w obudowie SOD-123: https://obrazki.elektroda.pl/3854850800_1580344635_thumb.jpg https://obrazki.elektroda.pl/3917655600_1580381249_thumb.jpg Obok nich jest też jedna większa dioda Zenera: https://obrazki.elektroda.pl/8147751800_1580344613_thumb.jpg Zapewne 1N4007 prostują napięcie a dioda Zenera je wstępnie wyrównuje. Podsumowując, zasilanie całości widziałbym mniej więcej tak: https://obrazki.elektroda.pl/7115948300_1580344574_thumb.jpg Schemat powyżej jest oczywiście tylko poglądowy, na płytce są dodatkowo rezystory, kondensator elektrolityczny (na 35V, co mówi nam jakiego rzędu napięcia tam występują), co widać dobrze na zdjęciach. Nieco dalej na płytce rzuca się w oczy pojedynczy układ w budowie SOT-89-3L. To 78L05, stabilizator napięcia o wyjściu 5V: https://obrazki.elektroda.pl/5224831400_1580343153_thumb.jpg Jego układ pinów umieszczam poniżej (przydaje się przy śledzeniu połączeń na płytce): https://obrazki.elektroda.pl/8392946700_1580344772_thumb.jpg Można łatwo prześledzić, że jest on podłączony za diodą Zenera. Czyli zasadniczo 'capacitive dropper' wraz z diodą obniża wstępnie napięcie, a sam 78L05 już ostatecznie przygotowuje stabilne 5V. 78L05 zasila serce miernika - układ V9261F 1925 HOPM80 firmy Vangotech. https://obrazki.elektroda.pl/1693740700_1580343225_thumb.jpg Na stronie Vangotech udało mi się znaleźć jego dokładny opis. Podane tam jest jego napięcie zasilania oraz bardziej szczegółowe informacje, a nawet dokładność pomiarów i sposób jego komunikacji z wyświetlaczem/mikrokontrolerem (UART 4800 bps). Zacytuję tu jego opis: · 5.0 V power supply, wide range:3.0 V ~ 5.5 V · Internal reference: 1.188 V (Typical drift 10 ppm/°C) · Typical power consumption in normal operation: 1.9 mA · Three independent oversampling Σ/Δ ADCs: One for voltage, one for current, and one for multifunctional measurements · Support UART communication interface, baud rate: 4800 bps · Crystal frequency: 6.5536 MHz or 3.2768 MHz · Highly metering accuracy: < 0.1% error in total/fundamental active energy over a dynamic range of 5000:1 < 0.1% error in total/fundamental reactive energy over a dynamic range of 3000:1 Supporting GB/T 17215.321-2008, GB/T 17215.322-2008, and GB/T 17215.323-2008 · Supporting various measurements · Supporting software calibration · Supporting current detection · Supporting programmable no-load detection threshold · Accelerating meter calibration when low signal is applied · CF signals output · Current input: Current transformer and shunt resistor · Operating temperature: -40°C ~ +85°C · Storage temperature: -55°C ~ +150°C · Package: 16–SOP Źródło: http://www.vangotech.com/int/product.php?areas=0&bigs=10&smalls=15&id=37 Znalazłem tam też jego notę katalogową: https://obrazki.elektroda.pl/4879960000_1580343563_thumb.jpg Jest ona dostępna po angielsku i po chińsku. Jest w niej dość dużo informacji, m. in. schemat przykładowego zastosowania tego układu: https://obrazki.elektroda.pl/9399309600_1580343684_thumb.jpg Są w niej też dokładne przebiegi czasowe sygnałów i opis komunikacji z tym układem scalonym: https://obrazki.elektroda.pl/9727710800_1580472388_thumb.jpg Zamieszczam tu ją do pobrania: 1006268 Podsumowując teardown, nie jest tak źle w środku, choć widać cięcia kosztów. Układ scalony jest zasilany w sposób prymitywny, niezapewniający separacji galwanicznej od sieci. Nie rzuciły mi się też w oczy żadne zabezpieczenia, zero bezpieczników. Możliwości modyfikacji i użycia miernika na bazie V9261F we własnych projektach Pod hasłem V9261F w sieci można znaleźć posty i tematy innych użytkowników tego miernika energii, którym udało się skomunikować go z ESP8285/ESP8266. Czyli opisany tu miernik zasadniczo jest 'otwarty' i można go użyć w różnorodnych projektach DIY: https://obrazki.elektroda.pl/8955142100_1580470201_thumb.jpg Czyli całość można łatwo przerobić tak by mieć odczyt bezprzewodowy, np. przez WiFi. Dość bogaty opis użycia tego miernika w połączeniu z ESP8266 można znaleźć na stronie tinkerman: https://tinkerman.cat/post/connected-power-meter/ Cała jego modyfikacja opiera się na wpięciu się w linie TX/RX po której przesyłane są dane i przechwytywaniu ich przez ESP. https://obrazki.elektroda.pl/9693070400_1580470733_thumb.jpg Źródło schematu: https://tinkerman.cat/post/connected-power-meter Modyfikacja wygląda tak: https://obrazki.elektroda.pl/8100736900_1580470615_thumb.jpg Źródło zdjęcia: https://tinkerman.cat/post/connected-power-meter Kod modyfikacji jest napisany w Arduino i dostępny na github: https://github.com/HarringayMakerSpace/WiFiPowerMeter Projekt ten jest dostępny na licencji Apache-2.0. Kopia zapasowa repozytorium (stan na 31 stycznia 2020): 1006267 Dodatkowo ten miernik wspierany jest przez projekt ESpurna. ESpurna to modyfikacja firmware ESP8285/ESP8266 przeznaczona dla inteligentnego domu. Też Open Source, kod dostępny na licencji GPL-3.0. Repozytorium Espurna: https://github.com/xoseperez/espurna Kopia zapasowa repozytorium (stan na 31 stycznia 2020): 1006269 Podsumowanie Produkt nie jest zły jak na prosty mierniczek energii dla przeciętnego "Kowalskiego", nie ma profesjonalnej dokładności, ale ostateczny werdykt zostawię Wam. Plusy zakupu: + bateryjki były w zestawie + instrukcja po angielsku była w zestawie + produkt zapakowany był dość dobrze + protokół komunikacji jest znany (datasheet V9261F jest dostępny) + w miarę bogata funkcjonalność (pamięta maksymalne wartości, może liczyć koszt zużytej energii, itp) Minusy: - dostałem troszkę inny typ gniazda niż na zdjęciu z oferty - dość długie oczekiwanie na przesyłkę - cena nie była rewelacyjna - przy tak dużej obudowie pewnie mogliby zmieścić do środka mini-zasilacz impulsowy zamiast tego 'capacitive dropper', ale pewnie wtedy byłoby drożej... - miernik chyba troszkę zaniża wyniki, ale by ostatecznie to osądzić to musiałbym mieć nieco lepszy sprzęt pomiarowy A Wy co sądzicie o tym mierniku? Warto go kupować, czy może znacie lepsze alternatywy? A może ktoś się pokusi o użycie go w projekcie DIY (jako że sposób komunikacji z V9261F jest znany)?


Download file - link to post
  • espurna-dev-2020-01-31.zip
    • .gitmodules
    • travis_script.sh
    • README.md
    • LICENSE
    • .bandit
    • .gitattributes
    • travis_install.sh
    • pre-commit
    • CONTRIBUTING.md
    • SUPPORT.md
    • images
      • devices
        • geiger_wiring_diagram.png
        • blitzwolf-bw-shp2.jpg
        • itead-sonoff-b1.jpg
        • intermittech-quinled-2.6.jpg
        • litesun-la-wf3.jpg
        • mancavemade-esp-live.jpg
        • blitzwolf-bw-shp6.jpg
        • xiaomi-smart-desk-lamp.jpg
        • itead-s26.jpg
        • generic-v9261f.jpg
        • gblife-rgbw-socket.jpg
        • tonbux-xs-ssa06.jpg
        • tonbux-powerstrip02.jpg
        • kmc-70011.jpg
        • itead-sonoff-basic.jpg
        • arilux-al-lc02.jpg
        • arilux-al-lc06.jpg
        • foxel-lightfox-dual.jpg
        • neo-coolcam-wifi.jpg
        • vanzavanzu-smart-wifi-plug-mini.jpg
        • lingan-swa1.jpg
        • itead-sonoff-led.jpg
        • allterco-shelly2.jpg
        • generic-ag-l4-5.jpg
        • yidian-xs-ssa05.jpg
        • schuko-wifi-plug-v2.jpg
        • fornorm-power-strip.jpg
        • iWoole-led-desk-lamp.jpg
        • generic-ag-l4-3.jpg
        • electrodragon-wifi-iot.jpg
        • homecube-16a.jpg
        • itead-s20.jpg
        • itead-sonoff-t1.jpg
        • itead-bn-sz01.jpg
        • jinvoo-valve-sm-aw713.jpg
        • green-esp-relay.jpg
        • itead-sonoff-th.jpg
        • generic-ag-l4-1.jpg
        • exs-wifi-relay-v31.jpg
        • heygo-hy02.jpg
        • arilux-e27.jpg
        • lombex-lux-nova-flash.jpg
        • maxcio-w-de004.jpg
        • hama-wifi-steckdose.jpg
        • wemos-d1-relayshield.jpg
        • iwoole-led-table-lamp.jpg
        • itead-motor.jpg
        • generic-dht11-10.jpg
        • muvit-io-miobulb001-flash-connections.jpg
        • lyasi-rgb-led.jpg
        • schuko-wifi-plug.jpg
        • nodemcu-lolin-v3.jpg
        • lohas-9w.jpg
        • tonbux-mosquito-killer.jpg
        • geiger_espurna_status.png
        • smartlife-mini-smart-socket.jpg
        • iWoole-led-desk-lamp-module-rear.jpg
        • exs-wifi-relay-v50.jpg
        • huacanxing-h801.jpg
        • generic-ag-l4-2.jpg
        • muvit-io-miobulb001-board.jpg
        • geiger_scope_following_pulses.png
        • wion-50055.jpg
        • geiger_grafana_dashboard.png
        • digoo-nx-sp202.jpg
        • itead-slampher.jpg
        • allterco-shelly1.jpg
        • itead-sonoff-sv.jpg
        • aithinker-ai-light.jpg
        • bh-onofre.jpg
        • arilux-al-lc11.jpg
        • teckin-sp20.jpg
        • generic-ag-l4-4.jpg
        • blitzwolf-bw-shp5.jpg
        • lombex-lux-nova.jpg
        • geiger_scope_single_pulse.png
        • itead-1ch-inching.jpg
        • allnet-esp8266-up-relay.jpg
        • orvibo-b25.jpg
        • workchoice-ecoplug.jpg
        • yjzk-2gang-switch.jpg
        • heltec-touch-relay.jpg
        • itead-sonoff-dual.jpg
        • gosund-ws1.jpg
        • muvit-io-miobulb001.jpg
        • iWoole-led-desk-lamp-module-esp-m2.jpg
        • lombex-lux-nova2.jpg
        • tinkerman-espurna-h.jpg
        • jangoe-wifi-relay.jpg
        • lombex-lux-nova-flash-2.jpg
        • itead-sonoff-ifan02.jpg
        • generic-relay-40.jpg
        • zhilde-zld-eu55-w.jpg
        • bestek-mrj1011.jpg
        • pilotak-esp-din.jpg
        • itead-sonoff-rfbridge.jpg
        • arniex-swifitch.jpg
        • iWoole-led-desk-lamp-open2.jpg
        • itead-sonoff-rf.jpg
        • tinkerman-rfm69gw.jpg
        • allterco-shelly 1pm.jpg
        • oukitel-p1.jpg
        • generic-geiger-diy.png
        • itead-sonoff-s31.jpg
        • generic-ds18b20-10.jpg
        • iWoole-led-desk-lamp-open1.jpg
        • tonbux-xs-ssa01.jpg
        • itead-sonoff-4ch-pro.jpg
        • kogan-smarter-home-plug-with-energy-meter.png
        • phyx-esp12-rgbw.jpg
        • ike-espike.jpg
        • generic-rgbled-10.jpg
        • geiger_espurna_configuration.png
        • maxcio-w-us002s.jpg
        • witty-cloud.jpg
        • authometion-lyt8266.jpg
        • luani-hvio.jpg
        • arilux-al-lc01.jpg
        • itead-sonoff-pow.jpg
        • hykker-smart-home-power-plug.jpg
        • xenon-sm-pw702u.jpg
        • itead-sonoff-touch.jpg
        • itead-sonoff-pow-r2.jpg
        • ag-l4.jpg
        • jorgegarcia-wifi-relays.jpg
        • openenergymonitor-mqtt-relay.jpg
        • iWoole-led-desk-lamp-module-front.jpg
        • itead-sonoff-4ch.jpg
        • magichome-led-controller.jpg
      • icons
        • collaborate.png
        • documentation.png
        • hardware.png
        • features.png
    • code
      • test
        • platformio.ini
        • lib
          • StreamString
            • StreamString.cpp
            • StreamString.h
        • build
          • sensor.h
          • extra
            • secure_client.h
          • core.h
          • emon.h
          • light_tuya.h
          • light_my92xx.h
          • basic.h
          • light_dimmer.h
          • nondefault.h
        • .gitignore
        • unit
          • tuya_test.cpp
      • scripts
        • memanalyzer.py
        • pio_main.py
        • espurna_utils
          • postmortem.py
          • lwip.py
          • __init__.py
          • display.py
          • float_support.py
          • git.py
          • checks.py
          • flags.py
          • ldscripts.py
        • pio_pre.py
        • test_build.py
      • platformio.ini
      • espurna
        • utils.ino
        • ntp.ino
        • tuya.h
        • thermostat.ino
        • tuya_dataframe.h
        • nofuss.ino
        • board.h
        • ota_httpupdate.ino
        • relay.ino
        • ws.ino
        • ota_asynctcp.ino
        • telnet.h
        • ws.h
        • debug.ino
        • rpnrules.ino
        • wifi.h
        • settings.h
        • broker.h
        • tuya_types.h
        • scheduler.ino
        • thinkspeak.ino
        • ota.h
        • light.h
        • web.ino
        • debug.h
        • eeprom.ino
        • i2c.ino
        • button.ino
        • gpio.ino
        • ssdp.ino
        • ir.ino
        • telnet.ino
        • crash.ino
        • encoder.ino
        • utils.h
        • sensor.ino
        • netbios.ino
        • relay_config.h
        • wifi_config.h
        • settings_internal.h
        • uartmqtt.ino
        • button_config.h
        • settings.ino
        • ws_internal.h
        • sensors
          • GUVAS12SDSensor.h
          • AM2320Sensor.h
          • MICS2710Sensor.h
          • T6613Sensor.h
          • BaseSensor.h
          • GeigerSensor.h
          • V9261FSensor.h
          • ADE7953Sensor.h
          • SenseAirSensor.h
          • EventSensor.h
          • EZOPHSensor.h
          • CSE7766Sensor.h
          • LDRSensor.h
          • SI7021Sensor.h
          • TMP3XSensor.h
          • SonarSensor.h
          • PMSX003Sensor.h
          • BMP180Sensor.h
          • HLW8012Sensor.h
          • DallasSensor.h
          • DHTSensor.h
          • EmonSensor.h
          • MICS5525Sensor.h
          • BMX280Sensor.h
          • PZEM004TSensor.h
          • EmonAnalogSensor.h
          • DigitalSensor.h
          • ECH1560Sensor.h
          • EmonADC121Sensor.h
          • MHZ19Sensor.h
          • BH1750Sensor.h
          • SDS011Sensor.h
          • MAX6675Sensor.h
          • SHT3XI2CSensor.h
          • VL53L1XSensor.h
          • VEML6075Sensor.h
          • EmonADS1X15Sensor.h
          • AnalogSensor.h
          • PulseMeterSensor.h
          • NTCSensor.h
          • I2CSensor.h
        • static
          • index.lightfox.html.gz.h
          • server.key.h
          • index.small.html.gz.h
          • server.cer.h
          • index.light.html.gz.h
          • index.rfbridge.html.gz.h
          • index.rfm69.html.gz.h
          • digicert_evroot_pem.h
          • index.sensor.html.gz.h
          • index.thermostat.html.gz.h
          • index.all.html.gz.h
          • letsencrypt_isrgroot_pem.h
        • llmnr.ino
        • rfm69.ino
        • alexa.ino
        • mqtt.ino
        • tuya.ino
        • pwm.c
        • api.ino
        • ota_arduinoota.ino
        • system.h
        • fs_math.c
        • influxdb.ino
        • led_config.h
        • button.h
        • config
          • types.h
          • progmem.h
          • dependencies.h
          • build.h
          • buildtime.h
          • hardware.h
          • rtcmem.h
          • deprecated.h
          • defaults.h
          • version.h
          • arduino.h
          • general.h
          • prototypes.h
          • all.h
          • sensors.h
          • webui.h
        • relay.h
        • dummy_ets_printf.c
        • tuya_transport.h
        • libs
          • RFM69Wrap.h
          • StreamInjector.h
          • SecureClientHelpers.h
          • pwm.h
          • WebSocketIncommingBuffer.h
          • URL.h
          • TypeChecks.h
          • Encoder.h
          • HeapStats.h
          • NtpClientWrap.h
          • fs_math.h
          • EmbedisWrap.h
        • espurna.ino
        • rtcmem.ino
        • board.ino
        • domoticz.ino
        • tuya_protocol.h
        • tuya_util.h
        • led.ino
        • homeassistant.ino
        • lightfox.ino
        • migrate.ino
        • mdns.ino
        • data
          • server.cer
          • index.light.html.gz
          • server.key
          • index.lightfox.html.gz
          • index.rfbridge.html.gz
          • index.thermostat.html.gz
          • index.small.html.gz
          • index.all.html.gz
          • index.sensor.html.gz
          • index.rfm69.html.gz
        • rfbridge.ino
        • light.ino
        • led.h
        • terminal.ino
        • filters
          • MedianFilter.h
          • MaxFilter.h
          • LastFilter.h
          • MovingAverageFilter.h
          • BaseFilter.h
        • system.ino
        • wifi.ino
      • package.json
      • build.sh
      • lib
        • readme.txt
      • package-lock.json
      • gulpfile.js
      • debug.sh
      • html
        • custom.js
        • vendor
          • pure-grids-responsive-1.0.0.min.css
          • pure-1.0.0.min.css
          • side-menu.css
          • images
            • sort_desc.png
            • sort_desc_disabled.png
            • sort_both.png
            • sort_asc_disabled.png
            • sort_asc.png
          • jquery.wheelcolorpicker-3.0.8.min.js
          • datatables-1.10.16.min.js
          • jquery-3.4.1.slim.min.js
          • datatables-1.10.16.css
          • jquery.wheelcolorpicker-3.0.8.css
        • favicon.ico
        • custom.css
        • images
          • loading.gif
        • index.html
      • platformio_ota.ini
      • libraries
        • README
      • .gitignore
      • symbols.sh
      • requirements.txt
      • astyle.conf
      • ota.py
    • dist
      • patches
        • lwip_mtu_issue_1610.patch
      • ld
        • pre_2.5.0
          • eagle.flash.4m1m4s.ld
          • eagle.flash.1m0m2s.ld
          • eagle.flash.4m3m4s.ld
          • eagle.flash.512k0m1s.ld
          • eagle.flash.2m1m4s.ld
          • eagle.flash.1m0m1s.ld
        • README.md
        • latest
          • eagle.flash.4m1m4s.ld
          • eagle.flash.1m0m2s.ld
          • eagle.flash.4m3m4s.ld
          • eagle.flash.512k0m1s.ld
          • eagle.flash.2m1m4s.ld
          • eagle.flash.1m0m1s.ld
      • boards_local_txt.py
      • arduino_ide
        • README.md
        • latest
          • boards.local.txt
        • 2.3.0
          • boards.local.txt
      • ldscript_gen.py
    • .github
      • stale.yml
      • ISSUE_TEMPLATE
        • questions---troubleshooting.md
        • bug_report.md
        • feature_request.md
    • .gitignore
    • CHANGELOG.md
    • .travis.yml


espurna-dev-2020-01-31.zip > secure_client.h

#define SECURE_CLIENT SECURE_CLIENT_BEARSSL
#define MQTT_LIBRARY MQTT_LIBRARY_ARDUINOMQTT
#define OTA_CLIENT OTA_CLIENT_HTTPUPDATE


espurna-dev-2020-01-31.zip > core.h

#define ALEXA_SUPPORT 0
#define API_SUPPORT 0
#define BROKER_SUPPORT 0
#define DOMOTICZ_SUPPORT 0
#define DEBUG_SERIAL_SUPPORT 0
#define DEBUG_TELNET_SUPPORT 0
#define DEBUG_WEB_SUPPORT 0
#define HOMEASSISTANT_SUPPORT 0
#define I2C_SUPPORT 0
#define MQTT_SUPPORT 0
#define NTP_SUPPORT 0
#define RPN_RULES_SUPPORT 0
#define SCHEDULER_SUPPORT 0
#define SENSOR_SUPPORT 0
#define THINGSPEAK_SUPPORT 0
#define WEB_SUPPORT 0


espurna-dev-2020-01-31.zip > all.h

/*

If you want to modify the stock configuration but you don't want to touch
the repo files you can define USE_CUSTOM_H in your build settings.

Arduino IDE:
define it in your boards.txt for the board of your choice.
For instance, for the &quot; Generic ESP8266 Module &quot; with prefix &quot; generic &quot; just add:

generic.build.extra_flags=-DESP8266 -DUSE_CUSTOM_H

PlatformIO:
add the setting to your environment or just define global PLATFORMIO_BUILD_FLAGS

export PLATFORMIO_BUILD_FLAGS= &quot; '-DUSE_CUSTOM_H' &quot;

Check https://github.com/xoseperez/espurna/issues/104
for an example on how to use this file.

*/

#include &amp; lt; core_version.h &amp; gt;

#ifdef USE_CUSTOM_H
#include &quot; custom.h &quot;
#endif

#include &quot; version.h &quot;
#include &quot; types.h &quot;
#include &quot; arduino.h &quot;
#include &quot; hardware.h &quot;
#include &quot; defaults.h &quot;
#include &quot; buildtime.h &quot;
#include &quot; deprecated.h &quot;
#include &quot; general.h &quot;
#include &quot; dependencies.h &quot;
#include &quot; prototypes.h &quot;
#include &quot; sensors.h &quot;
#include &quot; webui.h &quot;
#include &quot; progmem.h &quot;


espurna-dev-2020-01-31.zip > prototypes.h

#include &amp; lt; Arduino.h &amp; gt;
#include &amp; lt; ArduinoJson.h &amp; gt;
#include &amp; lt; functional &amp; gt;
#include &amp; lt; algorithm &amp; gt;
#include &amp; lt; limits &amp; gt;
#include &amp; lt; vector &amp; gt;
#include &amp; lt; memory &amp; gt;

extern &quot; C &quot; {
#include &quot; user_interface.h &quot;
extern struct rst_info resetInfo;
}

#define UNUSED(x) (void)(x)

// -----------------------------------------------------------------------------
// System
// -----------------------------------------------------------------------------

#define LWIP_INTERNAL
#include &amp; lt; ESP8266WiFi.h &amp; gt;
#undef LWIP_INTERNAL

extern &quot; C &quot; {
#include &amp; lt; lwip/opt.h &amp; gt;
#include &amp; lt; lwip/ip.h &amp; gt;
#include &amp; lt; lwip/tcp.h &amp; gt;
#include &amp; lt; lwip/inet.h &amp; gt; // ip_addr_t
#include &amp; lt; lwip/err.h &amp; gt; // ERR_x
#include &amp; lt; lwip/dns.h &amp; gt; // dns_gethostbyname
#include &amp; lt; lwip/ip_addr.h &amp; gt; // ip4/ip6 helpers
#include &amp; lt; lwip/init.h &amp; gt; // LWIP_VERSION_MAJOR
}

// ref: https://github.com/me-no-dev/ESPAsyncTCP/pull/115/files#diff-e2e636049095cc1ff920c1bfabf6dcacR8
// This is missing with Core 2.3.0 and is sometimes missing from the build flags. Assume HIGH_BANDWIDTH version.
#ifndef TCP_MSS
#define TCP_MSS (1460)
#endif

// -----------------------------------------------------------------------------
// PROGMEM
// -----------------------------------------------------------------------------

#include &amp; lt; pgmspace.h &amp; gt;

// ref: https://github.com/esp8266/Arduino/blob/master/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h
// __STRINGIZE &amp; &amp; __STRINGIZE_NX &amp; &amp; PROGMEM definitions port

// Do not replace macros unless running version older than 2.5.0
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) \
|| defined(ARDUINO_ESP8266_RELEASE_2_4_0) \
|| defined(ARDUINO_ESP8266_RELEASE_2_4_1) \
|| defined(ARDUINO_ESP8266_RELEASE_2_4_2)

// Quoting esp8266/Arduino comments:
// &quot; Since __section__ is supposed to be only use for global variables,
// there could be conflicts when a static/inlined function has them in the
// same file as a non-static PROGMEM object.
// Ref: https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html
// Place each progmem object into its own named section, avoiding conflicts &quot;

#define __TO_STR_(A) #A
#define __TO_STR(A) __TO_STR_(A)

#undef PROGMEM
#define PROGMEM __attribute__((section( &quot; \ &quot; .irom.text. &quot; __FILE__ &quot; . &quot; __TO_STR(__LINE__) &quot; . &quot; __TO_STR(__COUNTER__) &quot; \ &quot; &quot; )))

// &quot; PSTR() macro modified to start on a 32-bit boundary. This adds on average
// 1.5 bytes/string, but in return memcpy_P and strcpy_P will work 4~8x faster &quot;
#undef PSTR
#define PSTR(s) (__extension__({static const char __c[] __attribute__((__aligned__(4))) PROGMEM = (s); &amp; __c[0];}))

#endif

// -----------------------------------------------------------------------------
// API
// -----------------------------------------------------------------------------

using api_get_callback_f = std::function &amp; lt; void(char * buffer, size_t size) &amp; gt; ;
using api_put_callback_f = std::function &amp; lt; void(const char * payload) &amp; gt; ;

#if WEB_SUPPORT
void apiRegister(const char * key, api_get_callback_f getFn, api_put_callback_f putFn = NULL);
#endif

// Core version 2.4.2 and higher changed the cont_t structure to a pointer:
// https://github.com/esp8266/Arduino/commit/5d5ea92a4d004ab009d5f642629946a0cb8893dd#diff-3fa12668b289ccb95b7ab334833a4ba8L35
// Core version 2.5.0 introduced EspClass helper method:
// https://github.com/esp8266/Arduino/commit/0e0e34c614fe8a47544c9998201b1d9b3c24eb18
extern &quot; C &quot; {
#include &amp; lt; cont.h &amp; gt;
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) \
|| defined(ARDUINO_ESP8266_RELEASE_2_4_0) \
|| defined(ARDUINO_ESP8266_RELEASE_2_4_1)
extern cont_t g_cont;
#define getFreeStack() cont_get_free_stack( &amp; g_cont)
#elif defined(ARDUINO_ESP8266_RELEASE_2_4_2)
extern cont_t* g_pcont;
#define getFreeStack() cont_get_free_stack(g_pcont)
#else
#define getFreeStack() ESP.getFreeContStack()
#endif
}

void infoMemory(const char* , unsigned int, unsigned int);
unsigned int getFreeHeap();
unsigned int getInitialFreeHeap();

// -----------------------------------------------------------------------------
// Domoticz
// -----------------------------------------------------------------------------
#if DOMOTICZ_SUPPORT
template &amp; lt; typename T &amp; gt; void domoticzSend(const char * key, T value);
template &amp; lt; typename T &amp; gt; void domoticzSend(const char * key, T nvalue, const char * svalue);
#endif

// -----------------------------------------------------------------------------
// EEPROM_ROTATE
// -----------------------------------------------------------------------------
#include &amp; lt; EEPROM_Rotate.h &amp; gt;
EEPROM_Rotate EEPROMr;

void eepromSectorsDebug();

// -----------------------------------------------------------------------------
// GPIO
// -----------------------------------------------------------------------------
bool gpioValid(unsigned char gpio);
bool gpioGetLock(unsigned char gpio);
bool gpioReleaseLock(unsigned char gpio);

// -----------------------------------------------------------------------------
// Homeassistant
// -----------------------------------------------------------------------------
struct ha_config_t;
void haSetup();

// -----------------------------------------------------------------------------
// I2C
// -----------------------------------------------------------------------------
void i2cScan();
void i2cClearBus();
bool i2cGetLock(unsigned char address);
bool i2cReleaseLock(unsigned char address);
unsigned char i2cFindAndLock(size_t size, unsigned char * addresses);

void i2c_wakeup(uint8_t address);
uint8_t i2c_write_buffer(uint8_t address, uint8_t * buffer, size_t len);
uint8_t i2c_write_uint8(uint8_t address, uint8_t value);
uint8_t i2c_write_uint8(uint8_t address, uint8_t reg, uint8_t value);
uint8_t i2c_write_uint8(uint8_t address, uint8_t reg, uint8_t value1, uint8_t value2);
uint8_t i2c_write_uint16(uint8_t address, uint16_t value);
uint8_t i2c_write_uint16(uint8_t address, uint8_t reg, uint16_t value);
uint8_t i2c_read_uint8(uint8_t address);
uint8_t i2c_read_uint8(uint8_t address, uint8_t reg);
uint16_t i2c_read_uint16(uint8_t address);
uint16_t i2c_read_uint16(uint8_t address, uint8_t reg);
uint16_t i2c_read_uint16_le(uint8_t address, uint8_t reg);
int16_t i2c_read_int16(uint8_t address, uint8_t reg);
int16_t i2c_read_int16_le(uint8_t address, uint8_t reg);
void i2c_read_buffer(uint8_t address, uint8_t * buffer, size_t len);

// -----------------------------------------------------------------------------
// MQTT
// -----------------------------------------------------------------------------

#if MQTT_LIBRARY == MQTT_LIBRARY_ASYNCMQTTCLIENT
#include &amp; lt; ESPAsyncTCP.h &amp; gt;
#include &amp; lt; AsyncMqttClient.h &amp; gt;
#elif MQTT_LIBRARY == MQTT_LIBRARY_ARDUINOMQTT
#include &amp; lt; MQTTClient.h &amp; gt;
#elif MQTT_LIBRARY == MQTT_LIBRARY_PUBSUBCLIENT
#include &amp; lt; PubSubClient.h &amp; gt;
#endif

using mqtt_callback_f = std::function &amp; lt; void(unsigned int type, const char * topic, char * payload) &amp; gt; ;
using mqtt_msg_t = std::pair &amp; lt; String, String &amp; gt; ; // topic, payload

void mqttRegister(mqtt_callback_f callback);

String mqttTopic(const char * magnitude, bool is_set);
String mqttTopic(const char * magnitude, unsigned int index, bool is_set);

String mqttMagnitude(char * topic);

bool mqttSendRaw(const char * topic, const char * message, bool retain);
bool mqttSendRaw(const char * topic, const char * message);

void mqttSend(const char * topic, const char * message, bool force, bool retain);
void mqttSend(const char * topic, const char * message, bool force);
void mqttSend(const char * topic, const char * message);

void mqttSend(const char * topic, unsigned int index, const char * message, bool force);
void mqttSend(const char * topic, unsigned int index, const char * message);

const String &amp; mqttPayloadOnline();
const String &amp; mqttPayloadOffline();
const char* mqttPayloadStatus(bool status);

void mqttSendStatus();

// -----------------------------------------------------------------------------
// OTA
// -----------------------------------------------------------------------------

#include &amp; lt; ArduinoOTA.h &amp; gt;

#if OTA_CLIENT == OTA_CLIENT_ASYNCTCP
#include &amp; lt; ESPAsyncTCP.h &amp; gt;
#endif

#if OTA_CLIENT == OTA_CLIENT_HTTPUPDATE
#include &amp; lt; ESP8266HTTPClient.h &amp; gt;
#include &amp; lt; ESP8266httpUpdate.h &amp; gt;
#endif

#if SECURE_CLIENT != SECURE_CLIENT_NONE
#include &amp; lt; WiFiClientSecure.h &amp; gt;
#endif // SECURE_CLIENT != SECURE_CLIENT_NONE

// -----------------------------------------------------------------------------
// RFM69
// -----------------------------------------------------------------------------
typedef struct {
unsigned long messageID;
unsigned char packetID;
unsigned char senderID;
unsigned char targetID;
char * key;
char * value;
int16_t rssi;
} packet_t;

// -----------------------------------------------------------------------------
// Terminal
// -----------------------------------------------------------------------------

class Embedis; // FIXME: order
using embedis_command_f = void (*)(Embedis*);

void terminalRegisterCommand(const String &amp; name, embedis_command_f func);
void terminalInject(void *data, size_t len);
Stream &amp; terminalSerial();

// -----------------------------------------------------------------------------
// WebServer
// -----------------------------------------------------------------------------

class AsyncClient;
class AsyncWebServer;

#if WEB_SUPPORT
#include &amp; lt; ESPAsyncWebServer.h &amp; gt;
AsyncWebServer * webServer();
#else
class AsyncWebServerRequest;
class ArRequestHandlerFunction;
class AsyncWebSocketClient;
class AsyncWebSocket;
class AwsEventType;
#endif

using web_body_callback_f = std::function &amp; lt; bool(AsyncWebServerRequest*, uint8_t* data, size_t len, size_t index, size_t total) &amp; gt; ;
using web_request_callback_f = std::function &amp; lt; bool(AsyncWebServerRequest*) &amp; gt; ;
void webBodyRegister(web_body_callback_f);
void webRequestRegister(web_request_callback_f);

// -----------------------------------------------------------------------------
// WIFI
// -----------------------------------------------------------------------------
#include &amp; lt; JustWifi.h &amp; gt;
struct wifi_scan_info_t;
using wifi_scan_f = std::function &amp; lt; void(wifi_scan_info_t &amp; info) &amp; gt; ;
using wifi_callback_f = std::function &amp; lt; void(justwifi_messages_t code, char * parameter) &amp; gt; ;
void wifiRegister(wifi_callback_f callback);
bool wifiConnected();

#if LWIP_VERSION_MAJOR == 1
#include &amp; lt; netif/etharp.h &amp; gt;
#else // LWIP_VERSION_MAJOR &amp; gt; = 2
#include &amp; lt; lwip/etharp.h &amp; gt;
#endif

// -----------------------------------------------------------------------------
// THERMOSTAT
// -----------------------------------------------------------------------------
using thermostat_callback_f = std::function &amp; lt; void(bool state) &amp; gt; ;
#if THERMOSTAT_SUPPORT
void thermostatRegister(thermostat_callback_f callback);
#endif

// -----------------------------------------------------------------------------
// RTC MEMORY
// -----------------------------------------------------------------------------
#include &quot; rtcmem.h &quot;

// -----------------------------------------------------------------------------
// Warn about broken Arduino functions
// -----------------------------------------------------------------------------

// Division by zero bug
// https://github.com/esp8266/Arduino/pull/2397
// https://github.com/esp8266/Arduino/pull/2408
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0)
long __attribute__((deprecated( &quot; Please avoid using map() with Core 2.3.0 &quot; ))) map(long x, long in_min, long in_max, long out_min, long out_max);
#endif

// -----------------------------------------------------------------------------
// std::make_unique backport for C++11
// -----------------------------------------------------------------------------
#if 201103L &amp; gt; = __cplusplus
namespace std {
template &amp; lt; typename T, typename... Args &amp; gt;
std::unique_ptr &amp; lt; T &amp; gt; make_unique(Args &amp; &amp; ... args) {
return std::unique_ptr &amp; lt; T &amp; gt; (new T(std::forward &amp; lt; Args &amp; gt; (args)...));
}
}
#endif


espurna-dev-2020-01-31.zip > hardware.h

// -----------------------------------------------------------------------------
// Configuration HELP
// -----------------------------------------------------------------------------
//
// MANUFACTURER: Name of the manufacturer of the board ( &quot; string &quot; )
// DEVICE: Name of the device ( &quot; string &quot; )
// BUTTON#_PIN: GPIO for the n-th button (1-based, up to 4 buttons)
// BUTTON#_RELAY: Relay number that will be bind to the n-th button (1-based)
// BUTTON#_MODE: A mask of options (BUTTON_PUSHBUTTON and BUTTON_SWITCH cannot be together)
// - BUTTON_PUSHBUTTON: button event is fired when released
// - BUTTON_SWITCH: button event is fired when pressed or released
// - BUTTON_DEFAULT_HIGH: there is a pull up in place
// - BUTTON_SET_PULLUP: set pullup by software
// RELAY#_PIN: GPIO for the n-th relay (1-based, up to 8 relays)
// RELAY#_TYPE: Relay can be RELAY_TYPE_NORMAL, RELAY_TYPE_INVERSE, RELAY_TYPE_LATCHED or RELAY_TYPE_LATCHED_INVERSE
// LED#_PIN: GPIO for the n-th LED (1-based, up to 8 LEDs)
// LED#_PIN_INVERSE: LED has inversed logic (lit when pulled down)
// LED#_MODE: Check types.h for LED_MODE_%
// LED#_RELAY: Linked relay (1-based)
//
// Besides, other hardware specific information should be stated here

// -----------------------------------------------------------------------------
// Custom hardware
// -----------------------------------------------------------------------------

#if defined(MANUFACTURER) and defined(DEVICE)

// user has defined custom hardware, no need to check anything else

// -----------------------------------------------------------------------------
// ESPurna Core
// -----------------------------------------------------------------------------

#elif defined(ESPURNA_CORE)

// This is a special device targeted to generate a light-weight binary image
// meant to be able to do two-step-updates:
// https://github.com/xoseperez/espurna/wiki/TwoStepUpdates

// Info
#define MANUFACTURER &quot; ESPURNA &quot;
#define DEVICE &quot; ESPURNA_CORE &quot;

// Disable non-core modules
#define ALEXA_SUPPORT 0
#define API_SUPPORT 0
#define BROKER_SUPPORT 0
#define DOMOTICZ_SUPPORT 0
#define DEBUG_SERIAL_SUPPORT 0
#define DEBUG_TELNET_SUPPORT 0
#define DEBUG_WEB_SUPPORT 0
#define HOMEASSISTANT_SUPPORT 0
#define I2C_SUPPORT 0
#define MQTT_SUPPORT 0
#define NTP_SUPPORT 0
#define RPN_RULES_SUPPORT 0
#define SCHEDULER_SUPPORT 0
#define SENSOR_SUPPORT 0
#define THINGSPEAK_SUPPORT 0
#define WEB_SUPPORT 0

// Extra light-weight image
//#define BUTTON_SUPPORT 0
//#define LED_SUPPORT 0
//#define MDNS_SERVER_SUPPORT 0
//#define TELNET_SUPPORT 0
//#define TERMINAL_SUPPORT 0

#elif defined(ESPURNA_BASE)

// This is a special device with no specific hardware
// with the basics to easily upgrade it to a device-specific image

// Info
#define MANUFACTURER &quot; ESPURNA &quot;
#define DEVICE &quot; ESPURNA_BASE &quot;

// Disable non-core modules
#define ALEXA_SUPPORT 0
#define API_SUPPORT 0
#define BROKER_SUPPORT 0
#define DOMOTICZ_SUPPORT 0
#define DEBUG_SERIAL_SUPPORT 0
//#define DEBUG_TELNET_SUPPORT 0
//#define DEBUG_WEB_SUPPORT 0
#define HOMEASSISTANT_SUPPORT 0
#define I2C_SUPPORT 0
#define MQTT_SUPPORT 0
#define NTP_SUPPORT 0
#define SCHEDULER_SUPPORT 0
#define SENSOR_SUPPORT 0
#define THINGSPEAK_SUPPORT 0
//#define WEB_SUPPORT 0

// Extra light-weight image
#define BUTTON_SUPPORT 0
#define LED_SUPPORT 0
//#define MDNS_SERVER_SUPPORT 0
//#define TELNET_SUPPORT 0
//#define TERMINAL_SUPPORT 0

// -----------------------------------------------------------------------------
// Development boards
// -----------------------------------------------------------------------------

#elif defined(NODEMCU_LOLIN)

// Info
#define MANUFACTURER &quot; NODEMCU &quot;
#define DEVICE &quot; LOLIN &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Hidden button will enter AP mode if dblclick and reset the device when long-long-clicked
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// Light
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

#elif defined(NODEMCU_BASIC)
// Info
// Generic NodeMCU Board without any buttons or relays connected.
#define MANUFACTURER &quot; NODEMCU &quot;
#define DEVICE &quot; BASIC &quot;

#elif defined(WEMOS_D1_MINI)

// Info
#define MANUFACTURER &quot; WEMOS &quot;
#define DEVICE &quot; D1_MINI &quot;

// Buttons
// No buttons on the D1 MINI alone, but defining it without adding a button doen't create problems
#define BUTTON1_PIN 0 // Connect a pushbutton between D3 and GND,
// it's the same as using a Wemos one button shield
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

#define I2C_SDA_PIN 4 // D2
#define I2C_SCL_PIN 5 // D1

#elif defined(WEMOS_D1_MINI_RELAYSHIELD)

// Info
#define MANUFACTURER &quot; WEMOS &quot;
#define DEVICE &quot; D1_MINI_RELAYSHIELD &quot;

// Buttons
// No buttons on the D1 MINI alone, but defining it without adding a button doen't create problems
#define BUTTON1_PIN 0 // Connect a pushbutton between D3 and GND,
// it's the same as using a Wemos one button shield
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LED
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// When Wemos relay shield is connected GPIO5 (D1) is used for relay,
// so I2C must be remapped to other pins
#define I2C_SDA_PIN 12 // D6
#define I2C_SCL_PIN 14 // D5

#elif defined(WEMOS_D1_TARPUNA_SHIELD)

// Info
#define MANUFACTURER &quot; WEMOS &quot;
#define DEVICE &quot; D1_TARPUNA_SHIELD &quot;

// Relays
#define RELAY1_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#define DHT_SUPPORT 1
#define DHT_PIN 12

// -----------------------------------------------------------------------------
// ESPurna
// -----------------------------------------------------------------------------

#elif defined(TINKERMAN_ESPURNA_H06)

// Info
#define MANUFACTURER &quot; TINKERMAN &quot;
#define DEVICE &quot; ESPURNA_H06 &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_RELAY 1

// Normal pushbutton
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_INVERSE

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 2
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 14

#elif defined(TINKERMAN_ESPURNA_H08)

// Info
#define MANUFACTURER &quot; TINKERMAN &quot;
#define DEVICE &quot; ESPURNA_H08 &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_RELAY 1

// Normal pushbutton
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 5
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 14

#elif defined(TINKERMAN_ESPURNA_SWITCH)

// Info
#define MANUFACTURER &quot; TINKERMAN &quot;
#define DEVICE &quot; ESPURNA_SWITCH &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_RELAY 1

// Touch button
#define BUTTON1_MODE BUTTON_PUSHBUTTON
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_INVERSE

// Check http://tinkerman.cat/rfm69-wifi-gateway/
#elif defined(TINKERMAN_RFM69GW)

// Info
#define MANUFACTURER &quot; TINKERMAN &quot;
#define DEVICE &quot; RFM69GW &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// RFM69GW
#define RFM69_SUPPORT 1

// Disable non-core modules
#define ALEXA_SUPPORT 0
#define DOMOTICZ_SUPPORT 0
#define HOMEASSISTANT_SUPPORT 0
#define I2C_SUPPORT 0
#define SCHEDULER_SUPPORT 0
#define SENSOR_SUPPORT 0
#define THINGSPEAK_SUPPORT 0

// -----------------------------------------------------------------------------
// Itead Studio boards
// -----------------------------------------------------------------------------

#elif defined(ITEAD_SONOFF_BASIC)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_BASIC &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1
#define BUTTON2_PIN 14
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON2_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_RF)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_RF &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1
#define BUTTON2_PIN 14
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON2_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_MINI)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_MINI &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1
#define BUTTON2_PIN 4
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON2_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_TH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_TH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Jack is connected to GPIO14 (and with a small hack to GPIO4)
#ifndef DALLAS_SUPPORT
#define DALLAS_SUPPORT 1
#endif
#define DALLAS_PIN 14

#ifndef DHT_SUPPORT
#define DHT_SUPPORT 1
#endif
#define DHT_PIN 14
#define DHT_TYPE DHT_CHIP_SI7021

//#define I2C_SDA_PIN 4
//#define I2C_SCL_PIN 14

#elif defined(ITEAD_SONOFF_SV)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_SV &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SLAMPHER)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SLAMPHER &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_S20)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; S20 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_TOUCH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_TOUCH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_POW)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_POW &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 15
#define LED1_PIN_INVERSE 0

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 5
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 14

#elif defined(ITEAD_SONOFF_POW_R2)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_POW_R2 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Disable UART noise
#define DEBUG_SERIAL_SUPPORT 0

// CSE7766
#ifndef CSE7766_SUPPORT
#define CSE7766_SUPPORT 1
#endif
#define CSE7766_PIN 1

#elif defined(ITEAD_SONOFF_DUAL)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_DUAL &quot;
#define SERIAL_BAUDRATE 19230
#define RELAY_PROVIDER RELAY_PROVIDER_DUAL
#define DUMMY_RELAY_COUNT 2
#define DEBUG_SERIAL_SUPPORT 0

// Buttons
#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 1

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_DUAL_R2)

#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_DUAL_R2 &quot;

// Buttons
#define BUTTON1_PIN 0 // Button 0 on header
#define BUTTON2_PIN 9 // Button 1 on header
#define BUTTON3_PIN 10 // Physical button
#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 1
#define BUTTON1_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_4CH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_4CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9
#define BUTTON3_PIN 10
#define BUTTON4_PIN 14

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON4_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 3
#define BUTTON4_RELAY 4

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY3_PIN 4
#define RELAY4_PIN 15

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_4CH_PRO)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_4CH_PRO &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9
#define BUTTON3_PIN 10
#define BUTTON4_PIN 14

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON4_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 3
#define BUTTON4_RELAY 4

// Sonoff 4CH Pro uses a secondary STM32 microcontroller to handle
// buttons and relays, but it also forwards button presses to the ESP8285.
// This allows ESPurna to handle button presses -almost- the same way
// as with other devices except:
// * Double click seems to break/disable the button on the STM32 side
// * With S6 switch to 1 (self-locking and inching modes) everything's OK
// * With S6 switch to 0 (interlock mode) if there is a relay ON
// and you click on another relay button, the STM32 sends a &quot; press &quot;
// event for the button of the first relay (to turn it OFF) but it
// does not send a &quot; release &quot; event. It's like it's holding the
// button down since you can see it is still LOW.
// Whatever reason the result is that it may actually perform a
// long click or long-long click.
// The configuration below make the button toggle the relay on press events
// and disables any possibly harmful combination with S6 set to 0.
// If you are sure you will only use S6 to 1 you can comment the
// BUTTON1_LNGCLICK and BUTTON1_LNGLNGCLICK options below to recover the
// reset mode and factory reset functionalities, or link other actions like
// AP mode in the commented line below.

#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
//#define BUTTON1_LNGCLICK BUTTON_MODE_AP
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON3_PRESS BUTTON_MODE_TOGGLE
#define BUTTON3_CLICK BUTTON_MODE_NONE
#define BUTTON4_PRESS BUTTON_MODE_TOGGLE
#define BUTTON4_CLICK BUTTON_MODE_NONE

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY3_PIN 4
#define RELAY4_PIN 15

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_1CH_INCHING)

// The inching functionality is managed by a misterious IC in the board.
// You cannot control the inching button and functionality from the ESP8266
// Besides, enabling the inching functionality using the hardware button
// will result in the relay switching on and off continuously.
// Fortunately the unkown IC keeps memory of the hardware inching status
// so you can just disable it and forget. The inching LED must be lit.
// You can still use the pulse options from the web interface
// without problem.

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; 1CH_INCHING &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_MOTOR)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; MOTOR &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_BNSZ01)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; BNSZ01 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 1
#define LIGHT_CH1_PIN 12
#define LIGHT_CH1_INVERSE 0

#elif defined(ITEAD_SONOFF_RFBRIDGE)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_RFBRIDGE &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_RFBRIDGE

// Number of virtual switches
#ifndef DUMMY_RELAY_COUNT
#define DUMMY_RELAY_COUNT 8
#endif

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#define RF_SUPPORT 1

// Only used when RFB_DIRECT=1
#define RFB_RX_PIN 4
#define RFB_TX_PIN 5

// When using un-modified harware, ESPurna communicates with the secondary
// MCU EFM8BB1 via UART at 19200 bps so we need to change the speed of
// the port and remove UART noise on serial line
#if not RFB_DIRECT
#define SERIAL_BAUDRATE 19200
#define DEBUG_SERIAL_SUPPORT 0
#endif

#elif defined(ITEAD_SONOFF_B1)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_B1 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define MY92XX_MODEL MY92XX_MODEL_MY9231
#define MY92XX_CHIPS 2
#define MY92XX_DI_PIN 12
#define MY92XX_DCKI_PIN 14
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
#define MY92XX_MAPPING 4, 3, 5, 0, 1
#define LIGHT_WHITE_FACTOR (0.1) // White LEDs are way more bright in the B1

#elif defined(ITEAD_SONOFF_LED)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_LED &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 2
#define LIGHT_CH1_PIN 12 // Cold white
#define LIGHT_CH2_PIN 14 // Warm white
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0

#elif defined(ITEAD_SONOFF_T1_1CH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_T1_1CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_T1_2CH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_T1_2CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_T1_3CH)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_T1_3CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9
#define BUTTON3_PIN 10

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_PRESS BUTTON_MODE_TOGGLE
#define BUTTON3_CLICK BUTTON_MODE_NONE
#define BUTTON3_DBLCLICK BUTTON_MODE_NONE
#define BUTTON3_LNGCLICK BUTTON_MODE_NONE
#define BUTTON3_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 3

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY3_PIN 4

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_S31)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_S31 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Disable UART noise
#define DEBUG_SERIAL_SUPPORT 0

// CSE7766
#define CSE7766_SUPPORT 1
#define CSE7766_PIN 1

#elif defined(ITEAD_SONOFF_S31_LITE)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_S31_LITE &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

#elif defined(ITEAD_SONOFF_IFAN02)

// Info
#define MANUFACTURER &quot; ITEAD &quot;
#define DEVICE &quot; SONOFF_IFAN02 &quot;

// These are virtual buttons triggered by the remote
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9
#define BUTTON3_PIN 10
#define BUTTON4_PIN 14
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON4_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY3_PIN 4
#define RELAY4_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// ORVIBO
// -----------------------------------------------------------------------------

#elif defined(ORVIBO_B25)

// Info
#define MANUFACTURER &quot; ORVIBO &quot;
#define DEVICE &quot; B25 &quot;

// Buttons
#define BUTTON1_PIN 14
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 12 // 4 blue led
#define LED1_PIN_INVERSE 1
#define LED2_PIN 4 // 12 red led
#define LED2_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// YJZK
// -----------------------------------------------------------------------------

#elif defined(YJZK_SWITCH_1CH)

// Info
#define MANUFACTURER &quot; YJZK &quot;
#define DEVICE &quot; SWITCH_1CH &quot;

// Buttons
#define BUTTON1_PIN 0

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 0

#elif defined(YJZK_SWITCH_2CH)

// Info
#define MANUFACTURER &quot; YJZK &quot;
#define DEVICE &quot; SWITCH_2CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 0

// YJZK 3CH switch
// Also Lixin Touch Wifi 3M

#elif defined(YJZK_SWITCH_3CH)

// Info
#define MANUFACTURER &quot; YJZK &quot;
#define DEVICE &quot; SWITCH_3CH &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 9
#define BUTTON3_PIN 10

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_PRESS BUTTON_MODE_TOGGLE
#define BUTTON3_CLICK BUTTON_MODE_NONE
#define BUTTON3_DBLCLICK BUTTON_MODE_NONE
#define BUTTON3_LNGCLICK BUTTON_MODE_NONE
#define BUTTON3_LNGLNGCLICK BUTTON_MODE_RESET

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 3

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 5
#define RELAY3_PIN 4

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// Electrodragon boards
// -----------------------------------------------------------------------------

#elif defined(ELECTRODRAGON_WIFI_IOT)

// Info
#define MANUFACTURER &quot; ELECTRODRAGON &quot;
#define DEVICE &quot; WIFI_IOT &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON2_PIN 2

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 13

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 16
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// WorkChoice ecoPlug
// -----------------------------------------------------------------------------

#elif defined(WORKCHOICE_ECOPLUG)

// Info
#define MANUFACTURER &quot; WORKCHOICE &quot;
#define DEVICE &quot; ECOPLUG &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// AI Thinker
// -----------------------------------------------------------------------------

#elif defined(AITHINKER_AI_LIGHT)

// Info
#define MANUFACTURER &quot; AITHINKER &quot;
#define DEVICE &quot; AI_LIGHT &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 13
#define MY92XX_DCKI_PIN 15
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
#define MY92XX_MAPPING 0, 1, 2, 3

// -----------------------------------------------------------------------------
// Lyasi LED
// -----------------------------------------------------------------------------

#elif defined(LYASI_LIGHT)

// Info
#define MANUFACTURER &quot; LYASI &quot;
#define DEVICE &quot; RGB-LED &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 4
#define MY92XX_DCKI_PIN 5
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
#define MY92XX_MAPPING 0, 1, 2, 3

// -----------------------------------------------------------------------------
// LED Controller
// -----------------------------------------------------------------------------

#elif defined(MAGICHOME_LED_CONTROLLER)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; LED_CONTROLLER &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 13 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// IR
#define IR_SUPPORT 1
#define IR_RX_PIN 4
#define IR_BUTTON_SET 1

#elif defined(MAGICHOME_LED_CONTROLLER_20)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; LED_CONTROLLER_20 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 15 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// IR
#define IR_SUPPORT 1
#define IR_RX_PIN 4
#define IR_BUTTON_SET 1

#elif defined(MAGICHOME_ZJ_WFMN_A_11)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; ZJ_WFMN_A_11 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 15
#define LED2_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 12 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 14 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// IR
#define IR_SUPPORT 1
#define IR_RX_PIN 4
#define IR_BUTTON_SET 1

#elif defined(MAGICHOME_ZJ_WFMN_B_11)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; ZJ_WFMN_B_11 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 15
#define LED2_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 13 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// RF
#define RF_SUPPORT 1
#define RFB_DIRECT 1
#define RFB_RX_PIN 4

#elif defined(MAGICHOME_ZJ_WFMN_C_11)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; ZJ_WFMN_C_11 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 1
#define LIGHT_CH1_PIN 12 // WHITE

#elif defined(MAGICHOME_ZJ_ESPM_5CH_B_13)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; ZJ_ESPM_5CH_B_13 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 5 // COLD WHITE
#define LIGHT_CH5_PIN 15 // WARM WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

#elif defined(MAGICHOME_ZJ_LB_RGBWW_L)

// Info
#define MANUFACTURER &quot; MAGICHOME &quot;
#define DEVICE &quot; ZJ_LB_RGBWW_L &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 12 // COLD WHITE
#define LIGHT_CH5_PIN 13 // WARM WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

// -----------------------------------------------------------------------------
// HUACANXING H801 &amp; H802
// -----------------------------------------------------------------------------

#elif defined(HUACANXING_H801)

// Info
#define MANUFACTURER &quot; HUACANXING &quot;
#define DEVICE &quot; H801 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1
#define DEBUG_PORT Serial1
#define SERIAL_RX_ENABLED 1

// LEDs
#define LED1_PIN 5
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 15 // RED
#define LIGHT_CH2_PIN 13 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 14 // WHITE1
#define LIGHT_CH5_PIN 4 // WHITE2
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

#elif defined(HUACANXING_H802)

// Info
#define MANUFACTURER &quot; HUACANXING &quot;
#define DEVICE &quot; H802 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1
#define DEBUG_PORT Serial1
#define SERIAL_RX_ENABLED 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 12 // RED
#define LIGHT_CH2_PIN 14 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 15 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Jan Goedeke Wifi Relay
// https://github.com/JanGoe/esp8266-wifi-relay
// -----------------------------------------------------------------------------

#elif defined(JANGOE_WIFI_RELAY_NC)

// Info
#define MANUFACTURER &quot; JANGOE &quot;
#define DEVICE &quot; WIFI_RELAY_NC &quot;

// Buttons
#define BUTTON1_PIN 12
#define BUTTON2_PIN 13

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 2
#define RELAY2_PIN 14

#define RELAY1_TYPE RELAY_TYPE_INVERSE
#define RELAY2_TYPE RELAY_TYPE_INVERSE

#elif defined(JANGOE_WIFI_RELAY_NO)

// Info
#define MANUFACTURER &quot; JANGOE &quot;
#define DEVICE &quot; WIFI_RELAY_NO &quot;

// Buttons
#define BUTTON1_PIN 12
#define BUTTON2_PIN 13

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 2
#define RELAY2_PIN 14

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// -----------------------------------------------------------------------------
// Jorge García Wifi+Relays Board Kit
// https://www.tindie.com/products/jorgegarciadev/wifi--relays-board-kit
// https://github.com/jorgegarciadev/wifikit
// -----------------------------------------------------------------------------

#elif defined(JORGEGARCIA_WIFI_RELAYS)

// Info
#define MANUFACTURER &quot; JORGEGARCIA &quot;
#define DEVICE &quot; WIFI_RELAYS &quot;

// Relays
#define RELAY1_PIN 0
#define RELAY2_PIN 2

#define RELAY1_TYPE RELAY_TYPE_INVERSE
#define RELAY2_TYPE RELAY_TYPE_INVERSE

// -----------------------------------------------------------------------------
// WiFi MQTT Relay / Thermostat
// -----------------------------------------------------------------------------

#elif defined(OPENENERGYMONITOR_MQTT_RELAY)

// Info
#define MANUFACTURER &quot; OPENENERGYMONITOR &quot;
#define DEVICE &quot; MQTT_RELAY &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 16
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// WiOn 50055 Indoor Wi-Fi Wall Outlet &amp; Tap
// https://rover.ebay.com/rover/1/711-53200-19255-0/1?icep_id=114 &amp; ipn=icep &amp; toolid=20004 &amp; campid=5338044841 &amp; mpre=http%3A%2F%2Fwww.ebay.com%2Fitm%2FWiOn-50050-Indoor-Wi-Fi-Outlet-Wireless-Switch-Programmable-Timer-%2F263112281551
// https://rover.ebay.com/rover/1/711-53200-19255-0/1?icep_id=114 &amp; ipn=icep &amp; toolid=20004 &amp; campid=5338044841 &amp; mpre=http%3A%2F%2Fwww.ebay.com%2Fitm%2FWiOn-50055-Indoor-Wi-Fi-Wall-Tap-Monitor-Energy-Usage-Wireless-Smart-Switch-%2F263020837777
// -----------------------------------------------------------------------------

#elif defined(WION_50055)

// Currently untested, does not support energy monitoring

// Info
#define MANUFACTURER &quot; WION &quot;
#define DEVICE &quot; 50055 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// EX-Store Wifi Relay v3.1
// https://ex-store.de/ESP8266-WiFi-Relay-V31
// -----------------------------------------------------------------------------

#elif defined(EXS_WIFI_RELAY_V31)

// Untested

// Info
#define MANUFACTURER &quot; EXS &quot;
#define DEVICE &quot; WIFI_RELAY_V31 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 13
#define RELAY1_TYPE RELAY_TYPE_LATCHED
#define RELAY1_RESET_PIN 12

// -----------------------------------------------------------------------------
// EX-Store Wifi Relay v5.0
// -----------------------------------------------------------------------------

#elif defined(EXS_WIFI_RELAY_V50)

// Info
#define MANUFACTURER &quot; EXS &quot;
#define DEVICE &quot; WIFI_RELAY_V50 &quot;

// Buttons
#define BUTTON1_PIN 5
#define BUTTON2_PIN 4
#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON1_MODE BUTTON_SWITCH | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_LATCHED
#define RELAY1_RESET_PIN 16
#define RELAY2_PIN 13
#define RELAY2_TYPE RELAY_TYPE_LATCHED
#define RELAY2_RESET_PIN 12

// LEDs
#define LED1_PIN 15
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// V9261F
// -----------------------------------------------------------------------------

#elif defined(GENERIC_V9261F)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; V9261F &quot;
#define ALEXA_SUPPORT 0

// V9261F
#define V9261F_SUPPORT 1
#define V9261F_PIN 2
#define V9261F_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// ECH1560
// -----------------------------------------------------------------------------

#elif defined(GENERIC_ECH1560)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; ECH1560 &quot;
#define ALEXA_SUPPORT 0

// ECH1560
#define ECH1560_SUPPORT 1
#define ECH1560_CLK_PIN 4
#define ECH1560_MISO_PIN 5
#define ECH1560_INVERTED 0

// -----------------------------------------------------------------------------
// ESPLive
// https://github.com/ManCaveMade/ESP-Live
// -----------------------------------------------------------------------------

#elif defined(MANCAVEMADE_ESPLIVE)

// Info
#define MANUFACTURER &quot; MANCAVEMADE &quot;
#define DEVICE &quot; ESPLIVE &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON2_PIN 5

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 13

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// DS18B20
#ifndef DALLAS_SUPPORT
#define DALLAS_SUPPORT 1
#endif
#define DALLAS_PIN 2
#define DALLAS_UPDATE_INTERVAL 5000
#define TEMPERATURE_MIN_CHANGE 1.0

// -----------------------------------------------------------------------------
// QuinLED
// http://blog.quindorian.org/2017/02/esp8266-led-lighting-quinled-v2-6-pcb.html
// -----------------------------------------------------------------------------

#elif defined(INTERMITTECH_QUINLED)

// Info
#define MANUFACTURER &quot; INTERMITTECH &quot;
#define DEVICE &quot; QUINLED &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 5
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 2
#define LIGHT_CH1_PIN 0
#define LIGHT_CH2_PIN 2
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0

// -----------------------------------------------------------------------------
// Arilux AL-LC06
// -----------------------------------------------------------------------------

#elif defined(ARILUX_AL_LC01)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; AL_LC01 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 3
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0

#elif defined(ARILUX_AL_LC02)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; AL_LC02 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 12 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 15 // WHITE1
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

#elif defined(ARILUX_AL_LC02_V14)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; AL_LC02_V14 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 13 // WHITE1
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

#elif defined(ARILUX_AL_LC06)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; AL_LC06 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 15 // WHITE1
#define LIGHT_CH5_PIN 5 // WHITE2
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

#elif defined(ARILUX_AL_LC11)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; AL_LC11 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 13 // WHITE1
#define LIGHT_CH5_PIN 12 // WHITE1
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

#elif defined(ARILUX_E27)

// Info
#define MANUFACTURER &quot; ARILUX &quot;
#define DEVICE &quot; E27 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 13
#define MY92XX_DCKI_PIN 15
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
#define MY92XX_MAPPING 0, 1, 2, 3

// -----------------------------------------------------------------------------
// XENON SM-PW701U
// -----------------------------------------------------------------------------

#elif defined(XENON_SM_PW702U)

// Info
#define MANUFACTURER &quot; XENON &quot;
#define DEVICE &quot; SM_PW702U &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// ISELECTOR SM-PW702
// -----------------------------------------------------------------------------

#elif defined(ISELECTOR_SM_PW702)

// Info
#define MANUFACTURER &quot; ISELECTOR &quot;
#define DEVICE &quot; SM_PW702 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4 //BLUE
#define LED1_PIN_INVERSE 0
#define LED2_PIN 5 //RED
#define LED2_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// AUTHOMETION LYT8266
// https://authometion.com/shop/en/home/13-lyt8266.html
// -----------------------------------------------------------------------------

#elif defined(AUTHOMETION_LYT8266)

// Info
#define MANUFACTURER &quot; AUTHOMETION &quot;
#define DEVICE &quot; LYT8266 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 13 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 2 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

#define LIGHT_ENABLE_PIN 15

#elif defined(GIZWITS_WITTY_CLOUD)

// Info
#define MANUFACTURER &quot; GIZWITS &quot;
#define DEVICE &quot; WITTY_CLOUD &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

#define ANALOG_SUPPORT 1

// LEDs
#define LED1_PIN 2 // BLUE build-in
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 3
#define LIGHT_CH1_PIN 15 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0

// -----------------------------------------------------------------------------
// KMC 70011
// https://www.amazon.com/KMC-Monitoring-Required-Control-Compatible/dp/B07313TH7B
// -----------------------------------------------------------------------------

#elif defined(KMC_70011)

// Info
#define MANUFACTURER &quot; KMC &quot;
#define DEVICE &quot; 70011 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_VOLTAGE_R_UP ( 2 * 1000000 ) // Upstream voltage resistor

// -----------------------------------------------------------------------------
// Euromate (?) Wifi Stecker Schuko
// https://www.obi.de/hausfunksteuerung/wifi-stecker-schuko/p/2291706
// Thanks to @Geitde
// -----------------------------------------------------------------------------

#elif defined(EUROMATE_WIFI_STECKER_SCHUKO)

// Info
#define MANUFACTURER &quot; EUROMATE &quot;
#define DEVICE &quot; WIFI_STECKER_SCHUKO &quot;

// Buttons
#define BUTTON1_PIN 14
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// The relay in the device is not a bistable (latched) relay.
// The device is reported to have a flip-flop circuit to drive the relay
// So @Geitde hack is still the only possible

// Hack: drive GPIO12 low and use GPIO5 as normal relay pin:
#define RELAY1_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define LED2_PIN 12 /* DUMMY: exploit default off state for GPIO12=low */
#define LED2_PIN_INVERSE 0

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// Euromate (?) Wifi Stecker Schuko Version 2
// This configuration is for the second generation of devices sold by OBI.
// https://www.obi.de/hausfunksteuerung/wifi-stecker-schuko-weiss/p/4077806
// -----------------------------------------------------------------------------
#elif defined(EUROMATE_WIFI_STECKER_SCHUKO_V2)

// Info
#define MANUFACTURER &quot; EUROMATE &quot;
#define DEVICE &quot; WIFI_STECKER_SCHUKO_V2 &quot;

// Buttons
#define BUTTON1_PIN 5
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// Green
#define LED1_PIN 12
#define LED1_MODE LED_MODE_WIFI
#define LED1_PIN_INVERSE 0

// Red
#define LED2_PIN 13
#define LED2_MODE LED_MODE_RELAY
#define LED2_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// Generic 8CH
// -----------------------------------------------------------------------------

#elif defined(GENERIC_8CH)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; 8CH &quot;

// Relays
#define RELAY1_PIN 0
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_PIN 2
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_PIN 4
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_PIN 5
#define RELAY4_TYPE RELAY_TYPE_NORMAL
#define RELAY5_PIN 12
#define RELAY5_TYPE RELAY_TYPE_NORMAL
#define RELAY6_PIN 13
#define RELAY6_TYPE RELAY_TYPE_NORMAL
#define RELAY7_PIN 14
#define RELAY7_TYPE RELAY_TYPE_NORMAL
#define RELAY8_PIN 15
#define RELAY8_TYPE RELAY_TYPE_NORMAL

// -----------------------------------------------------------------------------
// STM RELAY
// -----------------------------------------------------------------------------

#elif defined(STM_RELAY)

// Info
#define MANUFACTURER &quot; STM_RELAY &quot;
#define DEVICE &quot; 2CH &quot;

// Relays
#define DUMMY_RELAY_COUNT 2
#define RELAY_PROVIDER RELAY_PROVIDER_STM

// Remove UART noise on serial line
#define DEBUG_SERIAL_SUPPORT 0

// -----------------------------------------------------------------------------
// Tonbux Powerstrip02
// -----------------------------------------------------------------------------

#elif defined(TONBUX_POWERSTRIP02)

// Info
#define MANUFACTURER &quot; TONBUX &quot;
#define DEVICE &quot; POWERSTRIP02 &quot;

// Buttons
#define BUTTON1_PIN 5
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 0

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_INVERSE
#define RELAY2_PIN 13
#define RELAY2_TYPE RELAY_TYPE_INVERSE
#define RELAY3_PIN 12
#define RELAY3_TYPE RELAY_TYPE_INVERSE
#define RELAY4_PIN 14
#define RELAY4_TYPE RELAY_TYPE_INVERSE
// Not a relay. USB ports on/off
#define RELAY5_PIN 16
#define RELAY5_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // 1 blue led
#define LED1_PIN_INVERSE 1
#define LED2_PIN 3 // 3 red leds
#define LED2_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// Lingan SWA1
// -----------------------------------------------------------------------------

#elif defined(LINGAN_SWA1)

// Info
#define MANUFACTURER &quot; LINGAN &quot;
#define DEVICE &quot; SWA1 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// HEYGO HY02
// -----------------------------------------------------------------------------

#elif defined(HEYGO_HY02)

// Info
#define MANUFACTURER &quot; HEYGO &quot;
#define DEVICE &quot; HY02 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// Maxcio W-US002S
// -----------------------------------------------------------------------------

#elif defined(MAXCIO_WUS002S)

// Info
#define MANUFACTURER &quot; MAXCIO &quot;
#define DEVICE &quot; WUS002S &quot;

// Buttons
#define BUTTON1_PIN 2
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 13
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 3
#define LED1_PIN_INVERSE 0

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_CURRENT_R 0.002 // Current resistor
#define HLW8012_VOLTAGE_R_UP ( 2 * 1000000 ) // Upstream voltage resistor

// LED1 on RX pin
#define DEBUG_SERIAL_SUPPORT 1

// -----------------------------------------------------------------------------
// Maxcio W-DE004
// -----------------------------------------------------------------------------

#elif defined(MAXCIO_WDE004)

// Info
#define MANUFACTURER &quot; MAXCIO &quot;
#define DEVICE &quot; WDE004 &quot;

// Buttons
#define BUTTON1_PIN 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// Oukitel P1 Smart Plug
// https://www.amazon.com/Docooler-OUKITEL-Control-Wireless-Adaptor/dp/B07J3BYFJX/ref=sr_1_fkmrnull_2?keywords=oukitel+p1+smart+switch &amp; qid=1550424399 &amp; s=gateway &amp; sr=8-2-fkmrnull
// -----------------------------------------------------------------------------
#elif defined(OUKITEL_P1)

// Info
#define MANUFACTURER &quot; Oukitel &quot;
#define DEVICE &quot; P1 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
// Right
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL
// Left
#define RELAY2_PIN 15
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // blue
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_WIFI

// -----------------------------------------------------------------------------
// YiDian XS-SSA05
// -----------------------------------------------------------------------------

#elif defined(YIDIAN_XSSSA05)

// Info
#define MANUFACTURER &quot; YIDIAN &quot;
#define DEVICE &quot; XSSSA05 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // red
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_WIFI

#define LED2_PIN 15 // blue
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_RELAY

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 3
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// TONBUX XS-SSA01
// -----------------------------------------------------------------------------

#elif defined(TONBUX_XSSSA01)

// Info
#define MANUFACTURER &quot; TONBUX &quot;
#define DEVICE &quot; XSSSA01 &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// TONBUX XS-SSA06
// -----------------------------------------------------------------------------

#elif defined(TONBUX_XSSSA06)

// Info
#define MANUFACTURER &quot; TONBUX &quot;
#define DEVICE &quot; XSSSA06 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // R - 8 rgb led ring
#define LED1_PIN_INVERSE 0
#define LED2_PIN 5 // G
#define LED2_PIN_INVERSE 0
#define LED3_PIN 2 // B
#define LED3_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// GREEN ESP8266 RELAY MODULE
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180323113846 &amp; SearchText=Green+ESP8266
// -----------------------------------------------------------------------------

#elif defined(GREEN_ESP8266RELAY)

// Info
#define MANUFACTURER &quot; GREEN &quot;
#define DEVICE &quot; ESP8266RELAY &quot;

// Buttons
// Not a button but input via Optocoupler
#define BUTTON1_PIN 5
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// Henrique Gravina ESPIKE
// https://github.com/Henriquegravina/Espike
// -----------------------------------------------------------------------------

#elif defined(IKE_ESPIKE)

#define MANUFACTURER &quot; IKE &quot;
#define DEVICE &quot; ESPIKE &quot;

#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE

#define BUTTON1_PIN 13
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON2_PIN 12
#define BUTTON2_RELAY 2
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define BUTTON3_PIN 14
#define BUTTON3_RELAY 3
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

#define RELAY3_PIN 16
#define RELAY3_TYPE RELAY_TYPE_NORMAL

#define LED1_PIN 2
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// SWIFITCH
// https://github.com/ArnieX/swifitch
// -----------------------------------------------------------------------------

#elif defined(ARNIEX_SWIFITCH)

// Info
#define MANUFACTURER &quot; ARNIEX &quot;
#define DEVICE &quot; SWIFITCH &quot;

// Buttons
#define BUTTON1_PIN 4 // D2
#define BUTTON1_MODE BUTTON_SWITCH | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

#define BUTTON1_PRESS BUTTON_MODE_NONE
#define BUTTON1_CLICK BUTTON_MODE_TOGGLE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE

// Relays
#define RELAY1_PIN 5 // D1
#define RELAY1_TYPE RELAY_TYPE_INVERSE

// LEDs
#define LED1_PIN 12 // D6
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// ESP-01S RELAY v4.0
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180404024035 &amp; SearchText=esp-01s+relay
// -----------------------------------------------------------------------------

#elif defined(GENERIC_ESP01S_RELAY_V40)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; ESP01S_RELAY_40 &quot;

// Relays
#define RELAY1_PIN 0
#ifndef RELAY1_TYPE
#define RELAY1_TYPE RELAY_TYPE_NORMAL // See #1504 and #1554
#endif

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// ESP-01S RGB LED v1.0 (some sold with ws2818)
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180404023816 &amp; SearchText=esp-01s+led+controller
// -----------------------------------------------------------------------------

#elif defined(GENERIC_ESP01S_RGBLED_V10)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; ESP01S_RGBLED_10 &quot;

// This board is sold as RGB LED module BUT it has on board 3 pin ph2.0 connector (VCC, GPIO2, GND)
// so, if you wish, you may connect LED, BUTTON, RELAY, SENSOR etc.

// Buttons
//#define BUTTON1_PIN 2

// Relays
//#define RELAY1_PIN 2

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0


// -----------------------------------------------------------------------------
// ESP-01S DHT11 v1.0
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180410105907 &amp; SearchText=esp-01s+dht11
// -----------------------------------------------------------------------------

#elif defined(GENERIC_ESP01S_DHT11_V10)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; ESP01S_DHT11_10 &quot;

// DHT11
#ifndef DHT_SUPPORT
#define DHT_SUPPORT 1
#endif
#define DHT_PIN 2
#define DHT_TYPE DHT_CHIP_DHT11

// -----------------------------------------------------------------------------
// ESP-01S DS18B20 v1.0
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180410105933 &amp; SearchText=esp-01s+ds18b20
// -----------------------------------------------------------------------------

#elif defined(GENERIC_ESP01S_DS18B20_V10)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; ESP01S_DS18B20_10 &quot;

// DB18B20
#ifndef DALLAS_SUPPORT
#define DALLAS_SUPPORT 1
#endif
#define DALLAS_PIN 2

// -----------------------------------------------------------------------------
// ESP-DIN relay board V1
// https://github.com/pilotak/esp_din
// -----------------------------------------------------------------------------

#elif defined(PILOTAK_ESP_DIN_V1)

// Info
#define MANUFACTURER &quot; PILOTAK &quot;
#define DEVICE &quot; ESP_DIN_V1 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 15
#define LED1_PIN_INVERSE 0

#define I2C_SDA_PIN 12
#define I2C_SCL_PIN 13

#ifndef DALLAS_SUPPORT
#define DALLAS_SUPPORT 1
#endif
#define DALLAS_PIN 2

#define RF_SUPPORT 1
#define RFB_DIRECT 1
#define RFB_RX_PIN 14

#ifndef DIGITAL_SUPPORT
#define DIGITAL_SUPPORT 1
#endif
#define DIGITAL1_PIN 16
#define DIGITAL1_PIN_MODE INPUT
#define DIGITAL1_DEFAULT_STATE 0

// -----------------------------------------------------------------------------
// Heltec Touch Relay
// https://www.aliexpress.com/wholesale?catId=0 &amp; initiative_id=SB_20180408043114 &amp; SearchText=esp8266+touch+relay
// -----------------------------------------------------------------------------

#elif defined(HELTEC_TOUCHRELAY)

// Info
#define MANUFACTURER &quot; HELTEC &quot;
#define DEVICE &quot; TOUCH_RELAY &quot;

// Buttons
#define BUTTON1_PIN 14
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL


// -----------------------------------------------------------------------------
// Zhilde ZLD-EU44-W
// http://www.zhilde.com/product/60705150109-805652505/EU_WiFi_Surge_Protector_Extension_Socket_4_Outlets_works_with_Amazon_Echo_Smart_Power_Strip.html
// -----------------------------------------------------------------------------

#elif defined(ZHILDE_EU44_W)

// Info
#define MANUFACTURER &quot; ZHILDE &quot;
#define DEVICE &quot; EU44_W &quot;

// Based on the reporter, this product uses GPIO1 and 3 for the button
// and onboard LED, so hardware serial should be disabled...
#define DEBUG_SERIAL_SUPPORT 0

// Buttons
#define BUTTON1_PIN 3
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Relays
#define RELAY1_PIN 5
#define RELAY2_PIN 4
#define RELAY3_PIN 12
#define RELAY4_PIN 13
#define RELAY5_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL
#define RELAY5_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 1
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// Allnet 4duino ESP8266-UP-Relais
// http://www.allnet.de/de/allnet-brand/produkte/neuheiten/p/allnet-4duino-iot-wlan-relais-unterputz-esp8266-up-relais/
// https://shop.allnet.de/fileadmin/transfer/products/148814.pdf
// -----------------------------------------------------------------------------

#elif defined(ALLNET_4DUINO_IOT_WLAN_RELAIS)

// Info
#define MANUFACTURER &quot; ALLNET &quot;
#define DEVICE &quot; 4DUINO_IOT_WLAN_RELAIS &quot;

// Relays
#define RELAY1_PIN 14
#define RELAY1_RESET_PIN 12
#define RELAY1_TYPE RELAY_TYPE_LATCHED

// LEDs
#define LED1_PIN 0
#define LED1_PIN_INVERSE 1

// Buttons
//#define BUTTON1_PIN 0
//#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH

// Using pins labelled as SDA &amp; SCL as buttons
#define BUTTON2_PIN 4
#define BUTTON2_MODE BUTTON_PUSHBUTTON
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_NONE

#define BUTTON3_PIN 5
#define BUTTON3_MODE BUTTON_PUSHBUTTON

// Using pins labelled as SDA &amp; SCL for I2C
//#define I2C_SDA_PIN 4
//#define I2C_SCL_PIN 5


// -----------------------------------------------------------------------------
// Luani HVIO
// https://luani.de/projekte/esp8266-hvio/
// https://luani.de/blog/esp8266-230v-io-modul/
// -----------------------------------------------------------------------------

#elif defined(LUANI_HVIO)

// Info
#define MANUFACTURER &quot; LUANI &quot;
#define DEVICE &quot; HVIO &quot;

// Buttons
#define BUTTON1_PIN 12
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_SWITCH | BUTTON_DEFAULT_HIGH //Hardware Pullup

#define BUTTON1_PRESS BUTTON_MODE_NONE
#define BUTTON1_CLICK BUTTON_MODE_TOGGLE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE

#define BUTTON2_PIN 13
#define BUTTON2_RELAY 2
#define BUTTON2_MODE BUTTON_SWITCH | BUTTON_DEFAULT_HIGH //Hardware Pullup

#define BUTTON2_CLICK BUTTON_MODE_TOGGLE

// Relays
#define RELAY1_PIN 4
#define RELAY2_PIN 5
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 15
#define LED1_PIN_INVERSE 0

// -----------------------------------------------------------------------------
// Tonbux 50-100M Smart Mosquito Killer USB
// https://www.aliexpress.com/item/Original-Tonbux-50-100M-Smart-Mosquito-Killer-USB-Plug-No-Noise-Repellent-App-Smart-Module/32859330820.html
// -----------------------------------------------------------------------------

#elif defined(TONBUX_MOSQUITO_KILLER)

// Info
#define MANUFACTURER &quot; TONBUX &quot;
#define DEVICE &quot; MOSQUITO_KILLER &quot;

// Buttons
#define BUTTON1_PIN 2
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 5 // not a relay, fan
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 15 // blue led
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_WIFI
#define LED2_PIN 14 // red led
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_RELAY

#define LED3_PIN 12 // UV leds (1-2-3-4-5-6-7-8)
#define LED3_PIN_INVERSE 0
#define LED3_RELAY 1
#define LED4_PIN 16 // UV leds (9-10-11)
#define LED4_PIN_INVERSE 0
#define LED4_RELAY 1

// -----------------------------------------------------------------------------
// Avatto NAS-WR01W Wifi Smart Power Plug
// https://www.aliexpress.com/item/33011753732.html
// https://todo...
// -----------------------------------------------------------------------------

#elif defined(AVATTO_NAS_WR01W)

// Info
#define MANUFACTURER &quot; AVATTO &quot;
#define DEVICE &quot; NAS_WR01W &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// NEO Coolcam NAS-WR01W Wifi Smart Power Plug
// https://es.aliexpress.com/item/-/32854589733.html?spm=a219c.12010608.0.0.6d084e68xX0y5N
// https://www.fasttech.com/product/9649426-neo-coolcam-nas-wr01w-wifi-smart-power-plug-eu
// -----------------------------------------------------------------------------

#elif defined(NEO_COOLCAM_NAS_WR01W)

// Info
#define MANUFACTURER &quot; NEO_COOLCAM &quot;
#define DEVICE &quot; NAS_WR01W &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 1


// -----------------------------------------------------------------------------
// Deltaco SH_P01 Wifi Smart Power Plug
// -----------------------------------------------------------------------------

#elif defined(DELTACO_SH_P01)

// Info
#define MANUFACTURER &quot; DELTACO &quot;
#define DEVICE &quot; SH_P01 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 5
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_FINDME


// ------------------------------------------------------------------------------
// DELTACO_SH_P03USB Wifi Smart Power Plug
// -----------------------------------------------------------------------------

#elif defined(DELTACO_SH_P03USB)

// Info
#define MANUFACTURER &quot; DELTACO &quot;
#define DEVICE &quot; SH_P03USB &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON1_RELAY 2

// Relays
#define RELAY1_PIN 15 // USB power
#define RELAY2_PIN 12 // power plug 1
#define RELAY3_PIN 14 // power plug 2
#define RELAY4_PIN 5 // power plug 3

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // power led
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_FINDME



// ------------------------------------------------------------------------------
// Fornorm Wi-Fi USB Extension Socket (ZLD-34EU)
// https://www.aliexpress.com/item/Fornorm-WiFi-Extension-Socket-with-Surge-Protector-Smart-Power-Strip-3-Outlets-and-4-USB-Charging/32849743948.html
// Also: Estink Wifi Power Strip
// -----------------------------------------------------------------------------

#elif defined(FORNORM_ZLD_34EU)

// Info
#define MANUFACTURER &quot; FORNORM &quot;
#define DEVICE &quot; ZLD_34EU &quot;

// Disable UART noise since this board uses GPIO3
#define DEBUG_SERIAL_SUPPORT 0

// Buttons
#define BUTTON1_PIN 16
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 4

// Relays
#define RELAY1_PIN 14 // USB power
#define RELAY2_PIN 13 // power plug 1
#define RELAY3_PIN 4 // power plug 2
#define RELAY4_PIN 15 // power plug 3

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0 // power led
#define LED2_PIN 12 // power plug 1
#define LED3_PIN 3 // power plug 2
#define LED4_PIN 5 // power plug 3

#define LED1_PIN_INVERSE 1
#define LED2_PIN_INVERSE 1
#define LED3_PIN_INVERSE 1
#define LED4_PIN_INVERSE 1

#define LED1_MODE LED_MODE_FINDME
#define LED2_MODE LED_MODE_FOLLOW
#define LED3_MODE LED_MODE_FOLLOW
#define LED4_MODE LED_MODE_FOLLOW

#define LED2_RELAY 2
#define LED3_RELAY 3
#define LED4_RELAY 4


// -----------------------------------------------------------------------------
// Bruno Horta's OnOfre
// https://www.bhonofre.pt/
// https://github.com/brunohorta82/BH_OnOfre/
// -----------------------------------------------------------------------------

#elif defined(BH_ONOFRE)

// Info
#define MANUFACTURER &quot; BH &quot;
#define DEVICE &quot; ONOFRE &quot;

// Buttons
#define BUTTON1_PIN 12
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON1_RELAY 1
#define BUTTON2_PIN 13
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// -----------------------------------------------------------------------------
// BlitzWolf SHP2 and SHP6
// Also several boards under different names uing a power chip labelled BL0937 or HJL-01
// * Blitzwolf (https://www.amazon.es/Inteligente-Temporización-Dispositivos-Cualquier-BlitzWolf/dp/B07BMQP142)
// * HomeCube (https://www.amazon.de/Steckdose-Homecube-intelligente-Verbrauchsanzeige-funktioniert/dp/B076Q2LKHG)
// * Coosa (https://www.amazon.com/COOSA-Monitoring-Function-Campatible-Assiatant/dp/B0788W9TDR)
// * Gosund (http://www.gosund.com/?m=content &amp; c=index &amp; a=show &amp; catid=6 &amp; id=5)
// * Ablue (https://www.amazon.de/Intelligente-Steckdose-Ablue-Funktioniert-Assistant/dp/B076DRFRZC)
// * DIY Tech Smart Home (https://www.amazon.es/gp/product/B07HHKXYS9)
// -----------------------------------------------------------------------------

#elif defined(BLITZWOLF_BWSHPX)

// Info
#define MANUFACTURER &quot; BLITZWOLF &quot;
#define DEVICE &quot; BWSHPX &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 0
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// Same as the above but new board version marked V2.3
// BlitzWolf SHP2 V2.3
// Gosund SP1 V2.3
// -----------------------------------------------------------------------------

#elif defined(BLITZWOLF_BWSHPX_V23)

// Info
#define MANUFACTURER &quot; BLITZWOLF &quot;
#define DEVICE &quot; BWSHPX_V23 &quot;

// Buttons
#define BUTTON1_PIN 3
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 1
#define LED1_PIN_INVERSE 1
#define LED2_PIN 13
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// BUTTON1 and LED1 are using Serial pins
#define DEBUG_SERIAL_SUPPORT 0

// -----------------------------------------------------------------------------
// Similar to both devices above but also with switchable USB ports
// and other sensor (CSE7766).
// the pin layout is different to the above two versions
// BlitzWolf SHP5
// -----------------------------------------------------------------------------
#elif defined(BLITZWOLF_BWSHP5)

// Info
#define MANUFACTURER &quot; BLITZWOLF &quot;
#define DEVICE &quot; BWSHP5 &quot;

// Buttons
#define BUTTON1_PIN 16
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
// Power plug
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL
// USB
#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 0
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 1

// Disable UART noise
#define DEBUG_SERIAL_SUPPORT 0

// CSE7766
#ifndef CSE7766_SUPPORT
#define CSE7766_SUPPORT 1
#endif
#define CSE7766_PIN 1

// -----------------------------------------------------------------------------
// Teckin SP21
// -----------------------------------------------------------------------------

#elif defined(TECKIN_SP21)

// Info
#define MANUFACTURER &quot; TECKIN &quot;
#define DEVICE &quot; SP21 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1


// -----------------------------------------------------------------------------
// Teckin SP22 v1.4 - v1.6
// -----------------------------------------------------------------------------

#elif defined(TECKIN_SP22_V14)

// Info
#define MANUFACTURER &quot; TECKIN &quot;
#define DEVICE &quot; SP22_V14 &quot;

// Buttons
#define BUTTON1_PIN 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 3
#define LED1_PIN_INVERSE 1
#define LED2_PIN 13
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 20730
#define HLW8012_VOLTAGE_RATIO 264935
#define HLW8012_POWER_RATIO 2533110
#define HLW8012_INTERRUPT_ON FALLING

// BUTTON1 and LED1 are using Serial pins
#define DEBUG_SERIAL_SUPPORT 0

// -----------------------------------------------------------------------------
// Several boards under different names uing a power chip labelled BL0937 or HJL-01
// Also model number KS-602S
// -----------------------------------------------------------------------------

#elif defined(GOSUND_WS1)

// Info
#define MANUFACTURER &quot; GOSUND &quot;
#define DEVICE &quot; WS1 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 1
#define LED1_PIN_INVERSE 1

// LED1 is using TX pin
#define DEBUG_SERIAL_SUPPORT 0

// ----------------------------------------------------------------------------------------
// Homecube 16A is similar but some pins differ and it also has RGB LEDs
// https://www.amazon.de/gp/product/B07D7RVF56/ref=oh_aui_detailpage_o00_s01?ie=UTF8 &amp; psc=1
// ----------------------------------------------------------------------------------------

#elif defined(HOMECUBE_16A)

// Info
#define MANUFACTURER &quot; HOMECUBE &quot;
#define DEVICE &quot; 16A &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
//LED Pin 4 - ESP8266 onboard LED
//Red LED: 0
//Green LED: 12
//Blue LED: 2

// Blue
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// Green
#define LED2_PIN 12
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_RELAY

// Red
#define LED3_PIN 0
#define LED3_PIN_INVERSE 0
#define LED3_MODE LED_MODE_OFF

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 16
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// VANZAVANZU Smart Outlet Socket (based on BL0937 or HJL-01)
// https://www.amazon.com/Smart-Plug-Wifi-Mini-VANZAVANZU/dp/B078PHD6S5
// -----------------------------------------------------------------------------

#elif defined(VANZAVANZU_SMART_WIFI_PLUG_MINI)

// Info
#define MANUFACTURER &quot; VANZAVANZU &quot;
#define DEVICE &quot; SMART_WIFI_PLUG_MINI &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 0
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 1

// Disable UART noise
#define DEBUG_SERIAL_SUPPORT 0

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 3
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------

#elif defined(GENERIC_AG_L4)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; AG_L4 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// button 1: &quot; power &quot; button
#define BUTTON1_PIN 4
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_PRESS BUTTON_MODE_TOGGLE
#define BUTTON1_CLICK BUTTON_MODE_NONE
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_RESET

// button 2: &quot; wifi &quot; button
#define BUTTON2_PIN 2
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_PRESS BUTTON_MODE_TOGGLE
#define BUTTON2_CLICK BUTTON_MODE_NONE
#define BUTTON2_DBLCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGCLICK BUTTON_MODE_NONE
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_NONE

// LEDs
#define LED1_PIN 5 // red status led
#define LED1_PIN_INVERSE 0

#define LED2_PIN 16 // master light power
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_RELAY

// Light
#define LIGHT_CHANNELS 3
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 13 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0

// -----------------------------------------------------------------------------

#elif defined(ALLTERCO_SHELLY1)

// Info
#define MANUFACTURER &quot; ALLTERCO &quot;
#define DEVICE &quot; SHELLY1 &quot;

// Buttons
#define BUTTON1_PIN 5
#define BUTTON1_MODE BUTTON_SWITCH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#elif defined(ALLTERCO_SHELLY2)

// Info
#define MANUFACTURER &quot; ALLTERCO &quot;
#define DEVICE &quot; SHELLY2 &quot;

// Buttons
#define BUTTON1_PIN 12
#define BUTTON2_PIN 14
#define BUTTON1_MODE BUTTON_SWITCH
#define BUTTON2_MODE BUTTON_SWITCH
#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

#elif defined(ALLTERCO_SHELLY1PM)
// Info
#define MANUFACTURER &quot; ALLTERCO &quot;
#define DEVICE &quot; SHELLY1PM &quot;

// Buttons
#define BUTTON1_PIN 4
#define BUTTON1_MODE BUTTON_SWITCH
#define BUTTON1_RELAY 1

#define BUTTON2_PIN 2
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON2_LNGCLICK BUTTON_MODE_RESET
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_FACTORY

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// Light
#define LED1_PIN 0
#define LED1_PIN_INVERSE 1

// HJL01 / BL0937
#define HLW8012_SUPPORT 1
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

//Temperature
#define NTC_SUPPORT 1
#define SENSOR_SUPPORT 1
#define NTC_BETA 3350
#define NTC_R_UP 10000
#define NTC_R_DOWN 0
#define NTC_R0 8000

#elif defined(ALLTERCO_SHELLY25)
// Info
#define MANUFACTURER &quot; ALLTERCO &quot;
#define DEVICE &quot; SHELLY25 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_SWITCH
#define BUTTON1_RELAY 1

#define BUTTON2_PIN 5
#define BUTTON2_MODE BUTTON_SWITCH
#define BUTTON2_RELAY 2

#define BUTTON3_PIN 2
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_LNGCLICK BUTTON_MODE_RESET
#define BUTTON3_LNGLNGCLICK BUTTON_MODE_FACTORY

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#define RELAY2_PIN 15
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// Light
#define LED1_PIN 0
#define LED1_PIN_INVERSE 1

//Temperature
#define NTC_SUPPORT 1
#define SENSOR_SUPPORT 1
#define NTC_BETA 3350
#define NTC_R_UP 10000
#define NTC_R_DOWN 0
#define NTC_R0 8000

//Current
#define ADE7953_SUPPORT 1
#define I2C_SDA_PIN 12
#define I2C_SCL_PIN 14

// -----------------------------------------------------------------------------

// also works with https://www.amazon.com/gp/product/B07TMY394G/
// see https://github.com/xoseperez/espurna/issues/2055

#elif defined(LOHAS_E27_9W)

// Info
#define MANUFACTURER &quot; LOHAS &quot;
#define DEVICE &quot; E27_9W &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define MY92XX_MODEL MY92XX_MODEL_MY9231
#define MY92XX_CHIPS 2
#define MY92XX_DI_PIN 13
#define MY92XX_DCKI_PIN 15
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
#define MY92XX_MAPPING 0, 1, 2, 3, 4
#define LIGHT_WHITE_FACTOR (0.1) // White LEDs are way more bright in the B1

// https://www.amazon.com/gp/product/B07T7W7ZMW

#elif defined(LOHAS_E26_A19)

// Info
#define MANUFACTURER &quot; LOHAS &quot;
#define DEVICE &quot; E26_A19 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 14 // WHITE1
#define LIGHT_CH5_PIN 12 // WHITE1

// -----------------------------------------------------------------------------

#elif defined(TECKIN_SB53)

// Info
#define MANUFACTURER &quot; TECKIN &quot;
#define DEVICE &quot; SB53 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 4 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 13 // WARM WHITE
#define LIGHT_CH5_PIN 5 // COLD WHITE

// -----------------------------------------------------------------------------

#elif defined(XIAOMI_SMART_DESK_LAMP)

// Info
#define MANUFACTURER &quot; XIAOMI &quot;
#define DEVICE &quot; SMART_DESK_LAMP &quot;

// Buttons
#define BUTTON1_PIN 2
#define BUTTON2_PIN 14

#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP

// This button doubles as switch here and as encoder mode switch below
// Clicking it (for less than 500ms) will turn the light on and off
// Double and Long clicks will not work as these are used to modify the encoder action
#define BUTTON1_RELAY 1
#define BUTTON_LNGCLICK_DELAY 500
#define BUTTON1_DBLCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGCLICK BUTTON_MODE_NONE
#define BUTTON1_LNGLNGCLICK BUTTON_MODE_NONE

// Hidden button will enter AP mode if dblclick and reset the device when long-long-clicked
#define BUTTON2_DBLCLICK BUTTON_MODE_AP
#define BUTTON2_LNGLNGCLICK BUTTON_MODE_RESET

// Light
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1
#define LIGHT_STEP 8
#define LIGHT_CHANNELS 2
#define LIGHT_CH1_PIN 5 // warm white
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_PIN 4 // cold white
#define LIGHT_CH2_INVERSE 0

// https://www.xiaomitoday.com/xiaomi-mijia-mjtd01yl-led-desk-lamp-review/
#define LIGHT_COLDWHITE_MIRED 153
#define LIGHT_WARMWHITE_MIRED 370

// Encoder
// If mode is ENCODER_MODE_RATIO, the value ratio between both channels is changed
// when the button is not pressed, and the overall brightness when pressed
// If mode is ENCODER_MODE_CHANNEL, the first channel value is changed
// when the button is not pressed, and the second channel when pressed
// If no ENCODERX_BUTTON_PIN defined it will only change the value of the first defined channel
#define ENCODER_SUPPORT 1
#define ENCODER1_PIN1 12
#define ENCODER1_PIN2 13
#define ENCODER1_BUTTON_PIN 2 // active low by default, with software pullup
#define ENCODER1_CHANNEL1 0 // please note this value is 0-based (LIGHT_CH1 above)
#define ENCODER1_CHANNEL2 1 // please note this value is 0-based (LIGHT_CH2 above)
#define ENCODER1_MODE ENCODER_MODE_RATIO

#elif defined(PHYX_ESP12_RGB)

// Info
#define MANUFACTURER &quot; PHYX &quot;
#define DEVICE &quot; ESP12_RGB &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 3
#define LIGHT_CH1_PIN 4 // RED
#define LIGHT_CH2_PIN 14 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0

// -----------------------------------------------------------------------------
// iWoole LED Table Lamp
// http://iwoole.com/newst-led-smart-night-light-7w-smart-table-light-rgbw-wifi-app-remote-control-110v-220v-us-eu-plug-smart-lamp-google-home-decore-p00022p1.html
// -----------------------------------------------------------------------------

#elif defined(IWOOLE_LED_TABLE_LAMP)

// Info
#define MANUFACTURER &quot; IWOOLE &quot;
#define DEVICE &quot; LED_TABLE_LAMP &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 12 // RED
#define LIGHT_CH2_PIN 5 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 4 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Generic GU10
// https://www.ebay.com/itm/1-10PC-GU10-RGB-Smart-Bulb-Wireless-WiFi-App-Remote-Ctrl-Light-for-Alexa-Google/173724116351
// -----------------------------------------------------------------------------

#elif defined(GENERIC_GU10)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; GU10 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 4 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Generic E14
// https://www.ebay.com/itm/LED-Bulb-Wifi-E14-4-5W-Candle-RGB-W-4in1-Dimmable-V-tac-Smart-VT-5114/163899840601
// -----------------------------------------------------------------------------

#elif defined(GENERIC_E14)

// Info
#define MANUFACTURER &quot; GENERIC &quot;
#define DEVICE &quot; E14 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 4 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 5 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Deltaco white e14 (SH-LE14W) and e27 (SH-LE27W)
// -----------------------------------------------------------------------------

#elif defined(DELTACO_SH_LEXXW)

// Info
#define MANUFACTURER &quot; DELTACO &quot;
#define DEVICE &quot; SH_LEXXW &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 2
#define LIGHT_CH1_PIN 12 // WARM WHITE
#define LIGHT_CH2_PIN 14 // COLD WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0

// -----------------------------------------------------------------------------
// Deltaco rgbw e27 (SH-LE27RGB)
// -----------------------------------------------------------------------------

#elif defined(DELTACO_SH_LEXXRGB)

// Info
#define MANUFACTURER &quot; DELTACO &quot;
#define DEVICE &quot; SH_LEXXRGB &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 14 // WARM WHITE
#define LIGHT_CH5_PIN 12 // COLD WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0
#define LIGHT_CH5_INVERSE 0

// -----------------------------------------------------------------------------
// Nexete A19
// https://www.ebay.com/itm/Wifi-Smart-LED-light-Bulb-9W-60W-A19-850LM-RGBW-Dimmable-for-Alexa-Google-Home/283514779201
// -----------------------------------------------------------------------------

#elif defined(NEXETE_A19)

// Info
#define MANUFACTURER &quot; NEXETE &quot;
#define DEVICE &quot; A19 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 12 // RED
#define LIGHT_CH2_PIN 15 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 5 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Lombex Lux Nova 2 Tunable White
// https://www.amazon.com/Lombex-Compatible-Equivalent-Dimmable-2700K-6500K/dp/B07B8K72PR
// -----------------------------------------------------------------------------
#elif defined(LOMBEX_LUX_NOVA2_TUNABLE_WHITE)

// Info
#define MANUFACTURER &quot; LOMBEX &quot;
#define DEVICE &quot; LUX_NOVA2_TUNABLE_WHITE &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 5
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 4
#define MY92XX_DCKI_PIN 5
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
// No RGB on this bulb. Warm white on channel 0, cool white on channel 3
#define MY92XX_MAPPING 255, 255, 255, 3, 0

// -----------------------------------------------------------------------------
// Lombex Lux Nova 2 White and Color
// https://www.amazon.com/Lombex-Compatible-Equivalent-Dimmable-2700K-6500K/dp/B07B8K72PR
// -----------------------------------------------------------------------------
#elif defined(LOMBEX_LUX_NOVA2_WHITE_COLOR)

// Info
#define MANUFACTURER &quot; LOMBEX &quot;
#define DEVICE &quot; LUX_NOVA2_WHITE_COLOR &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 4
#define MY92XX_DCKI_PIN 5
#define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT
// RGB on channels 0/1/2, either cool or warm white on channel 3
// The bulb *should* have cool leds, but could also have warm leds as a common defect
#define MY92XX_MAPPING 0, 1, 2, 3

// -----------------------------------------------------------------------------
// Bestek Smart Plug with 2 USB ports
// https://www.bestekcorp.com/bestek-smart-plug-works-with-amazon-alexa-google-assistant-and-ifttt-with-2-usb
// -----------------------------------------------------------------------------

#elif defined(BESTEK_MRJ1011)

// Info
#define MANUFACTURER &quot; BESTEK &quot;
#define DEVICE &quot; MRJ1011 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relay
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LED
#define LED1_PIN 4
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// GBLIFE RGBW SOCKET
// -----------------------------------------------------------------------------

#elif defined(GBLIFE_RGBW_SOCKET)

// Info
#define MANUFACTURER &quot; GBLIFE &quot;
#define DEVICE &quot; RGBW_SOCKET &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// Light RGBW
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 14 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 4 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// ----------------------------------------------------------------------------------------
// Smart life Mini Smart Socket is similar Homecube 16A but some GPIOs differ
// https://www.ebay.de/itm/Smart-Steckdose-WIFI-WLAN-Amazon-Alexa-Fernbedienung-Home-Socket-Zeitschaltuh-DE/123352026749?hash=item1cb85a8e7d:g:IasAAOSwk6dbj390
// Also labeled NETVIP
// https://www.amazon.es/Inteligente-NETVIP-Inal%C3%A1mbrico-Interruptor-Funciona/dp/B07KH8YWS5
// ----------------------------------------------------------------------------------------

#elif defined(SMARTLIFE_MINI_SMART_SOCKET)

// Info
#define MANUFACTURER &quot; SMARTLIFE &quot;
#define DEVICE &quot; MINI_SMART_SOCKET &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
//Red LED: 0
//Green LED: 4
//Blue LED: 2

// Light
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1
#define LIGHT_CHANNELS 3
#define LIGHT_CH1_PIN 0 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 2 // BLUE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// ----------------------------------------------------------------------------------------
// Hama WiFi Steckdose (00176533)
// https://at.hama.com/00176533/hama-wifi-steckdose-3500w-16a
// ----------------------------------------------------------------------------------------

#elif defined(HAMA_WIFI_STECKDOSE_00176533)

// Info
#define MANUFACTURER &quot; HAMA &quot;
#define DEVICE &quot; WIFI_STECKDOSE_00176533 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4
#define LED1_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// Oxaoxe NX-SP202
// Digoo NX-SP202 (not tested)
// Digoo DG-SP202 (not tested)
// https://github.com/xoseperez/espurna/issues/1502
// -----------------------------------------------------------------------------

#elif defined(DIGOO_NX_SP202)

// Info
#define MANUFACTURER &quot; DIGOO &quot;
#define DEVICE &quot; NX_SP202 &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1
#define BUTTON2_PIN 16
#define BUTTON2_MODE BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH
#define BUTTON2_RELAY 2

// Relays
#define RELAY1_PIN 15
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_PIN 14
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 23296
#define HLW8012_VOLTAGE_RATIO 310085
#define HLW8012_POWER_RATIO 3368471
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// Foxel's LightFox dual
// https://github.com/foxel/esp-dual-rf-switch
// -----------------------------------------------------------------------------

#elif defined(FOXEL_LIGHTFOX_DUAL)

// Info
#define MANUFACTURER &quot; FOXEL &quot;
#define DEVICE &quot; LIGHTFOX_DUAL &quot;
#define SERIAL_BAUDRATE 19200
#define RELAY_PROVIDER RELAY_PROVIDER_DUAL
#define DUMMY_RELAY_COUNT 2
#define DEBUG_SERIAL_SUPPORT 0

// Buttons
#define BUTTON1_RELAY 1
#define BUTTON2_RELAY 2
#define BUTTON3_RELAY 2
#define BUTTON4_RELAY 1

// -----------------------------------------------------------------------------
// Teckin SP20
// -----------------------------------------------------------------------------

#elif defined(TECKIN_SP20)

// Info
#define MANUFACTURER &quot; TECKIN &quot;
#define DEVICE &quot; SP20 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 1
#define LED2_PIN 0
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_FINDME
#define LED2_RELAY 0

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// Charging Essentials / LITESUN LA-WF3
// -----------------------------------------------------------------------------

#elif defined(LITESUN_LA_WF3)

// Info
#define MANUFACTURER &quot; LITESUN &quot;
#define DEVICE &quot; LA_WF3 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 4 // 4 blue led
#define LED1_MODE LED_MODE_WIFI
#define LED1_PIN_INVERSE 1

#define LED2_PIN 5 // 5 red led
#define LED2_MODE LED_MODE_RELAY
#define LED2_PIN_INVERSE 1

// -----------------------------------------------------------------------------
// PSH
// -----------------------------------------------------------------------------

#elif defined(PSH_WIFI_PLUG)

// Info
#define MANUFACTURER &quot; PSH &quot;
#define DEVICE &quot; WIFI_PLUG &quot;

// Relays
#define RELAY1_PIN 2
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0
#define LED1_PIN_INVERSE 0

#elif defined(PSH_RGBW_CONTROLLER)

// Info
#define MANUFACTURER &quot; PSH &quot;
#define DEVICE &quot; RGBW_CONTROLLER &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// LEDs
#define LED1_PIN 13
#define LED1_PIN_INVERSE 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 5 // RED
#define LIGHT_CH2_PIN 4 // GREEN
#define LIGHT_CH3_PIN 12 // BLUE
#define LIGHT_CH4_PIN 14 // WHITE1
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

#elif defined(PSH_WIFI_SENSOR)

// Info
#define MANUFACTURER &quot; PSH &quot;
#define DEVICE &quot; WIFI_SENSOR &quot;

// DHT12 Sensor
#define DHT_SUPPORT 1
#define DHT_PIN 14
#define DHT_TYPE DHT_CHIP_DHT12

// LDR Sensor
#define LDR_SUPPORT 1
#define LDR_TYPE LDR_GL5528
#define LDR_ON_GROUND false
#define LDR_RESISTOR 10000

#elif defined(JINVOO_VALVE_SM_AW713)

// Reflashing from original Tuya firmware
// to thirdparty firmware like espurna by:
// https://github.com/ct-Open-Source/tuya-convert

// Info
#define MANUFACTURER &quot; JINVOO &quot;
#define DEVICE &quot; VALVE_SM_AW713 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LED
#define LED1_PIN 5 // 5 red led
#define LED1_PIN_INVERSE 0
#define LED1_RELAY 1
#define LED1_MODE LED_MODE_RELAY

#define LED2_PIN 4 // 4 blue led
#define LED2_PIN_INVERSE 0
#define LED2_RELAY 1
#define LED2_MODE LED_MODE_FINDME_WIFI

#elif defined(TUYA_GENERIC_DIMMER)

#define MANUFACTURER &quot; TUYA &quot;
#define DEVICE &quot; GENERIC_DIMMER &quot;

#define LIGHT_PROVIDER LIGHT_PROVIDER_TUYA
#define LIGHT_CHANNELS 0
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define DUMMY_RELAY_COUNT 0

// -----------------------------------------------------------------------------
// Etekcity ESW01-USA
// https://www.amazon.com/Etekcity-Voltson-Outlet-Monitoring-Required/dp/B01M3MYIFS
// -----------------------------------------------------------------------------

#elif defined(ETEKCITY_ESW01_USA)

// Info
#define MANUFACTURER &quot; ETEKCITY &quot;
#define DEVICE &quot; ESW01-USA &quot;

// Buttons
#define BUTTON1_PIN 14
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
// Blue
#define LED1_PIN 5
#define LED1_PIN_INVERSE 0
#define LED1_MODE LED_MODE_WIFI
// Yellow
#define LED2_PIN 16
#define LED2_PIN_INVERSE 0
#define LED2_MODE LED_MODE_FOLLOW
#define LED2_RELAY 1

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 15
#define HLW8012_CF1_PIN 12
#define HLW8012_CF_PIN 13

#define HLW8012_SEL_CURRENT HIGH // SEL pin to HIGH to measure current
#define HLW8012_CURRENT_R 0.001 // Current resistor
#define HLW8012_VOLTAGE_R_UP ( 4 * 470000 ) // Upstream voltage resistor
#define HLW8012_VOLTAGE_R_DOWN ( 1000 ) // Downstream voltage resistor
#define HLW8012_INTERRUPT_ON CHANGE

// -----------------------------------------------------------------------------
// FS UAP1
// http://frank-schuetz.de/index.php/fhem/13-hoermann-torantrieb-mit-espeasy-in-fhem-einbinden

#elif defined(FS_UAP1)

// Info
#define MANUFACTURER &quot; FS &quot;
#define DEVICE &quot; UAP1 &quot;

// Inputs
#define DIGITAL1_PIN 4
#define DIGITAL2_PIN 5

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define RELAY3_PIN 14
#define RELAY4_PIN 15

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 2
#define LED1_PIN_INVERSE 0

// Disable UART noise
#define DEBUG_SERIAL_SUPPORT 0

// -----------------------------------------------------------------------------
// TFLAG NX-SM100 &amp; NX-SM200
// -----------------------------------------------------------------------------

#elif defined(TFLAG_NX_SMX00)

// Info
#define MANUFACTURER &quot; TFLAG &quot;
#define DEVICE &quot; NX_SMX00 &quot;

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 12
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LEDs
#define LED1_PIN 0
#define LED1_PIN_INVERSE 1
#define LED1_MODE LED_MODE_FOLLOW_INVERSE
#define LED1_RELAY 1
#define LED2_PIN 15
#define LED2_PIN_INVERSE 1
#define LED2_MODE LED_MODE_WIFI

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 16
#define HLW8012_CF1_PIN 14
#define HLW8012_CF_PIN 5

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 632
#define HLW8012_VOLTAGE_RATIO 313400
#define HLW8012_POWER_RATIO 3711185
#define HLW8012_INTERRUPT_ON FALLING

// -----------------------------------------------------------------------------
// MUVIT_IO_MIOBULB001
// -----------------------------------------------------------------------------

#elif defined(MUVIT_IO_MIOBULB001)

// Info
#define MANUFACTURER &quot; MUVIT_IO &quot;
#define DEVICE &quot; MIOBULB001 &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 14 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 13 // BLUE
#define LIGHT_CH4_PIN 4 // WHITE
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// -----------------------------------------------------------------------------
// Hykker Power Plug (Smart Home Series) available in Jerónimo Martins Polska (Biedronka)
// https://www.hykker.com/akcesoria/gniazdo-wi-fi-z-licznikiem-energii/
// Reflashing from original Tuya firmware
// to thirdparty firmware like espurna by:
// https://github.com/ct-Open-Source/tuya-convert
// -----------------------------------------------------------------------------

#elif defined(HYKKER_SMART_HOME_POWER_PLUG)

// Info
#define MANUFACTURER &quot; HYKKER &quot;
#define DEVICE &quot; SMART_HOME_POWER_PLUG &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LED
// Red
#define LED1_PIN 13
#define LED1_MODE LED_MODE_WIFI
#define LED1_PIN_INVERSE 1
// Blue connected to relay

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 282060
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

#define SENSOR_ENERGY_UNITS ENERGY_KWH
#define SENSOR_POWER_UNITS POWER_WATTS

// -----------------------------------------------------------------------------
// Kogan Smarter Home Plug with Energy Meter (Australia)
// Product code: KASPEMHA
// https://www.kogan.com/au/buy/kogan-smarterhome-smart-plug-energy-meter/
// Reflashing from original Tuya firmware
// to thirdparty firmware like espurna by:
// https://github.com/ct-Open-Source/tuya-convert
// -----------------------------------------------------------------------------

#elif defined(KOGAN_SMARTER_HOME_PLUG_W_POW)

// Info
#define MANUFACTURER &quot; KOGAN &quot;
#define DEVICE &quot; SMARTER_HOME_PLUG_W_POW &quot;

// Buttons
#define BUTTON1_PIN 0
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH | BUTTON_SET_PULLUP
#define BUTTON1_RELAY 1

// Relays
#define RELAY1_PIN 14
#define RELAY1_TYPE RELAY_TYPE_NORMAL

// LED
// Red
#define LED1_PIN 13
#define LED1_MODE LED_MODE_WIFI
#define LED1_PIN_INVERSE 1
// Blue connected to relay

// HLW8012
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 5
#define HLW8012_CF_PIN 4

#define HLW8012_SEL_CURRENT LOW
#define HLW8012_CURRENT_RATIO 25740
#define HLW8012_VOLTAGE_RATIO 282060
#define HLW8012_POWER_RATIO 3414290
#define HLW8012_INTERRUPT_ON FALLING

#define SENSOR_ENERGY_UNITS ENERGY_KWH
#define SENSOR_POWER_UNITS POWER_WATTS

// -----------------------------------------------------------------------------
// LSC Smart LED Light Strip (Smart CXonnect Series) available ACTION (Germany)
// https://www.action.com/de-de/p/lsc-smart-connect-intelligenter-multicolor-led-strip-/
// Reflashing from original Tuya firmware
// to thirdparty firmware like espurna by:
// https://github.com/ct-Open-Source/tuya-convert
// -----------------------------------------------------------------------------

#elif defined(LSC_SMART_LED_LIGHT_STRIP)
// Info
#define MANUFACTURER &quot; LSC &quot;
#define DEVICE &quot; SMART_LED_LIGHT_STRIP &quot;
#define RELAY_PROVIDER RELAY_PROVIDER_LIGHT
#define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER
#define DUMMY_RELAY_COUNT 1

// Light RGBW
#define LIGHT_CHANNELS 4
#define LIGHT_CH1_PIN 4 // RED
#define LIGHT_CH2_PIN 12 // GREEN
#define LIGHT_CH3_PIN 14 // BLUE
#define LIGHT_CH4_PIN 13 // WHITE
// #define LIGHT_CH5_PIN 5 // CW (not connected, but circuit supports it)
#define LIGHT_CH1_INVERSE 0
#define LIGHT_CH2_INVERSE 0
#define LIGHT_CH3_INVERSE 0
#define LIGHT_CH4_INVERSE 0

// IR
#define IR_SUPPORT 1
#define IR_RX_PIN 0
#define IR_BUTTON_SET 5

// -----------------------------------------------------------------------------
// eHomeDIY WT02
// https://github.com/eHomeDIY/WT02-hardware
// -----------------------------------------------------------------------------
#elif defined(EHOMEDIY_WT02)

// Info
#define MANUFACTURER &quot; EHOMEDIY &quot;
#define DEVICE &quot; WT02 &quot;

#define I2C_SDA_PIN 0
#define I2C_SCL_PIN 2

#define BMX280_SUPPORT 1
// #define SI7021_SUPPORT 1

// -----------------------------------------------------------------------------
// eHomeDIY WT03
// https://github.com/eHomeDIY/WT03-hardware
// -----------------------------------------------------------------------------

#elif defined(EHOMEDIY_WT03)

// Info
#define MANUFACTURER &quot; EHOMEDIY &quot;
#define DEVICE &quot; WT03 &quot;

#define I2C_SDA_PIN 2
#define I2C_SCL_PIN 0

#define BMX280_SUPPORT 1
// #define SI7021_SUPPORT 1

// -----------------------------------------------------------------------------
// Linksprite R4
// http://linksprite.com/wiki/index.php?title=LinkNode_R4:_Arduino-compatible_WiFi_relay_controller
// -----------------------------------------------------------------------------

#elif defined(LINKSPRITE_LINKNODE_R4)

// Info
#define MANUFACTURER &quot; LINKSPRITE &quot;
#define DEVICE &quot; LINKNODE_R4 &quot;

// Relays
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define RELAY3_PIN 14
#define RELAY4_PIN 16

#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_TYPE RELAY_TYPE_NORMAL
#define RELAY3_TYPE RELAY_TYPE_NORMAL
#define RELAY4_TYPE RELAY_TYPE_NORMAL

// -----------------------------------------------------------------------------

#else

#error &quot; UNSUPPORTED HARDWARE!! &quot;

#endif


espurna-dev-2020-01-31.zip > relay.h

/*

RELAY MODULE

Copyright (C) 2016-2019 by Xose Pérez &amp; lt; xose dot perez at gmail dot com &amp; gt;

*/

#pragma once

#include &amp; lt; bitset &amp; gt;
#include &quot; utils.h &quot;

constexpr size_t RELAYS_MAX = 32;

enum class RelayStatus : unsigned char {
OFF = 0,
ON = 1,
TOGGLE = 2,
UNKNOWN = 0xFF
};

struct RelayMask {

explicit RelayMask(const String &amp; string) :
as_string(string),
as_u32(u32fromString(string))
{}

explicit RelayMask(String &amp; &amp; string) :
as_string(std::move(string)),
as_u32(u32fromString(as_string))
{}

explicit RelayMask(uint32_t value) :
as_string(std::move(u32toString(value, 2))),
as_u32(value)
{}

explicit RelayMask(std::bitset &amp; lt; RELAYS_MAX &amp; gt; bitset) :
RelayMask(bitset.to_ulong())
{}

RelayMask(String &amp; &amp; string, uint32_t value) :
as_string(std::move(string)),
as_u32(value)
{}

const String as_string;
uint32_t as_u32;

};

RelayStatus relayParsePayload(const char * payload);

bool relayStatus(unsigned char id, bool status, bool report, bool group_report);
bool relayStatus(unsigned char id, bool status);
bool relayStatus(unsigned char id);

void relayToggle(unsigned char id, bool report, bool group_report);
void relayToggle(unsigned char id);

unsigned char relayCount();

const String &amp; relayPayloadOn();
const String &amp; relayPayloadOff();
const String &amp; relayPayloadToggle();

const char* relayPayload(RelayStatus status);

void relaySetupDummy(size_t size, bool reconfigure = false);


espurna-dev-2020-01-31.zip > dummy_ets_printf.c

// special dummy printf to disable Serial using some boards
int dummy_ets_printf(const char* format, ...) {
return 0;
}


espurna-dev-2020-01-31.zip > RFM69Wrap.h

/*

RFM69Wrap

RFM69 by Felix Ruso (http://LowPowerLab.com/contact) wrapper for ESP8266
Copyright (C) 2016-2019 by Xose Pérez &amp; lt; xose dot perez at gmail dot com &amp; gt;

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 &amp; lt; http://www.gnu.org/licenses/ &amp; gt; .

*/

#pragma once

#include &amp; lt; RFM69.h &amp; gt;
#include &amp; lt; RFM69_ATC.h &amp; gt;
#include &amp; lt; SPI.h &amp; gt;

class RFM69Wrap: public RFM69_ATC {

public:

RFM69Wrap(uint8_t slaveSelectPin=RF69_SPI_CS, uint8_t interruptPin=RF69_IRQ_PIN, bool isRFM69HW=false, uint8_t interruptNum=0):
RFM69_ATC(slaveSelectPin, interruptPin, isRFM69HW, interruptNum) {};

protected:

// overriding SPI_CLOCK for ESP8266
void select() {

noInterrupts();

#if defined (SPCR) &amp; &amp; defined (SPSR)
// save current SPI settings
_SPCR = SPCR;
_SPSR = SPSR;
#endif

// set RFM69 SPI settings
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);

#if defined(__arm__)
SPI.setClockDivider(SPI_CLOCK_DIV16);
#elif defined(ARDUINO_ARCH_ESP8266)
SPI.setClockDivider(SPI_CLOCK_DIV2); // speeding it up for the ESP8266
#else
SPI.setClockDivider(SPI_CLOCK_DIV4);
#endif

digitalWrite(_slaveSelectPin, LOW);

}

};


espurna-dev-2020-01-31.zip > URL.h

// -----------------------------------------------------------------------------
// Parse char string as URL
//
// Adapted from HTTPClient::beginInternal()
// https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
//
// -----------------------------------------------------------------------------

#pragma once

class URL {
public:
URL(const String &amp; );

String protocol;
String host;
String path;
uint16_t port;

private:
String buffer;
};


URL::URL(const String &amp; url) : buffer(url) {

// cut the protocol part
int index = buffer.indexOf( &quot; :// &quot; );
if (index &amp; gt; 0) {
this- &amp; gt; protocol = buffer.substring(0, index);
buffer.remove(0, (index + 3));
}

if (this- &amp; gt; protocol == &quot; http &quot; ) {
this- &amp; gt; port = 80;
} else if (this- &amp; gt; protocol == &quot; https &quot; ) {
this- &amp; gt; port = 443;
}

// cut the host part
String _host;

index = buffer.indexOf('/');
if (index &amp; gt; = 0) {
_host = buffer.substring(0, index);
} else {
_host = buffer;
}

// store the remaining part as path
if (index &amp; gt; = 0) {
buffer.remove(0, index);
this- &amp; gt; path = buffer;
} else {
this- &amp; gt; path = &quot; / &quot; ;
}

// separate host from port, when present
index = _host.indexOf(':');
if (index &amp; gt; = 0) {
this- &amp; gt; port = _host.substring(index + 1).toInt();
this- &amp; gt; host = _host.substring(0, index);
} else {
this- &amp; gt; host = _host;
}

}


espurna-dev-2020-01-31.zip > nondefault.h

#define LLMNR_SUPPORT 1
#define NETBIOS_SUPPORT 1
#define SSDP_SUPPORT 1
#define RF_SUPPORT 1
#define RFB_DIRECT 1
#define MDNS_CLIENT_SUPPORT 1
#define NOFUSS_SUPPORT 1
#define UART_MQTT_SUPPORT 1
#define INFLUXDB_SUPPORT 1
#define OTA_MQTT_SUPPORT 1
#define RPN_RULES_SUPPORT 1


espurna-dev-2020-01-31.zip > tuya_test.cpp

#include &amp; lt; Arduino.h &amp; gt;
#include &amp; lt; Stream.h &amp; gt;
#include &amp; lt; unity.h &amp; gt;

// -----------------------------------------------------------------------------
// Tests
// -----------------------------------------------------------------------------

#include &amp; lt; type_traits &amp; gt;
#include &amp; lt; queue &amp; gt;

#include &quot; libs/TypeChecks.h &quot;
#include &quot; tuya_types.h &quot;
#include &quot; tuya_util.h &quot;
#include &quot; tuya_transport.h &quot;
#include &quot; tuya_protocol.h &quot;
#include &quot; tuya_dataframe.h &quot;

using namespace Tuya;

bool test_datatype(const DataFrame &amp; frame, const Type expect_type) {
const auto type = dataType(frame);
return expect_type == type;
}

void test_states() {

States &amp; lt; bool &amp; gt; states(8);

// Will not update anything without explicit push
states.update(1, false);
states.update(1, true);
states.update(2, true);
states.update(2, false);

TEST_ASSERT_EQUAL_MESSAGE(8, states.capacity(),
&quot; Capacity has changed &quot; );
TEST_ASSERT_EQUAL_MESSAGE(0, states.size(),
&quot; Size should not change when updating non-existant id &quot; );

// Push something at specific ID
states.pushOrUpdate(2, true);
TEST_ASSERT_MESSAGE(states.changed(),
&quot; Should change after explicit push &quot; );
states.pushOrUpdate(2, false);
TEST_ASSERT_MESSAGE(states.changed(),
&quot; Should change after explicit update &quot; );
TEST_ASSERT_EQUAL_MESSAGE(1, states.size(),
&quot; Size should not change when updating existing id &quot; );
states.pushOrUpdate(3, true);
TEST_ASSERT_MESSAGE(states.changed(),
&quot; Should change after explicit push &quot; );

// Do not trigger &quot; changed &quot; state when value remains the same
states.pushOrUpdate(2, false);
TEST_ASSERT_MESSAGE(!states.changed(),
&quot; Should not change after not changing any values &quot; );

// Still shouldn't trigger &quot; changed &quot; without explicit push
states.update(4, false);
TEST_ASSERT_MESSAGE(!states.changed(),
&quot; Should not change after updating non-existant id &quot; );
TEST_ASSERT_EQUAL_MESSAGE(2, states.size(),
&quot; Size should remain the same after updating non-existant id &quot; );

}

void test_static_dataframe_bool() {

DataFrame frame(Command::SetDP, DataProtocol &amp; lt; bool &amp; gt; (0x02, false).serialize());

TEST_ASSERT_EQUAL_MESSAGE(0, frame.version,
&quot; Version should stay 0 unless explicitly set &quot; );
TEST_ASSERT_MESSAGE(frame.commandEquals(Command::SetDP),
&quot; commandEquals should return true with the same arg as in the constructor &quot; );
TEST_ASSERT_MESSAGE(test_datatype(frame, Type::BOOL),
&quot; DataProtocol &amp; lt; bool &amp; gt; should translate to Type::BOOL &quot; );

}

void test_static_dataframe_int() {

DataFrame frame(Command::ReportDP, DataProtocol &amp; lt; uint32_t &amp; gt; (0x03, 255).serialize());
TEST_ASSERT_EQUAL_MESSAGE(0, frame.version,
&quot; Version should stay 0 unless explicitly set &quot; );
TEST_ASSERT_MESSAGE(frame.commandEquals(Command::ReportDP),
&quot; commandEquals should return true with the same arg as in the constructor &quot; );
TEST_ASSERT_EQUAL_UINT_MESSAGE(std::distance(frame.cbegin(), frame.cend()), frame.length,
&quot; Data is expected to be stored in a contigious memory and be equal in length to the ::length attribute &quot; );
TEST_ASSERT_EQUAL_MESSAGE(0, frame[5],
&quot; Only last byte should be set &quot; );
TEST_ASSERT_EQUAL_MESSAGE(255, frame[7],
&quot; Only last byte should be set &quot; );

}

void test_dataframe_const() {

const DataFrame frame(Command::SetDP);
TEST_ASSERT_EQUAL_MESSAGE(0, frame.length,
&quot; Frame with Command::SetDP should not have any data attached to it &quot; );
TEST_ASSERT_EQUAL_MESSAGE(0, std::distance(frame.cbegin(), frame.cend()),
&quot; Frame with Command::SetDP should not have any data attached to it &quot; );

}

void test_static_dataframe_heartbeat() {

DataFrame frame(Command::Heartbeat);
TEST_ASSERT_EQUAL_MESSAGE(0, frame.length,
&quot; Frame with Command::Heartbeat should not have any data attached to it &quot; );
TEST_ASSERT_EQUAL_MESSAGE(0, std::distance(frame.cbegin(), frame.cend()),
&quot; Frame with Command::SetDP should not have any data attached to it &quot; );
//test_hexdump( &quot; static &quot; , static_frame.serialize());

}

void test_dataframe_copy() {

DataFrame frame(Command::Heartbeat);
frame.version = 0x7f;

DataFrame moved_frame(std::move(frame));
TEST_ASSERT_EQUAL_MESSAGE(0x7f, moved_frame.version,
&quot; DataFrame should be movable object &quot; );

TEST_ASSERT_MESSAGE(!std::is_copy_constructible &amp; lt; DataFrame &amp; gt; ::value,
&quot; DataFrame should not be copyable &quot; );

}

void test_dataframe_raw_data() {

{
const std::vector &amp; lt; uint8_t &amp; gt; data = {0x55, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01};
DataFrame frame(data.cbegin());
TEST_ASSERT_MESSAGE(frame.commandEquals(Command::Heartbeat),
&quot; This message should be parsed as heartbeat &quot; );
TEST_ASSERT_EQUAL_MESSAGE(0, frame.version,
&quot; This message should have version == 0 &quot; );
TEST_ASSERT_EQUAL_MESSAGE(1, frame.length,
&quot; Heartbeat message contains a single byte &quot; );
TEST_ASSERT_EQUAL_MESSAGE(1, frame[0],
&quot; Heartbeat message contains a single 0x01 &quot; );
}

{
const std::vector &amp; lt; uint8_t &amp; gt; data = {0x55, 0xaa, 0x00, 0x07, 0x00, 0x05, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0f};
DataFrame frame(data.cbegin());
TEST_ASSERT_MESSAGE(frame.commandEquals(Command::ReportDP),
&quot; This message should be parsed as data protocol &quot; );
TEST_ASSERT_MESSAGE(test_datatype(frame, Type::BOOL),
&quot; This message should have boolean datatype attached to it &quot; );
TEST_ASSERT_EQUAL_MESSAGE(5, frame.length,
&quot; Boolean DP contains 5 bytes &quot; );

const DataProtocol &amp; lt; bool &amp; gt; dp(frame);
TEST_ASSERT_EQUAL_MESSAGE(1, dp.id(), &quot; This boolean DP id should be 1 &quot; );
TEST_ASSERT_MESSAGE(dp.value(), &quot; This boolean DP value should be true &quot; );
}

//show_datatype(frame);
//std::cout &amp; lt; &amp; lt; &quot; length= &quot; &amp; lt; &amp; lt; frame.length &amp; lt; &amp; lt; std::endl;
//test_hexdump( &quot; input &quot; , frame.serialize());

//std::cout &amp; lt; &amp; lt; &quot; [ &quot; &amp; lt; &amp; lt; millis() &amp; lt; &amp; lt; &quot; ] -------------------bad dp frame---------------- &quot; &amp; lt; &amp; lt; std::endl;
//DataFrame bad_dp_frame(Command::ReportDP, DataProtocol &amp; lt; uint32_t &amp; gt; (0x03, 255).serialize());
//show_datatype(bad_dp_frame);
//std::cout &amp; lt; &amp; lt; &quot; length= &quot; &amp; lt; &amp; lt; bad_dp_frame.length &amp; lt; &amp; lt; std::endl;
//test_hexdump( &quot; input &quot; , bad_dp_frame.serialize());

}

class BufferedStream : public Stream {
public:
// Print interface
size_t write(uint8_t c) {
_buffer.push((int)c);
}
size_t write(const unsigned char* data, unsigned long size) {
for (size_t n = 0; n &amp; lt; size; ++n) {
_buffer.push(data[n]);
}
return size;
}
int availableForWrite() { return 1; }
void flush() {
while (!_buffer.empty()) {
_buffer.pop();
}
}
// Stream interface
int available() {
return _buffer.size();
}
int read() {
if (!_buffer.size()) return -1;
int c = _buffer.front();
_buffer.pop();
return c;
}
int peek() {
if (!_buffer.size()) return -1;
return _buffer.front();
}
private:
std::queue &amp; lt; int &amp; gt; _buffer;
};

void test_transport() {
const std::vector &amp; lt; uint8_t &amp; gt; data = {0x55, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01};
BufferedStream stream;
stream.write(data.data(), data.size());

Transport transport(stream);
TEST_ASSERT_MESSAGE(transport.available(), &quot; Available data &quot; );
}

int main(int argc, char** argv) {

UNITY_BEGIN();
RUN_TEST(test_states);
RUN_TEST(test_static_dataframe_bool);
RUN_TEST(test_static_dataframe_int);
RUN_TEST(test_static_dataframe_heartbeat);
RUN_TEST(test_dataframe_const);
RUN_TEST(test_dataframe_copy);
RUN_TEST(test_dataframe_raw_data);
RUN_TEST(test_transport);
UNITY_END();

}