Browsed by
Tag: MQTT

Loxone – tipy&triky – jak získat UUID kteréhokoli prvku

Loxone – tipy&triky – jak získat UUID kteréhokoli prvku

Dneska (vlastně před chvilkou, a rovnou to píšu, protože jsem z toho fakt nadšen) se mi povedlu vskutku parádní kousek…. (a jestli mi někdo řekne, že jste to znali, nebo že to je někde popsáno, tak budu fakt naštvanej 😉 ).

Řešil jsem, jak propojit dohromady Roombu, MQTT, NodeRed, mé vlastní RoombaWalls a do toho Loxone. Cílem je, aby si Roomba uměla sama rozsvítit v dané místnosti a uměla si i sama zapnout virtuální zdi v okamžiku, kdy jsou potřeba.

Na rozsvěcení jsem se stále snažil zprovoznit Websockets (marně), Node-lox-mqtt-gateway (marně), případně pak nějak jednoduše přes virtuální HTTP vstupy/výstupy (lze, ale dost opruzoidně).

Až jsem se rozhodl trochu “blíž” podívat na Loxone webovou aplikaci, abych se podíval, jak vlastně oni komunikují s Loxonem. A tady jsem oběvil (alespoň pro mne) zlatý grál ;-).

Ačkoli v dokumentaci píší, že musíte definovat virtuální vstupy/výstupy pro komunikaci s venkem, není tomu tak úplně pravda. Stejně tak není pravda, že přes HTTP požadavek nelze zapnout napřímo dané světlo, aniž by člověk simuloval HW vstup Loxonu.

Je to totiž o tom, že každý prvek v LoxConfigu má vlastní Uuid. Tenhle Uuid zřejmě nejde zjistit v Loxone configu, teoreticky by asi šlo najít ho v Loxone programu v XML souboru, ale mnohem snáž to jde právě přes jejich web aplikaci.

Stačí otevřít aplikaci v Chrome, přes developer tools (F12) se podívat do záložky “Console” a zmáčknout tlačítko dle potřeby (nebo třeba kliknout na žaluzie, nebo cokoli jiného. A hle. Máte kompletní URL adresu s požadavkem, UUIDem tak, abyste daný příkaz mohli vykonat i odkudkoli jinde.

Tohle jsou třeba žaluzie. A není potřeba žádný debilní virtuální vstup navíc, není potřeba nic donastavovat v LoxConfigu a není potřeba se ani prosit na naprosto nekompetentní Loxone podpoře, kde jen tak mimochodem o adrese /jdev/sps/io nemají ani tušení, jelikož znají jen /dev/sps/io, pomocí které šahají jen na fyzické vstupy/výstupy HW, což je ale k programování dost nešikovné.

A takhle vypadá primitivní NodeRED program na rozsvícení světla. To šedé vlevo je prvek “Inject”, který generuje msg se zprávou “status”:”on”

A takhle pak vypadá HTTP request, pomocí kterého se posílá zpráva on/off do loxonu

A to je vše. A takto tím pádem jde ovládat cokoli uvnitř Loxone, aniž by se museloy na vše dělat virtuální vstupy tak, jak to doporučují EXPERTI z Loxone podpory.

PS: Jen tak mimochodem, NodeRED je masakr. Pokud by v Loxonu vytáhli hlavy ze svých pr*** a nabídli by NodeRED nativně jako nadstavbu, neměli by jejich systém naprosto konkurenci.

Díky kombinaci UUID bloků v LoxoneConfigu a programovacím možnostem NodeRED jdou efektivně naprogramovat věci, které by byly jinak nemožné (viz rozsvěcení místností dle průjezdy Roomby, ovládání virtuální zdí roomby jen když roomba jede,….)

Nový firmware do vánočního stromečku

Nový firmware do vánočního stromečku

Začnu trochu od konce. Dělal jsem toho za svůj život už hodně, ale dneska poprvé jsem seděl pod vánočním stromečkem, do notebooku připojený USB kabel, co od něj vede, a debugoval a upgradoval jeho firmware ;-)).

