Apríl 22, 2017

Ako pripojiť ESP8266 na Bluemix

Pripojiť zariadenie s ESP8266 pomocou MQTT na server ako Mosquitto, je relatívne jednoduché. Je potrebné pridať jednu závislosť do projektu (súbor platformio.ini):

[env:d1_mini]
lib_deps =
  PubSubClient

Kód pre pripojenie k serveru vyzerá nasledovne:

WiFiClient espClient;
PubSubClient mqttClient(espClient);

static void callback(char* topicChar, byte* payloadByte, unsigned int length) {
  String topic = topicChar;

  // Default size is defined in PubSubClient library and it's limited to 128
  // https://github.com/knolleary/pubsubclient
  char buf[MQTT_MAX_PACKET_SIZE];
  if (length >= MQTT_MAX_PACKET_SIZE) {
    length = MQTT_MAX_PACKET_SIZE - 1;
  }
  snprintf(buf, length + 1, "%s", payloadByte);

  String payload = String((char *)buf);
  Serial.print(payload);
}

void setup() {
  mqttClient.setServer("iot.georgik.rocks", 1883);
  mqttClient.setCallback(callback);
}

void reconnect() {
  if (mqttClient.connect("display")) {
    subscribeTopics()
  } else {
    Serial.println("Connection failed");
  }
}

Kód na prihlásenie odberu nejakej témy vyzerá nasledovne:

void subscribeTopics() {
  mqttClient.subscribe("some/topic/data");
}

Kód pre publikovanie témy vyzerá nasledovne:

mqttClient.publish("other/topic/data", "123");

Tento prístup funguje v bezpečnom prostredí, kde je možné pripojiť sa priamo na Mosquitto. Príklad implementácie môžete nájsť v projekte LampESP vo vetve v0.3 v súbore LampMQTT.ino.

V prípade, že sa presunieme do prostredia cloudu, tak je nutné zobrať do úvahy bezpečnostný model, ktorý sa v danom cloude nachádza. Napríklad Microsoft Azure IoT Hub nepodporuje priamu komunikáciu medzi zariadeniami. Podobné “obmedzenie” je platné aj pre IBM Bluemix. Je nutné zvoliť trochu odlišnú štruktúru tém pre odosielanie a príjem správ.

Akým spôsobom je teda možné pripojiť zariadenie do IBM Bluemix?

Najskôr je nutné vytvoriť si účet v IBM Bluemix. K dispozícii je 30 denná skúšobná verzia. Po 30 dňoch je možné naďalej využívať časť služieb cloudu, ale je nutné zadať číslo vašej kreditnej karty. K dispozícii je 370 GB-hodín, čo plne postačuje na beh virtuálneho počítaču s 512 MB po celý mesiac.

Následne je potrebné vytvoriť službu “Internet of Things Platform”. Táto služba je dostupná len v regióne US a Veľká Británia (United Kingdom). Región Nemecko (Germany) túto službu zatiaľ nepodporuje. Keď služba naštartuje, prejdite do Dashboard-u k službe.

Budete presmerovaní na URL ako: https://ORG-ID.internetofthings.ibmcloud.com/dashboard/#/boards/

Uvidíte IBM Watson IoT Platform Dashboard. Zvoľte Devices.

Kliknite na tlačítko “+ Add Device”. Následne zvoľte “Create device type”.

Kliknite na “Create device type”.

Nastavte meno napríklad na ESP8266 a pokračujte ďalej v registrovaní typu zariadenia.

Po zadefinovaní typu zariadenia ja možné pridať zariadenie. Kliknite na “+ Add device”. Vyberte type ESP8266 z rozbaľovacieho menu. A teraz pozor!

Tlačítko Next sa nachádza v pravom spodnom rohu obrazovky. Vyzerá to, že UX inžinieri nevenovali príliš pozornosť validácii UI rozhrania.

Vyplnte meno a popis zariadenia.

Metadata môžete preskočiť. Nastavenie Security nechajte nastavené na Auto-generated authentication token.

Kliknite na Add.

Zobrazí sa vám stránka s definíciou zariadenia. Najdôležitejšia je sekcia Authentication token.

Nastavenie cloud-u je týmto krokom hotové. Teraz je potrebné zaktualizovať kód. Malým chytákom je meno servera, kam sa má zariadenie pripojiť. Pokiaľ sa pozriete na Watson dashboard, tak by vás mohlo napadnúť, že hostname je možné použiť pre pripojenie k MQTT: ORG-ID.internetofthings.ibmcloud.com. To však nebude fungovať. Je nutné pridať ešte subdoménu “messaging”. Správne hostname je: ORG-ID.messaging.internetofthings.ibmcloud.com.

