pondělí 26. prosince 2016

Python Open ZWave

Python wrapper pro OpenZWave knihovny. Pro ověření správné instalace a funkce ZWave sítě používám následující jednoduchý příklad.

Příklad jednoduchého Python skriptu pro ověření funkčnosti Python Open ZWave:

import sys
import time
import openzwave
from openzwave.node import ZWaveNode
from openzwave.value import ZWaveValue
from openzwave.scene import ZWaveScene
from openzwave.controller import ZWaveController
from openzwave.network import ZWaveNetwork
from openzwave.option import ZWaveOption
#  import time
#  from louie import dispatcher, All
device="/dev/ttyACM0"
options = ZWaveOption(device, config_path="openzwave/config", user_path=".", cmd_line="")
options.set_log_file("OZW_Log.log")
options.set_append_log_file(False)
options.set_console_output(False)
options.set_save_log_level('Debug')
options.set_logging(True)
network = None
options.lock()
network = ZWaveNetwork(options, autostart=False)
network.start()
for i in range(0,90):
    if network.state>=network.STATE_AWAKED:
        print( "***** Network is ready")
        break
    else:
        sys.stdout.write(".")
        sys.stdout.flush()
        time.sleep(1.0)

Definice stavů sítě

  • STATE_STOPPED = 0
  • STATE_FAILED = 1
  • STATE_RESETTED = 3
  • STATE_STARTED = 5
  • STATE_AWAKED = 7
  • STATE_READY = 10

Odkaz zdrojový text netwok.py

https://github.com/OpenZWave/python-openzwave/blob/master/src-api/openzwave/network.py

Odkaz na zdrojový text node.py

https://github.com/OpenZWave/python-openzwave/blob/master/src-api/openzwave/node.py

Odkaz na zdrojový text value.py


https://github.com/OpenZWave/python-openzwave/blob/master/src-api/openzwave/value.py

Seznam node v ZWave síti

for nodeKey in network.nodes:
        print("Node "+str(nodeKey)+": ")
        print(str(network.nodes[nodeKey]))

Notifikace s pyDispatch

Přijímání notifikací ze ZWave sítě je důležitá funkcionalita pro spolupráci se zařízeními. Následující kód ukazuje příklad přijmutí notifikace při změně stavu sítě.

from pydispatch import dispatcher
def handle_network_started_event( sender ):
print("Network started")
dispatcher.connect( handle_network_started_event, signal=ZWaveNetwork.SIGNAL_NETWORK_STARTED, sender=dispatcher.Any )

Alternativou je knihovna louie, která poskytuje to samé, co pydispatch. 


čtvrtek 22. prosince 2016

Vývojové prostředí SmartThings

Smartthings - vývojové prostředí pro IOT napsaný v Groovy. Dokumentace SmartThings je velmi kvalitní, hodně vysvětluje základní koncepty a obsahuje hodně názorných příkladů. Věnuje se širokému poli možností komunikace mezi zařízeními. Narozdíl od jiných stránek vysvětluje i základní použité koncepty a standardy jako je například ZWave.

http://docs.smartthings.com/

středa 14. prosince 2016

AeoTec Z-Stick Gen5 Switch off toggling LED

Aeon Z-Ware Stick Gen5 po zapojení začne blikat modře, žlutě a červeně. Toto "disco" světlo lze vypnout a zapnout následujícími příkazy.

Turn off “Disco lights”:

$ echo -e -n "\x01\x08\x00\xF2\x51\x01\x00\x05\x01\x51" > /dev/serial/by-id/usb-0658_0200-if00

Turn on “Disco lights”:

$ echo -e -n "\x01\x08\x00\xF2\x51\x01\x01\x05\x01\x50" > /dev/serial/by-id/usb-0658_0200-if00

pondělí 12. prosince 2016

Instalace node.js a node-RED na Raspberry Pi 3

Nejprve provést aktualizaci Raspbian

sudo apt-get update
sudo apt-get upgrade

Nahrát a spustit instalační skript:

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)




Spustit node-RED příkazem

node-red-start


Zapnutí security

Po instalaci není node-RED zapbezpečený.Je potřeba v konfiguračním souboru /home/pi/.nodered/settings.js odkomentovat adminAuth:

adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
        permissions: "*"
    }]
}

Pro vygenerování hesla je potřeba nainstalovat node-red-admin:

sudo npm install -g node-red-admin

a heslo vygenerovat příkazem

 node-red-admin hash-pw





pátek 9. prosince 2016

Bluemix IOT

Kombinace cloudu (IBM Bluemix) a IOT

Senzory postavené na Arduino platformě komunikují naměřená data do Bluemix Node.js aplikace. Hodnoty jsou ukládány do Bluemix MySql databáze.

Tabulka pro záznam údajů:

create table T_MEASURE(C_ID int AUTO_INCREMENT, C_CHANNEL varchar(255), C_DEVICE varchar(255), C_TIME_CREATED timestamp, C_FIELD varchar(255), C_VALUE int, primary key(C_ID))

alter table T_MEASURE add index(C_CHANNEL)

alter table T_MEASURE add index(C_CHANNEL, C_DEVICE)

IOT zařízení posílá naměřené hodnoty prostřednictvím HTTP GET do Bluemix, kde se uloží do databáze:

http://BLUEMIX_LOGIN.eu-gb.mybluemix.net/sendValue?channel=channel1&sensor=water&value=1234

Aplikační kód App.js v Bluemix


// This application uses express as its web server
// for more info, see: http://expressjs.com
var express = require("express");

// cfenv provides access to your Cloud Foundry environment
// for more info, see: https://www.npmjs.com/package/cfenv
var cfenv = require("cfenv");

// create a new express server
var app = express();

// This application requires mysql
var mysql = require('mysql');

// Use the valid user credential and database name
var connection=mysql.createConnection(
{
   host     : 'us-cdbr-iron-east-04.cleardb.net',
   user     : 'USER',
   password : 'PASSWORD',
   database : 'DATABASE'
}
);

// serve the files out of ./public as our main files
app.use(express.static(__dirname + '/public'));


app.get("/sendValue", function(req,res){
   
     var channel = req.query.channel;
     var sensor = req.query.sensor;
     var value = req.query.value;
     var timestamp = Date.now;
   
     var post  = {C_CHANNEL: channel, C_SENSOR: sensor, C_VALUE: value};
 var query = connection.query('INSERT INTO T_MEASURE SET ?', post, function(err, result) {
   console.log(err);
   console.log(result);
 });
    res.send('Inserted');

});

// get the app environment from Cloud Foundry
var appEnv = cfenv.getAppEnv();

// start server on the specified port and binding host
app.listen(appEnv.port, '0.0.0.0', function() {
  // print a message when the server starts listening
  console.log("server starting on " + appEnv.url);
});

středa 26. října 2016

Měření spotřeby vody a elektřiny s Arduino Nano

Měření aktuální spotřeby vody a elektřiny přináší rozšířené možnosti, jak sledovat chod domácnosti. Využití možnosti nabízených v podobě Arduino a modulů periférií je velmi vhodnou možností, která přináší potřebnou flexibilitu v návrhu i v realizaci. 
V současné době ve zkušebním provozu provozuji sestavu podle následujícího zapojení.
Schéma zapojení
V dvouminutových intervalech Arduino Nano odesílá prostřednictvím WiFi modulu ESP8266 naměřené hodnoty do ThingSpeak.com, kde je možno nameřené hodnoty graficky zobrazit a provádět nad nimi další analýzy.


Vedle toho sestava využívá RTC modul s obvodem DS1307. Kupodivu u něj nepoužívám hodnoty pro zjištění reálného času (ten je mimochodem na tomto typu velmi nepřesný), ale modul DS1307 kromě realného času poskytuje 56 bytů RAM paměti zálohovaných vloženou baterií. Tato pamět se dobře hodí pro ukládání aktuálních hodnot sensorů, aby zůstaly zachovány i po odpojení senzoru od zdroje napájení. Zdrojem napájení je 12V spínaný zdroj, který mám zabudovaný na DIN liště vedle elektroměru.

