GSM modul (1. díl – integrace do Loxone přes UDP)

GSM modul (1. díl – integrace do Loxone přes UDP)

Categories
You are here:
< Zpět

K čemu to je

GSM modul se hodí jako alternativní kanál pro komunikaci s Loxonem, zvláště v těchto případech:

  • Loxone nemá připojení k internetu (např. někde na chatě apod.).
  • Nechce se Vám (neumíte) nakonfigurovat bezpečné internetové připojení k Loxonu (přes VPN).
  • Chcete se rychle dozvědět o kritických událostech v domě (alarm, stisknutí tísňového tlačítka apod). Nechcete se spoléhat na nějaké push notifikace a chtěli byste, aby vám Loxone rovnou poslal SMS nebo zavolal.
  • Chcete rychle něco ovládat mobilem (příjezdová brána) přes prozvonění a nechce se vám listovat v Loxone app.
  • Chcete umožnit třetím osobám, které nemají v telefonu Loxone aplikaci, aby něco na dálku ovládali (přes zavolání nebo přes SMS)
  • Nechce se vám platit za službu Loxone Caller…

Samozřejmě provoz GSM modulu není (na rozdíl od internetu) zadarmo, platíte za SMSky. Vybírejte tarif s levnými SMS a dlouhou dobou platnosti kreditu.

Co to umí

  • odesílat a přijímat hovory
  • odesílat a přijímat SMS zprávy
  • odesílat a přijímat USSD kódy

Výhodou oproti dedikovaným GSM modulům (např. od alarmů) je to, že nejste nijak omezeni co se týče počtu vstupů a výstupů. Můžete (zavoláním a SMS zprávami) ovládat všechno, co máte v domě. A stejně tak máte neomezené možnosti toho, co vám bude Loxone posílat SMS zprávami. Při odesílání SMS z Loxonu nejste omezeni několika předem nadefinovanými SMS zprávami, ale můžete si obsah SMS dynamicky skládat v samotném Loxonu. Detailní možnosti použití viz níže.

Co to neumí:

  • Neumí to mluvit. Takže vám to sice zavolá, ale pokud hovor zvednete, tak vám to nic neřekne. Možná by to šlo zprovoznit pomocí nějakého text-to-speech nodu pro Node Red, ale nezkoušel jsem to, protože jsem nedokázal zjistit, jak poslat audio stream přes USB/Serial do GSM modulu.
  • Neumí to tónovou volbu (zadání číselného kódu přes klávesnici telefonu). Nezkoušel jsem to a ani nevím, co by k tomu bylo potřeba.

 

