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 26, 2017

Ako nastaviť macOS, tak aby bolo možné napísať zavináč pomocou kombinácie Alt+V

Používatelia Windows sú zvyknutí písať znak zavináč pomocou klávesovej skratky pravý Alt+V na slovenskej klávesnici. Pri prechode na macOS potom nastáva problém, že nevedia ako napísať zavináč. Jedna z možností je použiť pravý Alt (Option) a klávesu 2.

Pokiaľ si však človek zvykol na väčšie množstvo klávesový skratiek, ako napríklad písanie hranatej zátvorky, tak macOS rozvrhnutie kláves nie je príliš efektívne. macOS navyše nemá v sebe priamo mapovanie slovenskej klávesnice, ktorá by zodpovedala tej na Windose alebo Linuxe. To sa dá jednoducho vyriešiť.

Doinštalujte si program Karabiner.

Aktivujte ho pomocou nasledujúcich krokov. V systémových nastaveniach v sekcii Bezpečnosť a súkromie (Security & Privacy), pod záložkou Súkromie (Privacy) vyberte zo zoznamu Prístupnosť (Accessibility). Kliknite na značku zámku v ľavom rohu a zadajte heslo pre správcu počítača. Potvrďte výber aplikácie Karabiner_AXNotifier.app. Popis s obrázkom je na stránke Karabiner v dokumentácii.

Týmto krokom sa aktivoval Karabiner a môže prevádzať mapovanie kláves. Zostáva mu len povedať aké mapovanie potrebujete.

Otvorte konfiguráciu programu Karabiner Preferences a v záložke Misc & Uninstall, v sekcii Custom Settings kliknite na Open private.xml.

Zobrazí sa Finder s adresárom “Library/Application Support/Karabiner”, v ktorom sa nachádza súbor private.xml. Obsah tohto súboru môžete nahradiť za obsah súboru slovak.xml, ktorý som umiestnil na GitHub.

Podstatný riadok s mapovaním Alt+V na zavináč:

 <autogen>__KeyToKey__ KeyCode::V, ModifierFlag::OPTION_R, KeyCode::KEY_2, ModifierFlag::OPTION_R</autogen>

Prvé dva parametre definujú z akých kláves sa má mapovať. Druhé dva parametre definujú to, na aké sa majú namapovať.

Po uložení súboru sa prepnite v nastaveniach Karabiner do záložky Change Key. Kliknite na Reload XML. Do vyhľadávacieho políčka zadajte slovak. Zaškrtnite možnosť For Slovak.

Môžete zatvoriť okno. Mapovanie kláves je aktívne.

Poznámka: autor Karabiner-u upozorňuje, že verzia 10.22.0 aktuálne nefunguje s najnovším macOS Sierra. Uvedené nastavenie som testoval s El Capitan.

Ak Vám tento článok pomohol, napíšte prosím do komentárov pod článkom. Taktiež rád zodpoviem prípadné otázky na túto tému.

Marec 12, 2017

Ako zapnúť číslovanie riadkov v KWrite

Textový editor KWrite má podporu pre číslovanie riadkov, tá je ale v základnom nastavení vypnutá. Túto vlastnosť je možné pomerne jednoducho aktivovať.

Z menu Nastavenie vyberte Nastaviť editor…

V sekcii Vzhľad vyberte záložku Orámovanie, zaškrtnite možnosť Zobraziť čísla riadkov a potvrďte pomocou OK.

KWrite so zapnutým číslovaním riadkov potom vyzerá nasledovne:

Marec 7, 2017

Ako zväčšiť veľkosť fontu v pgAdmin 4 na Windows

Nová verzia programu pgAdmin 4 je založená na QT5. Pokiaľ si nainštalujete aplikáciu na počítač s vysokým rozlíšením obrazovky, tak sa vám môže stať, že font v aplikácii bude veľmi malý.

Tento problém je možné vyriešiť, keď QT enginu zadáte špeciálny parameter, ktorý spôsobí iné spracovanie DPI.

Otvorte PowerShell, zmeňte aktuálny adresár na adresár aplikácie pgAdmin. Následne spustite aplikáciu s parametrom:

cd "c:\Program Files\PostgreSQL\9.6\pgAdmin 4\bin"
.\pgAdmin4.exe -platform windows:dpiawareness=0