sobota 22. října 2016

Arduino: #define versus const String

Při programování Arduina si dejte pozor jakým způsobem deklarujete konstanty. Vzhledem k omezeným zdrojům na pro proměnné (Arduino Nano: Maximum is 2,048 bytes) je potřeba s tímto místem zacházet velmi šetrně. Místo pro programový kód na tom bývá lépe (Arduino Nano: Maximum is 30,720 bytes).

Pokud tedy v programovém kódu použijete pro definici konstanty konstrukci:

const String CONST_DEVICENAME = "Adruino Nano";


bude zařízení s řetězcem pracovat jako s proměnnou a řetězec umístí do lokace pro proměnné, tudíž ubere byty s těch cenných 2kB,

Pokud použijete #define, pak se konstanta zahrne do programového kódu a ušetříte cenné místo pro proměnné:

#define CONST_DEVICENAME "Adruino Nano"




pátek 5. srpna 2016

Arduino Uno jako USB -> TTL převodník pro ESP8266

Potřeboval jsem narychlo provést připojení ESP8266 k počítači, ale neměl jsem k dispozici klasický Adruino USB TTL převodník. Jak si pomoci? Využil jsem převodník, který je na desce Arduino Uno.
Co je pro to potřeba udělat?

1) Na Arduino Uno propojit RES a GND - tím vyblokuji procesor
2) Oproti zvyklostem propojit ESP8266 a Arduino Uno
Tx - Tx
Rx - Rx
- to není chyba, opravdu je takto potřeba propojit - tzn. nebude komunikovat Arduino -> ESP, ale Adruino bude v tomto případě pouze převodníkem mezi USB počítače a vstupy ESP
2) Připojit ESP8266 na zdroj 3.3V (pro napájení jsem využil výstup 5V napojený na nastavitelný  MP2307 Mini-360 Module)

S tímto propojením a pokud na ESP GPIO0 propojím se zemí, je možné provést flash firmware na ESP jako s kalsickým USB TTL převodníkem.

čtvrtek 21. července 2016

Spuštění Raspbian v single user mode

V případě, že nelze se z nějakého důvodu nedokončí běžné spuštění lze spustit Raspbian v tzv. single user mode, kde dostanete možnost pracovat s právy root přes konzoli. Nastavení provedete na jakémkoli počítači se čtečkou SD karet. Boot partition je FAT32, takže je přístupná například i ve Windows. V boot partition je soubor cmdline.txt. Do řádku cmdline přidejte

init=/bin/sh

čtvrtek 30. června 2016

Synchronizace času

Nainstalujte ntp:

apt-get install ntp

Nastavte ntp servery v ČR v konfiguračním souboru /etc/ntp.conf

server 0.cz.pool.ntp.org iburst
server 1.cz.pool.ntp.org iburst
server 2.cz.pool.ntp.org iburst
server 3.cz.pool.ntp.org iburst




pátek 24. června 2016

Instalace Java 7 a Tomcat 7

sudo apt-get update && sudo apt-get install oracle-java7-jdk

sudo apt-get install tomcat7

sudo apt-get install tomcat7-admin


Nastaveni admin uživatele:
sudo vi /var/lib/tomcat7/conf/tomcat-users.xml

<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>


Spuštění tomcat
sudo service tomcat7 start

Vypnutí
sudo service tomcat7 stop

neděle 5. června 2016

Raspberry Pi 3 a web kamera Microsoft LifeCam Studio

Syn dostal k vyzkoušení kamerku Microsoft LifeCam Studio, tak jsem si ji od něj na chvíli propůjčil k otestování s Raspberry Pi.

Použité komponenty



Raspberry Pi 3

Microsoft LifeCam Studio





Snímání fotografií do jgp

Použití fswebcam

Po získání jpg fotek jsem použil jednoduchý program wfwebcam. Jeho instalace a použití byla otázka chvilky. Postupoval jsem podle popisu https://www.raspberrypi.org/documentation/usage/webcams/