...
void setup() {
  mqttClient.setServer("ORG-ID.messaging.internetofthings.ibmcloud.com", 1883);
  mqttClient.setCallback(callback);
}
...

Ďalším dôležitým krokom je pridanie tokenu, ktorý bude použitý pri ustanovení spojenia s cloudom. Tento krok nie je úplne priamočiary. Budete potrebovať tri parametre zostaviť správnym spôsobom a zavolať metódu connect z PubSubClient:

  • id = “d:ORG-ID:ESP8266:DEVICE-NAME”
  • username = “user-token”
  • password = “TOKEN-FROM-DEVICE-PAGE”
void reconnect() {
  if (mqttClient.connect(id, username, password)) {
    subscribeTopics()

V prípade použitia cloud verzie MQTT je možné prihlásiť sa k odberu len špecifických tém. Téma musí byť definovaná v správnom formáte. V prípade odberu tému s príkazom (command), by mal byť tvar témy nasledovný: iot-2/cmd/COMMAND/fmt/json. Slovo COMMAND nahradíte reťazcom, na ktoré má zariadenie reagovať.

void subscribeTopics() {
  mqttClient.subscribe("iot-2/cmd/COMMAND/fmt/json");
}

Téma so stavom zariadenia môže byť publikovaná nasledovne:

mqttClient.publish("iot-2/evt/status/fmt/json", "{\"d\":{\"value\":\"online\"}}");

Po tejto zmene kódu je zariadenie pripravené na pripojenie do Bluemix cloud-u. Pokiaľ narazíte na problém, tak jednoducho otvorte detail zariadenia a detailné informácie nájdete v sekcii Connection log.

Zariadenie je potom možné jednoducho spojiť s Node-RED prípadne s iným nástrojom a komunikovať so zariadením. Implementáciu nájdete na Githube v LampESP v0.4 projekte.

Poďme si to zosumarizovať. V celom postupe sú tri chytáky:

  • MQTT musí byť pripojené na subdoménu: ORG-ID.messaging.internetofthings.ibmcloud.com
  • Odber a publikovanie tém je možné len pre témy, ktoré majú správny formát/li>
  • Auth informácie musia byť zostavené presne
    • Keď sa vám podarí prekonať tieto počiatočné problémy, tak ďalšia komunikácia s Bluemix-om a Node-RED je jednoduchá.

Apríl 3, 2017

Vlastný font pre OLED displej pripojený k ESP8266 cez SPI

Pomocou malého OLED displeja je možné vcelku jednoducho rozšíriť funkcionalitu ESP8266.

Poďme sa pozrieť na to, ako je možné na 128×64 OLED displeji od Com-Four zobraziť text s vlastným písmom.

Prvou výzvou je pripojenie displeju k ESP8266. Odporúčané zapojenie pre vyšší výkon je pomocou použitia Serial Peripheral Interface Bus (SPI). Hlavnou výhodou tohto zapojenia je vyššia rýchlosť a hlavnou nevýhodou je, že použitie väčšie množstvo pinov na doske.

Displej je možné pripojiť nasledovne (popis nájdete taktiež v príkladoch knižnice ESP8266_SD1306):

ESP8266 - SD1306
GND     - GND
3V      - VDD
D5      - SCK (also known as CLK)
D7      - SDA (also known as MOSI/DOUT)
D0      - RES
D2      - DC
D8      - CS

Pokiaľ použivate PlatformIO, tak jednoducho pridajte ESP8266_SD1306 knižnicu do závislostí v súbore platfromio.ini:

lib_deps =
 ESP8266_SSD1306

S týmto zapojením a kódom je možné spustiť rôzne príklady z knižnice od Squix78. Táto knižnica navyše obsahuje tri veľkostí písma Arial: 10, 16 a 24px.

Mojim cieľom bolo zobraziť teplotu z Hvezdárne a planetária v Brne. Získanie teploty a odoslanie na MQTT pre ESP8266 bolo vcelku jednoduché.

#!/usr/bin/env python3

import paho.mqtt.publish as publish

import urllib.request
f = urllib.request.urlopen('http://www.hvezdarna.cz/meteo/lastmeteodata')
content = f.read().decode('utf-8')

items = content.split(' ')

publish.single('/home/monitor/display/0', items[4], hostname='localhost')

Skúsil som použiť písmo Arial 24. Výsledný text nebol veľmi čitateľný z väčšej vzdialenosti, predsa len sú písmenká menšie. Našťastie Daniel Eichhorn vytvoril skvelý online nástroj, ktorý umožňuje generovanie vlastných fontov pre OLED displeje: http://oleddisplay.squix.ch.

Najskôr som skúsil použiť font Roboto Light 54px font. Písmo fungovalo, okrem čísla 4. Podarilo sa mi odhaliť príčinu. Pri veľkých fontoch, totiž generuje nástroj hodnotu do jump table väčšiu než 255, čo spôsobí pretečenie možnej hodnoty pre char a kompilátor hodnotu zmenší.

Po niekoľkých pokusoch sa mi podarilo nájsť vhodné písmo DejaVu Sans 52px, ktoré je podstatne lepšie čitateľné.

Poslednou kozmetickou úpravou bolo zníženie kontrastu, aby bol text lepšie čitateľný. To je možné dosiahnuť pomocou príkazu:

display.setContrast(10);

Jednoznačne môžem odporučiť tento typ OLED displeja. Je veľmi dobre čitateľný aj za slnečného dňa. Aktualizovaná kód môžete nájsť na GitHub-e v LampESP projekte.

Marec 4, 2017

Priama komunikácia zariadení pripojených na Microsoft Azure IoT Hub cez MQTT nie je podporovaná

Microsoft Azure poskytuje možnosť spustenia IoT Hub. To môže znieť ako dobrá správa pre autorov IoT riešení, pretože IoT Hub podporuje MQTT. Každopádne je veľmi dôležité poznamenať, že Azure IoT Hub funguje iným spôsobom než Mosquitto. Tento rozdiel má výrazný dopad na to, akým spôsobom sa musí postaviť architektúra IoT riešenia.

Poďme sa pozrieť na rozdiely.

Predvolený port:

  • Mosquitto používá port 1883, ktorý nie je zabezpečený. Zabezpečenie TLS je možné zapnúť.
  • IoT Hub používá port 8883 zabezpečený pomocou TLS/SSL. Nešifrovaná varianta nie je povolená.

Publikácia a odber správ:

Toto predstavuje zásadný rozdiel. V prípade Mosquitta môžete jednoducho vytvoriť sieť zariadení, ktorá dokážu priamo na seba navzájom reagovať. Ďaľšiu logiku je možné zapojiť pomocou technológie ako napríklad Node-RED. V prípade IoT Hubu musí byť celá interakcia riadená cloudom.

Pokiaľ máte v pláne experimentovať s IoT Hubom a MQTT, tak odporúčam článok, ktorý napísal Satish Pagare. V článku je vysvetlené, ako je možné komunikovať s IoT Hubom pomocou mosquitto_sub a mosquitto_pub.

Február 21, 2017

Ako odoslať príkaz z Pythonu cez MQTT na RGB LED, ktorá je pripojená k ESP8266

V minulom článku som popisoval postup, ako odoslať hodnuto so záťažou servera cez MQTT. Hodnotu je potom možné prostredníctvom Node-RED previesť na príkaz pre LampESP s farebnou ledkou. Výsledok je prostý, ledka indikuje farbou záťaž na serveri.

Ďalšia možnosť, ako odoslať príkaz s farbou priamo zo servera, je použiť Python.

Jednoduch nainštalujte paho-mqtt:

pip install paho-mqtt

Tu je krátky Python skrit (publish_server_load.py):

#!/usr/bin/env python3

import paho.mqtt.publish as publish
import os

color = 'red'
load = os.getloadavg()[0]
if load < 0.7:
    color = 'black'
elif load < 1.5:
    color = 'blue'
elif load < 3:
    color = 'green'
elif load < 7:
    color = 'orange'

publish.single('/server/monitoring/command', color, hostname='iot.sinusgear.com')

ESP modul, by mal byť nastavený na príjem témy /server/monitoring. Kód LampESP 0.3 je dostupný na GitHube.

Do crontabu stačí potom vložiť nasledujúci riadok:

* * * * * /usr/local/bin/publish_server_load.py

V prípade, že používate virtualenv, tak by príkaz mal vyzerať nasledovne:

* * * * * /opt/my-python-env3/bin/python /usr/local/bin/publish_server_load.py

Február 5, 2017

Farebné zobrazenie logu z MQTT s časovou známkou

Najjednoduhší spôsob, ako si zobraziť všetky MQTT správy zo servera ako je Mosquitto, je použiť nasledujúci príkaz:

mosquitto_sub -v -t '/#'

Problém takéhoto zobrazenia je, že sa jedná len o čistý text. Na sprehľadnenie je možné pridať časové razítko a farby, takže je potom jednoduhšie odhaliť zaujímavé správy.

Riešenie je vcelku jednoduché, stači výstup programu presmerovať na vstup programu xargs, ktorý vloží dátum. Následne výsledok poslať na vstup programu ccze, ktorý sa postará o farebný výpis. Tu je príklad:

mosquitto_sub -v -t '/#' | xargs -d$'\n' -L1 sh -c 'date "+%d.%m.%Y %T $0"' | ccze -m ansi

Výsledok: