Integrace Shelly PlugS Gen3 do Loxone

Doma nastala potřeba řídit, kdy dětem bude fungovat televize a kdy naopak televize nebude dostupná. Chtěl jsem něco, co bude ovládat přímo zásuvku, do které je napojena jak samotná TV tak i SetTopBox. Vzhledem k tomu, že již ovládám jiné spotřebiče pomocí DIN Rail modulů od Shelly, hledal jsem řešení i pro tento případn. Rozhodl jsem se vyzkouše integraci Shelly PlugS Gen3 s Loxone. Zjistil jsem, že PlugS se od ostatních modelů mírně liší strukturou API, ale integrace se nakonec zdařila.

Obsah

Ovládání relé v zásuvce (Virtual Output)

Začněme tím jednodušším a co v Google vyběhne na první dobrou. Jak z Loxone zapnout nebo vypnout relé v Shelly zásuvce. K tomu je potřeba vytvořit tzv. „Virtuální výstup“ a poslat do Shelly příkaz pro vypnutí / zapnutí.

Dokumentace k tomuto příkazu je zde:

Nejprve je tedy potřrba vytvořit Virtuální výstup. Důležité je vyplnit:

  • Označení – Název výstupu, v mém případě „Shelly_PlugGen3_2NP_TV_DAVID
  • Adresa – adresa Shelly PlugS
    • ve tvaru http://[IP_ADRESA]
    • například http://192.168.1.10
    • pokud používáte ověřování jménem a heslem na straně Shelly, je potřeba tvar upravit na:
      http://{username}:{password}@{IP_ADDRESA}:80
      POZOR: Loxone Miniserver Gen1 má s ověřováním problém a osvědčilo se mi (bohužel) ověřování nepoužívat
  • Doporučuji nechat zatrženu volbu „Po odeslání ukončit spojení“

Po vytvoření virtuálního výstupu je potřeba vytvořit „Příkaz pro virtuální výstup“ v Loxone Configu je to označeno, podle mě, trochu nelogicky jako „Virtuální výstup příkazu“. 

Důležité parametry jsou:

  • Označení – slouží jako identifikace výstupu, v mém případe „Relay0-TV-David
    • Označení Relay0 používám unifikovaně, protože mám i zařízení, která mají více relé a chci zachovat jmennou konvenci
  • Instrukce při zapnutí – /relay/0?turn=on
  • HTTP při zapnutí – GET
  • Instrukce při vypnutí – /relay/0?turn=off
  • HTTP při vypnutí – GET
  • První opakování – 10
    • Zajistí, že pokud na tento výstup posíláme logickou 1, tak pokud je tento výstup aktivní déle než (v tomto případě) 10 vteřin, instrukce se zopakuje
  • Interval opakování – 10
    • Zajistí, že pokud na tento výstup posíláme logickou 1, tak pokud je tento výstup stále aktivní, instrukce se každých 10 vteřin zopakuje
    • Doporučuji nastavit interval mezi 5 – 10 vteřinami, aby se zbytečně Loxone miniserver nezatěžoval, ale aby opakování instrukce netrvalo příliš dlouho.
    • Opakování není potřeba nutně nastavovat, ale v případě, že někdo změní stav relé na úrovni Shelly aplikace nebo Shelly webu, tak bude v Loxone jiná informace, než je skutečný stav. V mém případě je Loxone vždy zdrojem pravdy

Nyní je již možné zásuvku ovládat. V Loxone Configu stačí přidat tlačítko / vypínač a odesílat instrukce do Shelly.

Přímo ve web rozhraní Shelly PlugS lze pak sledovat změnu stavu v sekci Diagnostics

Data, která jsou zaslaná z Loxone, mají uvedeno „source“:“http“ a hodnota „output“ je true nebo false podle toho, zda Shelly dostává příkaz pro zapnutí nebo vypnutí.

Restart / reboot Shelly (Virtual Output)

Když už vytváříme Virtuální výstup (Virtual Output / VO), lze si do Loxone přidat ještě jeden příkaz, pomocí kterého lze restartovat (reboot) Shelly Plug. Ovládání tohoto výstupu doporučuji tlačítkem nebo jedním impulzem který VO aktivuje a příkaz jednou odešle.

