Objavljeno:

Priklop UPS naprave na HomeAssistant

Zaradi občasnih izpadov elektrike sem si pred kratkim omislil UPS napravo, katere funkcija je, da zagotavlja napajanje za domačo omrežno opremo. Na UPS je povezan optični modem, domači usmerjevalnik, RaspberryPi s HomeAssistant ter OrangePi napravica, ki skrbi za povezavo domačega omrežja v VPN. Ob izpadu elektrike tako v hiši internet nemoteno deluje, ob nakupu UPS-a pa sem si zaželel še možnosti, da mi HomeAssistant ob izpadu električnega napajanja pošlje obvestilo.

Tako sem v enem slovenskih podjetij kupil UPS z imenom Samurai SMART 1500 LCD proizvajalca Samurai Power. Reklamni letak naprave ponosno navaja, da je napravi priložena programska oprema za upravljanje UPS-a, ki da deluje v okoljih Windows, Mac in Linux. Podjetje Samurai Power pa je, kot navajajo na spletni strani, “vodilni globalni ponudnik UPS rešitev”.

No, nekaj brskanja po njihovi spletni strani je razkrilo, da ima podjetje sedež v Zagrebu ter podružnico v Sloveniji, med referenčnimi partnerji pa so navedena večinoma podjetja iz Slovenije in Balkana. Ampak vseeno, podjetje je očitno regionalno kar močno prisotno. Programska oprema za nadzor in upravljanje UPS-a pa… hmm, tukaj se naša zgodba pravzaprav šele začne.

Prvi priklop

UPS ob nakupu žal ni imel priložene nikakršne programske opreme, me je pa prodajalec kasneje na moje povpraševanje usmeril na njihovo spletno stran, kjer si je programsko opremo mogoče prenesti na svoj računalnik. Sem pa ob nakupu dobil serijsko številko za namestitev programske opreme.

Napravo sem najprej preko USB kabla priključil na mini računalnik OrangePi, ki je zgrajen na ARM arhitekturi in na kateri teče operacijski sistem Armbian 22.05.3 Bullseye.

Ukaz lsusb je pokazal naslednje:

Bus 007 Device 002: ID 0001:0000 Fry's Electronics MEC0003

Dodatno sem z ukazom lsusb -D /dev/bus/usb/007/002 lahko videl nekaj več podrobnosti o napravi:

idVendor         0x0001 Fry's Electronics
idProduct        0x0000 
bcdDevice        1.00
iManufacturer    1 MEC
iProduct         2 MEC0003
iSerial          0 

ID-ji USB naprave nakazujejo, da gre za generično USB napravo zgrajeno okrog nekega generičnega vezja z lažno identifikacijo proizvajalca (0x0001) in naprave (0x0000). To pa navadno pomeni… težave. Plus, glede na to, da polje iSerial ravno tako vsebuje ničlo, to pomeni, da priklop več naprav na en računalnik namenjen spremljanju delovanja UPS naprav najverjetneje ne bi bil mogoč. Vsaj ne brez nekaj malega hekanja

UPSilon 2000

Pa si poglejmo programsko opremo za upravljanje UPS-a. Ko sem jo prenesel iz spletne strani proizvajalca, sem ugotovil, da gre za program UPSilon 2000, tajvanskega proizvajalca Mega System Technologies (Megatec).

Priložena navodila pravijo, da je program na voljo za naslednje operacijske sisteme: MS-Windows Me, MS-Windows XP, MS-Windows 2003, MS-Windows Vista, Novell NetWare, Linux in FreeBSD.

Hmm, kot bi bral kakšen star zgodovinski zapis. In res, v dokumentu piše “Copyright 1999-2007”, kar najverjetneje pomeni, da se program ne razvija več že kakšnih 15 let. Kar je razvidno tudi iz zaslonskih posnetkov Windows in Linux različice aplikacije.

Posledično pa to tudi pomeni, da programa na ARM procesorjih najverjetneje niti ni mogoče poganjati (česar priznam, da nisem niti testiral).

Po namestitvi programa v Windows 10, nas takoj pričaka “spodbudno” obvestilo:

If you can not run the service function in UPSilon 2000 on Windows NT.
You may need to install Windows NT Service Pack 4.

Na srečo se program da poganjati na sodobnejših Windows sistemih in ko priklopimo kabel ter med nastavitvami programa kot Communication type izberemo Mega(USB), UPSilon 2000 UPS napravo zazna in omogoča osnovno upravljanje z njo.

