Kalėdinės švieselės

Posted: 2017-12-29 in Darbeliai
Žymos:, , , ,

Sveikinu jus, mieli manęs skaitytojai, su šventėmis, tarpušvenčiu ir mini atostogomis, jei tokias pasidarėte. Aš, po dvejų metų labai ribotų atostogų visgi nusprendžiau sau leisti per tarpušventį patingėti ir leisti galvai atsikvėpti. Bet, be abejo, neleidau sau tingėti kitose srityse. Baigiau lopyti nenudažytus plotus, susikabinau girliandas ir dar netgi pabandžiau kurmiams spąstus paspęsti. Kalbant apie spąstus, reikia eiti ir juos užkasti.

Užkasiau. Su kurmiais taip gerai, kaip su pelėmis, nesigauna. Dar nė vieno neturiu. Pradėjau mąstyt, o kaip rasti gyvus kurmius, gal prismaigstyt lystelių ir tiesiog stebėt, kada sujudės? Nežinau.

Kaip tikras kaimo gyventojas, truputį papuošiau trobą:

Girliandomis papuoštas namas | Darau, blė

Ten ant sniego matosi dar lazerio projekcija, nusipirkau tokią mirgalkę. Jis turėtų ant namo sienų mirguliuot, bet pagalvojau, kad visai nematysiu tada ir jokio džiaugsmo nebus. Tai pakraigėj pakabinau ir nukreipiau į pievelę.

Mažai čia to papuošimo, o ir sakiau, kad kitais metais, kai pasistatysim tvorą, tai ją apkabinėsiu visokiom girliandom, kad pats matyčiau. Šiaip man patinka islandiškos bei amerikietiškos tradicijos, kur namus puošia praktiškai be saiko. Man apskritai kalėdinis išprotėjimas labai patinka ir išmesti krūvą pinigų viskam taip pat. Tad kitiems metams jau planuoju nuo vasaros pradėti šopingą visokiems papuošimams, kad, blė, iš kosmoso matytųsi.

Na, o dabar prie esmės. Tarpušvenčiui užsibrėžiau tikslą padaryti savo namo šviesą valdomą kompiuteriu ir telefonu. Valdikliai guli lentynoj, o Avietė su CAN „stogeliu“ — ant darbinio stalo. Viena plokštė irgi dar ant darbinio stalo, testavimuisi. Bet su ja jau viskas. Tad pradėjau galvoti, kaip čia viską suintegruoti ir ką gero padaryti dar.

Pirmiausia, reikėjo apsispręsti, kokį „išmanaus namo“ protą pasirinkti. Nes pačiam daryti kokį nors interfeisą ir appsus — nesąmonė. Vienas mano skaitytojas buvo pradėjęs domėtis OpenHAB, bet tas daiktas biškį griozdas, kad ant Avietės optimaliai suktųsi. Kitas panašus, gal ne tos įmantrus, bet labai gerai palaikomas — Home Assistant. OpenHAB tai toks biškį merdėjantis ir apleistas reikalas pasirodė, o HASS tai stačiai siautėja dabar.

Nukrypstant į šalį, susidomėjau ir Xiaomi Mijia išmaniuoju namu, ypač po poros Justino straipsnelių: įžangos ir papildomų priedų. Vien šito rinkinio jums gali pakakti, jei norite savo namams suteikti kažkiek „proto“. Tik tiek, kad Xiaomi yra debesinis reikalas ir duomenukai nuolat siuva tarp gateway’aus ir kinų serverių. Jei esate paranojiški dėl savo privatumo, tada geriau nenaudokite. O aš galvoju, kad padarius pradinį setupą tą daiktą galima nuo interneto atkirsti ir tada ramiai naudoti savo reikmėms.

Kodėl aš čia užsiminiau dabar… ogi todėl, kad HASS turi integraciją su Xiaomi gateway’um. Pvz. 220 V toršerą, stovintį kampe, taip pat galėčiau prijungti prie savo HASS’o, tik vietoj jo mygtuko reikėtų užklijuoti ant viršaus Xiaomi signalinį mygelį ir susieti su išmaniąja rozete.

Grįžtu prie savo sprendimo. Mano valdikliai su Aviete surišti CAN magistrale. Papildžiau jų firmwares, kad kas kartą uždegus ar užgesinus lempą viena CAN žinute iškeliautų valdiklio valdomų šviesų būsena, konkrečiai 0, kai išjungta ir kokia nors PWM reikšmė, kai įjungta. Taip pat sukūriau papildomą FreeRTOS taskelį, kuris kas pora sekundžių pasižiūri, ar valdiklio šviesų PWM’ai nepasikeitė. Jei pasikeitė — išsiunčia apie tai žinutę. Na, su užvėlavimu, bet kad pranešinėtų apie pakeistą šviesumo lygį.