„Virtuální výstup příkazu“ a jeho parametry:

  • Označení: RebootShelly
  • Instrukce při zapnutí: /rpc/Shelly.Reboot
  • HTTP při zapnutí: GET

Dokumentace:

Získávání provozních stavů ze Shelly do Loxone (HTTP Virtual Input)

Získávat provozní data ze Shelly lze několika způsoby. Jedním ze způsobů je pomocí pravidelného dotazování pomocí HTTP příkazu. A aby toho nebylo málo, jsou hned 2 HTTP endpointy, kterých se lze dotazovat.

 

HTTP Endpoint: /relay/id

Volání tohoto endpointu vrací základní informace o relé. Shelly PlugS Gen3 má pouze jedno relé (ID: 0), jiné modely ale mohou mít relé více, pak je potřeba pro ovládání konkrétního relé, upravit hodnotu ID.

Endpoint, který budeme volat je tedy ve tvaru: http://{username}:{password}@{IP_ADDRESS}:80/relay/0 nebo bez ověření http://{IP_ADDRESS}/relay/0

Když si tuto adresu dáte do internetového prohlížeče, vrátí se vám odpověď ve tvaru JSON, která vypadá přibližně takto:

Raw JSON odpověď pak má tuto strukturu:

{"ison": true, "has_timer":false, "timer_started_at": 0, "timer_duration": 0.00, "timer_remaining": 0.00, "overpower": false, "source": "http"}

Pro získávání dat je tedy potřeba přidat nový Virtuální HTTP vstup s těmito parametry:

  • Označení: V mém případě „Shelly_PlugGen3_2NP_TV_DAVID_relay0
  • URL: http://[IP_ADRESA]/relay/0
    • například: http://192.168.1.10/relay/0 nebo http://admin:heslo@192.168.1.10/relay/0
  • Dotazovací cyklus: 10 vteřin
    • Doporučuji nastavit interval mezi 10-15 vteřinami, aby se zbytečně Loxone miniserver nezatěžoval, ale aby opakování instrukce netrvalo příliš dlouho.

Po vytvoření virtuálního HTTP vstupu je na čase získávat data pomocí jednotlivých HTTP příkazů. Seznam všech příkazů je popsán v této dokumentaci, já se v tomto případě zaměřím pouze na získání stavu relé 0.

Důležitá je pro nás tedy informace „ison“: true, která má datový typ Boolean a vrací true, pokud je relé sepnuto, ve všech ostatních případech vrací false.

Pro virtuální HTTP vstup je tedy potřeba vytvořit Virtuální vstup HTTP příkazu s těmito parametry:

  • Označení: v mém případě „OUT0-TV-David
  • Rozeznání příkazu: „ison“: \1
  • Vstupní hodnota 1: 102
  • Zobrazená hodnota 1: 0
  • Vstupní hodnota 2: 116
  • Zobrazená hodnota 2: 1

Hodnota 102 reprezentuje logickou 0, tedy hodnotu FALSE

Hodnota 116 reprezentuje logickou 1, tedy hodnotu TRUE

Pokud chceme v Loxone Configu pracovat s 1 pro identifikaci zapnutého relé a 0 pro vypnuté relé, je potřeba:

  1. použít opravu vstupních hodnot (viz tento příklad)
  2. nebo výstup posílat do funkčního bloku Stav a tam hodnoty transformovat (viz obrázek níže)
  3. nebo pracovat v programu s hodnotami 102 resp 116
Loxone Stav

V Loxone lze paj s takovým vstupem pracovat stejně, jako s jakýmkoliv jiným vstupem a pracovat s jeho výslednou hodnotou. Hotnota se aktualizuje v definovaném intervalu.

Kromě atributu ison, lze použít i další atributy pro vytvoření příkazu pro vstup:

AtributDatový typPopis
isonbooleanTrue, pokud je spínač zapnutý, jinak false
has_timerbooleanTrue, pokud je časovač zapnutý, jinak false
timer_started_atnumberUnix časové razítko, čas spuštění časovače (UTC)
timer_durationnumberDoba trvání časovače v sekundách
timer_remainingnumberZbývající čas (v sekundách) do provedení požadavku
overpowerbooleanTrue, pokud došlo k přetížení, jinak false (zobrazeno, pokud je relevantní)
sourcestringZdroj posledního příkazu, například: init, WS_in, http, …
HTTP Endpoint: /rpc/Switch.GetStatus?id=

