Pojďme programovat elektroniku

Programování elektroniky: Ovládáme lacinou klimatizaci z příkazové řádky

  • Dnes z počítače ovládneme lacinou mobilní klimatizaci
  • Je totiž vybavená Wi-Fi a napojením do systému Tuya
  • Budeme i zapínat a vypínat v Pythonu

Zatímco jedním z největších spotřebitelských témat v Evropské unii a USA je v posledních letech právo na opravu, my, domácí kutilové, bastlíři a makeři všeho druhu, toužíme možná ještě více po právu na aplikační rozhraní – API.

Kdybychom o světě rozhodovali my, každá chytrá krabička bude povinně nabízet vedle napojení do všemožných systémů chytré domácnosti ještě základní rozhraní pro vývojáře, kteří si chtějí osvětlení, vysavač, lednici a sporák ovládnout po svém.

Nutno podotknout, že i v roce 2022 je to spíše ojedinělý jev a svět komerčního IoT zůstává poměrně uzavřený. Častým argumentem výrobců je bezpečnost, protože API, které nebudou mít plně pod kontrolou, považují jen za další vektor potenciálního kybernetického útoku. Fakt, že si jejich výrobek zakoupila zpravidla dospělá osoba a s vlastní osobní zodpovědností za své činy, je už bohužel tak nezajímá.

Podívejte se na video, jak zapneme klimatizaci z příkazové řádky:

Čínská Tuya dobývá hlavně lacinou elektroniku

Ironií osudu tak svět chytré domácí elektroniky otevírá hlavně kontroverzní Čína a IoT platformy tamních výrobců. Jednou z nich je Tuya, jejíž ekosystém dnes čítá více než 8 400 výrobců. Na seznamu figurují tisíce neznámých asijských značek, stejně tak ale i francouzský Schneider Electric nebo třeba Philips.

8e6c1a7e-6662-4024-8f82-2d81877c048f
Mobilní aplikace Tuya Smart a ovládání laciné klimatizace od Sencoru

Tuya už také prosákla do světa laciných a v Evropě tradičně rozšířených značek jako třeba Sencor a stejně tak tvoří jádro levné chytré domácí elektroniky z Lidlu.

Kompatibilitu s evropskou legislativou, co se ochrany dat týče, zajišťuje hned několik serverů na území Evropské unie. Pokud je zvolíte, nemusíte se alespoň podle výrobce obávat, že vaše informace potečou skrze ústředí Komunistické strany Číny.

Cloudový management chytrých krabiček

Nás kutily nicméně spíše než jednotná mobilní aplikace Tuya Smart pro Android a iOS, pomocí které můžete kompletně ovládat celou chytrou domácnost, zajímá vývojářský portál iot.tuya.com.

Ten totiž neslouží jen pro výrobce, kteří by rádi Tuyu implementovali do své elektroniky, ale účet si zde může vytvořit naprosto každý. Třeba právě kutil, který pak se svým cloudovým projektem spáruje skrze mobilní apku koncová zařízení, získá jejich přístupové klíče a může je ovládat svépomocí.

343b1ed0-32d9-4514-9cf1-fe5082e49927
Správa zařízení v konzoli pro vývojáře

Slouží k tomu standardní příkazy ve formátu JSON, kterými lze popsat prakticky cokoliv od chytré varné konvice po robotický vysavač, automatické rolety a klimatizaci.

Loni na podzim pak Tuya představila i kompletní SDK pro vývoj v Pythonu, který vlastní integraci elektroniky ještě více zjednoduší a nabízí servis, který bychom u západní konkurence zpravidla hledali jen velmi marně.

Maličká knihovna TinyTuya pro Python

A právě v Pythonu si Tuyu ukážeme i v dnešním článku, namísto oficiálního a košatého SDK nicméně použijeme komunitní knihovnu TinyTuya, která to už podle svého názvu ještě více zjednodušuje. K dispozici je na GitHubu, kde najdete i hromadu příkladů, stejně tak ji ale můžete získat skrze instalátor balíčků pro Python pip.