Jaký hardware budete potřebovat

  • Raspberry Pi nebo jakýkoliv jiný stroj, na kterém dokážete zprovoznit Node Red a který má jeden volný USB port. V mém případě se jedná o Unipi Neuron (PLC postavené na Raspberry). Neuron má řadu neduhů, občas tady na něj svorně nadáváme, ale tady si neodpustím menší reklamu. Je to super mít v rozvaděči krabičku, která zvládne běh Node Red a která má 4 USB porty, ke kterým se v Node Red snadno dostanete přes serial-in a serial-out.
  • USB modem s podporou hlasového volání. V mém případě Huawei E353 (https://www.aliexpress.com/item/HiLink-Huawei-E353-3G-usb-Modem-3g-dongle-3g-usb-stick-3g-huawei-modem-pk-e3131/32773440894.html ). Myslím, že pokud sáhnete po jakémkoliv modemu od Huawei, tak bude mít podporu hlasu.

Toť vše. Z hlediska HW není potřeba nic řešit. Vložíte SIM do modemu (karta nesmí mít nastavený PIN kód). Píchnete modem do USB a je to.

Poznámka pod čarou 1: Zkoušel jsem postavit celé řešení na Arduinu (Arduino Uno + ethernet shield + GSM shield). Přes Arduino se dá udělat přeposílání AT příkazů přes UDP, ale nikdy na Arduinu neuděláte parsování AT příkazů jako to mám v Node Red. A nakonec stejně narazíte na problém s napájením “žravého” GSM shieldu… Jak říká Jára Cimrman: Tudy ne, přátelé. Tudy cesta nevede.

Poznámka pod čarou 2: Pokud byste náhodou chtěli mít víc GSM modulů, není problém. Stačí upravit Node Red flow třeba tak, aby každý GSM modul poslouchal na jiném UDP portu.

 

Jaký software budete potřebovat

Přesunuto do druhého dílu.

 

Nastavení v Loxone Config

Node Red z Loxonu přijímá tyto UDP příkazy:

  • gsm callout <volané číslo>
  • gsm hangup
  • gsm sms <číslo příjemce> <text zprávy>
  • gsm ussdout <USSD kód>

Node Red do Loxonu posílá tyto UDP příkazy:

  • gsm callin <volající číslo>
  • gsm signal <síla signálu v dBm>
  • gsm <sms příkaz> <číslo odesílatele>
  • gsm ussdin <text USSD zprávy>

Probereme si nastavení Loxone Config po jednotlivých UDP příkazech.

 

Virtuální výstupy

Jako první si udělejte nový Virtuální výstup, kde si nastavíme

Adresa

/dev/udp/192.168.1.78/10007

kde 10007 je port, na kterém poslouchá Node Red.

 

gsm callout <volané číslo>

UDP příkaz na zavolání čísla. Pokud by v té době už nějaký příchozí nebo odchozí hovor probíhal, tak se nejdřív ten starý hovor položí a teprve pak začné nové odchozí vyzvánění. Hovor bude vyzvánět maximálně 1 minutu a potom se sám položí (nastaveno v Node Red). Volané číslo je v devítimístném formátu bez předčíslí.

V Loxone Config si vytvořte Virtuální výstup příkazu, kde si nastavíte

Instrukce při zapnutí

gsm callout <v>

Doporučuji vytvořit si konstantu, do které si uložíte vaše telefonní číslo (9-místný formát bez předčíslí). Bude se vám to hodit. Na jednoduché otestování můžete použít blok analogové paměti. Spouštět ho můžete fyzickým nebo virtuálním tlačítkem – níže uvedený příklad je vlastně příkladem tísňového tlačítka. Jak vidíte, na ovládání gsm callout můžete použít impuls. Po uvolnění tlačítka se analogová paměť zresetuje, na Node Red se sice odešle UDP příkaz “gsm callout 0”, ale v reálu se žádná nula nevytočí.

Připomínám, že Loxone (zatím) neumí mluvit. Zavolá vám, ale neřekne vám, proč volá. Takže doporučuju kombinovat gsm callout s odesláním SMS, abyste vědělli, proč vám Loxone volá.

 

gsm hangup

Jednoduchý UDP příkaz bez dalších parametrů. Položí jakýkoliv odchozí či příchozí hovor. Příklad využití: Loxone položí příchozí hovor (viz gsm callin) aby vám potvrdil, že přijal váš požadavek.

V Loxone Config si vytvořte Virtuální výstup příkazu, kde si nastavíte

Instrukce při zapnutí

gsm hangup

 

gsm sms <číslo příjemce> <text zprávy>

Odeslání SMS zprávy na uvedené číslo (opět číslo bez mezinárodní předvolby). Číslo příjemce musí být odděleno z obou stran mezerami. Samotná zpráva může obsahovat mezery. Příklad:

gsm sms 123456789 Ahoj, jak se mas?

Bohužel v Loxone neexistuje žádný “virtuální textový výstup”, takže si musíme pomoct přes UDP logger. V Loxone Config si vytvořte nový Logger, kde si nastavíte

Adresa loggeru

/dev/udp/<IP adresa stroje s Node Redem>/10007

v příkladu níže je 192.168.1.78 adresa mého stroje s Node Redem a 10007 je port, na kterém Node Red poslouchá.

Samotné sestavení textu SMS zprávy uděláme přes blok Status. Tento status nebude vidět ve vizualizaci, takže Vizualizace>Použít>zrušit zaškrtnutí. Blok má celkem 4 analogové vstupy. Na tyto vstupy můžete přivést analogovou hodnotu, digitální hodnotu (0/1) a dokonce i textovou hodnotu (např. výstup jiného bloku Status). Blok Status má jenom 4 vstupy. Pokud by Vám to nestačilo, můžete bloky Status řetězit (výstup jednoho bloku půjde do vstupu dalšího bloku). Na jeden ze vstupů si pošleme telefonní číslo, kam budeme SMS posílat. Na další vstupy si přivedeme cokoliv, u čeho chceme sledovat stav přes SMS (stav topení, teplota, stavy alarmu…).

Zároveň doporučuji přivést na jeden ze vstupů i nějaký spouštěč (impuls), tak abyste mohli řídit nejenom to, co se bude v SMS odesílat (např. stav topení), ale i kdy se to bude odesílat (tímto impulsem může být například i příchozí SMS příkaz – viz příklad níže). Pokud byste chtěli odesílat SMS opakovaně v určitých intervalech (například opakovaná SMS při alarmu), můžete si pomoct přes nějaký generátor impulsů přivedený na vstup bloku Status.

Uvnitř bloku Status si ve sloupci “Text statusu” nadefinujeme text UDP zprávy (a tedy i text samotné SMS zprávy) v souladu s naší syntaxí. Takže například:

gsm sms <v1> Topeni je vypnute.

Kde <v1> je telefonní číslo (například jako konstanta) přivedené na vstup 1.

Zároveň si nadefinujeme podmínky, za kterých se bude tato zpráva odesílat. Upozorňuji, že SMS se odešle vždy, když se má daný text statusu zobrazit. Text statusu se zobrazí vždy, když jsou splněny nadefinované podmínky na vstupech. A podmínky na vstupech se kontrolují i v okamžiku, kdy se Loxone spustí! Pokud byste měli jako jedinou podmínku změnu stavu sledované veličiny, tak by se SMS odesílala i při každém spuštění Loxonu. Proto je potřeba přivést do bloku kromě sledovaného stavu (stav topení je na vstupu 1) i nějaký další spouštěč (v mém příkladě je spouštěč na vstupu 4).

No a potom stačí k bloku Status přiřadit námi nadefinovaný UDP logger. “Minimální časový interval” doporučuji stáhnout na nulu (pro případ, že byste chtěli rychle za sebou poslat SMS na více čísel). Aby se SMS neodesílaly příliš často je potřeba ohlídat podmínkami uvnitř samotného bloku Status.

 

gsm ussdout <USSD kód>

Odeslání USSD kódu. Využití: zjišťování stavu kreditu na SIM kartě. USSD kód samozřejmě může obsahovat hvězdičky, mřížky atd.

V Loxone Config si vytvořte Virtuální výstup příkazu. Tady je příklad pro zjištění kreditu přes Kaktus.

Instrukce při zapnutí:

gsm ussdout *103#

 

Virtuální UDP vstupy

Udělejte nový Virtuální UDP vstup, kde si nastavíme

Adresa odesílatele

<vaše adresa stroje s Node Red>

UDP port

<port, na kterém poslouchá Loxone>

 

gsm signal <síla signálu v dBm>

Modem pravidelně a sám od sebe informuje o stavu signálu. Proč toho nevyužít. Takže první vstup je síla signálu.

Přidáme nový Virtuální UDP příkaz. Nastavíme

Rozeznání příkazu

gsm signal \v

Modem posílá sílu signálu v rozmezí 0 až 13, to je potřeba převést na dBm pomocí “Oprava” a případně můžete zapnout i validaci:

 

gsm ussdin <text USSD zprávy>

Toto je USSD zpráva, kterou modem pošle jako odpověď na váš předchozí dotaz gsm ussdout. Využití: ověření stavu kreditu. Toto fakt není radno podceňovat. GSM modem bude mít na starosti kritické věci jako alarm a určitě nechceme, aby nám tam došel kredit. Buďto si pořiďte nějaký tarif nebo si nastavte kontrolu kreditu přes příkazy gsm ussdout a gsm ussdin.

Node Red odešle USSD zprávu celou, je proto potřeba z ní vyparsovat proměnné, které nás zajímají. Zapněte si UDP monitor. Pošlete si na GSM modul dotaz “gsm ussdout <kód na zjištění kreditu>”. Do UDP monitoru dostanete zprávu od operátora. Pro každou proměnnou si udělejte Virtuální UDP příkaz a parsujte podle toho, jak vypadá zpráva od operátora. Já mám Kaktus, zpráva vypadá takto

Tvoje cislo +420XXXXXXXXX ma kredit 79.00 Kc, Platnost SIM do 15.11.2019.

Takže “Rozeznání příkazu” pro jednotlivé Virtuální UDP příkazy vypadá takto:

Kredit

\ikredit\i \v

Den platnosti

\iPlatnost SIM do \i\v

Měsíc platnosti

\iPlatnost SIM do \i\w.\v

Rok platnosti

\iPlatnost SIM do \i\w.\w.\v

 

Doporučuji nastavit validaci pro případ, že operátor změní formát zprávy a parsování selže.

Pokud chci vědět, za kolik dní mi kredit vyprší, musím použít PicoC (blok Program), kde vstup 1 je den platnosti, vstup 2 je měsíc a vstup 3 je rok. Na výstupu mi polezou zbývající dny platnosti:

int nEvents;
while(TRUE)
{
nEvents = getinputevent();
if (nEvents & 0xe)
{
int day = getinput(0);
int month = getinput(1);
int year = getinput(2);
int currentTime = getcurrenttime();
int deltaDays = (gettimeval(year, month, day, 0, 0, 0, 0) - gettimeval(getyear(currentTime, 1), getmonth(currentTime, 1), getday(currentTime, 1), 0, 0, 0, 1)) / (60*60*24);

setoutput(0,deltaDays);
}
sleep(60000);
}

Poznámka: nejsem programátor, prosím někoho o kontrolu. Občas mi to zlobí a hodnota na výstupu se neaktualizuje v případě změny na vstupu.

No a v tuhle chvíli si už můžeme poskládat notifikační SMS, aby nás Loxone upozornil SMSkou v případě, že bude docházet kredit nebo se bude blížit doba vypršení kreditu:

Pro lepší pochopení tam máte ukázané o hodnoty jednotlivých vstupů a výstupů. Většinu bloků jsme si popsali. Je tam:

  • gsm ussdout na dotaz na kredit
  • gsm ussdin, které z odpovědi operátora parsují: kredit, den, měsíc a rok vypršení platnosti.
  • Program (PicoC) na konverzi zbývajících dnů platnosti.
  • Pak tam jsou dva bloky Impulz v daném čase, které vždy jednou za den mají za úkol “Zjistit kredit” (třeba v 5:59) a “Odeslat SMS” (třeba v 6:00).
  • Blok Status “Nízký kredit” odesílá SMS při nízkém kreditu nebo nízké zbývající době platnosti:

 

Pokud klesne kredit pod stanovený limit (v příkladu 20 Kč) nebo zbývající dny klesnou pod stanovený limit (30 dní), odešle se při následujícím impulzu (viz blok Impulz v daném čase na vstupu 4) varovná SMS. Každý den se bude SMS opakovat, dokud kredit nedobijete (nebo dokud varovné SMS nespotřebují veškerý zbývající kredit :-)).

 