Ale od začátku. Dostali jsme vánoční světýlka na stromeček. Bohužel, měly drobnou vadu. Po zapnutí elektriky se samy nerozsvítily. Bylo ještě potřeba na zdroji zmáčknout tlačítko. A to pokaždé, když se elektrika znovu zapnula.

No a to je naprd. Přece v chytrém domě nebudu ručně rozsvěcet vánoční stromeček, žejo. Takže začlo zkoušení a vymýšlení, jak problém vyřešit.

Problémů k vyřešení bylo hned několik. Jak ledky napájet, jak je spínat, čím spínat relátka a jak to propojit do Loxonu.

Napájení se nakonec vyřešilo elegantně. Od původního plánu napájet to 24V zdrojem s napěťovým děličem jsem se přes svůj laboratorní zdroj a měření spotřeby dostal až k USB 2A nabíječce, která krásně splinila zadání.

Další problém byly relátka. Z číny dorazil 8-modulový relé modul, jenže na spínání je potřeba 5V a to můj Wemos čip neměl. Tak jsem wemos vyměnil za Arduino UNO a zkusil to zapojit na něm. A relé se poprvé seplo, to bylo radosti.

Jenže jen do chvíle, kdy jsem si uvědomil, že UNO nemá ani ethernet, ani wifi. Takže pro dálkové spínání naprd. Takže zpět k Wemosu a jeho wifi.

Další cesta tak vedla přes samostatné napájení relé modulu 5V a pokusu, jestli náhodou relé pak nejde sepnout pomocí 3V z Wemosu. A abych to netestoval rovnou na Wemosu, využil jsem opět laboratorní zdroj (fakt ho miluju) a na napájení opět využil USB nabíječku.

A hle, prošlo to. Takže tudy by to mohlo jít. Takže jsem zkusil popropojovat Wemos a relátko, wemos napájet z USBčka, relé přes uřízlý USB kabel taky z USB nabíječky, a k tomu LEDky také z USB nabjíčeky.

To máme spoustu USB nabíječek ;-). Naštěstí relé modul a wemos utáhne jedna, a druhá na LEDky. To už jde. A časem koupím 5V 4A zdroj a bude to.

A protože s jedním relé není žádá sranda, tak sem to rozšířil na dub-step čtyř relátek 😉

Když byl hotový proof-of-concept, začal jsem to celé propojovat. Tady byla největší brzda nedostatek materiálu (tím jsem trpěl už i zkoušení, ale tady to byl extrém). Nejvíc mi chyběly kabílky na propojování PINů. Zatím jich dorazilo jen pár a tak jsem si zbytek povyráběl, z čeho šlo (hlavně pak z těch černých male-female patic, které lze stříhat štípačkama a dělat multi-konektory, viz ty žlutě zalepené konektory).

Po propojení a ověření, že vše bliká a cvaká, jak má, byla další mise nacpat to do nějaké krabičky, aby to vypadalo alespoň trochu civilizovaně a mohlo se to válet v obyváku. To se našetěstí povedlo také docela rychle a tak bylo řešení téměř hotové.

Nakonec pak už jen řetězy rozmotat, přenést do obyváku, znovu otestovat, a… vyhodit elektriku v celém baráku. Samozřejmě v deset večer, takže tma jak v řiti. A samozřejmě vyhozeno až venku na ulici.

I I. se přišla podivat, co jsem to zas udělal ;-). Kupodivu ale na vině nebylo moje udělátko, ale očividně dosloužilý zdroj k notebooku, co jsem si potřeboval zapojit. Po nahození se tím pádem mohlo pokračovat dál ;-).

Dneska jsem přesunul do obyváku stromek a ověsil ho lampičkama. Na řadu tak přišla softwareová část. Samoblikání je sice pěkné, ale chtělo to hlavně to zapínání a vypínání přes Loxone.

Plán byl využít už připravené MQTT komponenty z minula a jen to použít na něco konkrétního. Založil jsem další topic christmas-tree/relay a začal propojovat. Část v arduinu byla snadná. Vzít data ve formátu 101011 a podle toho postupně pozapínat/povypínat relátka. Easy.