Instalace:
 sudo apt-get install fswebcam
Spuštění:
fswebcam -r 1920x1080 test2.jpg

Maximální rozlišení web kamery je 1920x1080, pokud se pokusíte získat jpg s větším rozlišením, fswebcam automaticky sníží rozlišení 1920x1080.
Kamera snímala velni pěkně v interiéru. Když jsem ji vyzkoušel v exterieru, dostával jsem hodně přesvětlené snímky.

Použití kamery pro záznam pohybu - utilita motion

Kameru jsem vyzkoušel také s programem motion, který zaznamenává jpg a avi v případě, že se před kamerou objeví nějaký pohyb. Pro nastavení jsem použil následující popis:

https://pimylifeup.com/raspberry-pi-webcam-server/

Nainstalovaný motion běží jako služba a na portu 8081 nebo 8082 je možné prostřednictvím http protokolu zobrazovat online záznam z připojené kamery.

Zastavení služby:
sudo sevrice motion stop

Záznam videa

Utilita avcon

Instalace utility avconv

sudo apt-get install libav-tools
Spuštění záznamu videa:

avconv -f video4linux2 -t 5 -i /dev/video0 video1.avi





úterý 3. května 2016

Mobilní připojení Raspberry PI přes 3G

V šuplíku jsem měl jeden nepoužívaný dongle ZTE model MF667, který jsem někdy dostal od TMobile k datovému tarifu. Nabízelo se vyzkoušet, zda bude možné jej použít s Raspberry Pi. Po několika slepých uličkách jsem dospěl k řešení, které mi nyní spolehlivě zajišťuje propojení autonomní stanice s Raspberry Pi na internet.

V následujících řádkách je popsáno, jak jsem připojení řešil. Jedná se o kombinaci využití usb_modeswitch a umtskeeper.

Hned v úvodu jsem musel řešit, jak aktivovat modem. K tomu mi pomohl právě usb_modeswitch. Dongle se totiž tváří jako USB zařízení se dvěma funkcemi. Jednak jako paměťové médium, flashdisk - tam jsou uloženy drivery pro instalaci na Windows a jednak jako vlastní modem. Problémem je, že je dongle iniciálně nastavený jako flashdisk a je nutno jej přepnout do režimu modemu.

usb_modeswitch

Instalace

sudo apt-get install ppp usb-modeswitch wvdial

Kofigurace

V této části je potřeba správně nakonfigurovat pravidlo pro přepnutí na modem po restartu:

Do souboru rules:

/lib/udev/rules.d/40-usb_modeswitch.rules

najít a zaměnit odpovídající část následujícím obsahem:

ACTION=="add", SUBSYSTEM=="usb",

ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000",

RUN+="/usr/sbin/usb_modeswitch -v 0x19d2 -p 0x2000 -V 0x19d2

-P 0x0117 -m 0x01 -M

55534243123456702000000080000c85010101180101010101000000000000"

kde pro každý model jsou specifické parametry -P -M, které vedou ke správnému přepnutí do modem módu.

Pak nakopírovat soubor 40-usb_modeswitch.rules do /etc/udev/rules.d:

sudo cp /lib/udev/rules.d / 40-usb_modeswitch.rules /etc/udev/rules.d/40-usb_modeswitch.rules



Příkazem lsusb lze zjistit v jakém módu se dongle nachází:

lsusb


Výstup:
Bus 001 Device 4: ID 19d2:2000 ZTE WCDMA Technologies... ... HSDPA/HSUPA - to je flashdisk

nebo

Bus 001 Device 005: ID 19d2:0117 ZTE WCDMA Technologies MSM - to je modem a takto je to správně


UMTSKeeper

Popia UMTSKeeper naleznete na http://mintakaconciencia.net/squares/umtskeeper/

Instalace


Instalace se provede následující sekvencí příkazů:

mkdir umtskeeper

cd umtskeeper

wget "http://mintakaconciencia.net/squares/umtskeeper/src/umtskeeper.tar.gz"