TinyTuya umožnuje ovládání zařízení v ekosystému Tuya buď skrze cloudové API – tedy přes internet z jakéhokoliv místa na světě –, stejně tak ale nabízí přístup skrze místní síť a UDP. To se hodí pro případy, kdy nebude k dispozici internetové připojení, ale jen LAN.

Kuřáci mě donutili k nákupu klimatizace

Bydlím v pátém patře, všechna okna mám orientovaná směrem na západ a v domě se ke všemu před lety uhnízdilo několik kuřáků, kteří v parném létu obtěžují ostatní obyvatele prakticky nepřetržitým vypouštěním dýmu. Pokud si u nás budete chtít po západu slunce vyvětrat, riskujete zamoření celého bytu nikotinovým kouřem.

42c0441b-d9dd-480f-80d7-d10f6f0dc9f8
Teplota vzduchu na mém rozpáleném balkoně za poslední tří měsíce

Aby toho nebylo málo, dispozice domu není zrovna nejvhodnější pro instalaci klasické dvoudílné klimatizační jednotky, která by problém s chlazením alespoň trošku řešila, a tak jsem loni zašel do nejbližšího hobby marketu a přitáhl domů lacinou 1kW mobilní klimatizaci s chobotem, pro který jsem v panelu vysekal větrací šachtu.

Kdejaké laciné zařízení má Wi-Fi

Lepší kousky s kvalitním odvodem horkého vzduchu sice dokážou malý byt zchladit podobně jako menší nástěnná klima, nicméně za cenu vysokého hluku a tvorby podtlaku v místnosti.

Je to prostě kompromis. Na stranu druhou, zhruba od 5 000,- už velmi často nechybí Wi-Fi, mobilní aplikace a napojení do chytrých ekosystémů od Amazonu, Googlu a Applu. U klasických nástěnných klimatizací je to naopak i nadále spíše výjimka.

dcf683e1-e0d8-4457-858c-6db776eecd13
Laciná mobilní klimatizace za pár tisíc s chobotem a Wi-Fi

Toto ale není recenze mobilních klimatizací, rovnou tedy přejdu k tomu podstatnému. Mozkem klimatizace je mezi kutily oblíbený Wi-Fi čip od Espressifu, čili kdybych jednotku demontoval, mohu na mikrokontroler nahrát vlastní firmware třeba z Arduina, anebo některý z těch komunitních. Třeba ESPhome.

V mém případě to ale není třeba, Sencor totiž použil firmware od Tuyi, a tak se s klimatizací spojím přímo pomocí jejího oficiálního API pro vývojáře.

Svůj projekt spáruji se zařízením pomocí QR

Nainstaloval jsem tedy na mobil apku Tuya Smart a spároval v ní klimatizaci. Poté jsem si vytvořil účet na vývojářském portálu Tuya a založil nový projekt v sekci Cloud. Každý takový projekt má své Access ID/Client ID, což je jedinečný identifikátor, a Access Secret/Client Secret, což je zase přístupový klíč.

8453ab95-42bc-403b-8645-25308922942b
V Tuya IoT Platform jsem vytvořil nový projekt, ve kterém budu spravovat svoje zařízení

Obě hodnoty budu později potřebovat při přístupu k zařízení. Nejprve ale musím nějaké propojit se svým projektem, což provedu v jeho administraci a v sekci Devices. Najdu zde seznam všech svých hraček v ekosystému Tuya, aktuální stav a také tlačítko Add Device. Propojení zařízení s projektem probíhá skrze QR kód.

4baf5376-84cf-4d40-9280-393a5447030b
Nové zařízení spáruji s projektem skrze QR kód, který sejmu v mobilní aplikaci Tuya

QR kód mohu samozřejmě předat i někomu jinému a na dálku pak spravovat jeho chytrou elektroniku z jednoho vývojářského pultíku.

9511ba3c-8421-47ee-9097-06152db067c6
A už je tam. Mám práva ke čtení a zápisu do zařízení a také k jeho správě

Ovládací instrukce v JSON