Šitą informaciją reikia priduoti HASS’ui. Daug negalvojęs nusprendžiau, kad panaudosiu MQTT protokolą. Čia jau keli skaitytojai man komentaruose apie MQTT zirzė. Nu tai džiaukitės, prizirzėt 🙂 Tik tiek, kad MQTT naudoti, mano galva, reikėtų kaip sąsają tarp kažkokių įrenginių. Jei mano kiekvienas valdiklis per TCP būtų prijungtas ir MQTT pats siuntinėtų, tai sakyčiau, kad toks dalykas yra biškį „per sunkus“. TCP yra apskritai ne mikrovaldiklių kategorijos protokolas, nors ir tie patys Arduino būna ir su Ethernet, ir su WiFi skydeliais. Todėl ir dariau su CAN, kur vos keli baitukai skraido. Na, o va Avietė, kaip „kompiuteris“ su gan galingu procesoriumi, jau gali dirbti man už CAN-MQTT adapterį.

Ant Avietės su Python3 sukodijau būtent tokį demoną. Jį jau buvau seniau pradėjęs lipdyti, bet pradinė idėja buvo apie įrenginių aptikimą, konfigūravimą ir t.t. Bet kadangi mano įrenginiai laikui bėgant supaprastėjo, tai ir tokio ūber galingo demono poreikis dingo. Dabar tiesiog sukūriau tokį demonuką, kuris atėjusias būsenos CAN žinutes papublishina į MQTT serverį, o atėjusias iš MQTT serverio persiunčia į CAN.

Kas yra MQTT? MQTT yra toks gudrus TCP pagrindo 7 lygio (application layer) protokolas. Jame vidury stovi serveris, o prie to serverio jungiasi subscriberiai ir publisheriai. Publisheriai skelbia visokius topicus, o subscriberiai tam tikrų topicų klausosi. Fiziškai MQTT serverio klientas gali tą patį TCP socketą naudoti ir kaip subscriberis, ir kaip publisheris — čia šiaip, kad žinotumėt.

MQTT žinutę sudaro taip vadinama antraštė (topic) ir pati žinutė — baitų krūva. Kiek pastebėjau, tai ta baitų krūva yra ASCII stringas. Net ir skaičiai siunčiami, kaip stringas. Nu tai ir ok.

Antraštės yra hierarchinės, atskiriamos pasviraisiais brūkšniais /. Panašiai, kaip Unix katalogų kelias, tik viršuje root’o nėra 🙂 Subscriberis gali prisisubscribinti į konkretų topic’ą arba naudoti wildcardus.

Sakykim, aš apgalvojęs, kad noriu savo lempas sušerti HASS’ui, nuėjau ir pasiskaičiau HASS pavyzduką apie integraciją su MQTT lempom. Tenykštė lempų hierarchija man nelabai patiko, tada aš sugalvojau maždaug šitaip. Lempos būsenos topicas va toks:

darauble/light/integral/<divaiso ID>/channel/<kanalo ID>/status

Žinutės turinys: „on“ arba „off“. Tie patys „on“ ir „off“ gali būti nusiunčiami jau į mano demoną per „switch“ paantraštę:

darauble/light/integral/<divaiso ID>/channel/<kanalo ID>/switch

Šviesumo būsena:

darauble/light/integral/<divaiso ID>/channel/<kanalo ID>/brightness/status

Šviesumo reguliavimas:

darauble/light/integral/<divaiso ID>/channel/<kanalo ID>/brightness/set

Dar pas mane gavosi, kad mano lempų šviesumo lygis yra nuo 0 iki 94. Šitą irgi reikia nurodyti HASS’ui konfigūracijoje.

Biškį paaiškinimų apie mano antraštes. Pradžia, „darauble“, turėtų būti aiški — čia mano kada nors būsimos įrenginių šeimos pavadinimas. Toliau „light“ — konkrečiai šviesų įrengimai. „integral“ — mano šviesos įrenginio tipas. Aš juos prisiprojektavau trijų tipų: per CAN valdomą „light“ aparatą, CAN mygtukyną „controller“, o „integral“ yra mano naujausia iteracija, kur į vieną plokštę ateina jungtukai ir iš jos išeina šviesų valdymas. Na, pradžioje galvojau, kad mano sistema bus išmėtyta, bet paskui nusėdo vienoje centrinėje spintoje, tai neliko poreikio turėt daug atskirų įrenginių. „switch“ naudosiu grupių valdymui ir masiniam išjungimui tiktai. Ok, toliau <divaiso ID> — tai kiekvienam įrenginiui priskirtas 7 bitų adresas, kad CAN žinutės gabale galėčiau jį pakavot — tam išnaudojamas aparatūrinis filtravimas. Toliau „channel“ — mano kiekviena plokštė turi keturis kanalus ir valdoma keturiais rotaciniais enkoderiais. Na, viena plokštė — keturios „lempos“. Tai čia kanalo nuo 0 iki 3 numeriukas. Toliau jau aišku.

Home Assistant konfigūracija aprašoma YAML failais, tokia visokių aprašymų kalba. Ne XML, ne JSON, o toks kitoks daiktas, kuriame, kaip ir Python kalboje, svarbu postūmis nuo krašto, taip viskas susidėlioja į hierarchiją.