UPSilon 2000

UPSilon 2000.

Kljub temu pa gre za precej zastarel kos programske opreme, z obupnim “retro” izgledom in z zastarelimi funkcionalnostmi (program zmore pošiljati obvestila samo preko e-pošte in pagerja, če se kdo še spomni kaj je to).

Po mojem osebnem mnenju je dobesedno sramota, da prodajalec tak program sploh ponuja poleg (hm) svojih naprav.

UPSilon 2000

UPSilon 2000.

NUT

Kot rečeno je računalnik, s katerim sem želel spremljati delovanje UPS zgrajen na ARM arhitekturi in odločil sem se, da na njem postavim Network UPS Tools (NUT). Gre za sodoben odprtokoden sistem za upravljanje več UPS naprav, ki teče na različnih platformah in ga je tudi mogoče zelo elegantno integrirati v HomeAssistant.

Namestitev NUT-a na Armbian sistem je enostavna: sudo apt install nut nut-client nut-server.

Nato poženemo nut-scanner, ki poišče priključene UPS naprave: sudo nut-scanner -U. Dobimo izpis:

Scanning USB bus.
[nutdev1]
    driver = "nutdrv_atcl_usb"
    port = "auto"
    vendor = "MEC"

Izpis kaže, da je UPS naprava sicer zaznana, vendar se je kasneje izkazalo, da je NUT scanner zaznal napačen gonilnik. Nekaj brskanja po internetu je pokazalo, da UPS naprave z opisanim ID-jem, ki uporabljajo programsko opremo UPSilon 2000, v resnici za komunikacijo računalnika z UPS napravo uporabljajo poseben protokol, ki pa ga je nekdo uspel razvozlati z vzvratnim inženirstvom. Ustrezen gonilnik je torej nutdrv_qx, pri čemer je potrebno podati še nekaj parametrov. Ugotavljanje kako nastaviti komunikacijo z UPS napravo je bilo kar zamudno.

Zdaj v datoteko /etc/nut/ups.conf vpišemo naslednje parametre:

pollinterval = 1
maxretry = 3

[samurai]
    driver = nutdrv_qx
    port = auto
    vendorid = 0001
    productid = 0000
    desc = "UPS Samurai SMART 1500 LCD"

Mimogrede, če bi imeli več UPS naprav, bi v to konfiguracijsko datoteko lahko vpisali vse UPS naprave, NUT pa potem poskrbi, da lahko z njimi enotno upravljamo. Bi bilo pa verjetno potrebno rešiti še že omenjeno težavo z odsotnostjo serijske številke USB naprave…

Nato odpremo datoteko /etc/nut/upsmon.conf in vanjo dodamo UPS napravo, katere delovanje želimo spremljati. V našem primeru torej vpišemo:

MONITOR samurai@localhost 1 admin MysecretpAssword124 master

Opis posameznih parametrov je obširno razložen v sami konfiguracijski datoteki, morda samo omenimo, da mora biti ime UPS naprave (samurai) enako kot v /etc/nut/ups.conf datoteki, namesto MysecretpAssword124 pa seveda vpišemo svoje geslo. V tej datoteki nastavimo tudi tim. “polling interval”, se pravi na koliko časa naj računalnik preverja stanje UPS-a, itd., vendar lahko večino parametrov pustimo kar privzeto nastavljenih.

Sledi urejanje datoteke /etc/nut/upsd.conf, kjer mora biti v osnovi zapisano samo na katerih TCP vratih je NUT strežnik dosegljiv za naprave v istem omrežju. Torej: LISTEN 0.0.0.0 3493, kar pomeni, da bo NUT strežnik dosegljiv na TCP vratih 3493 (ne pozabimo odpreti požarnega zidu!).

Podobno skope so nastavitve datoteke /etc/nut/nut.conf, ki načeloma vsebuje samo vrstico MODE=netserver

Zadnja nastavitvena datoteka pa je /etc/nut/upsd.users, kjer nastavimo uporabnika za dostop do NUT strežnika. Ta datoteka mora biti usklajena z datoteko /etc/nut/upsmon.conf. V našem primeru smo vpisali:

[admin]
  password = MysecretpAssword124
  actions = SET
  instcmds = ALL