Vývojářský dashboard toho umí opravdu hodně. Když si otevřu kartu některého ze zařízení, dozvím se základní informace, příslušnost ke konkrétnímu geografickému datacentru, se kterým komunikuje (můj projekt by měl být v tom stejném), nechybějí ale ani podrobné časové logy všech událostí a konečně záložka Device Debugging.

87273597-0159-4bdf-a58f-f91b49bb9e37c66f6a86-612e-4291-a7d0-fc911145933d
Grafický a textový terminál pro zasílání instrukcí v JSON

Je to vlastně jakýsi GUI/text terminál pro zasílání JSON příkazů přímo do zařízení skrze cloudové API.

Takže kdybych chtěl svoji klimatizaci zapnout, stačí odeslat instrukci v JSON:

{
    "code": "switch",
    "value": true
}

A kdybych ji chtěl zapnout, ale zároveň nastavit také režim na chlazení, teplotu na 18 °C a ventilátor na nejvyšší otáčky, dávku upravím tímto způsobem:

[
  {
    "code": "switch",
    "value": false
  },
  {
    "code": "mode",
    "value": "cold"
  },
  {
    "code": "temp_set",
    "value": 18
  },
  {
    "code": "fan_speed_enum",
    "value": "high"
  },
]

Díky strukturovanému formátu JSON mohu v jedné zprávě kombinovat celou řadu dílčích příkazů.

Spojíme se s klimatizací skrze TinyTuya

Tak, to by na webu stačilo a hurá na ten Python. Nainstaloval jsem knihovnu TinyTuya na své domácí Raspberry Pi, ke kterému jsem se skrze SSH připojil z bezplatného editoru Visual Studio Code a připravil si první ukázku stručného kódu, který jen ověří spojení s klimatizací skrze cloudové API a vypíše konfiguraci zařízení opět ve formátu JSON.

129efd18-7e19-4ec6-830c-eb9ed5435dff
Textový výstup ve spodní části prozrazuje, že jsem se úspěšně spojil s klimatizací a získal její aktuální stav ve formátu JSON

Abych to dokázal, budu potřebovat ony identifikační hodnoty mého projektu (Access ID a Access Secret) a ještě identifikátor zařízení Device ID, který najdu v seznamu spárovaných spotřebičů na webu.

Celý kód bude vypadat takto:

import tinytuya as tt

# Přístup pres Tuya Cloud (internet)
cloud = tt.Cloud(
    apiRegion = "eu", # Geografický region/datacentrum
    apiKey = "sk8uycg7aqood", # Access ID projektu
    apiSecret = "19b1d39c0a784a", # Access Secret
    apiDeviceID = "54766874e86" # Device ID
)

# Pole odpovídajících zařízení
spotrebice = cloud.getdevices()

# Projdu pole
for spotrebic in spotrebice:
    print(f"Název: {spotrebic['name']}")
    print(f"ID: {spotrebic['id']}")

    # Vypíšu surový obsak stavu zařízení v JSON
    stav = cloud.getstatus(spotrebic["id"])
    print(f"\n{stav}")

Funguje to! V terminálu se brzy zobrazí informace o mé klimatizaci. Používám cloudové API, takže to zabere možná pár sekund, spojení totiž probíhá skrze server kdesi v evropském datacentru.

Na stranu druhou, takto se mohu s klimatizací spojit odkudkoliv, i když bude moje chytrá domácnost za NATem routeru a infrastrukturou operátora – i bez veřejné a pevné domácí IP adresy.

Posíláme povely v JSON do klimatizace

Pasivní čtení stavu je ale nuda. Převezmu proto iniciativu a skript výše upravím pro zasílání zpráv. Když přidám terminálový parametr zapni, klimatizace se spustí, no a když vypni, analogicky se zastaví.

41a50547-1f83-4756-909e-b0aa4737a077
Zapnutí a vypnutí klimatizace z příkazové řádky pomocí skriptu v Pythonu

Jak už jsme si řekli výše, zprávy se do zařízení zasílají ve formátu JSON a knihovna TinyTuya k tomu má metodu sendcommand(idZařízení, JSON). Upravený kód by proto mohl vypadat třeba takto:

import tinytuya as tt
import sys

# ID naší klimatizace v systému Tuya Cloud
klimatizaceId = "54766874e86"

# Instrukce pro zapnutí
zapni = {
    "commands":[
        {
            "code": "switch",
            "value": True
        }
    ]
}

# Instrukce pro vypnutí
vypni = {
    "commands":[
        {
            "code": "switch",
            "value": False
        }
    ]
}

# Přístup Tuya Cloud (internet)
cloud = tt.Cloud(
    apiRegion = "eu", # Geografický region/datacentrum
    apiKey = "sk8uycg7aqood", # Access ID projektu
    apiSecret = "19b1d39c0a784a", # Access Secret
    apiDeviceID = klimatizaceId # Device ID
)

# Pole odpovídajících zařízení
spotrebice = cloud.getdevices()

# Projdu pole
for spotrebic in spotrebice:
    print(f"ID: {spotrebic['id']}")

    # Vypíšu surový obsak stavu zařízení v JSON
    stav = cloud.getstatus(spotrebic["id"])
    print(f"\n{stav}")

print("")

# Pokud jsem použil parametr zapni, zapnu klimatizaci
if "zapni" in sys.argv:
    print("*** ZAPÍNÁM KLIMATIZACI ***")
    odpoved = cloud.sendcommand(klimatizaceId, zapni)
    print(f"Odpověď: {odpoved}")

# Pokud jsem použil parametr vypni, vypnu klimatizaci
elif "vypni" in sys.argv:
    print("*** VYPÍNÁM KLIMATIZACI ***")
    odpoved = cloud.sendcommand(klimatizaceId, vypni)
    print(f"Odpověď: {odpoved}")

Spouštíme a vypínáme klimu z příkazové řádky

Pokud by se náš skript v Pythonu jmenoval třeba ovladani.py, pro spuštění klimatizace stačí zavolat příkaz:

python3 ovladani.py zapni

No a pro vypnutí:

python3 ovladani.py vypni

Začátečníky v Pythonu pro jistotu upozorním na to, že příkaz výše odpovídá mé konfiguraci interpretu Pythonu. Na vašem počítači se spouštěcí program nemusí jmenovat python3, ale prostě jen python nehledě na jeho verzi.

A když nechceš cloud, můžeš použít LAN a UDP

Stejným způsobem bych mohl klimatizaci předat i jiný a klidně i kombinovaný příkaz, který bude měnit otáčky ventilátoru, cílovou teplotu a další parametry.

A jelikož na platformě Tuya běží i hromada dalších typů elektroniky, analogickým způsobem ovládnu třeba osvětlení, chytré zásuvky a další spotřebiče na identickém protokolu. Jen zvolím adekvátní instrukce v JSON.

413cf90f-7451-4c8c-bf7a-70da5923bcde
Ovládání v LAN bez potřeby internetu se liší hlavně jednodušším číselným formátem instrukcí v JSON a klíčem pro lokální spojení se spotřebičem

A pokud bych chtěl celý Tuya Cloud odstřihnout, v TinyTuya mohu nakonec pracovat i se zmíněným přístupem skrze LAN a UDP bez potřeby internetu. Tento krok vyžaduje další stupeň autorizace a odlišný formát příkazů v JSON. Jak na to, se dozvíte přímo na GitHubu knihovny TinyTuya.

Demokratizace integrace je nezbytná

Co napsat na závěr? Je smutné, že podobný vývojářský servis nenabízejí i západní výrobci a majitel spotřebiče se nemůže do nitra krabičky dostat po své vlastní ose. Snad se situace časem zlepší a ekosystémy se otevřou podobným způsobem jako právě Tuya.

Je to nezbytné pro další úroveň demokratizace IoT v budoucnosti – tedy demokratizace jeho integrace.

Diskuze (23) Další článek: Kolo na dvě půlky, a stejně to jede. Jen chceme vidět, až se to rozsynchronizuje…

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,