As it is now possible to use a serial gateway with openHAB I've written a simple (as simple as possible) entry tutorial.
What do we need?
- a MySensors serial gateway
- a linux system (like a RPi, example based on Ubuntu)
- a MySensors sensor (for example with a DHT22 and a fixed NODE_ID of 101)
Where to start?
Start with the serial gateway.
Build it: http://www.mysensors.org/build/serial_gateway
If you see something like this in the serial monitor for arduino you're done:
0;0;3;0;14;Gateway startup complete.
Connect the serial gateway to the linux system and execute "dmesg". You should see something like:
[ 186.047748] usb 2-1.5: new full-speed USB device number 7 using ehci-pci
[ 186.147030] usb 2-1.5: New USB device found, idVendor=0403, idProduct=6001
[ 186.147036] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 186.147040] usb 2-1.5: Product: FT232R USB UART
[ 186.147044] usb 2-1.5: Manufacturer: FTDI
[ 186.147047] usb 2-1.5: SerialNumber: A40360T2
[ 186.149618] ftdi_sio 2-1.5:1.0: FTDI USB Serial Device converter detected
[ 186.149659] usb 2-1.5: Detected FT232RL
[ 186.149663] usb 2-1.5: Number of endpoints 2
[ 186.149667] usb 2-1.5: Endpoint 1 MaxPacketSize 64
[ 186.149670] usb 2-1.5: Endpoint 2 MaxPacketSize 64
[ 186.149673] usb 2-1.5: Setting MaxPacketSize 64
[ 186.150205] usb 2-1.5: FTDI USB Serial Device converter now attached to ttyUSB0
As we see the serial gateway is now accessible through "ttyUSB0" like: /dev/ttyUSB0. But the Number may change. It depends on the FTDI Chip and could also be something like "/dev/ttyACM0".
But we don't want to look for the correct name after every reboot or after we plugged out and in the serial gateway, so we add the following in "/etc/udev/rules.d/99-usb-serial.rules"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A40360T2", SYMLINK+="ttyUSB99"
Look at the output from "dmesg" above and change "0403", "6001" and "A40360T2" according to your hardware.
Now plug out and plug in the serial gateway.
The serial gateway will now be accessible through "/dev/ttyUSB99".
Install openHAB
It is important to install a version like or above 1.7.0. This version is not stable yet so download a snapshot from cloudbees:
https://openhab.ci.cloudbees.com/job/openHAB/
You need:
distribution-1.7.0-SNAPSHOT-addons.zip
distribution-1.7.0-SNAPSHOT-runtime.zip
Move to the "/opt" directory and extract the files:
cd /opt
mkdir openhab
cd openhab
unzip /tmp/distribution-1.7.0-SNAPSHOT-runtime.zip
cd addons
unzip /tmp/distribution-1.7.0-SNAPSHOT-addons.zip org.openhab.binding.serial-1.7.0-SNAPSHOT.jar
We will keep it simple and just use the serial binding.
Configure openHAB
At first we need to configure openHAB to use the serial binding to connect with the gateway. So we switch to the "configurations" directory:
cd /opt/openhab/configurations
There we create a file named "demo.items" in the "items" directory:
vi items/demo.items
Insert the following content:
String Arduino "Arduino" { serial="/dev/ttyUSB99@115200" }
Number livingTemp01 "Temperatur [%.1f Β°C]" <temperature>
Number livingHum01 "Feuchtigkeit [%.1f %%]" <temperature>
We keep it simple and just assume we just want to read out a DHT22.
Start up openHAB with "/opt/openhab/start.sh". You should see something like:
2015-04-02 20:05:30.731 [INFO ] [runtime.busevents ] - Arduino state updated to 0;0;3;0;14;Gateway startup complete.
If that is the case: very good!!
Now we need rules that reads the information that is received by openHAB via /dev/ttyUSB99 and show it.
vi rules/demo.rules
Content (that is the hardest part):
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
import java.util.*
import org.eclipse.xtext.xbase.lib.*
import org.openhab.core.items.*
var String ArduinoUpdate = ""
var String sketchName = ""
var int V_TEMP = 0
var int V_HUM = 1
var int V_LIGHT = 2
var int V_DIMMER = 3
var int V_PRESSURE = 4
var int V_FORECAST = 5
var int V_RAIN = 6
var int V_RAINRATE = 7
var int V_WIND = 8
var int V_GUST = 9
var int V_DIRECTION = 10
var int V_UV = 11
var int V_WEIGHT = 12
var int V_DISTANCE = 13
var int V_IMPEDANCE = 14
var int V_ARMED = 15
var int V_TRIPPED = 16
var int V_WATT = 17
var int V_KWH = 18
var int V_SCENE_ON = 19
var int V_SCENE_OFF = 20
var int V_HEATER = 21
var int V_HEATER_SW = 22
var int V_LIGHT_LEVEL = 23
var int V_VAR1 = 24
var int V_VAR2 = 25
var int V_VAR3 = 26
var int V_VAR4 = 27
var int V_VAR5 = 28
var int V_UP = 29
var int V_DOWN = 30
var int V_STOP = 31
var int V_IR_SEND = 32
var int V_IR_RECEIVE = 33
var int V_FLOW = 34
var int V_VOLUME = 35
var int V_LOCK_STATUS = 36
var int V_DUST_LEVEL = 37
var int V_VOLTAGE = 38
var int V_CURRENT = 39
var int msgPresentation = 0
var int msgSet = 1
var int msgReq = 2
var int msgInternal = 3
var int msgStream = 4
var int alarmArmor = 1
// Internal Commands
var int I_BATTERY_LEVEL = 0
var int I_TIME = 1
var int I_VERSION = 2
var int I_ID_REQUEST = 3
var int I_ID_RESPONSE = 4
var int I_INCLUSION_MODE = 5
var int I_CONFIG = 6
var int I_FIND_PARENT = 7
var int I_FIND_PARENT_RESPONSE = 8
var int I_LOG_MESSAGE = 9
var int I_CHILDREN = 10
var int I_SKETCH_NAME = 11
var int I_SKETCH_VERSION = 12
var int I_REBOOT = 13
var int I_GATEWAY_READY = 14
// Mappings
var HashMap<String, String> sensorToItemsMap = newLinkedHashMap(
"101;0;" -> "livingHum01",
"livingHum01" -> "101;0;",
"101;1;" -> "livingTemp01",
"livingTemp01" -> "101;1;"
)
//receiving msg from mysensors gateway
rule "Arduino sends to Openhab"
when
Item Arduino received update
then
var String lineBuffer = Arduino.state.toString.split("\n")
for (String line : lineBuffer) {
var String[] message = line.split(";")
var Integer nodeId = new Integer(message.get(0))
var Integer childId = new Integer(message.get(1))
var Integer msgType = new Integer(message.get(2))
var Integer ack = new Integer(message.get(3))
var Integer subType = new Integer(message.get(4))
var String msg = message.get(5)
if(msgType == 1 ){
if (subType == V_TEMP){
postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
println ("Temp item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " temp: " + msg )
}
if (subType == V_HUM){
postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
println ("Hum item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " hum: " + msg )
}
}
// Internal Command
if(msgType == 3){
if(subType == I_SKETCH_NAME){
println("Sketch name: " + msg )
sketchName=msg
}
if(subType == I_SKETCH_VERSION){
println("Sketch version: " + msg )
postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), sketchName+" " +msg )
sketchName=""
}
}
}
}
end
Wow, that is hardcore! Are you still with me? Luckily there is not much to change for start.
There is a mapping, that you may change or want to extent:
// Mappings
var HashMap<String, String> sensorToItemsMap = newLinkedHashMap(
"101;0;" -> "livingHum01",
"livingHum01" -> "101;0;",
"101;1;" -> "livingTemp01",
"livingTemp01" -> "101;1;"
)
Where "101" is the NODE_ID of my DHT22 Sensor. I'm using hardcoded NODE_IDs, so if your sensor has another NODE_ID already, just change the mappings in the configuration. The "0" and "1" after the "101" is the childId. Change that too if you must. Just look at the Arduino code of your sensor.
Start openHAB if it is not already running and look for the output.
2015-04-02 20:19:47.057 [INFO ] [runtime.busevents ] - Arduino state updated to 0;0;3;0;9;read:101-101-0s=0,c=1,t=1,pt=7,l=5:44.7
101;0;1;0;1;44.7
2015-04-02 20:19:47.114 [INFO ] [runtime.busevents ] - livingHum01 state updated to 44.7
Hum item: livingHum01 hum: 44.7
If you see something like the above it is still working!
*Nearly done! *
Know we want to show the information in a sitemap. We just create one with:
vi sitemaps/demo.sitemap
Content:
sitemap demo label="HauptmenΓΌ"
{
Frame label="Wohnzimmer" {
Text item=livingTemp01
Text item=livingHum01
}
}
We keep it simple here!
If OpenHAB is not running start it and fire up your favorite browser and open
http://localhost:8080/openhab.app?sitemap=demo
For further information have a look at this thread: http://forum.mysensors.org/topic/655/serial-gateway-connection-to-openhab/2