Pak upravit Node-Red tak, aby se daly MQTT data posílat a testovat přes něj. Opět easy. Trochu složitější pak bylo parsování dat dle typu, tzn. když přijde z Loxonu “christmas-tree/relay/xxxx”, tak aby to poslal na správný kanál se správnýma datama. Ale stačilo zjistit, jak fungují v MQTT funkce, že je to Javascript a zjistit, jak se v JS pracuje se stringama. Easy.

EDIT: Večer jsem měl ještě chvilku čas, tak jsem si pohrál s Node-RED nastavením. Nutno říct, že je to naprosto impozantní a lze tam udělal naprosto cokoli (hlavně díky možnosti scriptovat pomocí JS). Takže nyní má stromeček ještě pět režimů blikání 🙂

Pak ale přišel kámen úrazu. To, co jsem očekával, že bude to nejjednodušší, tak nefungovalo. V Loxonu se mi nedařilo rozběhnout virtuální výstupy HTTP. Ať jsem dělal, co jsem dělal, tak z Loxonu data prostě nelezly. Nejen do Node-Red, ale ani na testovací app, ani do aplikace Hercules, co Loxon doporučuje, a ani nebyly vidět přes Ethereal či Wireshark.

A tak jsem zkoušel a zkoušel, nastavoval, ptal se na fóru a to, co všem funguje, mně nejelo. Nakonec jsem to všechno natvrdo zrestartoval a pakety začaly chodit. Bohužel, HTTP výstupy u mne mají cca 15sekund prodlevu. Pokud pošlu 10 signálů, místo aby přišly hned, dorazí vždy jeden, 15s pauza, další, zase pauza, …

Co naštěstí funguje bleskově jsou přímé TCP spojení. A protože HTTP nepotřebuju a TCP je přes NodeRED mnohem rychlejší/jednodušší, zůstal jsem u něj a HTTP dál neřešil.

A to byla poslední část potřebná k tomu, aby se z mobilu dal poslat příkaz do Loxonu, který pošle příkaz do NodeRED, který pošle MQTT zprávu na Ubuntu server, kde je pak zpráva poslána do Wemosu, který přes digitální výstupy pošle impulzy do relátek, které rozsvítí vánoční stromeček.

Jako jo, šlo by to asi o něco jednodušeji, ale takhle je to prostě cooool 😉

PĚKNÉ VÁNOCE VÁM VŠEM!

NodeRED – Propojení všeho se vším, od Arduina po Loxone

NodeRED – Propojení všeho se vším, od Arduina po Loxone

Jak jsem psal v předchozím článku, MQTT i NodeRed instaluji na Ubuntu linuxu. Jde ale rozběhat třeba i na Raspberry Pi  nebo Turrisu (OpenWRT).

Instalace NodeRED je relativně jednoduchá. Do ubuntu jsem musel nejprve doinstalovat aplikaci npm (což jsem zjistil, že je balíčkovací služba pro javascript) a následně pak pomocí npm aplikace nainstalovat NodeRED.

sudo apt-get install npm
sudo npm install -g --unsafe-perm node-red

Po samo-doinstalování obrovského množství dalších navazujícíh balíků měl začít fungovat příkaz `node-red`. Ale prdlajs. Takže další postup pak byl:

sudo apt-get install nodejs-legacy
node -v
##v4.2.6

sudo apt-get install npm
npm -v
##3.5.2

sudo npm install -g --unsafe-perm node-red node-red-admin

Dál bylo potřeba otevřít firewall port 1880, který node-red používá pro komunikaci

sudo ufw allow 1880
##Rules updated
##Rules updated (v6)

A pak už node-red konečně naběhl.


node-red

Welcome to Node-RED
===================