HASS turi „light“ tipą būtent šviesoms. Yra visa dokumentacija, kokias savybes turi šio tipo įrenginiai. Skaitant tą dokumentaciją galima labai detaliai sukonfigūruoti savo šviesas. Aš pasidariau atskirą failą savo visoms šviesoms, kurį HASS pagrindiniame includinu:

light: !include daraublelights.yaml

O tada procesas buvo toks. Prisisubscribinau į savo šviesų demono MQTT srautą ir pradėjau vaikščiot po namus, maigyt mygtukus ir žiūrėt, kokie ten ID byra. Galėjau iš karto spintoj susižiūrėt, bet ten nepatogu, o ir visų numeriukų neatsimenu, tai toks pedalinis metodas buvo paprastesnis:

Šviesos per MQTT Mosquitto serverį | Darau, blė

O tada susidėliojau savo MQTT lempas į atskirą failą:

- platform: mqtt
  command_topic: "darauble/light/integral/17/channel/0/switch"
  state_topic: "darauble/light/integral/17/channel/0/status"
  name: "Svetainės vidurys"
  brightness_state_topic: "darauble/light/integral/17/channel/0/brightness/status"
  brightness_command_topic: "darauble/light/integral/17/channel/0/brightness/set"
  brightness_scale: 94
  payload_on: "on"
  payload_off: "off"
- platform: mqtt
  command_topic: "darauble/light/integral/16/channel/2/switch"
  state_topic: "darauble/light/integral/16/channel/2/status"
  name: "Svetainės dešinė"
  brightness_state_topic: "darauble/light/integral/16/channel/2/brightness/status"
  brightness_command_topic: "darauble/light/integral/16/channel/2/brightness/set"
  brightness_scale: 94
  payload_on: "on"
  payload_off: "off"

Ir taip toliau, visas 12 šiuo metu valdomų lempų.

HASS puslapis atrodo va taip, netgi matosi, kad viena lempa pritemdyta:

Lempų valdymas per Home Assistant | Darau, blė

Lygiai taip pat atrodo ir iOS programėlė. Įtariu, kad ten net ne programėlė, o apvalkalas naršyklei. Android tuo tarpu vaizdas visai kitoks:

Home Assistant Android programėlė | Darau, blė

Va ir viskas, galima dabar namuose žybčiot. Gaila tik, kad HASS neturi kokybiško administravimo, kaip OpenHAB, pvz. kad galėčiau apriboti vaiko vartotojui teises ir kad miegamajame mums šviesomis nemirksėtų 😀

Viso šito dalyko architektūra gavosi tokia:

  • Valdikliai, susikalbantys per CAN magistralę
  • Mano šviesų demonas ant Avietės, konvertuojantis CAN-MQTT
  • Mosquitto MQTT brokeris ant Avietės
  • Home Assistant serveris ant Avietės

Kadangi MQTT vyksta per TCP, tai mano demoną, MQTT brokerį ir Home Assistant serverį teoriškai galima laikyti netgi trijuose atskiruose kompiuteriuose. Bet vieno Raspberry Pi 2 užtenka visiems trims, paveža. Tiesa, iš pradžių pora Python procesų buvo užkabinę procesorių ant 100%, bet ten aš tiesiog buvau pamiršęs įdėti pauzę tarp Queue nuskaitymų. Mano demoną sudaro atskiri Pythono Multiprocess’ai: vienas skaito CAN žinutes ir deda jas į Queue (eilę), kitas iš kito Queue skaito žinutes ir siunčia įrenginiams, trečias skaito/rašo žinutes į/iš MQTT, ketvirtas jama CAN ir MQTT žinutes iš Queue bei ten pat padeda. MQTT dar turi atskirą thread’ą subscribintoms žinutėms nuskaitinėt. Tai va MQTT išsiunčiamų žinučių eilė buvo baksnojama ir centrinis procesas, kuris viską integruoja, irgi „graužė“ eiles. Įdėjau ten 0,05 sekundės pauzes tarp eilių tikrinimų ir dingo visi procesoriaus ėdimai. Realaus laiko šviesų junginėjimui nesijaučia, o eilių patikrinimas, ar ten kas yr — pakankamai spartus.

Tai va tiek šiam kartui.

Reklama
Komentarai
  1. GGr parašė:

    siūlyčiau įspėti skaitytojus, kad paspaudus nuorodas į Justino puslapius, antivirusai apsipils pranešimais dėl tuose puslapiuose esančių WebMinerių: https://i.imgur.com/bEnuRW4.png
    nors puslapis pasirodė įdomus…

  2. jarik parašė:

    Jau N metu vis zvilgteliu i “protingu“ namu tema, ir visada visi pasakoja apie sviesu junginejima… Negi nieko protingesnio tie namai kolkas nemoka tik kad sviesas junginet bei termostatu apsimest? 🙂

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti /  Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Keisti )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.