md5sum umtskeeper.tar.gz

tar -xzvf umtskeeper.tar.gz

chmod +x sakis3g umtskeeper resetusb

Konfigurace

Součástí UMTSKeeper je sakis3g, které je asi nejlépe nakonfigurovat v interktivním módu.

sudo ./sakis3g --interactive

Spustí se následující interaktivní mód pro nastavení





Následujícím příkazem umtskeeper lze provést napojení:

sudo ./umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='19d2:0117' SIM_PIN='xxxx' APN='CUSTOM_APN' CUSTOM_APN='internet.t-mobile.cz' APN_USER='0' APN_PASS='0'" --sakisswitches "--sudo --console" --devicename ' ZTE WCDMA Technologies MSM' --log --nat 'no'


- musíte samozřejmě správně doplnit pin místo xxxx a pokud nemáte jako operátora T-Mobile, pak také změnit CUSTOM_APN, TMobile nevyžaduje pro přístup na APN jméno a heslo, proto jsou uvedeny 0. Pokud je bude operátor vyžadovat, pak je potřeba patřičně nastavit také APN_USER a APN_PASS.


Automatické spuštění 

do /etc/rc.local přidat

/home/pi/umtskeeper/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='19d2:0117' SIM_PIN='xxxx' APN='CUSTOM_APN' CUSTOM_APN='internet.t-mobile.cz' APN_USER='0' APN_PASS='0'" --sakisswitches "--sudo --console" --devicename 'ZTE WCDMA Technologies MSM' --log --silent --nat 'no' &>> /var/log/umtskeeper_error.log

- opět platí, že je potřeba správně doplnit podle popisu výše, minimálně SIM_PIN.

No a tím by mělo být hotovo. Zařízení mi běží automatickém režimu 24x7, po rozpojení se připojení automaticky navazuje, spojení se spolehlivě naváže i po restartu nebo vypnutí a znovu zapnutí. Zatím testuji v kontinuálním provozu více než 9 měsíců a jeví se to jako nadprůměrně spolehlivé řešení.

Použité součásti:

Raspberry Pi Model A s instalovaným Raspbian Jessy Lite
Dongle ZTE model MF667



neděle 1. května 2016

Automatická kamera s Raspberry Pi

Nedávno jsem potřeboval zařídit dlouhodobé automatické snímkování ze statické kamery. Nejprve jsem hledal mezi komerčními produkty. Nejbližší k tomu jsem nalezl fotopasti, které dokáží periodicky snímkovat a mohou odesílat snímky prostřednictvím mobilního připojení. Jejich cena ale byla příliš vysoká. Tak jsem se probral tím, jaké zásoby mám doma a volba řešení padla na Raspberry Pi, která již delší dobu nečinně ležela v šuplíku. Dále jsem tam pak nalezl také usb dongle od T-Mobile, kterou mi kdysi vnutili jako součást internetového připojení. Obojí jsem teď využil. Jediné, co jsem musel koupit byla Raspberry Pi kamera. Náklady na celkové řešení se tak zmenšily na zlomek oproti komerčmín produktům.
Operační systém jsem použil minimalizovaný Raspbian Jessie Lite. Připojení Raspberry Pi na mobilní sít je posánu v příspěvku: Mobilní připojení Raspberry PI přes 3G. Pro snímání utilitu raspistill. V cron jsem nastavil automatický job pro vyfocení a odeslání emailem. Pro odeslání emailem včetně přílohy je vhodné využít utilitu sendEmail.

Zde je příklad jednoduchého skriptu, který pravidelně spouští cron v Raspberry Pi s periodou jedné minuty, skript v pracovní dny od 7 do 17 hodiny udělá každých 20 minut fotku, kterou pošle jako přílohu emailu.



#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
FILE=pict_$DATE.jpg
DAYOFWEEK=$(date +%u)
HOURS=$(date +%H)
MINUTES=$(date +%M)
MINUTES=`echo $MINUTES|sed 's/^0//'`
MODULO=$((MINUTES%20))

