Išmanaus namo signalizacija

Posted: 2022-01-28 in Darbeliai
Žymos:, , ,

Iki šiol mano signalizacija gyveno gan atskirą gyvenimą nuo pagrindinio namo proto. Jei būčiau žinojęs ją rinkdamasis – būčiau rinkęsis kitokią. Arba gal būčiau pasidaręs pats, yra šiais laikais tam sprendimų. Bet kai jau turiu tokią, kokią turiu, tai reikėjo prie jos prisitaikyti.

Mano signalizacija yra Paradox EVO192. Brangus daiktas ir nelabai atviras. Sakykim, prie Magelan ar Spectra galima tiesiog prijungti serijinį adapterį ir su ja komunikuoti. O va EVO centralės yra biškį bjauresnės. Nuo kažkurios firmwarės pradėjo šifruoti komunikaciją. Aš kažką bandžiau nuveikti per IP150 tinklo modulį, bet ir ten ne viskas veikia, kaip norėtųsi.

Galiausiai kažkada atradau, kad Paradox turi ir specialų spausdintuvo bei komunikacijos modulį PRT3. Spausdinimas skamba labai savotiškai, nu bet tiek to. Tačiau modulis turi net ir USB jungtį, kuri turi atvirai apibrėžtą ASCII protokolą ir per jį galima su centrale šnekėtis. Netgi radau su JavaScript ir NodeJS parašytą adapterį, kuris suriša PRT3 per MQTT su kokiu nors išmanios trobos protu, kad ir mano naudojamu Home Assistant. Bet, bliamba, JavaScript tokiam daiktui…

Radau ir kitą, įdomesnį projektą. Kuris veikia per serijinę centralės jungtį ir netgi per IP modulį. Bet jei atsinaujini centralę į naujesnę (o aš jau buvau tai padaręs) – tai niekas nebeveikia. Protokolas užšifruotas. Tad visgi lieka vargti su PRT3.

Nepamenu, prieš kiek laiko, lyg ir prieš porą metų, padariau smulkią embedded chaltūrėlę. Dalį užmokesčio pasiėmiau ne pinigais, o trūkstama įranga savo signalizacijai: dūmų detektoriai ten, zonų išplėtimas ir, be abejo, PRT3.

Kurį laiką tas PRT3 kabojo tiesiog, bet per jo konsolę galėdavau ką nors pasiųsti su skriptuku ir padaryti kokį nors mažą smagumą. Bet vis po truputį galvojau paimti ir pasirašyti nuosavą demoną tam reikalui (nes tas, kurį radau, manęs netenkino ir šiaip nepatiko).

Dar per tuos porą metų įgijau nemažai patirties su pranešimų žongliravimo frameworku ØMQ. Labai keistas daiktas, bet visgi su juo patyriau tą satori paradigm shift akimirką, kai viskas nušvito ir socketai jau nebebuvo man tokie, kokie buvo. Valdydamas tokį galingą ginklą, aišku, panorau juo pamojuoti ir namie (vaikai, būtinai tai pabandykit namuose).

Taigi prisėdau ir pradėjau galvoti signalizacijos demono apmatus. Reikia, kad kažkas nuolat stebėtų PRT3 modulio išspjaunamus pranešimus ir juos dorotų. Reikia, kad kažkas mėtytų MQTT pranešimus ir taip pat kai kuriuos skaitytų. Ir reikia kažkokio dar vidurinio proto, kuris viską surinkinėtų ir paskirstytų.

Tai taip ir susidėliojo, kad bus trys pagrindinės gijos, kurios tarpusavy mėtysis ØMQ pranešimukais, nes kiek ir ką teko bandyt, šitas metodas daugiagijėje aplinkoje man pasirodė pats patogiausias. Dar biškį pasiterliojus galima netgi daugiaprocesį demoną padaryt, tik kad gal neverta.

Home Assistant integracija