gsm callin <volající číslo>

Příchozí hovor. Node Red je nastavený tak, že při každém zvonění odesílá UDP zprávu. UDP zprávu přijmeme pomocí (analogového) virtuálního UDP vstupu, který nakonfugurujeme takto:

Rozeznání příkazu

gsm callin \v

A nastavte validaci podle obrázku. Min a max na krajní dovolené hodnoty (nezapomínejte, že budeme posílat defítimístné číslo). Standardní hodnota 0 a časový limit 1s. Virtuální vstup se pak bude chovat jako “analogový impuls”. Jednu sekundu bude posílat volající číslo a pak vstup se zresetuje na hodnotu 0.

Máme tedy volající číslo a teď je potřeba ho ověřit. Hledal jsem způsob, jak to udělat a nakonec jsem skončil u bloku Vzorec (pokud byste měli lepší řešení, dejte vědět).

EDIT: Úplně jsme přehlídl blok Rovnost.

Na vstupy přiveďte samotný virtuální UDP vstup a autorizované telefonní číslo, které máte uložené jako konstantu. Tady je příklad dvou autorizovaných čísel:

 

K čemu je tam ten bloky Zpoždění zapnutí a vypnutí? Loxone má nepříjemnou vlastnost, že při startu mají na kratičkou chvíli všechny analogové konstanty a všechny analogové virtuální vstupy hodnotu nula (to znamená volající číslo odpovídá autorizovanému a odešle se impuls na rozsvícení světla na chodbě). Blok Zpoždění zapnutí a vypnutí slouží k tomu, že zablokuje jakýkoliv impuls kratší než 0,5s. Připomínám, že impuls posílaný Virtuálním UDP vstupem callin má délku 1s, takže bez problémů projde. Blok Zpoždění zapnutí a vypnutí je třeba nastavit takto:

Ve schématu máte i gsm hangup, který hovor zavěsí jako potvrzení toho, že Loxone přijal vaši instrukci. Nezapomeňte, že pokud telefonát nepoloží ani Loxone, ani volající osoba, tak z Node Redu budou do Loxonu chodit další opakované UDP zprávy (impulsy) při každém zvonění.

 

gsm <sms příkaz> <číslo odesílatele>

Příchozí příkazy přes SMS. Nejlepší asi bude, když vysvětlím, co se v Node Red stane, pokud na GSM modul přijde SMS zpráva. SMS zpráva se rozdělí na jednotlivá slova (rozdělovačem je mezera) a tato slova jsou v původním pořadí odesílána v jednotlivých UDP zprávách v intervalech 1s. Takže máte sérii UDP zpráv:

gsm <slovo1> <číslo odesílatele>
gsm <slovo2> <číslo odesílatele>
....

Kromě toho se všechna písmena převedou na malá a odstraní se případná diakritika (abyste se při psaní SMS nemuseli trápit jestli máte správnou velikost písmen).

Nastavení v Loxonu je jednoduché. vytvořte si Virtuální UDP příkaz (vstup), ve kterém si nastavíte

Rozeznání příkazu

gsm <prikaz> \v

například

gsm topeni1 \v

 