if [ $HOURS -ge 7 ] && [ $HOURS -le 17 ] && [ $DAYOFWEEK -le 5 ] && [ $MODULO -eq 0 ]
then 
  raspistill -hf -vf -o /home/pi/$FILE
  sendEmail -f camera@digitalroom.eu -t info@digitalroom.eu -u $FILE -m $FILE -s smtp.digitalroom.eu -xu camera@digitalroom.eu -xp password -a /home/pi/$FILE
  rm /home/pi/$FILE
fi


Seznam součástí, které jsem použil:

Raspberry Pi Model A
Dongle ZTE MF667
Napájení s kabelem MicroUSB 80 cm
Kamera Raspberry Pi kamera modul V2
8 GB paměťová karta, do které jsem nainstaloval Raspbian Jessy Lite






Schéma řešení






Instalace WebShpere Application Server Liberty Profile na Raspberry PI

IBM WebSphere Application Server Liberty Profile je light verze Java IBM aplikačního serveru. Tato odlehčená verze má mnohem jednodušší konfiguraci pomocí xml souboru a je mnohem méně náročná na zdroje. To se projeví například rychlostí startu aplikačního serveru, který je řádově v sekundách. Vzhledem k malé náročnosti na zdroje je možné tuto edici WebSphere aplikačního serveru provozovat i na platformách s omezenými zdroji, jako je i Raspberry PI.

Instalační soubor WAS Liberty Profile je volně stažitelný na adrese https://developer.ibm.com/wasdev/getstarted/



Instalace a zprovoznění WAS Liberty Profile na Raspberry PI je jednoduchá a zde je popis jednotlivých kroků, jak je provádím při instalaci.


Instalační postup


  1. Stahněte zip soubor s poslední verzí WebShpere Liberty Profile (viz odkaz výše) wpl-javae77-8.5.5.9.zip
  2. zip soubor rozbalte do cílového adresáře např. /opt/ibm.
    unzip wpl-javae77-8.5.5.9.zip -d /opt/ibm
  3. Vytvořte instanci serveru: v adresáři /opt/ibm/wlp/bin spusťte příkaz server s parametrem create
    /opt/ibm/wlp/bin/server create myserver
  4. Spusťte server myserver - /opt/ibm/wlp/server start myserver
  5. Vyzkoušejte, zda server odpovídá na portu 9080: http://adresa_raspberry_pi:9080. Měla by se zobrazit úvodní stránka:




Tím je instalace hotova. Aplikace lze instalovat vložením war nebo ear souboru do adresáře serveru:
/opt/ibm/wlp/usr/servers/myserver/dropins.

čtvrtek 24. března 2016

Instalace image pro Raspberry PI

Instalace velmi jednoduchá:

Co je k tomu potřeba?
- SD karta, doporučeno min. 8GB
- počítač se čtečkou SD karet
- pro Windows platformu volně stažitelný Win32DiskImager

1) Na stráncec https://www.raspberrypi.org/downloads/ stáhnout image OS. Vybral jsem RASBIAN JESSIE LITE s minimem předinstalovaného. Budu instalovat pouze potřebný software. Na této stránce je i návod a odkaz na stažení Win32DiskImager.

2) S pomocí Win32DiskImager zapsat image na SD kartu

A hotovo - možno použít pro první start v Raspberry PI.
Pro RASPBIAN je přednastavený uživatel pi a heslo raspberry.

3) Po přihlášení spusťte raspi-config a volbou Expand Filesystem zvětšete filesystem na celou SD kartu


Připojení přes SSH

I minimální instalace Raspbianu má naistalovaný ssh server. Tzn. je možné se připojit pomocí ssh clienta (například putty - http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html). Je k tomu potřeba pouze znát ip adresu Raspberry PI, kterou zjistíme po lokálním přihlášení na Raspberry PI příkazem ifconfig -a. Pokud nemáme například monitor a nemůžeme se připojit lokálně, podívejte se na administrativní stránky vašeho domácího routeru, v seznamu dhcp klientů ji najdete pro hostnane  raspberrypi.