...avagy az értelem fénye...
Szoftverész és rendszerész lévén úgy véltem, itt az ideje haladni a korral és mivel ma az IoT illetve az AI számít korszerűnek, így nekiálltam a kettő kombinálásának.
Mert miért is elégedne meg az ember azzal, hogy külön van a fény és külön az ész, ha össze is lehet pakolni őket egy meglehetősen csúnyán működő, de annál szórakoztatóbb rendszerbe.
Az akció tárgya a Tapo L530-as izzó lett, amelynek egyrészt van egy jól használható mobil appja, másrészt az elterjedt asszisztensekkel (Alexa, Google Home) is elég jól megértik egymást; ráadásul elég elterjedt és akadnak hozzá függvénykönyvtárak a különböző nyelvekhez -mondhatni ideális áldozat... hittem én...
Gyakorlatilag ugyanaz, amit a gyártó mobilappjával el lehet érni:
Szóval a feladat triviális és egyszerű: ugyanezt elérni PC-ről. És természetesen saját programmal -amibe beletartozik, hogy a megfelelő kódokat bármilyen programba beillesztve vezérelhessem azt a szerencsétlen pilácsot. Mert ha már egyszer az ember a saját munkaállomásán ül, akkor ne kelljen külön appok között bohóckodnia egy villanykapcsolás miatt. Mivel a Gugli a barátom, így pár perc múlva már a VS Code-ban figyelt egy Python script; user/pass/IP, connect aztán megadva a paramétereket futtatás -és örülés. Feladat leküzdve.....
Na persze. Ilyenkor még mindenki boldog, amíg rá nem jön, hogy a „kész” valójában csak egy elegáns illúzió.
De ugye az ember alapvetően lusta és kényelmes, nem igazán szeret forráskódot szerkeszteni és futtatni egy egyszerű villanykapcsolás miatt; tehát Kellett egy jól matatható GUI -és akkor már nyilván a jó öreg C#. Szóval VS beizzít, NuGET csomag keres -és rögtön pár találat... Mondjuk a deprecated nem igazán tűnt célravezetőnek, így nem volt nehéz a választás. Az eleje simaliba: connection string megír, konstruktornak átad és megkaptam a pilácsomat szép, szabályos ojjektum formájában, kismillió adattaggal és metódussal. Hurrá...
Akkor jöhet a GUI: egy button (be- és kikapcs), 5 csúszka (fényerő, színhőmérséklet és a három színcsatorna). Melléjük egy-egy textbox, az aktuális értékkel. Nem probléma... És akkor az eseménykezelők. Kezdjük az egyszerűbbekkel: kapcsoló. Klikkre ha a pilács nem világít, akkor felkapcsolja; ha világít, akkor le. Egyszerű feltétel; lekérdezem a státuszt és az alapján küldi a fel/lekapcsoló jelet. Eddig jók vagyunk... Textbox: a beleírt értéket adja az ojjektumnak, ami továbbítja a lámpának... Csúszkák: A húzással updateli a textboxok tartalmát...
Eddig jók vagyunk. Akkor most adjuk át a pilácsnak a paramétereket és nézzük, mit művel. Itt jött el az ideje annak, hogy -mivel a lustaság fél egészség- konzultáljak a mesterséges intelligenciával; konkrétan a Perplexity Pro nevű dumagéppel.
Itt még minden nagyon okosnak tűnt, ami ugye a programozásnál általában a közvetlen előszobája valami kellemetlen meglepetésnek.
Első lépés: a kapcsoló... Klikk: világít; klikk: sötét. Megy ez, mint az ágybaszarás!
Következő: fényerő. Megvan. Teszt: textboxba érték beír, enter. Műxik! Aztán slider megfog, elhúz, b@$$zameg...
Lerohadt az egész... Konzultáció Plexyvel, a diagnosis: túl gyorsak vagyunk, a pilács nem képes követni. OK, ez nem akkora katasztrófa, rakjunk be egy késleltetést... Ok, műxik. Következő feladat: színhőmérséklet. Ugyanez a szisztéma; de már eleve debouncinggal -megvan.
Kezdem magam jól érezni. Kozmetikázzunk kicsit: a program indulásakor kérdezze le az izzót és az aktuális paraméterekkel indítsa a GUIt. Ugye megvan a függvényünk, amely visszaadja a pilács aktuális állapotát -avagy nem... A lekérdezéssel megkapjuk a be- illetve kikapcsolt állapotot, az IP-címet, a szoftververziót, a kedves édesanyucikája lábméretét, stb. -csak pár apróságot nem: a fényerőt, színhőmérsékletet, az aktuális színt... avagy azokat az adatokat, amire szükségem lenne... Konzultáció Plexyvel... És igen: a hivatalos Tapo csomagban nincsenek meg az állapot lekérdezéséhez szükséges függvények. Mijafac?
Na, itt kezdett gyanús lenni, hogy a „modern” meg „okos” szavak mögött csak egy jól becsomagolt hiánylista van.
Némi keresgélés után a GitHub egy eldugott sarkában vigyorgott egy nem hivatalos, deprecated, szemmel láthatóan hobbyprojectként írt tapo-masters csomag, amelyben állítólag benne van a szükséges metódus. Teljesen jó, csak a forrás háromnegyedét kell hozzá átírni...
OK, átírjuk...mi az nekem...
Közben akkor már beillesztem azt a pár sort, amivel a program indulásakor a sliderek/textboxok kezdőértéke a körtéből kapott parameter lesz. El sem hiszem: működik! Csak a vezérlés nem igazán... Végül is jogos: elavult, régi .NET verzióhóz íródott, unofficial. Konzultáció Plexyvel, közben a mennyben lakók felemlegetése -végül kompromisszumos megoldás született: az egy izzóból lett két ojjektum: egyiket írjuk, a másikat olvassuk. Létrehozzuk az osztályokat, eseménykezelő a kapcsolóhoz: működik! Fényerő: az is! Színhőmérséklet: tökéletes! Pihenésképpen a GUI-n megcsinálom a skálabeosztásokat (fényerö:1-100%; hőmérséklet 2500-6500K; a színek 0-255) és jöhetnek a színek. Eseménykezelő megvan, adjuk át az ojjektumnak. És... árulás történt! A három színcsatorna (RGB) helyett HSV-t vár. És természetesen kiolvasni is ezeket tudom, nem a színeket... WTF????
Akkor konvertálunk...mi az nekünk? Plexyvel összedobtunk egy RGB=>HSV ill. HSV=>RGB konvertáló metódust a megfelelő osztályokba és készen is vagyunk. El sem hiszem...
Az ember ilyenkor már nem a feladattal küzd, hanem azzal, hogy meddig hajlandó elmenni azért, hogy ne kelljen feladnia.
Akkor teszt... Textboxba érték beír, szín gyönyörűen változik, ahogy kell. Sliderek: húzom, az érték (és a szín) változik, de... Egyik slidert húzom, egy másik pedig egyszer csak nullára áll. Teljesen kiszámíthatatlanul. Mia...?
Gyors konzultáció és keresés; az L530 anatómiájának tanulmányozása, stb... Konklúzió: az említett fényforrás nem egy kapkodó idegbeteg, a folyamatos, realtime szabályozásra nem képes. A késleltetések, a debouncing, a konverziók és a hardveres korlátok ilyen anomáliát okoznak. Lehetne pufferelni az értékeket és egyben, preset-jelleggel elküldeni és lemondani az azonnali visszajelzésről -de ehhez már tényleg lusta vagyok (ami nem jelenti azt, hogy egyszer ne állnék neki). De egyelőre jóvanezígy...
Ellenben született ebből egy másik projekt: egy végletekig leegyszerűsített program, GUI vagy más ablak nélkül -egyszerűen az ikonnal elindítva ha a pilács sötét, akkor felkapcsolja; ha világít, akkor meg le. A parancsikonját a tálcára rögzítve mindig kéznél van és egy klikkre kapcsolja a villanyt.
És ami ehhez tartozik: egy másik program, két sliderrel: fényerő + színhőmérséklet. Ezek tökéletesen működnek; a színes világítást meg nem használja az ember olyan sűrűn... És végső soron ott van a mobilapp vagy Alexa -de ha minden kötél szakad, az eredeti program is használható; a megfelelő korlátaival.