Volání tohoto endpointu vrací rozšířené informace nejen o stavu relé, ale také provozní stavy zásuvky. Shelly PlugS Gen3 má pouze jedno relé (ID: 0), jiné modely ale mohou mít relé více, pak je potřeba pro ovládání konkrétního relé, upravit hodnotu ID.

Endpoint, který budeme volat je tedy ve tvaru: http://{username}:{password}@{IP_ADDRESS}:80/rpc/Switch.GetStatus?id=0 nebo bez ověření http://{IP_ADDRESS}/rpc/Switch.GetStatus?id=0

Když si tuto adresu dáte do internetového prohlížeče, vrátí se vám odpověď ve tvaru JSON, která vypadá přibližně takto:

Raw JSON odpověď pak má tuto strukturu:

{"id":0, "source":"http", "output":true, "apower":3.6, "voltage":242.5, "freq":50.0, "current":0.051, "aenergy":{"total":46369.397,"by_minute":[0.000,210.202,0.000],"minute_ts":1767112800}, "ret_aenergy":{"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1767112800},"temperature":{"tC":40.6, "tF":105.0}}

Pro získávání dat je tedy potřeba přidat nový Virtuální HTTP vstup s těmito parametry:

  • Označení: V mém případě „Shelly_PlugGen3_2NP_TV_DAVID_RPC0
  • URL: http://[IP_ADRESA]/rpc/Switch.GetStatus?id=0
    • například: http://192.168.1.10/rpc/Switch.GetStatus?id=0 nebo http://admin:heslo@192.168.1.10/rpc/Switch.GetStatus?id=0
  • Dotazovací cyklus: 10 vteřin
    • Doporučuji nastavit interval mezi 10-15 vteřinami, aby se zbytečně Loxone miniserver nezatěžoval, ale aby opakování instrukce netrvalo příliš dlouho.

Po vytvoření virtuálního HTTP vstupu je na čase získávat data pomocí jednotlivých HTTP příkazů. Seznam všech příkazů je popsán v této dokumentaci, já se v tomto případě nyní zaměřím na získání stavu relé 0.

Důležitá je pro nás tedy informace „output“: true, která má datový typ Boolean a vrací true, pokud je relé sepnuto, ve všech ostatních případech vrací false.

Pro virtuální HTTP vstup je tedy potřeba vytvořit Virtuální vstup HTTP příkazu s těmito parametry:

  • Označení: v mém případě „Stav relé 0“
  • Rozeznání příkazu: „output“:\1
  • Vstupní hodnota 1: 102
  • Zobrazená hodnota 1: 0
  • Vstupní hodnota 2: 116
  • Zobrazená hodnota 2: 1

Hodnota 102 reprezentuje logickou 0, tedy hodnotu FALSE

Hodnota 116 reprezentuje logickou 1, tedy hodnotu TRUE

Výsledek je pak úplně stejný, jako v přechozím případě.

Pojďme si ale ukázat, jaké další hodnoty lze získat z JSON odpovědi.

AtributDatový typRozeznání příkazu LoxonePopis
idnumber Id instance komponenty spínače
sourcestring Zdroj posledního příkazu, například: init, WS_in, http, …
outputboolean„output“:\1True, pokud je spínač zapnutý, jinak False
timer_started_atnumber„timer_started_at“:\vUnix časové razítko, čas spuštění časovače (UTC)
timer_durationnumber„timer_duration“:\vDoba trvání časovače v sekundách
apowernumber„apower“:\vPoslední naměřený okamžitý činný výkon (ve Wattech)
voltagenumber„voltage“:\vPoslední naměřené napětí (ve Voltech)
currentnumber„current“:\vPoslední naměřený proud (v Ampérech)
pfnumber„pf“:\vPoslední naměřený účiník
freqnumber„freq“:\vPoslední naměřená síťová frekvence (v Hz)
totalnumber„total“:\vCelková spotřeba energie (ve Watthodinách)
tCnumber or null„tC“:\vTeplota ve stupních Celsia (null pokud mimo rozsah měření)

V Loxone Configu lze pak s jednotlivými vstupy pracovat tak, jak jste zvyklí.

Ačkoliv je řešení pomocí HTTP Virtuálních vstupů funkčním a robustním řešením, jeho velkou nevýhodou je rychlost. Změnu jakéhokoliv stavu nezískáváte online, ale v pravidelných intervalech na základě dotazování.

Mnohem efektivnější řešení je použití Virtuálních UDP vstupů a informací zasílaných aktivně ze Shelly pomocí RPC.

Získávání provozních stavů ze Shelly do Loxone (UDP Virtual Input)

Existuje mnohem lepší způsob, jak do Loxone získávat provozní informace ze Shelly a to téměř okamžitě. Shelly je možné nastavit tak, že aktivně odešle do Loxone informace (atributy a jejich hodnoty), které se změnily. Je potřeba provést nastavení na straně Shelly i na straně Loxone.

Nastavení Shelly RPC over UDP

Přihlaste se do webového rozhraní Shelly a přejděte to SettingsRPC over UDP

V části Destination address zadejte adresu Loxone miniserveru ve tvaru [IP_ADRESA_LOXONE]:[UDP_PORT]

  • Například: 192.168.1.20:10020
  • Číslo portu musí být unikátní a nesmí být sdíleno s jiným zařízením, které by komunikovalo s Loxone

V části Listening port zadejte číslo UDP portu, na kterém bude poslouchat Shelly

  • Například 10019

Nastavení UDP input v Loxone

Po uložení hodnot, začne Shelly automaticky posílat data do Loxone (na zvolenou IP adrese a na zvolený UDP port, tedy 10020).

Dalším krokem je vytvoření Virtuálního UDP vstupu pomocí Loxone Configu. Vytvoření takového vstupu je jednoduché, je potřeba zadat pouze minimální parametry:

  • Označení: v mém případě „Shelly_PlugGen3_2NP_TV_DAVID
  • UDP port: v mém případě „10020

Pomocí UDP Monitoru lze nyní sledovat, jaká data posílá Shelly do Loxone a odchytat textová data, která obsahují požadované informace.

Na základě těchto informací lze vytvořit jednotlivé UDP Virtuální příkazy, které budou obsahovat potřebná data a hlavně v téměř reálném čase.

Po vytvoření virtuálního UDP vstupu je na čase získávat data pomocí jednotlivých UDP příkazů. Seznam všech příkazů je popsán opět v této dokumentaci, já se v tomto případě nyní zaměřím na získání stavu relé 0.

Důležitá je pro nás tedy informace „output“: true, která má datový typ Boolean a vrací true, pokud je relé sepnuto, ve všech ostatních případech vrací false.

Pro virtuální HTTP vstup je tedy potřeba vytvořit Virtuální vstup HTTP příkazu s těmito parametry:

  • Označení: v mém případě „RelayStatus0-TV-David
  • Rozeznání příkazu: „output“:\1
  • Vstupní hodnota 1: 102
  • Zobrazená hodnota 1: 0
  • Vstupní hodnota 2: 116
  • Zobrazená hodnota 2: 1

Hodnota 102 reprezentuje logickou 0, tedy hodnotu FALSE

Hodnota 116 reprezentuje logickou 1, tedy hodnotu TRUE

Výsledek je pak úplně stejný, jako v přechozím případě.

Pojďme si ale ukázat, jaké další hodnoty lze získat z JSON odpovědi.

AtributDatový typRozeznání příkazu LoxonePopis
idnumber Id instance komponenty spínače
sourcestring Zdroj posledního příkazu, například: init, WS_in, http, …
outputboolean„output“:\1True, pokud je spínač zapnutý, jinak False
apowernumber„apower“:\vPoslední naměřený okamžitý činný výkon (ve Wattech)
voltagenumber„voltage“:\vPoslední naměřené napětí (ve Voltech)
currentnumber„current“:\vPoslední naměřený proud (v Ampérech)
totalnumber„total“:\vCelková spotřeba energie (ve Watthodinách)

 

Další užitečné odkazy:

V Loxone Configu lze pak s jednotlivými vstupy pracovat tak, jak jste zvyklí.

Napsat komentář