9 Dec 15:41:14 - [info] Node-RED version: v0.15.2
9 Dec 15:41:14 - [info] Node.js version: v4.2.6
9 Dec 15:41:14 - [info] Linux 4.4.0-53-generic x64 LE
9 Dec 15:41:14 - [info] Loading palette nodes
9 Dec 15:41:14 - [warn] ------------------------------------------------------
9 Dec 15:41:14 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
9 Dec 15:41:14 - [warn] ------------------------------------------------------
9 Dec 15:41:14 - [info] Settings file : /home/dev/.node-red/settings.js
9 Dec 15:41:14 - [info] User directory : /home/dev/.node-red
9 Dec 15:41:14 - [info] Flows file : /home/dev/.node-red/flows_home-server.json
9 Dec 15:41:14 - [info] Creating new flow file
9 Dec 15:41:14 - [info] Server now running at http://127.0.0.1:1880/
9 Dec 15:41:14 - [info] Starting flows
9 Dec 15:41:14 - [info] Started flows

Další krok je nastavení, aby se NodeRED spouštěl sám po startu. To už nebudu popisovat, protože bych jen kopíroval návod, podle kterého jsem postupoval. Ten jde najít v tomto super článku (bod 3 a dál).

Použití NodeRED

Tak jo, nainstalované to je, co teď s tím dál ;-). Vraťme se k naší ukázce z minulého článku o MQTT. V levym okně máme příkaz na poslání zprávy přes kanál(topic) hello/world. V pravém okně nahoře je pak příjemce této zprávy, abychom viděli, že vše funguje.

V pravo dole pak nasloucháme nové zprávě “bye/world”. Jak jde vidět z následujících screenshotů, při poslání zprávy na “hello/world” se tato zpráva ukáže i na “bye/world”. Jak to?

Protože NodeRED ;-). Jako první jsem pro otestování funkčnosti NodeRED a jeho napojení na MQTT udělal jednoduché přeposlání přijaté zprávy z jednoho kanálu na druhý.

A takhle to vypadá v NodeRED. Vlevo je MQTT consumer, nastavený tak, aby naslouchal topic hello/world

V pravo pak MQTT publisher, který přijatou zprávu pošle po kanálu (topicu) bye/world.

Dole pak mám ještě debug výstup, který zobrazuje přijaté zprávy.

A co loxone, jde to propojit?

No jasně! ;-). Pro testování jsem použil zatím jen REST Api loxone, ale NodeRED podporuje i websockets, navíc jsou pro Loxone už naprogramované přímo rozšíření pro NodeRED (viz dále).

Nyní nám ale pro jednoduchý test stačí RestAPI. Upravíme diagram tak, aby po přijetí jakékoli zprávy v topicu hello/world se nám rozsvítilo (nebo zhaslo) světlo v pracovně. To je cool ne? 😉

Samotné nastavení HTTP požadavku vypadá nějak takto. Nic složitého, jen se zavolá HTTP GET na adrese /dev/sps/io/WebApiTest/PulseDown.

Co se týká URL adresy, tak Loxone dokumentace stojí za starou bačkoru. Podle návodu by měla být adresa /prikaz/control/hodnota, coz ale /dev/sps/io/INPUT/PRIKAZ rozhodne není.

Touto url říkáme, že chceme na virtuální vstup “WebApiTest” poslat Impuls Down-Up. V Loxonu tak musíme tento virtuální vstup vytvořit a propojit se světlem.

A to je všechno. Nyní, kdykoli se objeví zpráva, světlo se přepne. Naprostá paráda. Nevím jak vy ostatní, ale já jsem nadšen. Těch možností, k čemu se to využít, je totiž neomezeně. Díky kombinaci NodeRED+Loxone tak jde do Loxonu dostat spoustu nových dat, od Arduino senzorů, dat z externích databází až po informace z Twitteru, Email nebo cokoli jiného vás jen napadne.

Co dál

NodeRED má obrovskou komunitu a kromě základních bloků (Nodes) má parádní knihovn dalších rozšíření – http://flows.nodered.org/. Jsou tam například i bloky na komunikaci s Modbus, KNX nebo Loxone.

Nyní to chce pořádně vyzkoušet a pohrát si s tím víc. V základu mám ověřeno, že vše funguje. Nyní zkusím zprovoznit nad Arduinem nějaký ten senzor a přes MQTT-NodeRed ho posílat do Loxonu. A uvidíme, jak to bude šlapat. Co jsem zatím testoval, tak problémy žádné, ale běží mi to jen chvilku.