S tem smo določili uporabnika admin, ki lahko izvaja vse ukaze. S tem pa so nastavitve tudi končane. Zdaj je potrebno ponovno zagnati vse NUT aplikacije oz. storitve:

sudo service nut-server restart
sudo service nut-client restart
sudo systemctl restart nut-monitor
sudo upsdrvctl stop
sudo upsdrvctl start

V ukazni vrstici bi sedaj morali dobiti tim. “broadcasting” obvestilo, da je komunikacija z UPS napravo uspešno vzpostavljena:

Communications with UPS samurai@localhost established 

Če sedaj vpišemo ukaz upsc samurai@localhost, bomo dobili izpis stanja UPS naprave:

Init SSL without certificate database
battery.voltage: 25.40
device.type: ups
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 1
driver.parameter.port: auto
driver.parameter.productid: 0000
driver.parameter.synchronous: no
driver.parameter.vendorid: 0001
driver.version: 2.7.4
driver.version.data: Q1 0.07
driver.version.internal: 0.28
input.frequency: 50.1
input.voltage: 229.4
input.voltage.fault: 229.4
output.voltage: 229.4
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 0
ups.productid: 0000
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0001

Izpis je sicer videti grozne oblike, ampak to je šele prvi korak…

Sedaj namreč lahko do podatkov o UPS napravi preko NUT strežnika dostopamo iz računalnikov v istem omrežju. Na sosednjem računalniku je najprej potrebno namestiti programski paket nut-client, nato pa preprosto vpišemo ukaz upsc samurai@192.168.200.231 (seveda uporabimo ustrezen IP naslov), in dobimo želene podatke.

Gledamo lahko seveda tudi posamezne parametre, recimo stanje UPS naprave: upsc samurai@localhost ups.status, sistem pa bo vrnil enega izmed možnih statusov. OL (On line) recimo pomeni, da zunanje napajanje deluje, OB (On battery), da je sistem na bateriji (zaradi izpada zunanjega napajanja), itd.

Zdaj si poglejmo katere ukaze lahko pošiljamo UPS napravi. Vpišemo upscmd -l samurai in dobimo izpis:

Instant commands supported on UPS [samurai]:

beeper.toggle - Toggle the UPS beeper
load.off - Turn off the load immediately
load.on - Turn on the load immediately
shutdown.return - Turn off the load and return when power is back
shutdown.stayoff - Turn off the load and remain off
shutdown.stop - Stop a shutdown in progress
test.battery.start - Start a battery test
test.battery.start.deep - Start a deep battery test
test.battery.start.quick - Start a quick battery test
test.battery.stop - Stop the battery test

Če na primer sedaj želimo izključiti nadležno piskanje UPS naprave ob izpadu električne energije vpišemo ukaz: upscmd samurai beeper.toggle. Vpišemo še uporabniško ime admin in geslo ter dobimo obvestilo OK.

Ukaz upsc samurai@localhost ups.beeper.status bo sedaj pokazal, da je piskanje izključeno (dobimo izpis disabled).

Seveda je že s samim NUT mogoče narediti številne avtomatizacije, na primer nastaviti obveščanje ob izpadu napajanja ali ko prične UPS napravi zmanjkovati baterije, izvajanje raznih skript (ugašanje sistemov,…) ob izpadu napajanja, zmanjkovanju baterije, itd.

Morda še omemba ukaza upsrw. Ukaz upsrw samurai@localhost bo izpisal vse spremenljivke, ki jih lahko nastavimo na UPS napravi. V našem primeru dobimo izpis:

[ups.delay.shutdown]
Interval to wait after shutdown with delay command (seconds)
Type: RANGE
Option: "12-600" SELECTED

[ups.delay.start]
Interval to wait before (re)starting the load (seconds)
Type: RANGE
Option: "0-599940" SELECTED

Spremenljivke nastavljamo s stikalom -s, na primer: upsrw -s ups.delay.shutdown=20 samurai@localhost. Seveda pa si je potrebno pred tem pogledati in razumeti pomen posameznih spremeljivk.

Integracija s HomeAssistant

Zdaj se začne najbolj zabaven in uporaben del, in sicer integracija z modernim sistemom za upravljanje doma, HomeAssistant.

