Nedávno jsme si v praxi vyzkoušeli, co dnes dokáže průchozí Wi-Fi zásuvka čínské provenience z Aliexpressu – pochopitelně s veškerým rizikem toho, že se na asijských e-shopech poměrně složitě reklamuje vyhořelý byt či rodinný dům.
Právě to byl nejčastější protiargument k nákupům podobných laciných cetek. Fungují, lze je snadno napojit na hlasové asistentky od Googlu a Amazonu, kutilové je po drobném zásahu mohou celé přeprogramovat, jenže je to prostě levná Čína se všemi s tím spojenými neduhy.
České profi Wi-Fi zásuvky Netio
Fajn, dobrá, dnes se tedy podíváme, jak může vypadat naprostý opak. Krátce poté nám totiž do redakce dorazily české profesionální Wi-Fi zásuvky Netio. Splňují všechny bezpečnostní normy a jsou určené pro napojení do nějakého již existujícího chytrého systému domácnosti, serverovny nebo jiného podobného provozu, nabízejí totiž vlastní aplikační rozhraní – API.
Netio nabízí v nejvyšší kategorii kompletní PDU (Power Distribution Unit), které mohou automatizovat spínání až čtyř 230V spotřebičů, přičemž s okolím komunikují dle modelu skrze Wi-Fi, ethernet a nakonec i sériovou linku a protokol modbus.
PowerCable
Na druhém konci nabídky jsou pak o něco levnější jednotky PowerCable, které ve formě krátkého prodlužovacího kabelu zvládnou sepnutí jednoho 230V/16A spotřebiče. Ovládnete je buď skrze Wi-Fi 4 (802.11n na 2,4 GHz), anebo tuzemský 868MHz protokol IQRF.
Česká Wi-Fi zásuvka PowerCable REST
Výrobce je ve svém e-shopu nabízí za 99 eur bez DPH (119,79 eur s daní), což po přepočtu činí dobré tři tisíce korun. Nu, svět asijských cetek jsme jak vidno opustili se vším všudy včetně ceny a právě dvě zásuvky PowerCable REST a PowerCable MQTT dorazily i nám. Dnes si ukážeme, co vlastně za ty tři tisíce dostanete a v čem je to unikátní.
Zásuvka s čidlem spotřeby
PowerCable po připojení k lokální síti a získání IP adresy nabídne jednoduché webové ovládací rozhraní, ve kterém můžete zásuvku zapnout a vypnout, stejně tak se ale dozvíte, kolik připojený spotřebič zrovna spaluje elektřiny.
Zásuvka má dvě informační LED pro indikaci Wi-Fi připojení a stavu spínače. Mechanický spínač pro ruční „hloupé“ zapnutí chybí.
V reálném čase se tedy můžete podívat na aktuální hodnoty elektrického napětí (V), proudu (mA), odběru energie připojeného spotřebiče (W), celkové spotřebované energie (Wh) a nechybí ani frekvence střídavého proudu (Hz) a účiník.
Ve webovém rozhraní můžete vedle hlavního administrátora vytvořit také nové uživatele a přidělit jim různá práva. Mohou mít tedy třeba jen přístup k těmto naměřeným datům, anebo i ovládat samotný spínač.
Webové rozhraní Wi-Fi zásuvky PowerCable REST
Vyšší modely dále nabízejí i časové plánování nejrůznějších spínacích úloh a hlavně mobilní aplikaci, pomocí které se k PDU jednotce snadno dostanete i z vnějšího internetu, komunikace totiž probíhá přes cloud výrobce. PowerCable zatím vlastní appku nemá, už je ale ve výrobě a měli bychom se ji dočkat během několika měsíců.
Zásuvka má API pro vývojáře
Leckdo by teď mohl namítnout, že toho základní model PowerCable vlastně moc neumí, to je ale tak trochu jeho účel. Namísto toho, aby sám o sobě prováděl složitou automatizaci třeba u vás doma, nabízí ono zmíněné komunikační API, takže je opravdu určený pro napojení do již existujícího systému chytré domácnosti – nevytváří žádný nový.
Jedná se tedy o skvělou hračku pro kutily, kteří se ostýchají nechat doma v síti kdejakou pochybnou čínskou cetku, zároveň ale nechtějí zásuvku ovládat výhradně skrze nějakou aplikaci výrobce, když už mají chytrou domácnost postavenou třeba na systému Fibaro, komunitním Domoticz a dalších, které umožňují napojení cizí chytré elektroniky.
Hlavní cílovou skupinou však budou spíše větší provozy, které si chtějí automatizaci řešit po svém.
Ovládání zásuvky pomocí webové adresy
PowerCable REST už podle svého názvu nabízí jednoduché HTTP REST API, takže zásuvku můžete sepnout zavoláním její speciální webové adresy a stejně tak můžete velmi snadno získat údaje o spotřebě třeba v dnes již standardním formátu pro výměnu dat JSON, případně stárnoucím XML.
Aktivace URL API pro změnu stavu zásuvky načtením speciální lokální adresy
Pojďme si nejprve vyzkoušet to nejjednodušší možné API, kdy zásuvku přepnu prostým zavoláním její URL. V takovém případě musím v nastavení aktivovat URL API a zvolit si nějaké heslo.
Pozor, jedná se pouze o jeden z parametrů webové adresy a na zásuvce běží základní a nešifrovaný HTTP server, čili i toto heslo se bude v síti šířit nešifrovaně. Je to jen základní obrana před tím, aby mi zásuvku nemohl někdo spustit třeba omylem.
Zásuvka získala lokální IP adresu 172.17.16.137, já zvolil heslo mops, a tak ji nyní mohu zapnout načtením webové adresy:
http://172.17.16.137/netio.cgi?pass=mops&output1=1
Jak vidno, adresa má vedle hesla pass ještě druhý parametr output1, který označuje spínač, který budu nastavovat. Jelikož PowerCable má jen jeden, je označen jedničkou. Parametr má hodnotu 1, který spínači sdělí, aby se sepnul.
Když bych jej chtěl vypnout, stačí zavolat:
http://172.17.16.137/netio.cgi?pass=mops&output1=0
Základní API nabízí ještě prohození aktuálního stavu (toggle):
http://172.17.16.137/netio.cgi?pass=mops&output1=4
A také dva speciální typy zapnutí/vypnutí, které většinou u konkurence nenajdete. Zásuvka se totiž může na krátký čas zapnout/vypnout a zase se vrátit do původního stavu. Může tedy vytvořit pulz, jehož délku v milisekundách nastavíte opět v konfiguraci.
Nastavení prodlevy pro tento typ krátkého sepnutí/vypnutí v jednom kroku
K čemu je to dobré? Krátkým vypnutím a zase sepnutím můžete třeba vyvolat tvrdý restart nějakého počítače, který přestal odpovídat. Stačí zavolat:
http://172.17.16.137/netio.cgi?pass=mops&output1=2
Opačný případ, kdy je zásuvka vypnutá, ale vy ji chcete v jednom kroku třeba jen na pár sekund sepnout a následně vypnout, zase vyvoláte takto:
http://172.17.16.137/netio.cgi?pass=mops&output1=3
Tento případ se může hodit třeba tehdy, když chcete v případě narušení na deset sekund spustit sirénu, která se pak zase vypne. Stačí, aby systém zavolal podobnou adresu jako výše. Anebo tuto adresu může nějaký chytrý systém vyvolávat periodicky třeba každou hodinu, přičemž připojený spotřebič změří data, někam je odešle a vy jej natvrdo odpojíte od napájení.
Ostatně, časté spínání a rozpínání 230V okruhu spotřebiče by mělo být maximálně šetrné a to díky technologii ZCS (Zero Current Switching), kdy je spotřebič odpojen/zapojen v okamžiku, kdy střídavý proud prochází nulou.
JSON API
Nejjednodušší URL API doplňuje ještě JSON API a XML API, které namísto HTTP GET používají HTTP POST. Příkazy se tedy odesílají v těle dotazu a nikoliv v jeho URL a v tomto režimu už na sebe zároveň zásuvka PowerCable práskne vše, co ví.
Aktivace JSON API pro stažení dat o spotřebě
Ještě jedna poznámka. PowerCable vždy rozumí jen jednomu ze zvolených API. Když tedy aktivujete JSON API, přijede o jednoduché URL API a naopak.
Co je to ten džejsn?
JSON je historická zkratka pro JavaScript Object Notation, přestože dnes se z něj už stala prakticky norma pro textový přenos strukturovaných dat napříč nejrůznějšími technologiemi. Stručně řečeno, postupně nahrazuje XML a není spjat výhradně jen s Javascriptem.
Zápis používá složené závorky pro objekt párů klíč: hodnota a hranaté závorky pro pole. Toto je objekt, který může obsahovat informace třeba o redaktorovi Živě.cz:
{
"jmeno": "cizek",
"vlasy": false,
"pocetfanynek": 31583
}
A toto je pole tří vybraných redaktorů Živě.cz v JSON:
[
{
"jmeno": "cizek",
"vlasy": false,
"pocetfanynek": 31583
},
{
"jmeno": "kluska",
"vlasy": true,
"pocetfanynek": 562
},
{
"jmeno": "holcik",
"vlasy": true,
"pocetfanynek": 2356
}
]
Oproti dříve široce rozšířenému XML je zápis stručnější, protože neobsahuje žádné otevírací a zavírací tagy, třeba <jmeno>cizek</jmeno>, ale co je nejdůležitější, parser pro JSON dnes ve výchozím stavu obsahuje prakticky každý moderní programovací jazyk (Javascript, Python aj.) a pro ty ostatní je tu zástup externích knihoven – včetně té pro titěrné Arduino a mikrokontrolery, kde jde o každý bajt paměti RAM.
Data o zásuvce a její spotřebě v JSON
Po malé rekapitulaci – ostříleným kodérům se omlouvám – zpět k JSON API na Wi-Fi zásuvce PowerCable. Jak už název napovídá, JSON se v tomto případě používá pro přenos údajů o spotřebě energie a dalších informací.
Autorizovaný HTTP GET dotaz na data o zásuvce ve formátu JSON
Pokud tedy namísto URL API aktivuji JSON a tentokrát zadám do prohlížeče adresu http://172.17.16.137/netio.json, nejprve na mě vyskočí autorizační dialog pro vyplnění přihlašovacího jména a hesla, no a poté kompletní výpis dat o zásuvce v JSON:
{
"Agent": {
"Model": "101x",
"DeviceName": "NetioPowerCable1",
"MAC": "24:A4:2C:38:D3:8F",
"JSONVer": "2.0",
"Time": "2019-10-12T15:18:41+01:00",
"Uptime": 10108,
"Version": "2.2.1",
"OemID": "5",
"VendorID": "0",
"NumOutputs": 1
},
"GlobalMeasure": {
"Voltage": 236,
"TotalLoad": 34,
"TotalEnergy": 970,
"OverallPowerFactor": 0.96,
"Frequency": 50,
"EnergyStart": "2019-05-03T11:11:10+01:00"
},
"Outputs": [
{
"ID": 1,
"Name": "Power output1",
"State": 1,
"Action": 6,
"Delay": 2000,
"Current": 149,
"PowerFactor": 0.96,
"Energy": 970,
"Load": 34
}
]
}
Jelikož už JSON umějí číst i ti, kteří o něm před patnácti minutami ještě neměli ani páru, pojďme si jej jen stručně projít.
V úvodu nechybí popisné informace o zásuvce, nás ale zajímá objekt GlobalMeasure a pak pole Outputs. V sekci GlobalMeasure jsou celkové statistiky aktuální spotřeby, ale jelikož náš PowerCable má jen jeden spínač, platí i pro něj. Ostatně, tento spínač je také jedinou položkou zmíněného pole Outputs, ze kterého můžeme navíc vyčíst aktuální stav (State) spínače a také protékající proud (Current) v miliampérech.
PowerCable ovládá a měří spotřebu hloupého redakčního ventilátoru
Takže pro kontrolu: PowerCable, který ovládá náš redakční ventilátor, právě na svém výstupu změřil střídavé napětí 236 V s frekvencí 50 Hz. Obvodem protéká elektrický proud 149 mA a ventilátor si aktuálně říká zhruba o 34 W. Za celou dobu od posledního resetování zásuvky jí proteklo 970 Wh elektrické energie a jak praví hodnota State, aktuálně je sepnutá, takže rozvířený redakční vzduch může zlehka ovívat pleš autora tohoto článku.
Právě tato strojová data získá jakýkoliv automatický systém, aplikace běžící na domácím Raspberry Pi či kdokoliv jiný, kdo zavolá tuto adresu, a může je dále zpracovat – třeba uložit do databáze, vykreslit graf s časovou osou, anebo třeba z celkové spálené elektřiny spočítat náklady na denní provoz redakčního ventilátoru.
Autorizace HTTP Basic
Jak už jsme si řekli výše, pokud adresu JSON API zavoláte z webového prohlížeče, zobrazí se přihlašovací okno, kam je třeba zadat přístupové údaje, které jste si nastavili v konfiguraci zásuvky pro toto API.
Webový server chytré zásuvky tentokrát používá primitivní autentizaci HTTP Basic, takže kdybychom chtěli získat data zavoláním adresy třeba z nějakého vlastního programu, musíme do HTTP dotazu vložit speciální hlavičku třeba v této podobě:
Authorization: Basic YWRtaW46bW9wcw==
Sled znaků ve třetí části tvoří textový pár jméno:heslo (včetně dvojtečky) zakódovaný algoritmem Base64. Webový server si jej dekóduje, a pokud bude vše souhlasit, odpoví vám daty v JSON. Opět raději připomenu, že na zásuvce běží pouze základní HTTP server a nikoliv šifrovaný HTTPS server, takže i v tomto případě login a heslo cestují v prostém textu. Vyšší úroveň zabezpečení si musíte zajistit svépomocí.
Pohled na HTTP hlavičky žádosti o JSON s daty o zásuvce ve vývojářských nástrojích prohlížeče Chrome. Jak vidno, obsahuje i zmíněný autorizační záznam, a tak mě zásuvka akceptuje a odpoví mi.
Pojďme si to vyzkoušet v praxi. Nejprve pomocí textového klientu cURL, který je dnes prakticky nedílnou součástí každé linuxové distribuce včetně Raspbianu na Raspberry Pi, k dispozici je ale i verze pro Windows.
Získání dat z příkazové řádky pomocí cURL
Curl autentizaci HTTP Basic samozřejmě podporuje, stejný JSON jako v prohlížeči tedy získáme zavoláním tohoto příkazu:
curl --user admin:mops http://172.17.16.137/netio.json
Všimněte si, že součástí příkazu v textové řádce je parametr --user a následně pár login:heslo.
Získání údajů ze zásuvky v JSON z příkazové řádky pomocí programu cURL
Získání dat v Pythonu a uložení do CSV
Fajn, teď si to pojďme vyzkoušet ještě v nějakém programovacím jazyku. Dejme tomu, že do lokální sítě zapojím maličké Raspberry Pi Zero W. Stojí pár stokorun a poběží na něm linuxový systém Raspbian s Pythonem. Nabízí se tedy aplikace právě v tomto jazyku. Na pomoc si vezmu knihovnu Requests.
Drobný skript se spojí se zásuvkou, získá údaje o spotřebě a uloží je na nový řádek textového souboru ve formátu CSV
Jednoduchý kód níže v Pythonu se spojí se zásuvkou, stáhne JSON, zjistí z něj aktuální napětí, proud, odběr a celkovou spotřebu a všechny tyto hodnoty oddělené středníkem uloží na nový řádek v textovém souboru data.csv, který poté budeme moci otevřít třeba v Excelu.
import requests
from datetime import datetime
http = requests.get("http://172.17.16.137/netio.json", auth=("admin", "mops"))
if http.status_code == 200:
data = http.json()
napeti = data["GlobalMeasure"]["Voltage"]
proud = data["Outputs"][0]["Current"]
prikon = data["Outputs"][0]["Load"]
spotreba = data["Outputs"][0]["Energy"]
print("Napeti: " + str(napeti) + "V")
print("Proud: " + str(proud) + "mA")
print("Prikon: " + str(prikon) + "W")
print("Spotreba: " + str(spotreba) + "Wh")
with open("data.csv", "a") as soubor:
soubor.write(datetime.today().strftime("%H:%M:%S %d.%m.%Y") + ";")
soubor.write(str(napeti) + ";")
soubor.write(str(proud) + ";")
soubor.write(str(prikon) + ";")
soubor.write(str(spotreba) + "\n")
print("Ulozeno do data.csv")
Po zpracování programu se v textovém souboru objeví nový řádek třeba v této podobě:
15:39:45 12.10.2019;237;113;40;952
Teď už stačí podobný kód volat stále dokola s určitým intervalem a získáte historický přehled o průběžné spotřebě a stavu připojeného spotřebiče. Když bude odběr energie nulový, bude spotřebič asi vypnutý, když bude špičkový bude naopak na svém maximu.
Minutový záznam spotřeby během pátečního odpoledne. Z kolísavého odběru energie lze vyčíst, kdy byl ventilátor spuštěný a s jakou rychlostí.
Ovládání zásuvky z příkazové řádky
Tímto způsobem sice ze zásuvky dostaneme všechny zajímavé údaje, ale jak ji tentokrát ovládnout? S aktivovaným JSON API už nemůžeme použít primitivní URL API a musíme do zásuvky odeslat instrukci pomocí HTTP POST, tedy podobně jako třeba webový formulář.
Pojďme si to ukázat nejprve opět pomocí textového programu cURL:
curl --user admin:mops -d "{\"Outputs\": [{\"ID\": 1, \"Action\": 4}]}" http://172.17.16.137/netio.json
Příkazem výše jsme tentokrát odeslali do zásuvky data ve formátu JSON uvnitř těla dotazu HTTP POST (parametr -d). Konkrétně se jednalo o tyto strukturované hodnoty:
{
"Outputs":
[
{
"ID": 1,
"Action": 4
}
]
}
PowerCablu v nich sdělujeme, že má zásuvce s pořadovým ID 1 nastavit akci na hodnotu 4. Je to kostrbaté, ale pamatujte na to, že všechny krabičky Netio mají stejné API a vyšší modely obsahují více zásuvek. Proto musíme sdělit, se kterou zrovna komunikujeme, i když jich má konkrétní zařízení jen jednu.
Číselné kódy akcí jsme si vysvětlili už v URL API na začátku, takže víme, že hodnota 4 znamená přepnutí (toggle) a zásuvka se buď vypne, nebo zapne podle toho, v jakém stavu zrovna byla.
Ovládání zásuvky z Pythonu
Teď si to pojďme opět ukázat v Pythonu pomocí knihovny Requests. Napíšeme si skript, který po spuštění prohodí stav zásuvky a vypíše jej do výstupu.
Přepínání zásuvky pomocí drobného programu v Pythonu
A takto bude vypadat samotný zdrojový kód:
import requests
import json
prepni = {
"Outputs":
[
{
"ID": 1,
"Action": 4
}
]
}
http = requests.post("http://172.17.16.137/netio.json", auth=("admin", "mops"), data=json.dumps(prepni))
if http.status_code == 200:
data = http.json()
stav = data["Outputs"][0]["State"]
if stav == 0:
print("Zasuvka je vypnuta")
elif stav == 1:
print("Zasuvka je zapnuta")
Jak vidno, i tentokrát je veškerá komunikace jednoduchá. Stačí jen pomocí knihovny Requests namísto metody get zavolat metodu post a jako parametr data použít JSON ve formě prostého textu, který chceme odeslat. Jakmile se náš program v Pythonu spustí, prohodí stav zásuvky, která se buď sepne, anebo rozpojí.
Zásuvka, která v prvé řadě myslí na programátory a vlastní systémy
Česká Wi-Fi zásuvka PowerCable REST tu je tedy od toho, abyste si ji mohli pomocí univerzálního API snadno zapojit do vlastního systému chytré domácnosti, firmy, podniku… a to vše bez potřeby flashování vlastního firmwaru atp.
Jak už jsem ale napsal v úvodu, výrobce brzy uvede pro PowerCable i vlastní mobilní aplikaci, takže zásuvku budete moci dálkově sepnout i bez jakéhokoliv systému chytré domácnosti u vás doma.
V úvodu jsme si zároveň řekli, že nám Netio poslalo i model PowerCable MQTT, který používá velmi populární a komplexní protokol MQTT pro internet věcí. O MQTT jsme v našem seriálu o programování elektroniky ještě nepsali, a tak si PowerCable MQTT necháme zase někdy napříště, kdy si ukážeme, co všechno MQTT umí, a proč jej nejen domácí kutilové tak milují.