Pokud ale vše pojede opravdu jak má a bude to 100% stabilní, vidím v tom obrovský potenciál. Navíc v případě, že by Loxone pokračoval se svými gestapáckými manýry a ještě více uzavíral jeho systém, tak se takto dá udělat kompletní rozšíření a defakto z architektury “Loxone je ten hlavní” udělat “NodeRED je ten hlavní” a Loxone mít jen jako podružný systém.

Použité linky

forumlink
Link na diskuzní fórum o Loxonu a Arduinu

Mosquitto – MQTT message broker

Mosquitto – MQTT message broker

Co je Mosquitto? Je to MQTT message broker. To znamená, že umožňuje komunikaci mezi hromadou zařízení pomocí MQTT protokolu. Zařízení může být v jednom ze dvou režimů. To první je Publisher, to druhe Subscriber. Publisher data generuje a sype do nějaké fronty, Subscriber (odběratel) je pak načítá. Odběratelů může být neomezeně, stejně tak Publisherů (vydavatelů?).

Celé se to dá krásně využít k tomu, že všechny IoT čidla postavené na Arduinu generují data a jednotně je sypo do MQTT. Z MQTT se to pak jednotně načítá, ať už napřímo přes Loxone, nebo třeba do NodeRED, kde se nastaví co se s datama má dít a až pak se data pošlu dál.

Díky tomu se do čidel nemusí dávat žádná složitá logika na publikování dat, posílání jích do Loxone atd. Ale jen se to nasype do MQTT brokera a další logika se postaví až o stupeň dál.

Instalace Mosquitto serveru.

Já jsem využil toho, že mi doma běží server na pracovní věci, a tak jsem si udělal novou virtualizovanou instanci Ubuntu ;-). Ale jinak se dá mosquitto rozběhat i na Windows, Raspberry, Turrisu a dalších.

2016-12-04_12-54-58

Instalace byla v mém pomocí apt-get. Kromě balíku mosquitto sem bral i mosquitto-clients, které přidají příkazy na simulaci subscribera/publishera, takže lze otestovat, že vše běží jak má. Po nainstalování jsem pak pro účely ladění zapl komplet logování, které v ostrém provozu později vypnu.

sudo apt-get install mosquitto mosquitto-clients
sudo /etc/init.d/mosquitto stop
sudo nano /etc/mosquitto/mosquitto.conf
sudo /etc/init.d/mosquitto start

Do konfigurační soubor mosquitta jsem přidal:

2016-12-04_13-14-27

log_type error
log_type warning
log_type notice
log_type information

connection_messages true
log_timestamp true

A nahodil jsem zpět mosquitto. Pro otestování, že vše funuje jak má, jsou právě ty mosquitto-clients.

2016-12-04_16-06-53

Pro otestování subscribera je příkaz mosquitto_sub. Parametr -d zapíná debug zprávy, -t nastavuje název kanálu, nad kterým subscriber poslouchá.

mosquitto_sub -d -t hello/world

2016-12-04_13-09-54

Když máme posluchače, je potřeba vygenerovat nějakou zprávu. To se dělá pomocí publishera mosquitto_pub. Parametry opět stejné, akorat místo naslouchání na -t se do kanálu -t data pošlou, -m pak definuje zprávu na poslání.

mosquitto_pub -d -t hello/world -m "test"

2016-12-04_13-10-02

Jakmile vygenerujete publisherem zprávu, na subscriberovi se zobrazí

Client mosqsub/7136-home-serve received PUBLISH (d0, q0, r0, m0, 'hello/world', ... (4 bytes))
test

To znamená, že nám MQTT broker funguje jak má. Pokud by něco zlobilo, logy jsou dostupně v souboru  /var/log/mosquitto/mosquitto.log

Komunikace s Mosquitto serverem z Arduina

A teď ta druhá část, poslání/naslouchání MQTT s Arduina. Zkusíme poslat zprávu, kterou necháme zobrazit pomocí již nahozeného subscribera v konzoli a pak přijímat zprávy a při přijmutí bliknout diodou.

2016-12-04_13-54-39

Krok první, nainstalujeme si nějakou předpřipravenou MQTT knihovnu do Arduina. V menu VMICRO -> Visual Micro Explorer -> Manage Libraries.

2016-12-04_13-55-55

Zkusil jsem PubSubClient, tvrdí že je lightweight a takové mám rád ;-).

2016-12-04_13-56-32

Jako další krok vložíme knihovnu do projektu. Pokud člověk ví co dělá, stačí obyčejný #include<PubSubClient.h>, pokud ne, může si to vybrat takto z wizarda. Napoprvé je to fajn, že není potřeba lovit, jak se soubor přesně jmenuje.

2016-12-04_13-58-20

Zkusíme zkompilovat a zdá se, že je vše ok. Tak pojďme poslat nějaká data. Výhoda Arduina je, že celý ekosystém už je opravdu pěkně rozrostlý a na všechno existují připravené knihovny.

Na druhou stranu nevýhoda Arduina je, že celý ekosystém dělají lidé, co jsou zřejme opravdu borci na elektrotechniku, ale dost slabí na programování. Takže ačkoli je Arduino postavené nad c++,  jeho knihovny, ukázky a vše ostatní vypadá jako programy psané v čistém C kódu kdysi v minulém století.

Naštěstí to není až takový problém a všechno jde postupně zabalit do vlastních objektů a udělat si nad tím čistý kód.

Inicializace Wifi, Debugu, Mqtt a Diody

Aby měl návod trochu spád, spojím všechny tyto věci dohromady. Jak už jsem psal, kód pro Arduino je bohužel takový c-like spaghetti bastl. Ačkoli využívá objektový zápis, tak instance objektů existují kdesi globálně a jen se používají. To je supr pro nováčky, co netuší která bije, ale pro pokročilé vyvíjení je to imho škoda, protože to maskuje hromadu věcí a cokoli globálního je prostě blbě.

#include &lt;ESP8266WiFi.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;PubSubClient.h&gt;

const char* ssid = "wifi";
const char* password = "password";
const char* mqtt_server = "192.168.0.102";

WiFiClient espClient;
PubSubClient mqttClient(espClient);

void setupDebug()
{
	Serial.begin(9600);
	Serial.println("WeMos MQTT test");
	Serial.println("");
}

void setupWifi()
{
	// Connect to your WiFi network
	WiFi.begin(ssid, password);
	Serial.print("Connecting");

	// Wait for successful connection
	while ( WiFi.status() != WL_CONNECTED )
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.print("Connected to: ");
	Serial.println(ssid);
	Serial.print("IP address: ");
	Serial.println(WiFi.localIP());
	Serial.println("");
}

void setupMqtt()
{
	mqttClient.setServer(mqtt_server, 1883);
	mqttClient.setCallback(MQTT_callback);
}

void setupDiode()
{
	pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output 
}

void Blink(int nDelayOn, int nDelayOff)
{
	digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
	delay(nDelayOn);                      // Wait for two seconds (to demonstrate the active low LED)
	digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level  
	delay(nDelayOff);                      // Wait for two seconds (to demonstrate the active low LED)
}

void setup() 
{ 
  setupDebug(); 
  setupWifi(); 
  setupMqtt(); 
  setupDiode(); 
}

Takhle nějak vypadá inicializace pro WeMos D1.

  • hromada “println” posílá po seriovém portu zpět do IDE stavy a zprávy
  • setupDebug inicializuje seriovou linku právě pro tyto přenosy.
  • setupWifi připojí wifi adaptér k zadané síti a vypíše kam se připojila.
  • setupMqtt nastaví parametry připojení pro MQTT clienta
  • setupDiode jakýmsi způsobem propojuje PIN LED_BUILTIN na OUTPUT diodu, toto zatím beru jako fakt a moc to nechápu
  • Blink slouží k bliknutí diody
  • A setup spustí všechny výše uvedené nastavení.

Spoustu nastavení, ale jinak nic objevného. Toto nastavení použijeme jak pro zapisování dat do MQTT, tak pro čtení.

