Temperatūros vėpsojimas su Home Assistant

Posted: 2018-03-14 in Darbeliai
Žymos:, , ,

Kai pasidariau apšvietimo valdymą su Home Assistant, natūraliai pradėjau galvot apie temperatūros stebėjimą. Būtų įdomu pasižiūrėti, kokia temperatūra kambaryje, kokia priklausomybė nuo grindų temperatūros, palyginti temperatūros šuolius esant skirtingai lauko temperatūrai. Na, o labiausiai tai tiesiog turėti po ranka savo trobos termometrus, o ne kokio nors Yahoo ar Meteo.lt abstrakčias vertes, kurios kartais visai ne į temą būna. Aišku, šiaip savo namuose visur primėčiau pigių kiniškų termometriukų, bet iki jų vaikščiot reikia, o kartais tingisi 🙂

Kadangi savo troboj pakavojau krūvą daviklių grindyse beigi pasilikau dėžutes oro temperatūrai matuoti, nusprendžiau, kad bent dalies tų daviklių nuskaitymą reikia susimeistrauti nelaukiant kokio nors tai genialaus plano, kaip tai padaryti labai gerai. Kaip žinote, neseniai nusipirkau NodeMCU žaisliukų, taip pat dar ir porą Orange Pi Zero „kompiuteriukų“, kurie turi vielinio tinklo jungtį.

Pradėjau nuo tyrimų ir bandymų, kaipgi nusiskaitinėti Dallas DS18B20 termometrus. eLua su NodeMCU man nepatiko, standartinė biblioteka padaryta labai jau atmestinai, supaprastinta iki negalėjimo. Sakykim, galima termometrų nuskaitymą paleisti ant vieno GPIO vienu metu. Na, tai nėra labai didelė bėda, bet vietoj to, kad pirmiausia biblioteka sukurtų kokį handlą konkrečiam GPIO ir paskui juo naujantis būtų galima manipuliuoti, gaunasi taip, kad paleidi termometrų nuskaitymą ir lauki, kol tie nuskaitymai grąžins rezultatą. Jei paleisi nuskaitymą ir bandysi jį paleisti ant kito GPIO iškart — viskas susibliauna. Nepatiko ir viskas.

Tada ėmiausi žiūrinėti Orange Pi, kuriame galima paleisti OneWire kernelio modulį. Bet, priešingai, nei Raspberry Pi, Orange Pi kernelio moduliukas yra labiau ribotas ir neradau galimybės paleisti jį ant kelių GPIO vienu metu. Be to, termometrams netyčia atsijungus jų sysfs neišsivalo. Bbž kodėl.

Gali kilti klausimas: o kam keli GPIO? Juk OneWire esmė ir yra tame, kad juos galima ant vieno laido kabinti? Galima tai galima, bet mano atveju iš kiekvieno kambario laidai yra atvesti į vieną tašką, taigi jų suminis ilgis yra gan didelis. Tuo tarpu OneWire veikia tuo geriau, kuo laido ilgis trumpesnis. Tad šitą žvaigždinę laidų pynę padalinus skirtingiems GPIO gauname kelias izoliuotas grandines su individualiai trumpesniu laido ilgiu. O taip padidiname nuskaitymo patikimumą.

Tad visgi nusprendžiau, kad laikiną termometrų nuskaitymą savo malonumui darysiu su ESP8266, tik ne su Lua ir NodeMCU firmware. Nors ir nemėgstu bevirvėlaidžių dalykų, kol kas nepanorau investuoti į kitokią įrangą. Orange Pi Zero galimybės ir iškrypėliškas OneWire termometrų modulis mane erzina, o pačiam rašytis naują kažkaip nelabai noro yra. Lygiai kaip ir „geresnį“ Lua modulį NodeMCU.

Pasirinkau patį paprasčiausią ir tuo pačiu metu patį patogiausią variantą, kuriuo užsiima daugybė mėgėjų: Arduino. ESP8266 jau seniai turi Arduino IDE palaikymą, yra krūvos bibliotekų tam, tad aš nusprendžiau taupyti savo laiką ir nervus, bet pasidaryti firmwarę su savo įsivaizduojamomis savybėmis:

  • WiFi ir MQTT serverio konfigūravimas per AP režimą
  • Nuresetinimas perkonfigūravimui
  • Firmwarės atnaujinimai oru (OTA)
  • OTA apsaugotas slaptažodžiu, tokiu pačiu, kaip WiFi passphrase.
  • DS18B20 nuskaitymai per kelis GPIO
  • Temperatūros ir scratchpado raportavimas per MQTT

Aš čia turėjau šiokį tokį pasikrapštymą su Sonoff, kurio jums dar neaprašiau, ten irgi panašią firmwarę bandžiau su Arduino pasidaryt. Tik paskui nusispjoviau ir nusprendžiau, kad reikia imti geriau išdirbtą gatavą. Kada nors ir apie tą patirtį aprašysiu.