Home Assistant turi standartinį templeitą, kuris yra MQTT Alarm Control Panel. Yra aprašytos standartinės būsenos, kurias Home Assistant automatiškai atpažįsta ir standartinės komandos, kurias jisai pats siunčia į valdymo tašką.

Tiesa, Paradox EVO turi galimybę saugomą zoną suskirstyti sritimis. Na, pavyzdžiui, atskiriems ofisams bendrame pastate. Kiekvieną iš tų sričių galima laikyti kaip ir „atskira signalizacija“. Tad kiekviena sritis, jei jų yra daugiau nei viena, Home Assistant požiūriu yra atskiras valdymo skydelis.

Standartiškai mano demonas publikuoja kiekvieną sritį pagal jos numerį:

darauble/paraevo/area/1

Į antrą MQTT topicą dar papublikuoja visą srities būseną JSON formatu pagal PRT3 išspjaunamą rezultatą:

darauble/paraevo/area/1/state
{"num": 1,"name": "Troba","status": "D","memory": "O","trouble": "O","ready": "O","programming": "O","alarm": "O","strobe": "O"}

Valdymas eina per topicą:

darauble/paraevo/area/1/set

Home Assistant čia automatiškai siunčia komandas ARM_AWAY, ARM_HOME ir DISARM. Yra dar pora, bet nežiūrėjau, kokios ir jų nenaudoju.

Skydelio konfigūracija Home Assistant YAML failuose yra labai paprasta, beveik nieko nereikia:

alarm_control_panel:
  - platform: mqtt
    state_topic: "darauble/paraevo/area/1"
    command_topic: "darauble/paraevo/area/1/set"

Kiekvienai norimai zonai (judesio ar durų davikliui) iškeliauja trys topicai:

  • darauble/paraevo/area/1/zone/1on arba off
  • darauble/paraevo/area/1/zone/1/alarm – on arba off. on – jei ta zona suveikė saugojimo metu, t.y. sukėlė aliarmą.
  • darauble/paraevo/area/1/zone/1/state – vėlgi JSON formatu viskas iš PRT3: {“num“: 1,“area“: 1,“name“: “Svetainė“,“status“: “C“,“alarm“: “O“,“fire“: “O“,“supervision“: “O“,“battery“: “O“,“bypassed“: “O“}

Šiaip zonos nėra reikalingos signalizacijai valdyti, tačiau protingas namas gali pagal zonų įsijungimą atlikti kokius nors veiksmus. Kad ir automatiškai įjungti šviesą garaže ar kažką panašaus. Arba išsiųsti pranešimą, jei kokios durys pernelyg ilgai atidarytos. Čia jau kas jums svarbu ir kur fantazija nuneša.

Šitos zonos (jų suveikimo arba aliarmo būsenų topicai) aprašomos kaip binary_sensor:

binary_sensor:
  - platform: mqtt
    name: "Judesys svetainėj"
    state_topic: "darauble/paraevo/area/1/zone/1/state"
    payload_on: "on"
    payload_off: "off"

Taip pat kadangi aš nuo centralės pultelių esu pasidaręs garažo ir kiemo vartų valdymą, man labai patiko galimybė per PRT3 pasiųsti komandą sukelti tam tikro mygtuko paspaudimą (Utility Key). Šiaip pats didžiausias nusivylimas skaitant PRT3 dokumentaciją man buvo tas, kad per šį modulį negalima tiesiogiai valdyti centralės PGM’ų! Kažkokius virtualius galima, o fizinių – ne! Nu kaip pasityčiojimas. Bet va jei fiziniai PGM’ai valdomi Utility Key mygtukais, tai tų mygtukų sužadinimą galima ir per PRT3 pasiųsti.

Tam aš pasidariau atskirą topicą darauble/paraevo/utilitykey, per kurį galima tiesiog nusiųsti norimo mygtuko numerį ir viskas – tiek žinių.

Dabar iš šito Utility Key ir iš zonos jutiklio galima pasigaminti „jungtuką“. Jo būsena imama iš zonos, o per Utility Key siunčiama komanda. Štai garažo vartų jungtukas:

switch
  - platform: mqtt
    name: "Garage gate open/close"
    state_topic: "darauble/paraevo/area/1/zone/30"
    state_on: "on"
    state_off: "off"
    command_topic: "darauble/paraevo/utilitykey"
    payload_on: "1"
    payload_off: "1"

Bet man dar norėjosi, kad kai garažo vartai atidaryti, Home Assistant rodytų kitokią piktogramą. Tam reikia pasidaryti antrą template tipo jungtuką, kuris tiesiog perduoda komandas kitam. Biškį durnas sprendimas per aplinkui, mano galva, bet šiuo metu nieko geresnio nėra:

- platform: template
  switches:
    garage_gate:
      value_template: "{{ is_state('switch.garazo_vartu_mygtukas', 'on') }}"
      turn_on:
        service: switch.turn_on
        target:
          entity_id: switch.garazo_vartu_mygtukas
      turn_off:
        service: switch.turn_off
        target:
          entity_id: switch.garazo_vartu_mygtukas
      icon_template: >-
        {% if is_state('switch.garazo_vartu_mygtukas', 'on') %}
          mdi:garage-open
        {% else %}
          mdi:garage
        {% endif %}

Man keista, kad tokio paprasto daikto, kaip icon_template, negali turėti kiekvienas HA entity. Tad norint kokį nors daiktą pasigražinti reikia daryti va tokias machinacijas. Ir paskui nepamiršti įdėti į juodąjį sąrašą, kad gražiojo egzemplioriaus istorijos ir logų nekauptų (nes neprasminga).

Na, o Lovelace veidelyje pasidariau paprastą tokį skydelį. Jame – signalizacijos valdymas ir tuo metu atvirų zonų sąrašas. Kaip ir su signalizacijos pulteliu, naudinga matyti, ar kokio lango nepalikai išeidamas:

Home Assistant signalizacijos integracija | Darau, blė

Automatizacijos

Be konkrečių receptų mano paties idėjos, kam signalizacijos integracija yra naudinga:

  • Išeinant iš namų nereikia galvot apie paliktas šviesas. Pridavus signalizaciją HA jas visas išjungia. Tas pats apie Sonos nutildymą, televizoriaus išjungimą ir pan.
  • Išjungiamas recirkuliacijos siurblys, kad nevarinėtų vandens, kai namie nieko nėr. Čia dar galima praplėsti ir šiaip pagal aktyvumą namuose.
  • Įvykus aliarmui išsiuntinėti pranešimus keliais papildomais kanalais, ne tik SMS.
  • Priminti apie atidarytus vartus, jeigu jie palikti daugiau kaip X minučių. Čia tiktų ir bet koks kitas jutiklis, bet kadangi vis tiek yra signalizacija, tai papildomo nereikia.
  • Pridavus signalizaciją automatiškai uždaryti kiemo vartus, jei atviri – tiesiog vienu veiksmu mažiau išvažiuojant.
  • Tiems, kas paranojiški: sudaryti šviesų junginėjimo šablonus, kuriuos HA vykdytų, kai nieko nėra namie. Tipo, kažkas yra 😀
  • Galima su signalizacija susieti „svetimus“ daviklius, kad ir užliejimo jutiklius. T.y. kad jų suveikimas irgi sukeltų aliarmą – per virtualias zonas.

Demonas

Dabar truputį apie patį demoną.

Jo kodas yra čia Githube ir visas Readme ten irgi surašytas, bet šį tą papasakosiu gimtąja kalba.

Šiuo rašymo metu demonas moka:

  • Pranešinėti signalizacijos būseną pagal Home Assistant standartą: armed_home, armed_away, disarmed, triggered.
  • Priimti komandas: ARM_HOME, ARM_AWAY, DISARM. Kad veiktų DISARM, demonui reikia turėti signalizacijos kodą (galima atskirą sukurti specialiai šitam reikalui). Pridavimui galima apsieiti ir be kodo.
  • Priimti komandas Utility Key paspaudimui.
  • Pranešinėti kiekvienos nurodytos zonos būsenas.
  • Jungtis tiek prie atviro, tiek prie username/password apsaugoto MQTT serverio.
  • Gali pagal pageidavimą liepti išsaugoti žinutes (retain).

Šiuo metu nemoka, bet yra planuose:

  • Siųsti virtualių įvesčių įjungimą/išjungimą
  • Pranešti apie virtualių PGMų būseną
  • Priimti raw komandas tiesiai į PRT3 ir pranešinėti kiekvieną PRT3 išspjaunamą eilutę (pasirinktinai).
  • Jungtis prie MQTT per TLS su sertifikatu.

Pagal visas gerąsias demonų tradicijas visus argumentus demonas priima per komandinės eilutės parametrus. Tačiau dar sukurpiau ir Python parašytą loaderį, kuris konfigūraciją gali nuskaityti iš gražaus YAML failo ir sugeneruoti visą reikiamą komandą. YAML galima nurodyti ir alternatyvų (ne tipišką konteinerio) kelią iki demono binarniko, taip pat pakišti failą, į kurį būtų nukreipiamas demono spjaudomas tekstas.

Norint žinoti, kurios srities zona suveikė, nėra kito kelio, kaip tik demonui perduoti sritį ir jai priskirtas zonas. Per PRT3 nėra galimybės išsiaiškinti, kuri zona kuriai sričiai priklauso ir netgi ar ta zona (ar sritis) yra sukonfigūruota. Tiksliau, apie sritį dar būna parameters „Not ready“, bet tas gali reikšti ir kad sritis nėra paruošta pridavimui, t.y. kažkuri zona aktyvi. Tad apie signalizacijos konfigūraciją reikia tam tikrų išankstinių žinių. Detales pasižiūrėkite Readme ir YAML pavyzduke.

Kadangi iš anksto planavau šitą demoną leisti konteineryje ant QNAP NAS, tai nuo pat pradžių atitinkamai jį ir kūriau. Pradžiai sukūriau du atskirus konteinerių aprašymus: vieną kompiliavimui, o kitą – demono naudojimui. Susikūrus pirmąjį konteinerį ir demoną sukompiliavus galima sukurti antrą konteinerį, nes sukompiliuotas demono binarnikas į tą antrą konteinerį įdedamas.

Apskritai, dauguma visokių Docker konteinerių yra su interpretuojamų kalbų, kaip Python, programomis, kurias užtenka nukopijuoti į konteinerį ir jį paleisti. Tuo tarpu su C rašytoms programoms tai taip paprastai negalioja. Na, tiksliau, reikia tas programas pradžiai bent jau sukompiliuoti. Kad neterščiau savo pagrindinio kompiuterio, aš ir kompiliavimo aplinkas dažniausiai darau konteineriuose. Paskui paprasčiau prasimėžti.

Nusivyliau apkarpytu QNAP Linuxu. Serijiniai įrenginiai ten prieinami tik kaip /dev/ttyUSB*. Nėra kernelio modulio, kuris galėtų pakišti nekintamą kelią į /dev/serial/by-id. Jei yra keli daiktai prijungti, tai jų keliai gali keistis, o tai gali būti nelabai smagu. Reikia tada juos ištraukti ir sugrūsti atgal reikiama tvarka, kas yra bereikalingas vargas. Tad planuose – paieškoti tinkamo kernelio modulio, kurį gal pavyktų pakišti.

Tai tiek pristatymo. Jei kažkam bus naudinga, klausimai yra velkami.

Komentarai
  1. eenamas parašė:

    Panaši situacija ir pas mane, Home Assistent nesikalba su signalizacija, tik maniškė ELDES. Jei kam pavyko ELDES pajungt prie HA, pasidalinkit patirtim 🙂

    • Darau, Blė parašė:

      Prie Eldes tai jungt serial adapterį ir debugint 🙂

      • eenamas parašė:

        Aš pasijungęs ELAN modulį, kuris su signalizacija leidžia bendrauti (programuoti ir valdyti per debesį, kai signalizacija su debesim bendrauja per ELAN) per LAN, tai turiu įtarimą, kad papildomos geležies nereikės. Bet kaip programavimo srityje konkretus “0“, tai net neįsivaizduoju nuo ko pradėt.

  2. Tuatvydas parašė:

    Aš su IP150 moduliu ir HomeAssistu naudoju https://github.com/ParadoxAlarmInterface
    Man veikia sklandžiai. Nebent kažko trūksta.

  3. PDnamas parašė:

    Dėl dockerių ir kompiliavimų tai aš multistage paveikslus darau ir ramu.

  4. Gintas parašė:

    Ačiū kad daliniesi. Turiu tokį pat vargą su savo paradoxu. Kol turėjau zipatobox sistemą paradoxas per prt3 bendravo gerai. Perėjau ant HA ir pasibaigė. Su PAI integracija neveikė per IP150 irgi ne nes atnaujinta. Su node.js nesugebėjau paleist. Taip ir liko. Mano HA sukasi ant proxmox. Tiek pažengęs nesu, tad nežinau ar pavyks man pasileisti 😉

    • Darau, Blė parašė:

      Jei pas tamstą galima Dockeriu iš komandinės eilutės žongliruoti, tai blogiausiu atveju galėsiu pasidalinti atvaizdais, kuriuos suimportavus turėtų veikti 😀

      • Gintas parašė:

        Pagalba būtų tikrai neblogai 🙂
        Paanalizuosiu tavąjį deamon. Kaip minėjau nesu įgudęs žonglierius, bet krapštai krapštai ir galų gale gaunasi.

        • Gintas parašė:

          Kaip ir viską pasiruošiau. Tik nesugebėjau startuot daemon. Ar tam reikia naują containerį kurti?
          Jei galėsi, prasiųsk printscreen bandyčiau per CLI pažongliruot.

          • Darau, Blė parašė:

            Galima startuot ir iš kompiliuojančio konteinerio, tada tik reikia YAML atitinkamai paredaguoti ir kelią iki jo startuojančio Python skriptui perduoti. Bet šiaip geriau po kompiliavimo pasidaryti antrą konteinerį. Jo skripte reikia pažiūrėt ti, ką kada užkomentuoti, gal aš ten ne viską aiškiai aprašęs.

  5. kazkas parašė:

    Ta centralė nauja kainuoja keliasdešimt eurų, o ją dar ir parduoti kam nors galima ir nusipirkti tinkamą. Bet vietoje to švaistomas pats brangiausias turtas – laikas.

    • Darau, Blė parašė:

      Kodėl švaistomas? Jei darai tai, kas patinka, tai laikas leidžiamas puikiai. Man atrodo laiko švaistymas žvejyba ar kašės žiūrėjimas, bet kitiems tai malonumas ir negaliu jų smerkti.

  6. Simonas parašė:

    “Arba gal būčiau pasidaręs pats, yra šiais laikais tam sprendimų.“ – apie kokius sprendimus kalbi? 🙂

    • Darau, Blė parašė:

      Tas pats Home Assistant turi integruotą galimybę dirbti už signalizaciją su įvairiais sensoriais. Iš atviro kodo yra konnected.io, AlertR ir pan. Gūglink, tikrai visko pilna.

  7. Kazys parašė:

    Gal pravers… https://kirils.org/slides/2019-03-02_security_nullcon_w.pdf .Jo puslapyje 2018 – 2019 m. yra ir daugiau tyrinėjimų šia tema. Paradox’as matyt įvertino.

  8. Robertas parašė:

    Tiem kas norite su ‘smart’ valdymu pažaisti, loginti duomenis, matyti grafikus isiųsti žinutes, laiškus ir panašiai yra neblogas web (java) įrankis Mango automation
    Krūva visokiausių protokolų ir custom sprendimų.

Parašykite komentarą

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

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.