Ko se prijavimo v HomeAssitant, nas že pričaka obvestilo, da je HomeAssistant zaznal novo integracijo, in sicer NUT (Network UPS Tools). Ko integracijo aktiviramo, nas vpraša za uporabniško ime in geslo (vpišemo podatke iz datoteke /etc/nut/upsmon.conf, torej uporabnika admin in geslo, ki smo ga nastavili (v našem primeru MysecretpAssword124).

Integracija NUT strežnika s HomeAssistant

Integracija NUT strežnika s HomeAssistant.

Sistem takoj zazna UPS napravo in v našem primeru 11 entitet te naprave, podatke iz UPS-a pa lahko takoj vključimo v HomeAssistant namizje. V NUT integraciji sicer lahko nastavimo tudi tim scan interval, ki določa kako pogosto bo HomeAssistant komuniciral z NUT strežnikom - privzeta vrednost je 60 sekund.

Podatki iz naprave UPS v HomeAssistantu

Podatki iz naprave UPS v HomeAssistantu.

Žal HomeAssistant v našem primeru ni uspel pravilno zaznati oz. aktivirati vseh entitet. HomeAssistant je tako zaznal entiteto sensor.samurai_input_line_frequency, vendar je zanjo javil, da ni dosegljiva. Rešitev je preprosta - kliknemo na entiteto in Entity ID popravimo na sensor.samurai_input_frequency(ime entitete se mora ujemati z izpisom iz upsc, torej input.frequency).

Se pa stanje UPS naprave v HomeAssistantu zelo lepo posodablja (seveda v nastavljenem časovnem intervalu ene minute). Ko recimo v ukazno vrstico vpišemo ukaz upscmd samurai beeper.toggle se v HomeAssistsant prikazu stanje piskača ustrezno spremeni. Enako seveda velja tudi za ostale podatke.

V našem primeru NUT integracija tudi ni omogočila entitete sensor.samurai_battery_voltage, zato jo je bilo treba vključiti ročno.

UPS naprava žal preko NUT ne sporoča odstotka napolnjenosti baterije, pač pa samo napetost baterije. Bi se pa iz tega verjetno dalo z nekaj matematike izračunati oceno napolnjenosti baterije (parameter runtimecal).

NUT sicer sporoča obremenitev UPS-a v odstotkih, lahko pa si v HomeAssistant ustvarimo senzor, ki prikaže obremenitev UPS-a v Wattih.

V urejevalniku datotek (v HomeAssistanttu je dostopen preko spletnega vmesnika) odpremo datoteko /config/configuration.yamldodamo: sensor: !include sensor.yaml.

Nato preko urejevalnika datotek v HomeAssistant ustvarimo novo datoteko /config/sensor.yaml ter vanjo dodamo:


- platform: template
  sensors:
    ups_load_watts:
      friendly_name: UPS obremenitev (W)
      unit_of_measurement: "W"
      icon_template: mdi:gauge
      value_template: "{{ states('sensor.samurai_load') | float(default=0) / 100 * 900 | round(0) }}"

Opomba: ker ima naš UPS 900 W (glede na dokumentacijo) to vrednost vnesemo v zgornjo formulo.

S tem smo ustvarili nov virtualni senzor, ki bo prikazoval obremenitev UPS naprave v Watih.

Spremljanje delovanja UPS naprave je v HomeAssistant res preprosta. S klikom na posamezno entiteto pa si lahko ogledamo tudi zgodovino dogodkov oz. stanj te entitete.

Zgodovina stanj UPS naprave

Zgodovina stanj UPS naprave.

Edino česar NUT integracija (še?) ne omogoča je enostavno pošiljanje ukazov UPS napravi preko HomeAssistant. S tem bi lahko kar preko HomeAssistanta izklapljali piskanje na UPS napravi, pognali test baterije, itd… Ampak ker je HomeAssistan odprt sistem, se z malo “hekanja” da narediti tudi to.

Dva namiga za integracijo vklapljanja in izklapljanja UPS piskanja v HomeAssistant:

upscmd -u admin -p MysecretpAssword124 samurai@192.168.200.231 beeper.toggle
OK

upsc samurai@192.168.200.231 ups.beeper.status 2>&1 | grep -v '^Init SSL'
enabled

Seveda pa to še ni vse, kar lahko naredimo. V HomeAssistantu namreč lahko nastavimo avtomatizacijo, ki bo poskrbela za to, da nas sistem obvesti, ko UPS zazna izpad napajanja in nato še, ko se napajanje vrne nazaj.

Avtomatizacijo sprogramiramo (no, napol sprogramiramo, napol naklikamo) v razdelku Settings - Automations & Scenes, kjer najprej nastavimo sprožilec (Triggers), ki se aktivira, ko se entiteta Samurai Status Dataspremeni in stanja OL (On line - zunanje napajanje deluje),v katerokoli drugo stanje.

Avtomatizacija v HA

Avtomatizacija v HA.

Za akcijo (Actions)) pa določimo pošiljanje obvestila na mobilni telefon (v našem primeru se entiteta imenuje myphone):