Váš příkaz může být jakékoliv slovo:

  • z písmen, číslic a znaků
  • bez mezer
  • pouze malá písmena
  • bez diakritiky
  • slova “signal” a “callin” nepoužívejte, aby nedocházelo ke kolizi s jinými příkazy.

Dále si ve virtuálním UDP příkazu nastavte validaci stejným způsobem, jako jsem to popsal u vstupu “gsm callin”. Aby vám UDP příkaz fungoval jako “analogový impuls”.

Toť vše. Stačí vytvořit Virtuální UDP s vaším příkazem a můžete ho hned začít používat v SMS zprávách. V jedné zprávě můžete poslat víc příkazů, oddělených mezerníkem. Loxone je bude provádět postupně v daném pořadí (s prodlevou 1s). Například já mám příkazy “topeni0” na vypnutí topení, “topeni1” na zapnutí a “topenistav” jako dotaz na aktuální stav. Pokud pošlu SMS “topeni1 topenistav”, tak mi Loxone zapne topení a zpátky mi pošle potvrzovací SMS s aktuálním stavem topení.

Validace čísla odesílatele probíhá úplně stejně jako u gsm callin, přes bloky Vzorec a Zpoždění zapnutí a vypnutí (přiznám se, není to moc elegantní, uvítám návrhy na lepší řešení):

Blok Status posílá SMS o stavu topení zpátky na číslo, ze kterého mu přišel dotaz. Nastavení máte uvedené nahoře, když jsem popisoval příkaz gsm sms. Nezapomeňte napojit celý blok na UDP logger, který jsme si vytvořili dříve.

 

 

No a toť vše.

Pomohl Vám náš blog? Chcete nás podpořit? I málo udělá radost 😉
Table of Contents

One thought on “GSM modul (1. díl – integrace do Loxone přes UDP)

  1. Pokouším se rozeběhnout uvedené zapojení. Test z NR chodí a to jak callout tak sms tak voice. Pokud tam pošlu něco z Loxonu (první příklad callout) vypíše mi debug toto:

    8. 7. 2019 13:46:03node: UDP
    msg.payload : string[22]
    “gsm callout 602305555”
    8. 7. 2019 13:46:03node: /dev/ttyUSB2
    msg.payload : string[6]
    “ATD;↵”
    8. 7. 2019 13:46:03node: /dev/ttyUSB2
    msg.payload : string[5]
    “ERROR”
    8. 7. 2019 13:46:03node: UDP
    msg.payload : string[14]
    “gsm callout 0”
    8. 7. 2019 13:46:03node: /dev/ttyUSB2
    msg.payload : string[6]
    “ATD;↵”
    8. 7. 2019 13:46:03node: /dev/ttyUSB2
    msg.payload : string[5]
    “ERROR”

    a končí chybou. Nevíte kde může být zakopaný pes?

Leave a Reply

Your email address will not be published. Required fields are marked *