Tai va kaip ir viskas. Firmwarę susilipdžiau gan greitai. Pasinaudojau puikios WiFiManager bibliotekos pavyzdukais. Su ja nekonfigūruotas įrenginys užkuria AP, prie jo prisijungi, suvedi savo WiFi tinklo kredencialus bei papildomus parametrus, kuriuos susiprogramuoji. Aš susiprogramavau MQTT serverio pavadinimą, portą ir kredencialus. Arduino OTA irgi integruojama gan lengvai, na, o OneWire ir DallasTemperature bibliotekos jau pažįstamos seniai seniai. Tiesa, DallasTemperature mane truputėlį erzina, kad ten yra prikaišiota daviklių paieška, kurios visai nereikia ir dalis vidinių temperatūros funkcijų yra private, t.y. nepasiekiamos vartotojui, kuris, galbūt, yra kiek gudresnis ir visą workflową nori pasidaryti efektyviau, blė. Tad teko šiek tiek kodo išsilupti ir pasigaminti pačiam.

Gavosi va tokia state machine:

  • Per visus palaikomus GPIO atliekama daviklių paieška
  • Kiekvienas rastas daviklio adresas ir GPIO numeris išsaugomi RAMe
  • Kas pusę minutės per visus GPIO išduodama temperatūros konvertavimo komanda
  • Po sekundės pagal rastus daviklių adresus individualiai kiekvienas apklausiamas
  • Kiekvieno daviklio scratchpadas išsaugomas atmintyje
  • Po nuskaitymo scratchpadai perskaičiojami į „normalią“ temperatūrą ir publikuojami MQTT
  • Kas 5 minutes pakartojama daviklių paieška, tad įmanomas daviklių papildymas „gyvai“

Tiesa, su mano firmware yra problemų: jei nusivožia WiFi arba MQTT serveris, reikia eiti ir aparatą perkrauti. Nors ir įdėjau prisijungimo tikrinimą bei aparato persikrovimą dingus ryšiui, tai kažkaip nesuveikia. Įtariu, kad arba aš kažko ten su bibliotekomis nesupratau, arba yra kažkokių papildomų kabliukų.

Ant stalo išbandyta sistema suveikė gerai, pradėjau galvoti apie jos įgyvendinimą katilinės skydelyje. Pradžiai nusprendžiau, kad užteks man penkių daviklių: svetainės grindų ir oro, garažo grindų ir oro bei lauko. Kai pasijunginėjau katilo lauko daviklį, tuo pačiu išsimečiau kabelį ir Dallas davikliams.

Pasidariau tokį nediduką skydelį:

Skydelis su NodeMCU plokšte | Darau, blė

Iš kitos pusės prisukau relės laikiklį, kad skydelį būtų galima pritvirtinti prie DIN bėgelio:

DIN bėgelio laikiklis SSD relei | Darau, blė

Garaže prilitavau oro daviklį:

Dallas DS18B20 daviklis oro temperatūrai stebėti | Darau, blė

Skydelis skydelyje:

NodeMCU ESP8266 plokštė įmontuota elektros skydelyje ant DIN bėgelio | Darau, blė

Įjungiau, prisijungiau prie MQTT — veikia:

MQTT serverio publikacija apie temperatūras | Darau, blė

Jėėė! Dabar laikas konfigūruoti Home Assistant. Susikūriau atskirą jutiklių failą ir jame surašiau viską:

- platform: mqtt
  name: "Svetainė"
  state_topic: "darauble/ds18x20/2810A236070000CE/temperature"
  unit_of_measurement: "℃"
- platform: mqtt
  name: "Svetainės grindys"
  state_topic: "darauble/ds18x20/28747735070000D5/temperature"
  unit_of_measurement: "℃"
- platform: mqtt
  name: "Garažas"
  state_topic: "darauble/ds18x20/28521735070000C0/temperature"
  unit_of_measurement: "℃"
- platform: mqtt
  name: "Garažo grindys"
  state_topic: "darauble/ds18x20/2891E435070000EE/temperature"
  unit_of_measurement: "℃"
- platform: mqtt
  name: "Laukas"
  state_topic: "darauble/ds18x20/28FF4011811604F8/temperature"
  unit_of_measurement: "℃"

Va ir viskas. Temperatūros jutiklius sudėjau į atskirą grupelę, kad prie lempų nesipainiotų. Žiūrim, ką turim:

Temperatūrų stebėjimas Home Assistant Androi programėlėje | Darau, blė

Šaltai turim, blė, tik tie penki nuliukai po kablelio nelabai košeriniai. Tai dar truputėlį pagražinau firmwarę, kad nuvalytų nuliukus:

Temperatūrų stebėjimas Home Assistant Androi programėlėje | Darau, blė

Buvau dar kažkokį bugą įvėlęs ir neigiamos temperatūros skaičiavime, rodydavo >4000 laipsnių 😀 Bet ten tiesiog castinimus blogai sudėliojęs buvau, biškį bitukai nusimetė ir nusivalė.

Bakstelėjus kurį nors temperatūros daviklį Home Assistant parodo paskutinės paros duomenis:

Temperatūros grafiko peržiūra Home Assistant Android programėlėje | Darau, blė

Na, o prisijungus prie Home Assistant per naršyklę History rodo ir daugiau grafikų, tik juos sugrupuoja pagal vienetus: laipsniai prie laipsnių, procentai prie procentų. Deja, neradau, kaip būtent tuos istorijos grafikus pasikoreguoti, jie šiaip yra gan per siauri vertikaliai, o ir norėtųsi kai kuriuos daviklius žiūrėti atskirai, nes visi penki krūvoj vienas kitą labai smarkiai „nuglotnina“:

Savaitės istorija Home Assistant skydelyje | Darau, blė

Beje, matot, kurią dieną buvo pamiršta išjungti įeinamos spintos apšvietimą? 😉

Temperatūrų sekiojimo firmwarės kodas guli Githube: https://github.com/darauble/wifi-mqtt-temperature

Reklama
Komentarai
  1. Nerijus parašė:

    Beveik nieko nesupratau. 🙂
    Šiandien pasiimu savo pirmą Raspeberry Pi.

  2. Saulius parašė:

    puiku, išbandysiu. Kaip tik krapštau panašų telemetrijos projektėlį su ESP8266 + PZEM004T

  3. Dovydas Zakas parašė:

    man analogiška situacija su nodemcu pakibimu.. be hardwarisko perkrovimo niekaip nesugebu atgaivint pakibusio, jei pameta wifi. jei kazka atrasi, pasidalink, prasau 🙂

    • Darau, Blė parašė:

      Šiuo metu kirbanti idėja — siųsti LWT su QoS 1. Negavęs PUBACK turėtų „žinoti“, kad kažkas blogai, būtų galima bandyti reconnectintis ar persikraut. Bet dabar neturiu kaip to išbandyt, paskolinau atsarginį NodeMCU.

  4. morkuviene parašė:

    Sveiki. Ar tikras raspberry 3 geriau veiktų su termometras?

    • Darau, Blė parašė:

      Priklauso nuo to, ką reiškia „geriau“. Jei dėl pakartotinio prisijungimo per WiFi ir prie MQTT — galbūt, nors MQTT persijungimą vis tiek reikėtų suprogramuot. O šiaip tai tokioms „sistemoms“ kaip tik geriau mikrovaldikliai be jokių ten sunkiasvorių operacinių sistemų. RTOS nebent, jei jau kažką sudėtingo reikia užkurti. Bet va, jei pagal tuos termometrus reikėtų valdyti šildymo kontūrus, tai tada Raspberry Pi ir analogai atkrenta visiškai.

      • Darau, Blė parašė:

        Ai, dar prisiminiau. Konkrečiai su OneWire Raspberry Pi tikrai prastai veikia ir gan dažnai pasitaiko blogų nuskaitymų. Tai dėl to, jog OneWire reikia gan tikslaus signalizavimo, o Linuxe tą daro kernelio modulis programiškai. Kadangi tai Linuxas, ten vyksta dar gausybė kitų procesų, tai tikslų signalizavimą ne tai kad sunku, bet iš tikro visai neįmanoma išlaikyti. Dedikuotas mikrovaldiklis bitbangu kur kas geriau tai padaro, o aparatūrinis masteris (kad ir USART) — visiškai tobulai.

  5. HDi parašė:

    Čia gal mažiau į temą klausimą, bet gal kada nors prie progos galėtum kokią schemutę papaišyti, kaip/kiek/kokiu tankumu į grindis daviklius dėjai? Ar daugmaž vienam kambariui vienas daviklis?

    • Darau, Blė parašė:

      Turiu kažkur tą „schemutę“, galėsiu įmest, bet jau kitą savaitę. O šiaip nieko mandro, viskas pagal sildau.lt rekomendacijas — daviklis zonai arba kambariui. Pas mane tik viena didžioji patalpa yra, kurioje dvi atskiros zonos, visur kitur po daviklį visam kambariui. Bet realiai tai aš nemanau, kad kada nors indivudualų kontūrų valdymą darysiu, nelabai matau prasmės dabar jau gyvendamas.

      • O Sole Mio parašė:

        Sveiki, su esp8266 ir konturu valdymu zaidziu jau kuris laikas. Ventiliams naudoju TWA pavaras. Kadangi davikliu laidai neisvedzioti, esp8266 tam puikiai tinka – kiekvienai patalpai po viena. Prie katilo taip pat vienas, kuris apskiklausia visus termostatus. Pradzioje litavau pats, bet dabar matau, kad SONOFFai tam puikiai tinka. Linkejimai.

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