Komunikace s MQTT brokerem

Po tom, co máme vše inicializováno, zbývá se jen připojit k MQTT brokerovi a posílat a přijímat data. Připojení se provede pomocí

if ( mqttClient.connected() == false )
  mqttClient.connect("ESP8266Client");

kdy řetězec “ESP8266Client” je pro mne velkou záhadou, ale mám to z examplu. Moc nerozumím tomu, proč je to jako string “ESP8266Client” místo objektu WiFi nebo espClient, ale je to jen další z divných věcí v Arduinu, která má zřejmě sloužit dobru, ale imho jen škodí.

Odeslání dat se provádí pomocí metody publish, která má jako první parametr název kanálu, jako druhý parametr data k odeslání.

mqttClient.publish("hello/world", "hello world");

Příjem dat se provádí pomocí zaregistrování callbacku metodou setCallback a pak přihlášení ke konkrétnímu kanálu metodou subscribe. Tady by mi přišlo logičtější mít co kanál možnost jiný callback, ale opět asi zjednodušení.

void MQTT_callback(char* topic, byte* payload, unsigned int length) {}
mqttClient.setCallback(MQTT_callback);
mqttClient.subscribe("hello/world/2");
&amp;amp;nbsp;

Celý kód pak vypadá třeba takto. V MQTT_callback se zobrazí obdržená data a blikneme diodou. V metodě reconnect se provádí testování platného připojení a jeho případně znovupřipojení, v metodě loop pak dokola testujeme platnost připojení, voláme interní loop MQTT clienta (kvůli přijmu dat) a každé 2sec posíláme zprávy do MQTT brokera “Hello world” spolu s pořadovým číslem zprávy.

void MQTT_callback(char* topic, byte* payload, unsigned int length) {
	Serial.print("Message arrived [");
	Serial.print(topic);
	Serial.print("] ");
	for ( int i = 0; i &amp;lt; length; i++ )
	{
		Serial.print((char)payload[i]);
	}
	Serial.println();

	Blink(100, 100);
}

void MQTT_reconnect() 
{
	// Loop until we're reconnected
	while ( !mqttClient.connected() )
	{
		Serial.print("Attempting MQTT connection...");
		// Attempt to connect
		if ( mqttClient.connect("ESP8266Client") )
		{
			Serial.println("connected");
			// Once connected, publish an announcement...
			mqttClient.publish("hello/world", "hello world");
			// ... and resubscribe
			mqttClient.subscribe("hello/world/2");
		}
		else
		{
			Serial.print("failed, rc=");
			Serial.print(mqttClient.state());
			Serial.println(" try again in 5 seconds");
			// Wait 5 seconds before retrying
			delay(5000);
		}
	}
}



void loop()
{
	if ( !mqttClient.connected() )
		MQTT_reconnect();
	mqttClient.loop();

	static long lastTime = 0;
	static int lastValue = 0;
	if ( millis() - lastTime &amp;amp;gt; 2000 )
	{
		char msg[50];
		snprintf(msg, 75, "hello world #%ld", lastValue++);
		Serial.print("Publish message: ");
		Serial.println(msg);
		mqttClient.publish("hello/world", msg);
		lastTime = millis();
	}
}

Na celém kódu není nic složitého a díky předpřipravenému MQTT clientu a hotovým ukázkám jde kód narychlo polepit dohromady.

Co je nevýhoda, tak kód je prostě ošklivý a nepřehledý. Na vlastní finální řešení to bude chtít obalit vše svými objekty, ideálně napsat i nějaké mock objekty kvůli testování a celkově nad tím udělat robustnější testování, aby člověk neprogramoval stylem zkompilovat-nahrát-zkusit-znovu. Takhle se programovalo v dobách Atari, ale ne dneska.

A to je vše, máme funční Arduino MQTT publisher i subscriber. Příště až bude čas, tak zkusím rozchodit onen Node-Red. A až dorazí věci z Aliny, tak na Wemos napom čidla a zkusim posílat nějaká smysluplnější data.

Ostatní linky

forumlink
Link na diskuzní fórum o Arduino vývoji