Tieto zmeny môžete natrvalo uložiť tak, že v adresári s pgAdminom vytvoríte súbor qt.conf. Otvorte PowerShell ako administrátor a vytvorte príslušný súbor:

cd "c:\Program Files\PostgreSQL\9.6\pgAdmin 4\bin"
notepad qt.conf

Vložte nasledujúci obsah:

[Platforms]
WindowsArguments = dpiawareness=0

Uložte súbor. Pri novom spustení programu pgAdmin, bude už font väčší.

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 27, 2017

Ako obmedziť sťahovanie dát aktualizácií Windows 10?

Windows 10 pomerne často sťahuje z internetu veľký objem dát za účelom aktualizácie systému. Toto nemusí predstavovať problém, pokiaľ máte dobré internetové pripojenie. V prípade, že ste na slabšom pripojení (napríklad ADSL), tak veľký objem aktualizácií môže vyústiť do problémov s konektivitou.

Jeden zo spôsobov, ako obmeziť sťahovanie aktualizácií pre Windows 10 je nastaviť “Pripojenie účtované podľa objemu údajov” (v angličtine Metered connection)

V ponuke štart zvoľte Nastavenie.

Z dostupných položiek vyberte Sieť a internet.

V sekcii Wi-Fi odrolujte pod zoznam dostupných bezdôtových sietí a zvoľte Rozšírené možnosti.

Prepnite nastavenie Pripojenie účtované podľa objemu údajov do stavu Zapnuté.

Po tomto nastavení Windows okamžite obmedzí prenášané údaje na nutné minimum.

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 18, 2017

Ako nastaviť gesto dvoch prstov na posúvanie obsahu okna v openSUSE KDE, tak aby sa chovalo podobne ako Apple MacBook

Gesto na posúvanie obsahu okna, pomocou dvoch prstov, má v openSUSE – KDE rovnaké východzie nastavenie ako napríklad Windows 10 na notebooku Lenovo. Toto nastavenie vychádza zo starých čias, ked používatelia mali k dispozícii jedine myš na navigáciu vo webe. Dnes, keď použivame touchpad, je omnoho prirodzenejšie, aby sa choval podobne ako tablet alebo Apple MacBook. Apple zmenilo smer posunu už pred nejakou dobou. Z nejakého dôvodu vývojári stále nechávajú v systémoch ako Linux alebo Windows, nastavený pôvodný štýl. Našťastie je možné toto veľmi jednoducho zmeniť.

Otvorete menu a zvoľte Systémové nastavenia.

Zvoľte Hardvér – Vstupné zariadenia.

Zvoľte Touchpad v ľavom paneli, ďalej záložku Rolovanie a vyberte možnosť Reverzné rolovanie – Vertikálne. Potvrďte nastavenie pomocou Použiť.

Február 15, 2017

GitHub problém pri klonovaní repozitáru – Permission denied (publickey)

Po upgrade SSH sa môžete stretnúť s nasledujúcim problémom. Príkaz git clone skončí s návratovým kódom 255 a chybovým hlásením:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

Toto sa mi stalo po upgrade Linux Mint z verzie 17 na verziu 18.

Ako diagnostikovať takýto problém s Gitom?

Spustite nasledujúci príkaz:

ssh -v git@github.com

Uvidíte množstvo riadkov logu a jeden z nich typicky obsahuje príčinu problému. V mojom prípade to bolo:

...
debug1: SSH2_MSG_NEWKEYS received
debug1: Skipping ssh-dss key ~/.ssh/id_dsa - not in PubkeyAcceptedKeyTypes
...

DSA kľúče boli totiž v SSH 7 zablokované. Riešenie spočíva vo vygenerovaní nového kľúča iného typu, napríklad RSA.

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

Potom stačí vymeniť kľúč na GitHub-e za nový. Môžete znova spustiť “ssh -v” pre diagnostiku, či sa komunikácia so serverom podarila:

PTY allocation request failed on channel 0
Hi georgik! You've successfully authenticated, but GitHub does not provide shell access.
...
debug1: Exit status 1

Toto je dobrý výsledok. Teraz môžete pokojne vyklonovať repozitár.