service: notify.mobile_app_myphone
data:
  message: >-
    Na lokaciji xxxx je bil ob {{ now().strftime('%H:%M:%S') }} zaznan
    izpad električnega napajanja. Stanje UPS naprave{{ ':' }} {{
    states('sensor.samurai_status') }}.
  title: Doma - izpad napajanja
  data:
    ttl: 0
    priority: high

Zdaj bo ob izpadu napajanja HomeAssistant obvestilo o tem poslal na mobilni telefon, kjer imamo naloženo HomeAssistant aplikacijo. Mimogrede, ker želimo obvestilo o izpadu prejeti prioritetno, smo v akcijo dodali naslednjo kodo:

  data:
    ttl: 0
    priority: high

Brez tega bi obvestila na telefon prihajala z nižjo prioriteto, kar pomeni z zamikom (npr. ko telefon “zbudimo” iz neaktivnosti).

Obvestilo o izpadu napajanja poslano na mobilni telefon

Obvestilo o izpadu napajanja poslano na mobilni telefon.

Pravzaprav se to obvestilo ne pošlje samo ob izpadu napajanja, pač pa vsakič, ki se spremeni status UPS naprave iz “On line” na karkoli drugega. Če recimo iz UPS naprave potegnemo USB kabel, bo skripta ravno tako javila izpad napajanja (ker je pač tako napisana), se bo pa na obvestilu izpisalo, da je stanje UPS naprave “unavailable”. Z nekoliko več programiranja je seveda mogoče napisati bolj kompleksne avtomatizacije, v navedenem primeru smo samo želeli prikazati kaj je mogoče narediti.

Na podoben način lahko sprogramiramo tudi pošiljanje obvestil ko se napajanje povrne, obvestila pa lahko pošiljamo tudi po elektronski pošti, na Signal ali na praktično katerikoli drug način. Da, sprogramiramo lahko tudi, da nas sistem ob izpadu elektrike pokliče na telefon.

Lahko nastavimo tudi avtomatizacijo, ki ob izpadu električnega napajanja npr. v prostoru prižge npr. rdečo luč (seveda mora biti ta priključena na UPS) - skratka, možnosti so skoraj neomejene. Hkrati pa do NUT strežnika lahko dostopamo preko različnih naprav oziroma njegove storitve integriramo v različne sisteme.

Z nekaj truda se tako rešimo (po mojem mnenju) slabo uporabne, zastarele in lastniške programske opreme.

UPS nadzorna plošča v HomeAssistant

UPS nadzorna plošča v HomeAssistant.

Edino česar ne razumem je, zakaj proizvajalec za svoje stranke ne pripravi podobnih navodil kako UPS povezati z NUT. Na moje povpraševanje glede Linux konfiguracije sem namreč dobil odgovor, da le-te žal nimajo…

In seveda, NUT teče tudi na Windows sistemih, na večini Unix, BSD in Linux platform (na različnih procesorskih arhitekturah), Solaris, HP-UX in AIX sistemih ter različnih vgrajenih sistemih (angl. embedded systems). Omogoča komunikacijo preko interneta, integracijo z različnimi orodji, na voljo pa so tudi različne spletne aplikacije za prikaz podatkov iz NUT strežnika. Z malo igranja je mogoče narediti tudi na RaspberryPi ali CM4 modulu temelječo napravo, ki poleg vsega naštetega omogoča še prikaz podatkov o stanju UPS naprave na mini zaslončku. Morda poslovna ideja za proizvajalca?

Za konec pa - je res tako težko razumeti, da odprtost podjetja včasih nič ne stane, ravno nasprotno, lahko mu prinese celo konkurenčno prednost?

Kategorije: Informacijska tehnologija, Odprta koda
Ključne besede: HomeAssistant, RaspberryPi, IoT, UPS, NUT