-
Notifications
You must be signed in to change notification settings - Fork 4
Samples Tricks
Miscellaneous Tips & Tricks
- How to redirect your log entries to the syslog
- How to do a proper ICMP ping on Linux
- How to add current or forecast weather icons to your sitemap
- How to configure openHAB to start automatically on Linux
- Use cheap bluetooth dongles on remote PCs to detect your phone/watch
- [Check presence by detecting WiFi phones/tablets] (Samples-Tricks#check-presence-by-detecting-wifi-phonestablets)
- Get connection status of all network devices from Fritz!Box, eg for presence detection
- How to configure openHAB to connect to device symlinks (on Linux)
- Use URL to manipulate items
- Extract caller and called number from Fritzbox Call object
- Item loops with delay
- enocean binding on Synology DS213+ (kernel driver package)
- How to use openHAB to activate or deactivate your Fritz!Box-WLAN
- How to format a Google Maps URL from a Mqttitude Mqtt message
- How to use Yahoo weather images
- How to wake up with Philips Hue
- How to manage and sync configuration via subversion
- How to switch LEDS on cubietruck
- How to use a voice command from HABDroid
You just need to add some lines to your logback.xml.
Like:
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>localhost</syslogHost>
<facility>AUTH</facility>
<suffixPattern>{}openhab: [%thread] %logger %msg</suffixPattern>
</appender>
<root level="INFO">
<appender-ref ref="SYSLOG" />
</root>
Java is not capable to open a raw socket to do a ICMP ping (see https://code.google.com/p/openhab/issues/detail?id=134). As a workaround, you can use the exec binding on Linux:
Switch PingedItem { exec="<[/bin/sh@@-c@@ping -c 1 192.168.0.1 | grep \"packets transmitted\" | sed -e \"s/.*1 received.*/ON/\" -e \"s/.*0 received.*/OFF/\":30000:REGEX((.*))]" }
This example gets the weather information from the Wunderground online api service (for details see http://www.wunderground.com/weather/api/) and shows the current weather icon and weather state (such as partly cloudy) in one line like it would show any other Openhab item.
- in the items file, create a string as follows:
String w "Today [%s]" <w> { http="<[http://api.wunderground.com/api/<your api key>/forecast/q/Luxembourg/Luxembourg.xml:3600000:XSLT(wunderground_icon_forecast.xsl)]"}
-
copy the weather icons to your images folder and rename and convert them to png, e.g. "w-partly_cloudy.png". The weather icon sets can be found here:
http://www.wunderground.com/weather/api/d/docs?d=resources/icon-sets
-
create a stylesheet named wunderground_icon_forecast.xsl containing the following lines (place it under configurations/transform):
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="/">
<!-- format: hh:mm:ss -->
<xsl:value-of select="//response/forecast/txt_forecast/forecastdays/forecastday/icon/text()" />
</xsl:template>
</xsl:stylesheet>
- display the string in the .sitemap file:
Text item=w
Create a new file in /etc/init.d/openhab using your preferred editor (e.g. nano) and copy the code below.
#! /bin/sh
### BEGIN INIT INFO
# Provides: openhab
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: OpenHAB Daemon
### END INIT INFO
# Author: Thomas Brettinger
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Open Home Automation Bus Daemon"
NAME=openhab
DAEMON=/usr/bin/java
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
ECLIPSEHOME="/opt/openhab";
HTTPPORT=8080
HTTPSPORT=8443
TELNETPORT=5555
# be sure you are adopting the user to your local OH user
RUN_AS=ben
# get path to equinox jar inside $eclipsehome folder
cp=$(find $ECLIPSEHOME/server -name "org.eclipse.equinox.launcher_*.jar" | sort | tail -1);
DAEMON_ARGS="-Dosgi.clean=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djetty.port=$HTTPPORT -Djetty.port.ssl=$HTTPSPORT -Djetty.home=$ECLIPSEHOME -Dlogback.configurationFile=$ECLIPSEHOME/configurations/logback.xml -Dfelix.fileinstall.dir=$ECLIPSEHOME/addons -Djava.library.path=$ECLIPSEHOME/lib -Djava.security.auth.login.config=$ECLIPSEHOME/etc/login.conf -Dorg.quartz.properties=$ECLIPSEHOME/etc/quartz.properties -Djava.awt.headless=true -jar $cp -console ${TELNETPORT}"
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --chdir $ECLIPSEHOME --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --chdir $ECLIPSEHOME --exec $DAEMON -- $DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
return 0
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
do_stop
sleep 1
do_start
return 0
}
case "$1" in
start)
log_daemon_msg "Starting $DESC"
do_start
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC"
do_stop
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:
Make the script executable and configure it to run on boot.
sudo chmod a+x /etc/init.d/openhab
sudo update-rc.d openhab defaults
Now whenever your Linux machine boots openHAB will be automatically started.
This is more an idea really but consider that openhab can know your home by picking up on the bluetooth on your phone, using cheap 3 euro bluetooth dongles connected to the various PCs and media centres you may have.
EG On an ubuntu/debian based PC.
- Install the "bluez" bluetooth stack.
apt-get install bluez
- Use the bash script below to do a simple scan several times per min. This script looks for my phone "jon-phone". Its made no real difference to the battery life on my android 4.x phone. The script updates a switch in openhab called "zoneOneState". You could have as many zones as you need/want to cover your house.
#!/bin/bash
while true
do
DEVICES=`hcitool scan`
if [[ $DEVICES = *jon-phone* ]]
then
curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "ON" http://192.168.1.121:8080/rest/items/zoneOneState/state
else
curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "OFF" http://192.168.1.121:8080/rest/items/zoneOneState/state
fi
sleep 30
done
-
The rule governing the decision process on if your house is occupied can be as complex or simple as you need. The rule below is clunky but simple and gets the job done. It uses three zone switches to decide if it should set a switch called "occupiedState" to on or off. Then using the occupiedState switch you can make your other openhab rules behave in different ways. Each zone checked reports true if your bluetooth device has been seen within the last 5 mins (helps stop flap caused by the patchy coverage of bluetooth signals).
//FIGURE IF HOUSE OCCUPIED EVERY 30 SECONDS rule "check occupiedState" when Time cron "*/30 * * * * ?" then if (occupiedState.state == ON) { zoneOneFlag = true zoneTwoFlag = true zoneThreeFlag = true
if (zoneOneState.state == OFF) { if (!zoneOneState.changedSince (now.minusMinutes(5))) { //sendCommand("occupiedState", "OFF") zoneOneFlag = false } } if (zoneTwoState.state == OFF) { if (!zoneTwoState.changedSince (now.minusMinutes(5))) { //sendCommand("occupiedState", "OFF") zoneTwoFlag = false } } if (zoneThreeState.state == OFF) { if (!zoneThreeState.changedSince (now.minusMinutes(5))) { //sendCommand("occupiedState", "OFF") zoneThreeFlag = false } } if (zoneOneFlag == false && zoneTwoFlag == false && zoneThreeFlag == false) { sendCommand("occupiedState", "OFF") } } else { if (zoneOneState.state == ON || zoneTwoState.state == ON || zoneThreeState.state == ON) { sendCommand("occupiedState", "ON") } }
This is a small modification to the tip above. This time we check, whether somebody is at home by testing if their phone is within WiFi reach. All you need is the Network Health Binding.
Your items file could look like this:
Group gMobiles
Switch Presence
Switch phone1 (gMobiles) {nh="android-xxxxx"}
Switch phone1 (gMobiles) {nh="android-yyyyy"}
My rules file looks like this:
rule "Periodically check presence"
when
Time cron "0 */5 * * * ?"
then
if (Presence.state == ON)
{
if(gMobiles.members.filter(s | s.state == ON).size == 0) {
logInfo("PresenceCheck", "No phone within reach, checking for flapping")
if(gMobiles.members.filter(s | s.changedSince(now.minusMinutes(5))).size == 0) {
logInfo("PresenceCheck", "Nobody is at home")
sendCommand(Presence, OFF)
}
}
}
else
{
//For initialisation. If Presence is undefined or off, although it should be on.
if(gMobiles.members.filter(s | s.state == ON).size > 0) {
sendCommand(Presence, ON)
}
else if (Presence.state == Undefined || Presence.state == Uninitialized) {
sendCommand(Presence, OFF)
}
}
end
rule "Coming home"
when
Item gMobiles changed
then
if (Presence.state != ON) {
if(gMobiles.members.filter(s | s.state == ON).size > 0) {
logInfo("PresenceCheck", "Somebody is home")
sendCommand(Presence, ON)
}
}
end
Presence is only switched off, if no phone was seen within the last 5 minutes. This avoids flapping, if you are just taking out the trash or something.
Additionally to the Network Health items in the gMobiles group, you could add bluetooth devices (like used above) or motion sensors.
For cases where bluetooth detection described above or network health binding is not suitable.
Requirements
- Fritz!Box with telnet access
- Linux server (preferably the openHAB server), tested with ReadyNAS
- Linux knowledge to adopt scripts
Methodology
- Shell script on the Fritz!Box to dump all known network devices with their current connection status
- This script is called from the Linux server through a cron job periodically (eg every minute), parses the dump and updates openHAB items according to their connection status
Restrictions
- Only tested on ReadyNAS Linux with manual added packages, others might need adoption
- All parameters like login/password/paths/script names "hard-coded" into the scripts, need adoption
- Absolutely no error-checks, use at own risk
- Due to these restrictions only applicable for people with at least basic Linux knowledge
How-To
The Fritz!Box shows a reliable status of devices connected to the network using the built-in ctlmgr_ctl r landevice command (see http://www.wehavemorefun.de/fritzbox/Landevice).
Create the script landevices.sh permanently (should not be deleted at reboot), for example in folder /var/media/ftp/Fritz!Box/. Make it executable. Take care not to indent the script as the Fritz!Box does not like that.
#!/bin/sh
i=0
count_devices=`ctlmgr_ctl r landevice settings/landevice/count`
while [ $i -lt $count_devices ]
do
device="landevice="$i
#for command in name ip mac manu_name dhcp static_dhcp wlan ethernet active online speed deleteable wakeup source neighbour_name is_double_neighbour_name ipv6addrs ipv6_ifid
for command in name active
do
output="`ctlmgr_ctl r landevice settings/landevice$i/$command`"
device=$device" "$command"="$output
done
echo $device
i=`expr $i + 1`
done
The commented out for loop shows all possible subcommands, so it is also possible to output eg the speed or mac adress of all landevices. However this would also require a change on the calling script below. Once created on the Fritz!Box and executed it should provide you all known network devices with their current status:
# ./landevices.sh
landevice=0 name=BoyLaptop active=0
landevice=1 name=BoyPhone active=0
landevice=2 name=BoyiPod active=0
landevice=3 name=DGOfficePrinter active=1
landevice=4 name=DGTVRasPlex active=1
landevice=5 name=DGTVWii active=0
landevice=6 name=DadLaptop active=0
landevice=7 name=DadLaptopWork active=0
landevice=8 name=DadLaptopWork active=0
landevice=9 name=DadPC active=1
landevice=10 name=DadPhone active=1
landevice=11 name=DadPhoneWork active=1
landevice=12 name=EGEntranceAP active=1
landevice=13 name=EGTVRasPlex active=1
landevice=14 name=EGWZAP active=0
landevice=15 name=GirlLaptop active=0
landevice=16 name=GirlPhone active=1
landevice=17 name=GuestLaptop active=0
landevice=18 name=KGOfficePrinter active=1
landevice=19 name=KGOfficeReadyNAS active=1
landevice=20 name=KGTEC1AP active=1
landevice=21 name=KGTEC2AP active=1
landevice=22 name=MomLaptop active=0
landevice=23 name=MomLaptop active=0
landevice=24 name=MomLaptopWork active=0
landevice=25 name=MomPhone active=0
If required, use the Fritz!Box GUI to give the devices some reasonable names in order to easily assign phones/laptops etc to people or media devices to floors/rooms. Using the ctlmgr_ctl command it would also be possible to only query for specific devices (go through the full list and look for either name or mac or both), but any change in the output of this script requires changes on the other end as well.
Create a expect script in a folder on your Linux Server and make it executable. The only purpose of this script is only to connect to your Fritz!Box through a telnet session and call the script created there.
#!/usr/bin/expect
spawn telnet <<<your fritzbox ip here>>>
expect "user: "
send "<<<your fritzbox login here>>>\r"
expect "password: "
send "<<<your fritzbox password here>>>\r"
expect "telnet"
expect "#"
send "\r"
expect "#"
send "/var/media/ftp/Fritz!Box/landevices.sh\r"
expect "#"
send "exit 0\r"
Here the IP of the Fritz!Box, your credentials and the path to the script need to be adopted. Furthermore the above script is for the newest version of the Fritz!box firmware where multiple user accounts can be created. In case this is not your case, you have to omit the "user:" and "login" expect/send statements in the script above, as in that case the Fritz!Box telnet session only requires the password, not the user. Again, to validate the functionality just execute the script:
ReadyNAS:~# ./fritzbox_devices.expect
spawn telnet 192.168.178.1
Entering character mode
Escape character is '^]'.
Fritz!Box user: admin
password:
BusyBox v1.20.2 (2013-05-13 12:53:07 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
ermittle die aktuelle TTY
tty is "/dev/pts/1"
weitere telnet Verbindung aufgebaut
#
# /var/media/ftp/Fritz!Box/landevices.sh
landevice=0 name=BoyLaptop active=0
landevice=1 name=BoyPhone active=0
landevice=2 name=BoyiPod active=0
landevice=3 name=DGOfficePrinter active=1
landevice=4 name=DGTVRasPlex active=1
landevice=5 name=DGTVWii active=0
landevice=6 name=DadLaptop active=0
landevice=7 name=DadLaptopWork active=0
landevice=8 name=DadLaptopWork active=0
landevice=9 name=DadPC active=1
landevice=10 name=DadPhone active=1
landevice=11 name=DadPhoneWork active=1
landevice=12 name=EGEntranceAP active=1
landevice=13 name=EGTVRasPlex active=1
landevice=14 name=EGWZAP active=0
landevice=15 name=GirlLaptop active=0
landevice=16 name=GirlPhone active=1
landevice=17 name=GuestLaptop active=0
landevice=18 name=KGOfficePrinter active=1
landevice=19 name=KGOfficeReadyNAS active=1
landevice=20 name=KGTEC1AP active=1
landevice=21 name=KGTEC2AP active=1
landevice=22 name=MomLaptop active=0
landevice=23 name=MomLaptop active=0
landevice=24 name=MomLaptopWork active=0
landevice=25 name=MomPhone active=0
# ReadyNAS:~#
As you can see here we have the original output of the script plus some "overhead" for the telnet session.
Now create a sed script fritzbox_devices.sed that will create curl commands to interface with the openHAB server:
#!/bin/sed -f
s#\r$##
s#landevice=[0-9]* name=#curl --silent -H \"Content-Type: text/plain\" http://localhost:8080/rest/items/landevice_#g
s#active=0#-d \"OFF\"#g
s#active=1#-d \"ON\"#g
The first line here is just to eliminate "DOS-like" \r at the end of each line which show up with a ReadyNAS as server and might not be required in your setup, but you can still leave them. The second line replaces the "landevice=....name=...... with a curl command. In order to have reasonable variable names again in openHAB the landevices there start with "landevice_", so "DadPhone" on the Fritz!Box gets landevice_DadPhone in openHAB. Furthermore localhost:8080 needs to be changed to match your openHAB server if is not running on the same machine. The last two lines replace the "active=0" or "active=1" with the correct statements for curl.
Another validation of the scripts created so far:
ReadyNAS:~# ./fritzbox_devices.expect | fgrep "landevice=" | ./fritzbox_devices.sed
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_BoyLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_BoyPhone -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_BoyiPod -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DGOfficePrinter -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DGTVRasPlex -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DGTVWii -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadLaptopWork -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadLaptopWork -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadPC -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadPhone -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_DadPhoneWork -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_EGEntranceAP -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_EGTVRasPlex -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_EGWZAP -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_GirlLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_GirlPhone -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_GuestLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_KGOfficePrinter -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_KGOfficeReadyNAS -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_KGTEC1AP -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_KGTEC2AP -d "ON"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_MomLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_MomLaptop -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_MomLaptopWork -d "OFF"
curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_MomPhone -d "OFF"
ReadyNAS:~#
Now it is time to create the required items in openHAB - One Switch for each landevice that is supposed to be used later. In case you don't configure all landevices as items you will get error messages in openHAB logs, however these can be ignored. Just to have a "clean" configuration you might want to add all devices.
Switch landevice_KGOfficeReadyNAS "ReadyNAS" <network> (KG_TEC1, gNetworkServer)
Switch landevice_EGEntranceAP "Airport Erdgeschoss" <network> (gWZ, gNetworkServer)
Switch landevice_EGWZAP "Airport Repeater Erdgeschoss" <network> (gWZ, gNetworkServer)
Switch landevice_KGTEC1AP "Airport Keller TEC1" <network> (KG_TEC1, gNetworkServer)
Switch landevice_KGTEC2AP "Airport Keller TEC2" <network> (KG_TEC2, gNetworkServer)
Switch landevice_DGOfficePrinter "Drucker Dachgeschoss" <network> (DG_GUEST, gNetworkMedia)
Switch landevice_KGOfficePrinter "Drucker Keller" <network> (KG_TEC1, gNetworkMedia)
Switch landevice_DGTVRasPlex "RasPLEX Dachgeschoss" <network> (DG_TV, gNetworkMedia)
Switch landevice_EGTVRasPlex "RasPLEX Erdgeschoss" <network> (EG_TV, gNetworkMedia)
Switch landevice_DGTVWii "Wii" <network> (DG_TV, gNetworkMedia)
Switch landevice_DadPC "Dad PC" <network> (gWZ, gNetworkDad)
Switch landevice_DadLaptop "Dad Laptop" <network> (gWZ, gNetworkDad)
Switch landevice_DadPhone "Dad Phone" <network> (gWZ, gDAD_PRESENT, gNetworkDad, gPhones)
Switch landevice_DadLaptopWork "Dad Laptop@work" <network> (gWZ, gNetworkDad)
Switch landevice_DadPhoneWork "Dad Phone@work" <network> (gWZ, gDAD_PRESENT, gNetworkDad, gPhones)
Switch landevice_MomLaptop "Mom Laptop" <network> (gWZ, gNetworkMom)
Switch landevice_MomPhone "Mom Phone" <network> (gWZ, gMOM_PRESENT, gNetworkMom, gPhones)
Switch landevice_MomLaptopWork "Mom Laptop@work" <network> (gWZ, gNETWORKMom)
Switch landevice_MomPhoneWork "Mom Phone@work" <network> (gWZ, gMOM_PRESENT, gNetworkMom, gPhones)
Switch landevice_GuestLaptop "Guest Laptop" <network> (DG_GUEST, gNetworkGuest)
Switch landevice_GuestPhone "Guest Phone" <network> (DG_GUEST, gGUEST_PRESENT, gNetworkGuest, gPhones)
Switch landevice_GirlLaptop "Girl Laptop" <network> (DG_GIRL, gNetworkGirl)
Switch landevice_GirlPhone "Girl Phone" <network> (DG_GIRL, gGIRL_PRESENT, gNetworkGirl, gPhones)
Switch landevice_BoyLaptop "Boy Laptop" <network> (DG_BOY, gNetworkBoy)
Switch landevice_BoyPhone "Boy Phone" <network> (DG_BOY, gBOY_PRESENT, gNetworkBoy, gPhones)
Switch landevice_BoyiPod "Boy iPod" <network> (DG_BOY, gNetworkBoy)
As you can see the devices are assigned to various groups in the config, the interesting ones are the "_PRESENT" ones for the phones. Based on these with rules the status of each person's presence in the house can be defined. In my case when at least one phone per kid/guest is active in the network this person is seen as "present", for mom and dad both devices have to be present (on the weekends the work phones usually stay connected at home). Adding all devices here also offers some other capabilities... For example lower the download speed of the download server based on the number of active laptops in case the internet connection is not lighting fast.
Another test: Now execute one of the curl statements created in the previous step on the Linux server in the shell:
ReadyNAS:~# curl --silent -H "Content-Type: text/plain" http://localhost:8080/rest/items/landevice_KGTEC2AP -d "ON"
ReadyNAS:~#
If the items were created correctly this should generate no output at all in the Linux shell, but show up promptly in the openHAB event log:
ReadyNAS:~# tail -200 /opt/openhab/logs/events.log
...
2013-11-13 22:47:25 - landevice_KGTEC2AP received command ON
...
Now create the final script fritzbox_devices.sh on the Linux server
#!/bin/sh
/root/fritzbox_devices.expect | /bin/fgrep "landevice=" | /root/fritzbox_devices.sed > /tmp/commands.txt
. /tmp/commands.txt
rm /tmp/commands.txt
and test this script again, this time using time to avoid too many calls by cron:
ReadyNAS:~# time ./fritzbox_devices.sh
real 0m13.637s
user 0m0.267s
sys 0m0.202s
ReadyNAS:~#
Again, you should see no output in case you defined all items in openHAB. In case you did not errors will show up here and in the openHAB logs. A "clean" openHAB event.log outputs looks as follows:
ReadyNAS:~# tail -200f /opt/openhab/logs/events.log
...
2013-11-13 22:58:52 - landevice_BoyLaptop received command OFF
2013-11-13 22:58:52 - landevice_BoyPhone received command ON
2013-11-13 22:58:52 - landevice_BoyiPod received command OFF
2013-11-13 22:58:52 - landevice_DGOfficePrinter received command ON
2013-11-13 22:58:52 - landevice_DGTVRasPlex received command ON
2013-11-13 22:58:52 - landevice_DGTVWii received command OFF
2013-11-13 22:58:52 - landevice_DadLaptop received command OFF
2013-11-13 22:58:52 - landevice_DadLaptopWork received command OFF
2013-11-13 22:58:52 - landevice_DadLaptopWork received command OFF
2013-11-13 22:58:52 - landevice_DadPC received command ON
2013-11-13 22:58:52 - landevice_DadPhone received command ON
2013-11-13 22:58:52 - landevice_DadPhoneWork received command ON
2013-11-13 22:58:52 - landevice_EGEntranceAP received command ON
2013-11-13 22:58:52 - landevice_EGTVRasPlex received command ON
2013-11-13 22:58:52 - landevice_EGWZAP received command OFF
2013-11-13 22:58:52 - landevice_GirlLaptop received command OFF
2013-11-13 22:58:52 - landevice_GirlPhone received command ON
2013-11-13 22:58:52 - landevice_GuestLaptop received command OFF
2013-11-13 22:58:52 - landevice_KGOfficePrinter received command ON
2013-11-13 22:58:52 - landevice_KGOfficeReadyNAS received command ON
2013-11-13 22:58:52 - landevice_KGTEC1AP received command ON
2013-11-13 22:58:52 - landevice_KGTEC2AP received command ON
2013-11-13 22:58:52 - landevice_MomLaptop received command OFF
2013-11-13 22:58:52 - landevice_MomLaptop received command OFF
2013-11-13 22:58:52 - landevice_MomLaptopWork received command OFF
2013-11-13 22:58:52 - landevice_MomPhone received command OFF
...
When everything is working fine the cronjob can be set up, but avoid calling the script to frequently (thus the time before). In this case we set it up to run each minute:
# m h dom mon dow command
* * * * * /root/fritzbox_devices.sh
wlandevices.sh is just dumping all devices connected directly to the wlan of the Fritz!Box (not those attached through LAN ports, but including the guest WLAN). For example to show devices connected to the guest WLAN with their remaining time in the openHAB GUI:
#!/bin/sh
i=0
count_devices=`ctlmgr_ctl r wlan settings/wlanlist/count`
while [ $i -lt $count_devices ]
do
device="wlandevice="$i
#for command in mac UID state speed rssi quality is_turbo is_guest is_ap ap_state mode wmm_active cipher powersave is_repeater channel freq flags flags_set
for command in mac state speed is_guest
do
output="`ctlmgr_ctl r wlan settings/wlanlist$i/$command`"
device=$device" "$command"="$output
done
echo $device
i=`expr $i + 1`
done
The output looks as follows and again can be adopted using the commented out for loop:
# ./wlandevices.sh
wlandevice=0 mac=AC:81:12:B0:39:F0 state=0 speed=0 is_guest=0
wlandevice=1 mac=20:02:AF:89:59:29 state=0 speed=0 is_guest=0
wlandevice=2 mac=18:E7:F4:09:A7:E4 state=0 speed=0 is_guest=0
wlandevice=3 mac=00:1F:1F:A2:AE:A6 state=5 speed=97 is_guest=0
wlandevice=4 mac=00:27:09:EA:D3:E9 state=0 speed=0 is_guest=0
wlandevice=5 mac=00:1C:B3:C3:5F:B3 state=0 speed=0 is_guest=0
wlandevice=6 mac=00:27:10:4F:3F:F0 state=0 speed=0 is_guest=0
wlandevice=7 mac=98:FE:94:39:AC:49 state=5 speed=41 is_guest=0
wlandevice=8 mac=54:44:08:A9:C4:F4 state=5 speed=106 is_guest=0
wlandevice=9 mac=80:1F:02:63:D3:32 state=5 speed=113 is_guest=0
wlandevice=10 mac=EC:55:F9:19:40:43 state=0 speed=0 is_guest=0
wlandevice=11 mac=64:66:B3:4B:A5:AE state=5 speed=65 is_guest=0
wlandevice=12 mac=64:66:B3:4B:C3:46 state=5 speed=38 is_guest=0
wlandevice=13 mac=B4:B6:76:AD:22:4E state=0 speed=0 is_guest=0
wlandevice=14 mac=58:1F:AA:AD:A6:E1 state=0 speed=0 is_guest=0
wlandevice=15 mac=00:80:92:97:3E:AB state=5 speed=64 is_guest=0
When you want to refer to device names, the mac addresses need to be added to the output of landevices.sh above and the output of both scripts needs to be matched by mac address which should be easily possible.
Furthermore wlanstatus.sh just dumps the status of the wireless networks of the Fritz!Box:
#!/bin/sh
for wlan in "" guest_
do
device=$wlan"wlan: "
for command in ap_enabled ssid pskvalue time_remain
do
output="`ctlmgr_ctl r wlan status/$wlan$command`"
device=$device" "$command"="$output
done
echo $device
done
The output looks as follows:
# ./wlanstatus.sh
wlan: ap_enabled=1 ssid=wlanssid pskvalue=unencryptedpassword time_remain=
guest_wlan: ap_enabled=0 ssid=guestssid pskvalue=unencryptedpassword time_remain=0
This script might be used together with another (yet to do) guest wlan on/off script to offer kids the possibility to enable/disable the guest wlan with a randomly generated password (eg *echo tr -dc A-Za-z0-9* < /dev/urandom | head -c 16
_) in order to not have to do this yourself each time.
When connecting serial devices to Linux (i.e. USB) they are assigned arbitrary device names - usually something like /dev/ttyUSB0. There is no way to know exactly what name will be assigned each time you plug in the device however.
Using udev rules you can setup symlinks which are created when the system detects a device is added. The symlink allows you to assign a 'known' name for that device. See this link for a useful tutorial about udev - http://www.reactivated.net/writing_udev_rules.html.
So for example, if you have a ZWave USB dongle you can configure a symlink called /dev/zwave. This makes it much easier to configure connection properties since this name will never change.
However the RXTX serial connection library used in openHAB is unable to 'see' these symlinks. Therefore you need to inform RXTX about your symlinks using a system property.
You can either add the property to the Java command line by adding the following (device names delimited by :);
-Dgnu.io.rxtx.SerialPorts=/dev/rfxcom:/dev/zwave
Or add a gnu.io.rxtx.properties file which is accessible in the Java classpath. See http://create-lab-commons.googlecode.com/svn/trunk/java/lib/rxtx/README.txt for more details.
This applies to any openHAB binding that uses the RXTX serial connection library - i.e. RFXCOM, ZWave etc.
When you have a device unable to send REST requests (f.e. Webcams), you may use
http://<openhab-host>:8080/CMD?<item>=<state>
Example:
http://<openhab-host>:8080/CMD?Light=ON
If you define an item like the following in your site.items config
Call Incoming_Call_No "Caller No. [%2$s]" (Phone) { fritzbox="inbound" }
the Type CallType with its associated methods can be used to extract the caller and called number of the call. The following rule sends an email with both numbers in the subject line.
import org.openhab.library.tel.types.CallType
rule "inbound Call"
when Item Incoming_Call_No received update
then
var CallType call = Incoming_Call_No.state as CallType
var String mailSubject =
"Anruf von Nummer " + call.origNum + " -> " + call.destNum
sendMail( "us...@domain.de" , mailSubject , "");
end
Some integrations don't like to be rushed with a cascade of simultaneous commands. This can be an issue if you, for instance want to implement a rule which loops through a list of group members (items) and send a command to all of them, e. g. OFF. The solution is to add a small delay between each command. The example below executes OFF for all members at a one second interval. Use now.plusMillis(i*
n)
for n millisecond intervals.
rule "Lights out"
when
Time cron "0 0 22 ? * MON-THU,SUN *" or
Time cron "0 59 23 ? * FRI,SAT *"
then
gLightOffNight?.members.forEach(item,i|createTimer(now.plusSeconds(i)) [|sendCommand(item, OFF)])
end
The enocean binding works with the enocean USB300 usb-stick. To enable the USB300 on a Synology DS213+ (probably works also on Synology DS413 - same CPU...) two things are needed:
- The kernel drivers
usbserial, ftdi_sio and cdc-acm are already included in DSM 4.3
pl2303 and cp210x are in the package usb-driver-kernel-2.6.32-dh-syno-qoriq-0.001.spk
The package is stored at OpenHAB google groups and on the package server https://www.hofrichter.at/sspks
You can install this package in DSM via the package manager -> manual installation or by adding https://www.hofrichter.at/sspks/ to your package sources - there is a tutorial on the Synology support pages about how to do that. - nrjavaserial
OpenHab 1.3.1 comes with the latest stable version of [nrjavaserial 3.8.8] (https://code.google.com/p/nrjavaserial/) (at the moment (17.11.2013)).
It's in {openhab_root}/server/plugins/org.openhab.io.transport.serial
The newer unstable nrjavaserial 3.9.1 is needed for the qoric cpu of the DS213+ and included in the (otherwise unchanged) org.openhab.io.transport.serial_1.3.1.201309182025.jar.
Just put that file in {openhab_root}/server/plugins/ and delete the original file {openhab_root}/server/plugins/org.openhab.io.transport.serial...
Introduction
Currently there is no openHAB-Binding available which allows for activation or deactivation of a Fritz!Box WLAN. The method here is a kind of workaround which fills this gap. It works reliably and has been tested with openHAB running on Debian-Linux with the following Fritz!Boxes:
- Fritz!Box 7390
- Fritz!Box 7170
- fritzed Speedport W 900V
- other types might work as well but have not been tested
How it works
In order to control a Fritz!Box WLAN a little Perl program named fritzwlan.pl has been written. It can be executed directly from the command line and uses the telnet protocol to retrieve the current status or to turn the WLAN on or off. Of course, the telnet-daemon on your Fritz!Box has to be activated beforehand. Since fritzwlan.pl works like any other shell command, it can be called by openHAB via the Exec-binding. The whole construct is simply like this:
openHAB ⇔ Exec-Binding ⇔ fritzwlan.pl ⇔ Fritz!Box
So what we need on top of a working openHAB installation is the following:
- activation of telnetd on the Fritz!Box
- installation of Perl module Net::Telnet
- installation of fritzwlan.pl
- installation of openHABs Exec-Binding
- an entry in the items-File
- an entry in the sitemap-File (optional)
Activation of telnetd on the Fritz!Box
Using your Fritz!Box connected handheld phone is probably the easiest way to activate the telnet daemon on your Fritz!box. Just dial
#967 for activation
#968 for deactivation
Installation of Perl module Net::Telnet
fritzwlan.pl requires Net::Telnet to function. On Debian systems this module comes with the libnet-telnet-perl –package and can be installed with the following command:
apt-get install libnet-telnet-perl
Installation of fritzwlan.pl
The installation of fritzwlan.pl is quite simple: Just copy it to a path of your choice (e.g. /usr/local/scripts or whatever). Assuming it resides in /usr/local/scripts you can do a quick test by executing the following command:
/usr/local/scripts/fritzwlan.pl help
⇒ Some usage information about its correct invocation is shown.
Now it is time trying to switch on/off the WLAN or querying the state. Assuming your Fritz!Box is password protected and has the IP 192.168.178.1 you could use the following commands for status/switching on/switching off:
/usr/local/scripts/fritzwlan.pl 192.168.178.1 password status
/usr/local/scripts/fritzwlan.pl 192.168.178.1 password on
/usr/local/scripts/fritzwlan.pl 192.168.178.1 password off
Please note, it might take a few seconds until the WLAN reaches the desired state. For further information check the output of
/usr/local/scripts/fritzwlan.pl help
Installation of openHABs Exec-Binding
If not already installed, simply copy the jar file of the Exec-Binding to openHABs addons-directory.
An entry in the items-File
In the following example the lower case words “fritzbox” and “speedport” are resolvable hostnames for respective devices. The second example additionally uses the knx-binding. This allows to turn WLAN for WLANSpeedport on or off via KNX.
Switch WLAN7390 "Fritzbox 7390 WLAN" <network> (Netzwerk) { exec="<[/usr/local/scripts/fritzwlan.pl fritzbox password status:300000:REGEX((.*?))] >[ON:/usr/local/scripts/fritzwlan.pl fritzbox password on] >[OFF:/usr/local/scripts/fritzwlan.pl fritzbox password off]" }
Switch WLANSpeedport "Speedport WLAN" <network> (Netzwerk) { knx="4/4/0", exec="<[/usr/local/scripts/fritzwlan.pl speedport password status:300000:REGEX((.*?))] >[ON:/usr/local/scripts/fritzwlan.pl speedport password on] >[OFF:/usr/local/scripts/fritzwlan.pl speedport password off]" }
An entry in the sitemap-File (optional)
Optionally you can use entries similar to ones below in your sitemap file to place frontend elements to the desired position or to redefine things like labels or icons:
Switch item=WLAN7390 label="Fritzbox 7390 WLAN" icon="network"
Switch item=WLANSpeedport label="Speedport W900V WLAN" icon="network"
First, create a MQTT entry in your items file that subscribes to the Mqttitude push:
String Map_Dan_Phone {mqtt="<[home:mqttitude/dan/iphone5s:state:JS(mqttitude-maps.js)]"}
The transform is a javascript file in the configuration/Transform directory (mqttitude-maps.js). This file is very simple:
var location = eval('(' + input + ')');
result = "http://maps.google.com/maps?z=12&t=m&q=loc:" + location.lat + "+" + location.lon;
The value of your item (Map_Dan_Phone) will be set to the result value.
This tip allows you to use Yahoo! weather images in your sitemap. See the Yahoo! Weather Developer page for more information.
First we need to download a current set of yahoo images to the runtime/webapps/images folder, there are 48 total. This command assumes you have imagemagick installed. This is included in most linux distros, on mac you can install it using brew like : brew install imagemagick
.
for i in `seq 0 47`;do curl http://l.yimg.com/a/i/us/we/52/$i.gif | convert - yahoo_weather-$i.png ;done
Note that we prefix the images with yahoo_weather, this is important as openHAB will append a yahoo weather code later to choose the correct one.
Next add a xml transform file to your configuration/Transform directory, name this yahoo_weather_code.xml
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" version="1.0">
<xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="/">
<!--<xsl:text>yahoo-weather-</xsl:text>-->
<xsl:value-of select="//item/yweather:condition/@code" />
</xsl:template>
</xsl:stylesheet>
This will return the Yahoo! weather code for a selected region.
We can map the weather code to a description so the item has both an image and text. Name this yahoo_weather_code.map in the Configuration/Transform directory.
0=tornado
1=tropical storm
2=hurricane
3=severe thunderstorms
4=thunderstorms
5=mixed rain and snow
6=mixed rain and sleet
7=mixed snow and sleet
8=freezing drizzle
9=drizzle
10=freezing rain
11=showers
12=showers
13=snow flurries
14=light snow showers
15=blowing snow
16=snow
17=hail
18=sleet
19=dust
20=foggy
21=haze
22=smoky
23=blustery
24=windy
25=cold
26=cloudy
27=mostly cloudy (night)
28=mostly cloudy (day)
29=partly cloudy (night)
30=partly cloudy (day)
31=clear (night)
32=sunny
33=fair (night)
34=fair (day)
35=mixed rain and hail
36=hot
37=isolated thunderstorms
38=scattered thunderstorms
39=scattered thunderstorms
40=scattered showers
41=heavy snow
42=scattered snow showers
43=heavy snow
44=partly cloudy
45=thundershowers
46=snow showers
47=isolated thundershowers
Add a Number item to a items file
Number YahooWeatherCode "Today is [MAP(yahoo_weather_code.map):%s]" (weather) { http="<[http://weather.yahooapis.com/forecastrss?w=2459115:3600000:XSLT(yahoo_weather_code.xsl)]"}
And a Text item to your sitemap
Text item=YahooWeatherCode icon="yahoo_weather"
You want to make your morning light up with philips hue, the follow the steps
First you make a rule to wake up a certain time, for example 6:30 in the morning between Monday and Friday. This rule call the script dimmlight wich you can use later also in a other rule.
rule "Wackeup"
when
Time cron "0 30 06 ? * MON-FRI "
then
callScript("dimmlight")
end
Now you make the script dimmlight.script
var Number Dimmer
Dimmer=0
while(Dimmer<100 )
{
Dimmer=Dimmer+5
sendCommand(Light_LR_Living_Sofa_D,Dimmer)
Thread::sleep(400)
}
Thread::sleep(400)
a higher value will dimm the light slower, a lower value will dimm the light faster
In this guide subversion is used to both store your config and sync it between you local computer and the openhab server.
First setup a subversion server on your openhab server. You'll will find plenty of howtos how to do that. We asume that your repo is stored in /var/lib/svn/openhab and is running under the system user www-data
A hook script is used to apply all changes in the subversion repo to the actual openhab config. Create a hook-script /var/lib/svn/openhab/hooks/commit-hook with the following contents
#!/bin/sh
REPOS="$1"
REV="$2"
svn up /opt/openhab/configurations
The path in the last line has to match to your openhab installation
Probably you already have an configuration. Import this into your subversion server. On Windows TortoiseSVN does a good job for that.
You have to checkout the configuration into openhab once
svn co http://yourhost/svn/openhab /opt/openhab/configurations
Maybe you have to delete your existing configuration folder in /opt/openhab first
The tricky part is to setup the permissions right. I assume you subversion server runs with www-data and openhab with openhab system user. The problem is that www-data needs the permission to write to your openhab configuration.
chown -R openhab.www-data /opt/openhab/configuration
find /opt/openhab/configuration -type d -exec chmod g+ws {} \;
/* LEDS */
Switch LED_Blue {exec=">[ON:/bin/sh@@-c@@echo 1 | sudo tee /sys/class/leds/blue:ph21:led1/brightness] >[OFF:/bin/sh@@-c@@echo 0 | sudo tee /sys/class/leds/blue:ph21:led1/brightness]"}
Switch LED_Orange {exec=">[ON:/bin/sh@@-c@@echo 1 | sudo tee /sys/class/leds/orange:ph20:led2/brightness] >[OFF:/bin/sh@@-c@@echo 0 | sudo tee /sys/class/leds/orange:ph20:led2/brightness]"}
Switch LED_White {exec=">[ON:/bin/sh@@-c@@echo 1 | sudo tee /sys/class/leds/white:ph11:led3/brightness] >[OFF:/bin/sh@@-c@@echo 0 | sudo tee /sys/class/leds/white:ph11:led3/brightness]"}
Switch LED_Green {exec=">[ON:/bin/sh@@-c@@echo 1 | sudo tee /sys/class/leds/green:ph07:led4/brightness] >[OFF:/bin/sh@@-c@@echo 0 | sudo tee /sys/class/leds/green:ph07:led4/brightness]"}
Create /etc/sudoers.d/leds
ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/blue\:ph21\:led1/brightness
ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/green\:ph07\:led4/brightness
ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/white\:ph11\:led3/brightness
ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/orange\:ph20\:led2/brightness
HABDroid uses a predefined string item to pass voice commands - the name of this item is "VoiceCommand". So all you have to do is to add such an item in your *.items file:
String VoiceCommand
And react on commands for this item in a rule:
rule VoiceControl
when
Item VoiceCommand received command
then
val hue = switch(receivedCommand.toString.lowerCase) {
case "blue" : 240
case "magenta" : 300
case "green" : 120
case "yellow" : 70
}
Light.sendCommand(hue + ",100,100")
end
Installation
Community
- Support
- News Archive
- Presentations
- How to Contribute
- IDE Setup
- How to Implement a Binding
- How to Implement an Action
- Projects using openHAB
- User Interfaces
- Classic UI
- iOS Client
- Android Client
- GreenT UI
- CometVisu
- Bindings
- Asterisk Binding
- Astro Binding
- Bluetooth Binding
- Comfo Air Binding
- CUL Binding
- CUPS Binding
- digitalSTROM Binding
- DMX512 Binding
- EnOcean Binding
- Epson Projector Binding
- Exec Binding
- Fritz!Box Binding
- Fritz AHA Binding
- GPIO Binding
- HDAnywhere binding
- Heatmiser Binding
- Homematic Binding
- HTTP Binding
- IHC / ELKO Binding
- Insteon Hub Binding
- Insteon PLM Binding
- Ir-Trans Binding
- KNX Binding
- Koubachi Binding
- MAX!Cube-Binding
- MiLight Binding
- Modbus TCP Binding
- MPD Binding
- MQTT Binding
- MQTTitude binding
- Neohub Binding (Preview)
- Netatmo Binding
- Network Health Binding
- Nibe Heatpump Binding
- Nikobus Binding
- Novelan/Luxtronic Heatpump Binding
- NTP Binding
- One-Wire Binding
- Onkyo AV Receiver Binding
- Open Energy Monitor Binding
- OpenPaths presence detection binding
- OpenSprinkler Binding
- OSGi Configuration Admin Binding
- Philips Hue Binding
- Piface Binding
- Pioneer-AVR-Binding
- Plugwise Binding
- PLCBus Binding
- Pulseaudio Binding
- RFXCOM Binding
- Samsung TV Binding
- Serial Binding
- Snmp Binding
- Squeezebox Binding
- System Info Binding
- Somfy URTSI II Binding
- Sonos Binding
- Swegon ventilation Binding
- TCP/UDP Binding
- Tellstick Binding
- TinkerForge Binding
- VDR Binding
- Velleman-K8055-Binding
- Wake-on-LAN Binding
- Withings Binding
- XBMC Binding
- xPL Binding
- Z-Wave Binding
- Persistence
- db4o Persistence
- rrd4j Persistence
- MySQL Persistence
- MongoDB Persistence
- Sen.Se Persistence
- Cosm Persistence
- Logging Persistence
- Exec Persistence
- MQTT Persistence
- Automation
- Scripts
- Rules
- Actions
- Misc
- REST-API
- Security
- Google Calendar Support
- Twitter Action
- Service Discovery
- Dropbox Bundle
Samples
- Item definitions
- Sitemap definitions
- Binding configurations
- Rules
- REST Examples
- Tips & Tricks
- FAQ
- XSLT Transforms
- Scripts
- Integration with other applications
- Syntax highlighting for external editors
- Update-Scripts
- Samples-Comfo-Air-Binding
- Samples WAC Binding
Release Notes