From da130e40e34cddc21503f81c240c49001eab9aab Mon Sep 17 00:00:00 2001 From: Kai Kreuzer Date: Mon, 20 Feb 2017 10:47:21 +0100 Subject: [PATCH] updated generated content Signed-off-by: Kai Kreuzer --- _data/addons.csv | 2 +- _data/oh1addons.csv | 1 + addons/actions/astro/readme.md | 3 +- addons/actions/ciscospark/readme.md | 3 +- addons/actions/dscalarm/readme.md | 3 +- addons/actions/ecobee/readme.md | 3 +- addons/actions/harmonyhub/readme.md | 3 +- addons/actions/homematic/readme.md | 3 +- addons/actions/mail/readme.md | 3 +- addons/actions/mios/readme.md | 3 +- addons/actions/mqtt/readme.md | 3 +- addons/actions/nma/readme.md | 3 +- addons/actions/openwebif/readme.md | 3 +- addons/actions/pebble/readme.md | 3 +- addons/actions/prowl/readme.md | 3 +- addons/actions/pushover/readme.md | 3 +- addons/actions/pushsafer/readme.md | 3 +- addons/actions/satel/readme.md | 3 +- addons/actions/squeezebox/readme.md | 3 +- addons/actions/telegram/readme.md | 3 +- addons/actions/tinkerforge/readme.md | 3 +- addons/actions/twitter/readme.md | 3 +- addons/actions/weather/readme.md | 3 +- addons/actions/xbmc/readme.md | 3 +- addons/actions/xmpp/readme.md | 3 +- addons/actions/xpl/readme.md | 3 +- addons/bindings/akm8681/readme.md | 3 +- addons/bindings/alarmdecoder1/readme.md | 3 +- addons/bindings/allplay/readme.md | 1 + addons/bindings/amazondashbutton/readme.md | 1 + addons/bindings/anel1/readme.md | 3 +- addons/bindings/asterisk1/readme.md | 3 +- addons/bindings/astro/readme.md | 17 +- addons/bindings/astro1/readme.md | 3 +- addons/bindings/atlona/readme.md | 1 + addons/bindings/autelis/readme.md | 1 + addons/bindings/autelis1/readme.md | 3 +- addons/bindings/avmfritz/readme.md | 1 + addons/bindings/benqprojector1/readme.md | 3 +- addons/bindings/bluetooth1/readme.md | 3 +- addons/bindings/boschindego/readme.md | 1 + addons/bindings/bticino1/readme.md | 3 +- addons/bindings/caldav-command1/readme.md | 3 +- addons/bindings/caldav-personal1/readme.md | 3 +- addons/bindings/chromecast/readme.md | 1 + addons/bindings/comfoair1/readme.md | 3 +- addons/bindings/configadmin1/readme.md | 3 +- addons/bindings/coolmasternet/readme.md | 1 + addons/bindings/cups1/readme.md | 3 +- addons/bindings/daikin1/readme.md | 3 +- addons/bindings/davis1/readme.md | 3 +- addons/bindings/ddwrt1/readme.md | 3 +- addons/bindings/denon1/readme.md | 3 +- addons/bindings/digitalstrom1/readme.md | 3 +- addons/bindings/diyonxbee1/readme.md | 3 +- addons/bindings/dmx1/readme.md | 3 +- addons/bindings/dscalarm/readme.md | 1 + addons/bindings/dscalarm1/readme.md | 3 +- addons/bindings/dsmr1/readme.md | 3 +- addons/bindings/ebus1/readme.md | 3 +- addons/bindings/ecobee1/readme.md | 3 +- addons/bindings/ecotouch1/readme.md | 3 +- addons/bindings/ekey1/readme.md | 3 +- addons/bindings/energenie1/readme.md | 3 +- addons/bindings/enocean1/readme.md | 3 +- addons/bindings/enphaseenergy1/readme.md | 3 +- addons/bindings/epsonprojector1/readme.md | 3 +- addons/bindings/exec/readme.md | 1 + addons/bindings/exec1/readme.md | 3 +- addons/bindings/expire1/readme.md | 3 +- addons/bindings/fatekplc1/readme.md | 3 +- addons/bindings/feed/readme.md | 1 + addons/bindings/fht1/readme.md | 3 +- addons/bindings/freebox/readme.md | 1 + addons/bindings/freebox1/readme.md | 3 +- addons/bindings/freeswitch1/readme.md | 3 +- addons/bindings/fritzaha1/readme.md | 3 +- addons/bindings/fritzbox1/readme.md | 3 +- addons/bindings/fritzboxtr0641/readme.md | 3 +- .../bindings/frontiersiliconradio1/readme.md | 3 +- addons/bindings/fs201/readme.md | 3 +- addons/bindings/garadget1/readme.md | 3 +- addons/bindings/gardena/readme.md | 1 + addons/bindings/gc100ir1/readme.md | 3 +- addons/bindings/globalcache/readme.md | 1 + addons/bindings/gpio1/readme.md | 3 +- addons/bindings/harmonyhub/readme.md | 1 + addons/bindings/harmonyhub1/readme.md | 3 +- addons/bindings/hdanywhere/readme.md | 1 + addons/bindings/hdanywhere1/readme.md | 3 +- addons/bindings/hdpowerview/readme.md | 1 + addons/bindings/heatmiser1/readme.md | 3 +- addons/bindings/hms1/readme.md | 3 +- addons/bindings/homematic/readme.md | 1 + addons/bindings/homematic1/readme.md | 3 +- addons/bindings/horizon1/readme.md | 3 +- addons/bindings/http1/readme.md | 3 +- addons/bindings/hue1/readme.md | 3 +- addons/bindings/iec6205621meter1/readme.md | 3 +- addons/bindings/ihc1/readme.md | 3 +- addons/bindings/insteonhub1/readme.md | 3 +- addons/bindings/insteonplm1/readme.md | 3 +- addons/bindings/intertechno1/readme.md | 3 +- addons/bindings/ipp/readme.md | 1 + addons/bindings/ipx8001/readme.md | 3 +- addons/bindings/irtrans1/readme.md | 3 +- addons/bindings/jointspace1/readme.md | 3 +- addons/bindings/k80551/readme.md | 3 +- addons/bindings/keba/readme.md | 1 + addons/bindings/km2001/readme.md | 3 +- addons/bindings/knx1/readme.md | 3 +- addons/bindings/kodi/readme.md | 51 +- addons/bindings/koubachi1/readme.md | 3 +- addons/bindings/lcn1/readme.md | 3 +- addons/bindings/lgtv1/readme.md | 3 +- addons/bindings/lgtvserial/readme.md | 1 + addons/bindings/lightwaverf1/readme.md | 3 +- addons/bindings/lutron/readme.md | 1 + addons/bindings/mailcontrol1/readme.md | 3 +- addons/bindings/max/readme.md | 6 +- addons/bindings/maxcube1/readme.md | 3 +- addons/bindings/maxcul1/readme.md | 3 +- addons/bindings/mcp230171/readme.md | 3 +- addons/bindings/mcp34241/readme.md | 3 +- addons/bindings/meteostick/readme.md | 1 + addons/bindings/milight/readme.md | 1 + addons/bindings/milight1/readme.md | 3 +- addons/bindings/minecraft/readme.md | 1 + addons/bindings/mios1/readme.md | 3 +- addons/bindings/mochadx101/readme.md | 3 +- addons/bindings/modbus1/readme.md | 295 ++++------- addons/bindings/mpd1/readme.md | 3 +- addons/bindings/mqtt1/readme.md | 3 +- addons/bindings/mqttitude1/readme.md | 3 +- addons/bindings/myq1/readme.md | 3 +- addons/bindings/mystromecopower1/readme.md | 3 +- addons/bindings/neohub1/readme.md | 3 +- addons/bindings/nest1/readme.md | 3 +- addons/bindings/netatmo1/readme.md | 3 +- addons/bindings/network/readme.md | 1 + addons/bindings/networkhealth1/readme.md | 3 +- addons/bindings/networkupstools1/readme.md | 3 +- addons/bindings/nibeheatpump1/readme.md | 3 +- addons/bindings/nikobus1/readme.md | 3 +- addons/bindings/novelanheatpump1/readme.md | 3 +- addons/bindings/ntp1/readme.md | 3 +- addons/bindings/oceanic/readme.md | 1 + addons/bindings/omnilink1/readme.md | 3 +- addons/bindings/onewire1/readme.md | 3 +- addons/bindings/onkyo/readme.md | 1 + addons/bindings/onkyo1/readme.md | 3 +- addons/bindings/openenergymonitor1/readme.md | 3 +- addons/bindings/openpaths1/readme.md | 3 +- addons/bindings/opensprinkler/readme.md | 1 + addons/bindings/opensprinkler1/readme.md | 3 +- addons/bindings/orvibo/readme.md | 1 + addons/bindings/owserver1/readme.md | 3 +- addons/bindings/panasonictv1/readme.md | 3 +- addons/bindings/panstamp1/readme.md | 3 +- addons/bindings/piface1/readme.md | 3 +- addons/bindings/pilight1/readme.md | 3 +- addons/bindings/pioneeravr/readme.md | 1 + addons/bindings/pioneeravr1/readme.md | 3 +- addons/bindings/plcbus1/readme.md | 3 +- addons/bindings/plclogo1/readme.md | 3 +- addons/bindings/plex1/readme.md | 3 +- addons/bindings/plugwise1/readme.md | 3 +- addons/bindings/powerdoglocalapi1/readme.md | 3 +- addons/bindings/powermax1/readme.md | 3 +- addons/bindings/primare1/readme.md | 3 +- addons/bindings/pulseaudio/readme.md | 1 + addons/bindings/pulseaudio1/readme.md | 3 +- addons/bindings/rfxcom/readme.md | 1 + addons/bindings/rfxcom1/readme.md | 3 +- addons/bindings/rme/readme.md | 1 + addons/bindings/rpircswitch1/readme.md | 3 +- addons/bindings/russound/readme.md | 1 + addons/bindings/rwesmarthome1/readme.md | 3 +- addons/bindings/sagercaster1/readme.md | 3 +- addons/bindings/sallegra1/readme.md | 3 +- addons/bindings/samsungac1/readme.md | 3 +- addons/bindings/samsungtv/readme.md | 1 + addons/bindings/samsungtv1/readme.md | 3 +- addons/bindings/sapp1/readme.md | 3 +- addons/bindings/satel1/readme.md | 3 +- addons/bindings/serial1/readme.md | 3 +- .../bindings/silvercrestwifisocket/readme.md | 1 + addons/bindings/smaenergymeter/readme.md | 1 + addons/bindings/smarthomatic1/readme.md | 3 +- addons/bindings/snmp1/readme.md | 3 +- addons/bindings/sonance1/readme.md | 3 +- addons/bindings/sonos1/readme.md | 3 +- addons/bindings/souliss1/readme.md | 3 +- addons/bindings/squeezebox/readme.md | 1 + addons/bindings/squeezebox1/readme.md | 3 +- addons/bindings/stiebelheatpump1/readme.md | 3 +- addons/bindings/swegonventilation1/readme.md | 3 +- addons/bindings/systeminfo/readme.md | 1 + addons/bindings/systeminfo1/readme.md | 3 +- addons/bindings/tacmi1/readme.md | 3 +- addons/bindings/tcp1/readme.md | 3 +- addons/bindings/tellstick/readme.md | 1 + addons/bindings/tellstick1/readme.md | 3 +- addons/bindings/tesla/readme.md | 1 + addons/bindings/tinkerforge1/readme.md | 3 +- addons/bindings/tivo1/readme.md | 3 +- addons/bindings/ucprelayboard1/readme.md | 3 +- addons/bindings/upb1/readme.md | 3 +- addons/bindings/urtsi/readme.md | 1 + addons/bindings/urtsi1/readme.md | 3 +- addons/bindings/vdr1/readme.md | 3 +- addons/bindings/vitotronic/readme.md | 1 + addons/bindings/wago1/readme.md | 3 +- addons/bindings/weather1/readme.md | 3 +- addons/bindings/wemo1/readme.md | 3 +- addons/bindings/wifiled/readme.md | 1 + addons/bindings/withings1/readme.md | 3 +- addons/bindings/wol1/readme.md | 3 +- addons/bindings/xbmc1/readme.md | 3 +- addons/bindings/xpl1/readme.md | 3 +- addons/bindings/yamahareceiver/readme.md | 1 + addons/bindings/yamahareceiver1/readme.md | 3 +- addons/bindings/zibase1/readme.md | 3 +- addons/bindings/zoneminder/readme.md | 1 + addons/bindings/zwave1/readme.md | 3 +- addons/bindings/zway/readme.md | 1 + addons/io/dropbox/readme.md | 132 +++++ addons/io/gcal/readme.md | 167 ++++++ addons/io/homekit/readme.md | 117 +++++ addons/io/hueemulation/readme.md | 44 ++ addons/io/imperihome/readme.md | 477 ++++++++++++++++++ addons/io/openhabcloud/doc/cfg.png | Bin 0 -> 85698 bytes addons/io/openhabcloud/readme.md | 64 +++ addons/persistence/caldav/readme.md | 3 +- addons/persistence/cosm/readme.md | 3 +- addons/persistence/db4o/readme.md | 3 +- addons/persistence/dynamodb/readme.md | 3 +- addons/persistence/exec/readme.md | 3 +- addons/persistence/influxdb/readme.md | 3 +- addons/persistence/influxdb08/readme.md | 3 +- addons/persistence/jdbc/readme.md | 3 +- addons/persistence/jpa/readme.md | 3 +- addons/persistence/mapdb/readme.md | 3 +- addons/persistence/mongodb/readme.md | 3 +- addons/persistence/mqtt/readme.md | 3 +- addons/persistence/mysql/readme.md | 3 +- addons/persistence/rrd4j/readme.md | 3 +- addons/persistence/sense/readme.md | 3 +- addons/persistence/sitewhere/readme.md | 3 +- addons/uis/habmin/readme.md | 4 + addons/uis/habpanel/readme.md | 4 + addons/voice/voicerss/readme.md | 4 + 252 files changed, 1595 insertions(+), 402 deletions(-) create mode 100644 addons/io/dropbox/readme.md create mode 100644 addons/io/gcal/readme.md create mode 100644 addons/io/homekit/readme.md create mode 100644 addons/io/hueemulation/readme.md create mode 100644 addons/io/imperihome/readme.md create mode 100644 addons/io/openhabcloud/doc/cfg.png create mode 100644 addons/io/openhabcloud/readme.md diff --git a/_data/addons.csv b/_data/addons.csv index 45d1b120b..0ee183236 100644 --- a/_data/addons.csv +++ b/_data/addons.csv @@ -253,7 +253,7 @@ oh1,persistence,mysql,false,MySQL,"This service allows you to persist state upda oh1,persistence,rrd4j,false,rrd4j,"The [rrd4j](https://github.com/rrd4j/rrd4j) Persistence service is based on a round-robin database." oh1,persistence,sense,false,Sen.Se,"This service allows you to feed item data to [Sen.Se web site](http://open.sen.se)." oh1,persistence,sitewhere,false,SiteWhere,"The [SiteWhere](http://www.sitewhere.org/) persistence service allows openHAB item states to be forwarded to a SiteWhere server instance running locally or in the cloud. Selected events from an openHAB instance can be stored in SiteWhere under a virtual device with hardware ID specified in the persistence provider implementation." -oh1,io,dropbox,true,Dropbox Synchronization,"This service will synchronize files on your openHAB server, such as configuration and log files, to and/or from your Dropbox account." +oh1,io,dropbox,true,Dropbox Synchronization,"This service will synchronize files on the openHAB server, such as configuration and log files, to and/or from a Dropbox account." oh1,io,gcal,true,Google Calendar Scheduler,"The Google Calendar Scheduler allows you to control items in openHAB at scheduled times in the future. It will send commands to items or update the state of items when defined on one of your Google Calendars." oh2,io,homekit,false,HomeKit Add-on,"This is an add-on that exposes your openHAB system as a bridge over the HomeKit protocol." oh2,io,hueemulation,false,openHAB Hue Emulation,"Hue Emulation exposes openHAB items as Hue devices to other Hue HTTP API compatible applications like an Amazon Echo." diff --git a/_data/oh1addons.csv b/_data/oh1addons.csv index 41f4ca941..2f003b380 100644 --- a/_data/oh1addons.csv +++ b/_data/oh1addons.csv @@ -104,3 +104,4 @@ persistence,mqtt,MQTT Persistence persistence,mysql,MySQL Persistence persistence,rrd4j,RRD4j Persistence misc,gcal1,Google Calendar Scheduler +misc,dropbox1,Dropbox Synchronization Service diff --git a/addons/actions/astro/readme.md b/addons/actions/astro/readme.md index a7a028cff..22d5a8dde 100644 --- a/addons/actions/astro/readme.md +++ b/addons/actions/astro/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Astro - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.astro/README.md --- + {% include base.html %} diff --git a/addons/actions/ciscospark/readme.md b/addons/actions/ciscospark/readme.md index a886621ae..8c2ff9ab4 100644 --- a/addons/actions/ciscospark/readme.md +++ b/addons/actions/ciscospark/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Cisco Spark - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.ciscospark/README.md --- + {% include base.html %} diff --git a/addons/actions/dscalarm/readme.md b/addons/actions/dscalarm/readme.md index ae28506eb..00f3ac993 100644 --- a/addons/actions/dscalarm/readme.md +++ b/addons/actions/dscalarm/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DSC Alarm - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.dscalarm/README.md --- + {% include base.html %} diff --git a/addons/actions/ecobee/readme.md b/addons/actions/ecobee/readme.md index ea2815e53..51e1134b5 100644 --- a/addons/actions/ecobee/readme.md +++ b/addons/actions/ecobee/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Ecobee - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.ecobee/README.md --- + {% include base.html %} diff --git a/addons/actions/harmonyhub/readme.md b/addons/actions/harmonyhub/readme.md index f48c58c38..a595d01e1 100644 --- a/addons/actions/harmonyhub/readme.md +++ b/addons/actions/harmonyhub/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Logitech Harmony Hub - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.harmonyhub/README.md --- + {% include base.html %} diff --git a/addons/actions/homematic/readme.md b/addons/actions/homematic/readme.md index db893c357..69ef73a76 100644 --- a/addons/actions/homematic/readme.md +++ b/addons/actions/homematic/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Homematic - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.homematic/README.md --- + {% include base.html %} diff --git a/addons/actions/mail/readme.md b/addons/actions/mail/readme.md index 3c86437f5..91c55f2a8 100644 --- a/addons/actions/mail/readme.md +++ b/addons/actions/mail/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Mail - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.mail/README.md --- + {% include base.html %} diff --git a/addons/actions/mios/readme.md b/addons/actions/mios/readme.md index 49a3ce284..3703abae9 100644 --- a/addons/actions/mios/readme.md +++ b/addons/actions/mios/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MiOS - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.mios/README.md --- + {% include base.html %} diff --git a/addons/actions/mqtt/readme.md b/addons/actions/mqtt/readme.md index 4feb69dee..55755c58e 100644 --- a/addons/actions/mqtt/readme.md +++ b/addons/actions/mqtt/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MQTT - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.mqtt/README.md --- + {% include base.html %} diff --git a/addons/actions/nma/readme.md b/addons/actions/nma/readme.md index 4bf0f31e3..cf507c9b4 100644 --- a/addons/actions/nma/readme.md +++ b/addons/actions/nma/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: NotifyMyAndroid - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.nma/README.md --- + {% include base.html %} diff --git a/addons/actions/openwebif/readme.md b/addons/actions/openwebif/readme.md index 2f409f3e4..3e4e6247c 100644 --- a/addons/actions/openwebif/readme.md +++ b/addons/actions/openwebif/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OpenWebIf - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.openwebif/README.md --- + {% include base.html %} diff --git a/addons/actions/pebble/readme.md b/addons/actions/pebble/readme.md index ac0ffe1ee..1760bb8af 100644 --- a/addons/actions/pebble/readme.md +++ b/addons/actions/pebble/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Pebble - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.pebble/README.md --- + {% include base.html %} diff --git a/addons/actions/prowl/readme.md b/addons/actions/prowl/readme.md index 0564292ce..c06664225 100644 --- a/addons/actions/prowl/readme.md +++ b/addons/actions/prowl/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Prowl - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.prowl/README.md --- + {% include base.html %} diff --git a/addons/actions/pushover/readme.md b/addons/actions/pushover/readme.md index 6b3edb429..0efc88f79 100644 --- a/addons/actions/pushover/readme.md +++ b/addons/actions/pushover/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Pushover - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.pushover/README.md --- + {% include base.html %} diff --git a/addons/actions/pushsafer/readme.md b/addons/actions/pushsafer/readme.md index 340665e8d..ab21df280 100644 --- a/addons/actions/pushsafer/readme.md +++ b/addons/actions/pushsafer/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Pushsafer - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.pushsafer/README.md --- + {% include base.html %} diff --git a/addons/actions/satel/readme.md b/addons/actions/satel/readme.md index 81428df58..4c851cddc 100644 --- a/addons/actions/satel/readme.md +++ b/addons/actions/satel/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Satel - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.satel/README.md --- + {% include base.html %} diff --git a/addons/actions/squeezebox/readme.md b/addons/actions/squeezebox/readme.md index 8b1aa42f4..1ae213d89 100644 --- a/addons/actions/squeezebox/readme.md +++ b/addons/actions/squeezebox/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Squeezebox - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.squeezebox/README.md --- + {% include base.html %} diff --git a/addons/actions/telegram/readme.md b/addons/actions/telegram/readme.md index 10a58bf7a..243ae14dd 100644 --- a/addons/actions/telegram/readme.md +++ b/addons/actions/telegram/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Telegram - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.telegram/README.md --- + {% include base.html %} diff --git a/addons/actions/tinkerforge/readme.md b/addons/actions/tinkerforge/readme.md index 9006e84dc..c61b58206 100644 --- a/addons/actions/tinkerforge/readme.md +++ b/addons/actions/tinkerforge/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: TinkerForge - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.tinkerforge/README.md --- + {% include base.html %} diff --git a/addons/actions/twitter/readme.md b/addons/actions/twitter/readme.md index 7273a1e16..77729d407 100644 --- a/addons/actions/twitter/readme.md +++ b/addons/actions/twitter/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Twitter - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.twitter/README.md --- + {% include base.html %} diff --git a/addons/actions/weather/readme.md b/addons/actions/weather/readme.md index 50a362069..0f16a60f0 100644 --- a/addons/actions/weather/readme.md +++ b/addons/actions/weather/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Weather - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.weather/README.md --- + {% include base.html %} diff --git a/addons/actions/xbmc/readme.md b/addons/actions/xbmc/readme.md index 34c7ff93a..47ef007cc 100644 --- a/addons/actions/xbmc/readme.md +++ b/addons/actions/xbmc/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: XBMC - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.xbmc/README.md --- + {% include base.html %} diff --git a/addons/actions/xmpp/readme.md b/addons/actions/xmpp/readme.md index 6c18a5054..540d65b9e 100644 --- a/addons/actions/xmpp/readme.md +++ b/addons/actions/xmpp/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: XMPP - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.xmpp/README.md --- + {% include base.html %} diff --git a/addons/actions/xpl/readme.md b/addons/actions/xpl/readme.md index 2dd544d60..f12a2d25a 100644 --- a/addons/actions/xpl/readme.md +++ b/addons/actions/xpl/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: xPL - Actions -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/action/org.openhab.action.xpl/README.md --- + {% include base.html %} diff --git a/addons/bindings/akm8681/readme.md b/addons/bindings/akm8681/readme.md index 9271b88da..3be2d17a1 100644 --- a/addons/bindings/akm8681/readme.md +++ b/addons/bindings/akm8681/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: AKM868 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.akm868/README.md --- + {% include base.html %} diff --git a/addons/bindings/alarmdecoder1/readme.md b/addons/bindings/alarmdecoder1/readme.md index d7c1ba1c6..ad43887d4 100644 --- a/addons/bindings/alarmdecoder1/readme.md +++ b/addons/bindings/alarmdecoder1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Alarm Decoder - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.alarmdecoder/README.md --- + {% include base.html %} diff --git a/addons/bindings/allplay/readme.md b/addons/bindings/allplay/readme.md index 25330df2d..b16ec0bdb 100644 --- a/addons/bindings/allplay/readme.md +++ b/addons/bindings/allplay/readme.md @@ -3,6 +3,7 @@ layout: documentation title: AllPlay - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/amazondashbutton/readme.md b/addons/bindings/amazondashbutton/readme.md index 1c4757b47..bd5a6176a 100644 --- a/addons/bindings/amazondashbutton/readme.md +++ b/addons/bindings/amazondashbutton/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Amazon Dash Button - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/anel1/readme.md b/addons/bindings/anel1/readme.md index 3ef1f96d2..fcec14efa 100644 --- a/addons/bindings/anel1/readme.md +++ b/addons/bindings/anel1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Anel NET-PwrCtrl - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.anel/README.md --- + {% include base.html %} diff --git a/addons/bindings/asterisk1/readme.md b/addons/bindings/asterisk1/readme.md index 2dbf3285e..c64e9a6a2 100644 --- a/addons/bindings/asterisk1/readme.md +++ b/addons/bindings/asterisk1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Asterisk - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.asterisk/README.md --- + {% include base.html %} diff --git a/addons/bindings/astro/readme.md b/addons/bindings/astro/readme.md index 32545f166..e88c772b4 100644 --- a/addons/bindings/astro/readme.md +++ b/addons/bindings/astro/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Astro - Bindings source: external --- + {% include base.html %} @@ -123,7 +124,7 @@ astro:sun:home [ geolocation="xx.xxxxxx,xx.xxxxxx", altitude=100, interval=60 ] astro:moon:home [ geolocation="xx.xxxxxx,xx.xxxxxx", interval=60 ] ``` -or optionally with an offset +or optionally with an event offset ``` astro:sun:home [ geolocation="xx.xxxxxx,xx.xxxxxx", altitude=100, interval=60 ] { @@ -135,6 +136,20 @@ astro:sun:home [ geolocation="xx.xxxxxx,xx.xxxxxx", altitude=100, interval=60 ] astro:moon:home [ geolocation="xx.xxxxxx,xx.xxxxxx", interval=60 ] ``` +or a datetime offset + +``` +astro:sun:home [ geolocation="xx.xxxxxx,xx.xxxxxx", altitude=100, interval=60 ] { + Channels: + Type start : rise#start [ + offset=5 + ] + Type end : rise#end [ + offset=5 + ] +} +``` + Items: ``` diff --git a/addons/bindings/astro1/readme.md b/addons/bindings/astro1/readme.md index c27673519..72f107bac 100644 --- a/addons/bindings/astro1/readme.md +++ b/addons/bindings/astro1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Astro - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.astro/README.md --- + {% include base.html %} diff --git a/addons/bindings/atlona/readme.md b/addons/bindings/atlona/readme.md index 0a9aea6d5..bba0ceaaa 100644 --- a/addons/bindings/atlona/readme.md +++ b/addons/bindings/atlona/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Atlona - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/autelis/readme.md b/addons/bindings/autelis/readme.md index c8f5b7046..a770b335c 100644 --- a/addons/bindings/autelis/readme.md +++ b/addons/bindings/autelis/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Autelis Pool Control - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/autelis1/readme.md b/addons/bindings/autelis1/readme.md index 141315cda..8eb82d850 100644 --- a/addons/bindings/autelis1/readme.md +++ b/addons/bindings/autelis1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Autelis - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.autelis/README.md --- + {% include base.html %} diff --git a/addons/bindings/avmfritz/readme.md b/addons/bindings/avmfritz/readme.md index 845ed80b0..3e774b881 100644 --- a/addons/bindings/avmfritz/readme.md +++ b/addons/bindings/avmfritz/readme.md @@ -3,6 +3,7 @@ layout: documentation title: AVM FRITZ! - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/benqprojector1/readme.md b/addons/bindings/benqprojector1/readme.md index 4fa76be39..ad2f3c186 100644 --- a/addons/bindings/benqprojector1/readme.md +++ b/addons/bindings/benqprojector1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: BenQ Projector - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.benqprojector/README.md --- + {% include base.html %} diff --git a/addons/bindings/bluetooth1/readme.md b/addons/bindings/bluetooth1/readme.md index 84b6309c5..f813b0611 100644 --- a/addons/bindings/bluetooth1/readme.md +++ b/addons/bindings/bluetooth1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Bluetooth - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.bluetooth/README.md --- + {% include base.html %} diff --git a/addons/bindings/boschindego/readme.md b/addons/bindings/boschindego/readme.md index 958101ffa..d54c9342a 100644 --- a/addons/bindings/boschindego/readme.md +++ b/addons/bindings/boschindego/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Bosch Indego - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/bticino1/readme.md b/addons/bindings/bticino1/readme.md index 9e52d37aa..05728ab3b 100644 --- a/addons/bindings/bticino1/readme.md +++ b/addons/bindings/bticino1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Bticino - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.bticino/README.md --- + {% include base.html %} diff --git a/addons/bindings/caldav-command1/readme.md b/addons/bindings/caldav-command1/readme.md index f45e4b42e..092f4e96d 100644 --- a/addons/bindings/caldav-command1/readme.md +++ b/addons/bindings/caldav-command1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: CalDAV Command - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.caldav-command/README.md --- + {% include base.html %} diff --git a/addons/bindings/caldav-personal1/readme.md b/addons/bindings/caldav-personal1/readme.md index ba7f81e64..bcf7a543b 100644 --- a/addons/bindings/caldav-personal1/readme.md +++ b/addons/bindings/caldav-personal1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: CalDAV Personal - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.caldav-personal/README.md --- + {% include base.html %} diff --git a/addons/bindings/chromecast/readme.md b/addons/bindings/chromecast/readme.md index 4b5881d8e..6c095708f 100644 --- a/addons/bindings/chromecast/readme.md +++ b/addons/bindings/chromecast/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Chromecast - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/comfoair1/readme.md b/addons/bindings/comfoair1/readme.md index 190e7f74e..6212b0956 100644 --- a/addons/bindings/comfoair1/readme.md +++ b/addons/bindings/comfoair1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: ComfoAir - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.comfoair/README.md --- + {% include base.html %} diff --git a/addons/bindings/configadmin1/readme.md b/addons/bindings/configadmin1/readme.md index b21ddaf55..2c74d04f7 100644 --- a/addons/bindings/configadmin1/readme.md +++ b/addons/bindings/configadmin1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: ConfigAdmin - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.configadmin/README.md --- + {% include base.html %} diff --git a/addons/bindings/coolmasternet/readme.md b/addons/bindings/coolmasternet/readme.md index 296613633..062e62a41 100644 --- a/addons/bindings/coolmasternet/readme.md +++ b/addons/bindings/coolmasternet/readme.md @@ -3,6 +3,7 @@ layout: documentation title: CoolMasterNet - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/cups1/readme.md b/addons/bindings/cups1/readme.md index d5416a4e3..00e1ec2fc 100644 --- a/addons/bindings/cups1/readme.md +++ b/addons/bindings/cups1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: CUPS - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.cups/README.md --- + {% include base.html %} diff --git a/addons/bindings/daikin1/readme.md b/addons/bindings/daikin1/readme.md index 95a6a355c..b06de59e6 100644 --- a/addons/bindings/daikin1/readme.md +++ b/addons/bindings/daikin1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Daikin - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.daikin/README.md --- + {% include base.html %} diff --git a/addons/bindings/davis1/readme.md b/addons/bindings/davis1/readme.md index 38a813126..f629cb3a3 100644 --- a/addons/bindings/davis1/readme.md +++ b/addons/bindings/davis1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Davis - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.davis/README.md --- + {% include base.html %} diff --git a/addons/bindings/ddwrt1/readme.md b/addons/bindings/ddwrt1/readme.md index 4e8548dc7..78a8b99b3 100644 --- a/addons/bindings/ddwrt1/readme.md +++ b/addons/bindings/ddwrt1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DD-WRT - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ddwrt/README.md --- + {% include base.html %} diff --git a/addons/bindings/denon1/readme.md b/addons/bindings/denon1/readme.md index 5a418a2ad..091940be6 100644 --- a/addons/bindings/denon1/readme.md +++ b/addons/bindings/denon1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Denon - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.denon/README.md --- + {% include base.html %} diff --git a/addons/bindings/digitalstrom1/readme.md b/addons/bindings/digitalstrom1/readme.md index 2e115fc9e..02242a377 100644 --- a/addons/bindings/digitalstrom1/readme.md +++ b/addons/bindings/digitalstrom1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: digitalSTROM - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.digitalstrom/README.md --- + {% include base.html %} diff --git a/addons/bindings/diyonxbee1/readme.md b/addons/bindings/diyonxbee1/readme.md index ed67fd414..c3b6352ab 100644 --- a/addons/bindings/diyonxbee1/readme.md +++ b/addons/bindings/diyonxbee1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DIYOnXBee - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.diyonxbee/README.md --- + {% include base.html %} diff --git a/addons/bindings/dmx1/readme.md b/addons/bindings/dmx1/readme.md index 2552c0bfc..1d9591df3 100644 --- a/addons/bindings/dmx1/readme.md +++ b/addons/bindings/dmx1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DMX - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.dmx/README.md --- + {% include base.html %} diff --git a/addons/bindings/dscalarm/readme.md b/addons/bindings/dscalarm/readme.md index cdd13c069..2dd7c5271 100644 --- a/addons/bindings/dscalarm/readme.md +++ b/addons/bindings/dscalarm/readme.md @@ -3,6 +3,7 @@ layout: documentation title: DSC Alarm - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/dscalarm1/readme.md b/addons/bindings/dscalarm1/readme.md index 4125d90f1..7e61735ec 100644 --- a/addons/bindings/dscalarm1/readme.md +++ b/addons/bindings/dscalarm1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DSC PowerSeries Alarm System - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.dscalarm/README.md --- + {% include base.html %} diff --git a/addons/bindings/dsmr1/readme.md b/addons/bindings/dsmr1/readme.md index 9a3ac790e..955d35bd5 100644 --- a/addons/bindings/dsmr1/readme.md +++ b/addons/bindings/dsmr1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: DSMR - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.dsmr/README.md --- + {% include base.html %} diff --git a/addons/bindings/ebus1/readme.md b/addons/bindings/ebus1/readme.md index eb31f7b67..fd63328ca 100644 --- a/addons/bindings/ebus1/readme.md +++ b/addons/bindings/ebus1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: eBUS - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ebus/README.md --- + {% include base.html %} diff --git a/addons/bindings/ecobee1/readme.md b/addons/bindings/ecobee1/readme.md index 88538ab07..53c2d10ae 100644 --- a/addons/bindings/ecobee1/readme.md +++ b/addons/bindings/ecobee1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Ecobee - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ecobee/README.md --- + {% include base.html %} diff --git a/addons/bindings/ecotouch1/readme.md b/addons/bindings/ecotouch1/readme.md index 562f0fc42..4700cbd52 100644 --- a/addons/bindings/ecotouch1/readme.md +++ b/addons/bindings/ecotouch1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: EcoTouch - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ecotouch/README.md --- + {% include base.html %} diff --git a/addons/bindings/ekey1/readme.md b/addons/bindings/ekey1/readme.md index 04b2fd319..cf9d941f3 100644 --- a/addons/bindings/ekey1/readme.md +++ b/addons/bindings/ekey1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: ekey - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ekey/README.md --- + {% include base.html %} diff --git a/addons/bindings/energenie1/readme.md b/addons/bindings/energenie1/readme.md index 6699c05f1..2f40d95ac 100644 --- a/addons/bindings/energenie1/readme.md +++ b/addons/bindings/energenie1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Energenie - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.energenie/README.md --- + {% include base.html %} diff --git a/addons/bindings/enocean1/readme.md b/addons/bindings/enocean1/readme.md index be1134774..01e64904b 100644 --- a/addons/bindings/enocean1/readme.md +++ b/addons/bindings/enocean1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: EnOcean - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.enocean/README.md --- + {% include base.html %} diff --git a/addons/bindings/enphaseenergy1/readme.md b/addons/bindings/enphaseenergy1/readme.md index 20f96914b..548e2bbe8 100644 --- a/addons/bindings/enphaseenergy1/readme.md +++ b/addons/bindings/enphaseenergy1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Enphase Energy - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.enphaseenergy/README.md --- + {% include base.html %} diff --git a/addons/bindings/epsonprojector1/readme.md b/addons/bindings/epsonprojector1/readme.md index d4cacd4d6..8671f6393 100644 --- a/addons/bindings/epsonprojector1/readme.md +++ b/addons/bindings/epsonprojector1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Epson Projector - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.epsonprojector/README.md --- + {% include base.html %} diff --git a/addons/bindings/exec/readme.md b/addons/bindings/exec/readme.md index f6919e08e..8c6118d9e 100644 --- a/addons/bindings/exec/readme.md +++ b/addons/bindings/exec/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Exec - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/exec1/readme.md b/addons/bindings/exec1/readme.md index 191588384..d69ae18b8 100644 --- a/addons/bindings/exec1/readme.md +++ b/addons/bindings/exec1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Exec - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.exec/README.md --- + {% include base.html %} diff --git a/addons/bindings/expire1/readme.md b/addons/bindings/expire1/readme.md index f8789ec04..8bc2eec4c 100644 --- a/addons/bindings/expire1/readme.md +++ b/addons/bindings/expire1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Expire - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.expire/README.md --- + {% include base.html %} diff --git a/addons/bindings/fatekplc1/readme.md b/addons/bindings/fatekplc1/readme.md index 2656aed8e..d421ff90b 100644 --- a/addons/bindings/fatekplc1/readme.md +++ b/addons/bindings/fatekplc1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Fatek PLC - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fatekplc/README.md --- + {% include base.html %} diff --git a/addons/bindings/feed/readme.md b/addons/bindings/feed/readme.md index 96e55fda6..1823a8b0e 100644 --- a/addons/bindings/feed/readme.md +++ b/addons/bindings/feed/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Feed - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/fht1/readme.md b/addons/bindings/fht1/readme.md index 9d5e277a6..da281d913 100644 --- a/addons/bindings/fht1/readme.md +++ b/addons/bindings/fht1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: FHT - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fht/README.md --- + {% include base.html %} diff --git a/addons/bindings/freebox/readme.md b/addons/bindings/freebox/readme.md index a7fadc4b6..d8dec4d1e 100644 --- a/addons/bindings/freebox/readme.md +++ b/addons/bindings/freebox/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Freebox - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/freebox1/readme.md b/addons/bindings/freebox1/readme.md index 93565e57f..6dafeb6ac 100644 --- a/addons/bindings/freebox1/readme.md +++ b/addons/bindings/freebox1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Freebox - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.freebox/README.md --- + {% include base.html %} diff --git a/addons/bindings/freeswitch1/readme.md b/addons/bindings/freeswitch1/readme.md index 51b95f7e5..cf4e4f1f9 100644 --- a/addons/bindings/freeswitch1/readme.md +++ b/addons/bindings/freeswitch1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: FreeSWITCH - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.freeswitch/README.md --- + {% include base.html %} diff --git a/addons/bindings/fritzaha1/readme.md b/addons/bindings/fritzaha1/readme.md index 3aed83388..3abeb704b 100644 --- a/addons/bindings/fritzaha1/readme.md +++ b/addons/bindings/fritzaha1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Fritz AHA - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fritzaha/README.md --- + {% include base.html %} diff --git a/addons/bindings/fritzbox1/readme.md b/addons/bindings/fritzbox1/readme.md index 5ef402cf2..d0ed49654 100644 --- a/addons/bindings/fritzbox1/readme.md +++ b/addons/bindings/fritzbox1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Fritz!Box - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fritzbox/README.md --- + {% include base.html %} diff --git a/addons/bindings/fritzboxtr0641/readme.md b/addons/bindings/fritzboxtr0641/readme.md index 9e37ae848..9f21ae32b 100644 --- a/addons/bindings/fritzboxtr0641/readme.md +++ b/addons/bindings/fritzboxtr0641/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Fritzbox (using TR064 protocol) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fritzboxtr064/README.md --- + {% include base.html %} diff --git a/addons/bindings/frontiersiliconradio1/readme.md b/addons/bindings/frontiersiliconradio1/readme.md index 804adcd16..bc33aa1f3 100644 --- a/addons/bindings/frontiersiliconradio1/readme.md +++ b/addons/bindings/frontiersiliconradio1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Frontier Silicon Radio - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.frontiersiliconradio/README.md --- + {% include base.html %} diff --git a/addons/bindings/fs201/readme.md b/addons/bindings/fs201/readme.md index 71536ac3d..3049c8938 100644 --- a/addons/bindings/fs201/readme.md +++ b/addons/bindings/fs201/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: FS20 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.fs20/README.md --- + {% include base.html %} diff --git a/addons/bindings/garadget1/readme.md b/addons/bindings/garadget1/readme.md index a0edd7517..9c0769977 100644 --- a/addons/bindings/garadget1/readme.md +++ b/addons/bindings/garadget1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Garadget - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.garadget/README.md --- + {% include base.html %} diff --git a/addons/bindings/gardena/readme.md b/addons/bindings/gardena/readme.md index 32a7a083b..055bc9534 100644 --- a/addons/bindings/gardena/readme.md +++ b/addons/bindings/gardena/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Gardena - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/gc100ir1/readme.md b/addons/bindings/gc100ir1/readme.md index 65574d1fa..8c67f7748 100644 --- a/addons/bindings/gc100ir1/readme.md +++ b/addons/bindings/gc100ir1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Global Cache IR - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.gc100ir/README.md --- + {% include base.html %} diff --git a/addons/bindings/globalcache/readme.md b/addons/bindings/globalcache/readme.md index 4c733b634..fcd747542 100644 --- a/addons/bindings/globalcache/readme.md +++ b/addons/bindings/globalcache/readme.md @@ -3,6 +3,7 @@ layout: documentation title: GlobalCache - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/gpio1/readme.md b/addons/bindings/gpio1/readme.md index 4a6badb74..9826aea23 100644 --- a/addons/bindings/gpio1/readme.md +++ b/addons/bindings/gpio1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: GPIO - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.gpio/README.md --- + {% include base.html %} diff --git a/addons/bindings/harmonyhub/readme.md b/addons/bindings/harmonyhub/readme.md index 7c7095850..4e2a0c309 100644 --- a/addons/bindings/harmonyhub/readme.md +++ b/addons/bindings/harmonyhub/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Logitech Harmony Hub - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/harmonyhub1/readme.md b/addons/bindings/harmonyhub1/readme.md index 096eac38a..7da057de4 100644 --- a/addons/bindings/harmonyhub1/readme.md +++ b/addons/bindings/harmonyhub1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Harmony Hub - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.harmonyhub/README.md --- + {% include base.html %} diff --git a/addons/bindings/hdanywhere/readme.md b/addons/bindings/hdanywhere/readme.md index 79c9d1173..bb3516508 100644 --- a/addons/bindings/hdanywhere/readme.md +++ b/addons/bindings/hdanywhere/readme.md @@ -3,6 +3,7 @@ layout: documentation title: HDanywhere - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/hdanywhere1/readme.md b/addons/bindings/hdanywhere1/readme.md index 315ed8f88..6ee7c2653 100644 --- a/addons/bindings/hdanywhere1/readme.md +++ b/addons/bindings/hdanywhere1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: HDanywhere - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.hdanywhere/README.md --- + {% include base.html %} diff --git a/addons/bindings/hdpowerview/readme.md b/addons/bindings/hdpowerview/readme.md index e5545ea1e..f15ff4bdc 100644 --- a/addons/bindings/hdpowerview/readme.md +++ b/addons/bindings/hdpowerview/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Hunter Douglas PowerView - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/heatmiser1/readme.md b/addons/bindings/heatmiser1/readme.md index 5df0823f8..883f21a59 100644 --- a/addons/bindings/heatmiser1/readme.md +++ b/addons/bindings/heatmiser1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Heatmiser - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.heatmiser/README.md --- + {% include base.html %} diff --git a/addons/bindings/hms1/readme.md b/addons/bindings/hms1/readme.md index a3c251d70..f12e00864 100644 --- a/addons/bindings/hms1/readme.md +++ b/addons/bindings/hms1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: HMS - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.hms/README.md --- + {% include base.html %} diff --git a/addons/bindings/homematic/readme.md b/addons/bindings/homematic/readme.md index 9fe386ce3..5e65fd8fd 100644 --- a/addons/bindings/homematic/readme.md +++ b/addons/bindings/homematic/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Homematic - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/homematic1/readme.md b/addons/bindings/homematic1/readme.md index 466805250..0c35cac37 100644 --- a/addons/bindings/homematic1/readme.md +++ b/addons/bindings/homematic1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Homematic - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.homematic/README.md --- + {% include base.html %} diff --git a/addons/bindings/horizon1/readme.md b/addons/bindings/horizon1/readme.md index 2fc985858..7e8b2eb0c 100644 --- a/addons/bindings/horizon1/readme.md +++ b/addons/bindings/horizon1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Horizon mediabox - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.horizon/README.md --- + {% include base.html %} diff --git a/addons/bindings/http1/readme.md b/addons/bindings/http1/readme.md index 23407625e..40bc90609 100644 --- a/addons/bindings/http1/readme.md +++ b/addons/bindings/http1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: HTTP - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.http/README.md --- + {% include base.html %} diff --git a/addons/bindings/hue1/readme.md b/addons/bindings/hue1/readme.md index 4e2d4b23e..f0087859d 100644 --- a/addons/bindings/hue1/readme.md +++ b/addons/bindings/hue1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Hue - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.hue/README.md --- + {% include base.html %} diff --git a/addons/bindings/iec6205621meter1/readme.md b/addons/bindings/iec6205621meter1/readme.md index 57880e057..91545173d 100644 --- a/addons/bindings/iec6205621meter1/readme.md +++ b/addons/bindings/iec6205621meter1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: IEC 62056-21 Meter - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.iec6205621meter/README.md --- + {% include base.html %} diff --git a/addons/bindings/ihc1/readme.md b/addons/bindings/ihc1/readme.md index 0464a6fd3..a2164de43 100644 --- a/addons/bindings/ihc1/readme.md +++ b/addons/bindings/ihc1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: IHC / ELKO - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ihc/README.md --- + {% include base.html %} diff --git a/addons/bindings/insteonhub1/readme.md b/addons/bindings/insteonhub1/readme.md index 0eacd07a0..978c58f27 100644 --- a/addons/bindings/insteonhub1/readme.md +++ b/addons/bindings/insteonhub1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Insteon Hub - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.insteonhub/README.md --- + {% include base.html %} diff --git a/addons/bindings/insteonplm1/readme.md b/addons/bindings/insteonplm1/readme.md index 137915e0b..805216c33 100644 --- a/addons/bindings/insteonplm1/readme.md +++ b/addons/bindings/insteonplm1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Insteon PLM - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.insteonplm/README.md --- + {% include base.html %} diff --git a/addons/bindings/intertechno1/readme.md b/addons/bindings/intertechno1/readme.md index b99405d98..e1799165a 100644 --- a/addons/bindings/intertechno1/readme.md +++ b/addons/bindings/intertechno1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Intertechno - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.intertechno/README.md --- + {% include base.html %} diff --git a/addons/bindings/ipp/readme.md b/addons/bindings/ipp/readme.md index 201608175..fff559820 100644 --- a/addons/bindings/ipp/readme.md +++ b/addons/bindings/ipp/readme.md @@ -3,6 +3,7 @@ layout: documentation title: IPP - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/ipx8001/readme.md b/addons/bindings/ipx8001/readme.md index 05fe98701..50632886e 100644 --- a/addons/bindings/ipx8001/readme.md +++ b/addons/bindings/ipx8001/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: IPX800 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ipx800/README.md --- + {% include base.html %} diff --git a/addons/bindings/irtrans1/readme.md b/addons/bindings/irtrans1/readme.md index 8d9c8bc39..8afa8a706 100644 --- a/addons/bindings/irtrans1/readme.md +++ b/addons/bindings/irtrans1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: IRTrans - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.irtrans/README.md --- + {% include base.html %} diff --git a/addons/bindings/jointspace1/readme.md b/addons/bindings/jointspace1/readme.md index ce683959a..9948a5dbe 100644 --- a/addons/bindings/jointspace1/readme.md +++ b/addons/bindings/jointspace1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: jointSPACE - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.jointspace/README.md --- + {% include base.html %} diff --git a/addons/bindings/k80551/readme.md b/addons/bindings/k80551/readme.md index f2d8c1c77..05bd7d35c 100644 --- a/addons/bindings/k80551/readme.md +++ b/addons/bindings/k80551/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Velleman k8055 USB IO Board - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.k8055/README.md --- + {% include base.html %} diff --git a/addons/bindings/keba/readme.md b/addons/bindings/keba/readme.md index edb78d0e0..78b2e3a46 100644 --- a/addons/bindings/keba/readme.md +++ b/addons/bindings/keba/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Keba - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/km2001/readme.md b/addons/bindings/km2001/readme.md index fe6651f9c..2ea644faa 100644 --- a/addons/bindings/km2001/readme.md +++ b/addons/bindings/km2001/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: KM200 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.km200/README.md --- + {% include base.html %} diff --git a/addons/bindings/knx1/readme.md b/addons/bindings/knx1/readme.md index d4855e54f..6ea4389e5 100644 --- a/addons/bindings/knx1/readme.md +++ b/addons/bindings/knx1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: KNX - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.knx/README.md --- + {% include base.html %} diff --git a/addons/bindings/kodi/readme.md b/addons/bindings/kodi/readme.md index 6d617740f..a0daf3525 100644 --- a/addons/bindings/kodi/readme.md +++ b/addons/bindings/kodi/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Kodi - Bindings source: external --- + {% include base.html %} @@ -70,7 +71,7 @@ The Kodi thing supports the following channels: |-------------------------|--------------|--------------| | mute | Switch | Mute/unmute your playback | | volume | Dimmer | Read or control the volume of your playback | -| control | Player | Control the Kodi player, e.g. play/pause/next/previous/ffward/rewind | +| control | Player | Control the Kodi player, e.g. `PLAY`, `PAUSE`, `NEXT`, `PREVIOUS`, `FASTFORWARD`, `REWIND` | | stop | Switch | Stops the Kodi player | | title | String | Title of the currently played song/movie/tv episode | | showtitle | String | Title of the currently played tv-show; empty for other types | @@ -80,9 +81,55 @@ The Kodi thing supports the following channels: | shownotification | String | Shows the provided notification message on the screen | | input | String | Allows to control Kodi. Valid values are: `Up`, `Down`, `Left`, `Right`, `Select`, `Back`, `Home`, `ContextMenu`, `Info`, `ShowCodec`, `ShowOSD` | | inputtext | String | This channel emulates a keyboard input | -| systemcommand | String | This channel allows to send commands to shutdown/suspend/hibernate/reboot kodi | +| systemcommand | String | This channel allows to send commands to `shutdown`, `suspend`, `hibernate`, `reboot` kodi | | mediatype | String | The media type of the current file. e.g. song or movie | +## Item Configuration + +demo.items + +``` +Switch myKodi_mute "Stumm" { channel="kodi:kodi:myKodi:mute" } +Dimmer myKodi_volume "Lautstärke [%d]" { channel="kodi:kodi:myKodi:volume" } +Player myKodi_control "Kontrolle [%s]" { channel="kodi:kodi:myKodi:control" } +Switch myKodi_stop "Stop" { channel="kodi:kodi:myKodi:stop" } +String myKodi_title "Titel [%s]" { channel="kodi:kodi:myKodi:title" } +String myKodi_showtitle "Showtitel [%s]" { channel="kodi:kodi:myKodi:showtitle" } +String myKodi_album "Album [%s]" { channel="kodi:kodi:myKodi:album" } +String myKodi_artist "Artist [%s]" { channel="kodi:kodi:myKodi:artist" } +String myKodi_playuri "PlayerURI [%s]" { channel="kodi:kodi:myKodi:playuri" } +String myKodi_notification "Benachrichtigung [%s]" { channel="kodi:kodi:myKodi:shownotification" } +String myKodi_input "Input [%s]" { channel="kodi:kodi:myKodi:input" } +String myKodi_inputtext "Inputtext [%s]" { channel="kodi:kodi:myKodi:inputtext" } +String myKodi_systemcommand "Systemcommand [%s]" { channel="kodi:kodi:myKodi:systemcommand" } +String myKodi_mediatype "Mediatyp [%s]" { channel="kodi:kodi:myKodi:mediatype" } +``` + +## Sitemap Configuration + +demo.sitemap + +``` +sitemap demo label="myKodi" +{ + Frame label="myKodi" { + Switch item=HTPC_mute + Slider item=HTPC_volume + Selection item=HTPC_control mappings=[PLAY='Play', PAUSE='Pause', NEXT='Next', PREVIOUSE'Previous', FFWARD='Fastforward', REWIND='Rewind'] + Switch item=HTPC_stop + Text item=HTPC_title + Text item=HTPC_showtitle + Text item=HTPC_album + Text item=HTPC_artist + Text item=HTPC_playuri + Text item=HTPC_notification + Text item=HTPC_input + Text item=HTPC_inputtext + Text item=HTPC_systemcommand + Text item=HTPC_mediatype + } +} +``` ## Audio Support diff --git a/addons/bindings/koubachi1/readme.md b/addons/bindings/koubachi1/readme.md index 0762c8668..42cd8ad00 100644 --- a/addons/bindings/koubachi1/readme.md +++ b/addons/bindings/koubachi1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Koubachi - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.koubachi/README.md --- + {% include base.html %} diff --git a/addons/bindings/lcn1/readme.md b/addons/bindings/lcn1/readme.md index 2111c5065..9ce048fed 100644 --- a/addons/bindings/lcn1/readme.md +++ b/addons/bindings/lcn1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: LCN - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.lcn/README.md --- + {% include base.html %} diff --git a/addons/bindings/lgtv1/readme.md b/addons/bindings/lgtv1/readme.md index ed6c4db99..beb37107d 100644 --- a/addons/bindings/lgtv1/readme.md +++ b/addons/bindings/lgtv1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: LG TV - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.lgtv/README.md --- + {% include base.html %} diff --git a/addons/bindings/lgtvserial/readme.md b/addons/bindings/lgtvserial/readme.md index 1c50bf3f4..6fc85e626 100644 --- a/addons/bindings/lgtvserial/readme.md +++ b/addons/bindings/lgtvserial/readme.md @@ -3,6 +3,7 @@ layout: documentation title: LG TV control using serial protocol - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/lightwaverf1/readme.md b/addons/bindings/lightwaverf1/readme.md index 71afa2e94..0994021b0 100644 --- a/addons/bindings/lightwaverf1/readme.md +++ b/addons/bindings/lightwaverf1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: LightwaveRF - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.lightwaverf/README.md --- + {% include base.html %} diff --git a/addons/bindings/lutron/readme.md b/addons/bindings/lutron/readme.md index ec60c97d3..e4436c3ab 100644 --- a/addons/bindings/lutron/readme.md +++ b/addons/bindings/lutron/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Lutron - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/mailcontrol1/readme.md b/addons/bindings/mailcontrol1/readme.md index 11e617625..ffb1f95fd 100644 --- a/addons/bindings/mailcontrol1/readme.md +++ b/addons/bindings/mailcontrol1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MailControl - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mailcontrol/README.md --- + {% include base.html %} diff --git a/addons/bindings/max/readme.md b/addons/bindings/max/readme.md index 508a898d5..21008c6f7 100644 --- a/addons/bindings/max/readme.md +++ b/addons/bindings/max/readme.md @@ -3,6 +3,7 @@ layout: documentation title: MAX! - Bindings source: external --- + {% include base.html %} @@ -73,8 +74,9 @@ In most cases no Things need to be defined manually. In case your Cube can't be max.things: ``` -Bridge max:bridge:KEQ0565026 [ ipAddress="192.168.3.9", serialNumber="KEQ0565026" ] -max:thermostat:KEQ0565026 [ serialNumber="KEQ0565123" ] +Bridge max:bridge:KEQ0565026 [ ipAddress="192.168.3.9", serialNumber="KEQ0565026" ] { + Thing max:thermostat:KEQ0565026:KEQ0565123 [ serialNumber="KEQ0565123" ] +} ``` max.items: diff --git a/addons/bindings/maxcube1/readme.md b/addons/bindings/maxcube1/readme.md index b36f996b2..baea5c81c 100644 --- a/addons/bindings/maxcube1/readme.md +++ b/addons/bindings/maxcube1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MAX!Cube - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.maxcube/README.md --- + {% include base.html %} diff --git a/addons/bindings/maxcul1/readme.md b/addons/bindings/maxcul1/readme.md index 2d0f316c0..55710ce8f 100644 --- a/addons/bindings/maxcul1/readme.md +++ b/addons/bindings/maxcul1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MAX!CUL - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.maxcul/README.md --- + {% include base.html %} diff --git a/addons/bindings/mcp230171/readme.md b/addons/bindings/mcp230171/readme.md index b0ae3d621..cf4424bb9 100644 --- a/addons/bindings/mcp230171/readme.md +++ b/addons/bindings/mcp230171/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MCP23017 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mcp23017/README.md --- + {% include base.html %} diff --git a/addons/bindings/mcp34241/readme.md b/addons/bindings/mcp34241/readme.md index cb267653e..1217625a8 100644 --- a/addons/bindings/mcp34241/readme.md +++ b/addons/bindings/mcp34241/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MCP3424 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mcp3424/README.md --- + {% include base.html %} diff --git a/addons/bindings/meteostick/readme.md b/addons/bindings/meteostick/readme.md index f75e58461..1ba3e5dfb 100644 --- a/addons/bindings/meteostick/readme.md +++ b/addons/bindings/meteostick/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Meteostick - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/milight/readme.md b/addons/bindings/milight/readme.md index 90fb5e080..4c5f544e8 100644 --- a/addons/bindings/milight/readme.md +++ b/addons/bindings/milight/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Milight - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/milight1/readme.md b/addons/bindings/milight1/readme.md index 40c06ac16..a328cbbed 100644 --- a/addons/bindings/milight1/readme.md +++ b/addons/bindings/milight1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Milight - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.milight/README.md --- + {% include base.html %} diff --git a/addons/bindings/minecraft/readme.md b/addons/bindings/minecraft/readme.md index 0c07bffd7..7f804970d 100644 --- a/addons/bindings/minecraft/readme.md +++ b/addons/bindings/minecraft/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Minecraft - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/mios1/readme.md b/addons/bindings/mios1/readme.md index c774d98fe..4997796a3 100644 --- a/addons/bindings/mios1/readme.md +++ b/addons/bindings/mios1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MiOS Bridge - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mios/README.md --- + {% include base.html %} diff --git a/addons/bindings/mochadx101/readme.md b/addons/bindings/mochadx101/readme.md index de26ee2ef..bbc78e83a 100644 --- a/addons/bindings/mochadx101/readme.md +++ b/addons/bindings/mochadx101/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Mochad X10 - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mochadx10/README.md --- + {% include base.html %} diff --git a/addons/bindings/modbus1/readme.md b/addons/bindings/modbus1/readme.md index 28d6777d0..f8bc89aa4 100644 --- a/addons/bindings/modbus1/readme.md +++ b/addons/bindings/modbus1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Modbus - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.modbus/README.md --- + {% include base.html %} @@ -18,28 +19,36 @@ The binding can act as The Modbus binding polls the slaves with an configurable poll period. openHAB commands are translated to write requests. +## Table of Contents - - [Binding Configuration](#binding-configuration) - - [Configuration parameters specific to each slave](#configuration-parameters-specific-to-each-slave) - - [Item Configuration](#item-configuration) +- [Binding Configuration](#binding-configuration) + - [Global configuration](#global-configuration) + - [Configuration parameters specific to each slave](#configuration-parameters-specific-to-each-slave) + - [Advanced connection parameters](#advanced-connection-parameters) +- [Item Configuration](#item-configuration) + - [Single coil/register per item](#single-coilregister-per-item) + - [Separate coils for reading and writing](#separate-coils-for-reading-and-writing) + - [input coil only for reading](#input-coil-only-for-reading) + - [Read / write register \(number\)](#read--write-register-number) - [Details](#details) - - [Modbus functions supported](#modbus-functions-supported) - - [Comment on addressing](#comment-on-addressing) - - [Many modbus binding slaves for single physical slave](#many-modbus-binding-slaves-for-single-physical-slave) - - [Read and write functions \(modbus slave type\)](#read-and-write-functions-modbus-slave-type) - - [Register interpretation \(valuetype\) on read & write](#register-interpretation-valuetype-on-read--write) + - [Modbus functions supported](#modbus-functions-supported) + - [Comment on addressing](#comment-on-addressing) + - [Many modbus binding slaves for single physical slave](#many-modbus-binding-slaves-for-single-physical-slave) + - [Read and write functions \(modbus slave type\)](#read-and-write-functions-modbus-slave-type) +- [Register interpretation \(valuetype\) on read & write](#register-interpretation-valuetype-on-read--write) + - [Write](#write) + - [Modbus RTU over TCP](#modbus-rtu-over-tcp) +- [Config Examples](#config-examples) - [Troubleshooting](#troubleshooting) - - [Enable verbose logging](#enable-verbose-logging) + - [Enable verbose logging](#enable-verbose-logging) - [For developers](#for-developers) - - [Testing serial implementation](#testing-serial-implementation) - - [Testing TCP implementation](#testing-tcp-implementation) - - [Writing data](#writing-data) - - [Troubleshooting](#troubleshooting-1) - - [Table of Contents](#table-of-contents) - - [Rollershutter Items](#rollershutter-items) + - [Testing serial implementation](#testing-serial-implementation) + - [Testing TCP implementation](#testing-tcp-implementation) + - [Writing data](#writing-data) + - [Troubleshooting](#troubleshooting-1) @@ -57,13 +66,13 @@ Most of config parameters are related to specific slaves, but some are global an | poll | 200 | No | **Poll period (optional)**
Frequency of polling Modbus slaves. Note that the value is in milliseconds! For example, `poll=1000` makes the binding poll Modbus slaves once per second. | | writemultipleregisters | false | No | **Function code to use when writing holding registers (optional)**
Binding can be configured to use FC 16 (*Write Multiple Holding Registers*) over FC 6 (*Write Single Holding Register*) when writing holding register items (see above). This is optional and default is `false`. For example, `writemultipleregisters=true` makes the binding to use FC16 when writing holding registers. | -## Configuration parameters specific to each slave +### Configuration parameters specific to each slave -The slaves are configured using key value pairs in openHAB config file. Each slave (identified by the slave name) in the config corresponds to a single modbus read request. Note that it might be necessary to define many "slaves" in openhab configuration to read all data from a single physical modbus slave. +The slaves are configured using key value pairs in openHAB config file. Each slave (identified by the slave name) in the config corresponds to a single modbus read request. Note that it might be necessary to define many "slaves" in openHAB configuration to read all data from a single physical modbus slave. The configuration parameters have the following pattern: -```ini +``` ..= ``` @@ -76,59 +85,26 @@ where: Valid slave parameters are - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyRequiredDescription
connectionmandatory

Connection string for the slave.

-

TCP slaves use the form host_ip[:port] e.g. 192.168.1.55 or 192.168.1.55:511. If you omit port, default 502 will be used.

-

For serial connections use the form port:[:baud:[dataBits:[parity:[stopBits:[encoding]]]]], e.g. /dev/ttyS0:38400:8:none:1:rtu (read from /dev/ttyS0 using baud rate of 38400, 8 databits, no parity, 1 stopbits, and rtu encoding. Another minimal example is /dev/ttyS0:38400 where all optional parameters except baud rate will get their default values.

+| Property | Required | Description | +|----------|----------|-------------| +| connection | mandatory | Connection string for the slave.

**TCP slaves** use the form `host_ip[:port]` e.g. `192.168.1.55` or `192.168.1.55:511`. If you omit port, default `502` will be used.

For **serial connections** use the form `port:[:baud:[dataBits:[parity:[stopBits:[encoding]]]]]`, e.g. `/dev/ttyS0:38400:8:none:1:rtu` (read from `/dev/ttyS0` using baud rate of 38400, 8 databits, no parity, 1 stopbits, and rtu encoding. Another minimal example is `/dev/ttyS0:38400` where all optional parameters except baud rate will get their default values.

`port` refers to COM port name on Windows and serial device path in *nix. Optionally one can configure one or more of the serial parameters: baud (default `9600`), dataBits (default `8`), parity (default `none`), stopBits (default `1`), encoding (default `ascii`).
Options for the optional serial parameters are as follows: parity={`even`, `odd`}; encoding={`ascii`, `rtu`, `bin`}. | +| id | optional | slave id, default `1`. Also known as _Address_, _Station address_, or _Unit identifier_, see [Wikipedia](https://en.wikipedia.org/wiki/Modbus) and [simplymodbus](http://www.simplymodbus.ca/index.html) articles for more information | +| type | mandatory | object type. Dictates the function codes used for read and write. See below for more information. Can be either `coil`, `discrete`, `holding`, or `input`. | +| start | optional | address of first coil/discrete input/register to read. Default is 0. The address is directly passed to the corresponding Modbus request, and thus is zero-based. See below for more information on the addressing. | +| length | mandatory | number of _data items_ to read. _Data items_ here refers to registers, coils or discrete inputs depending on the slave type. For example, if the goal is to read one item with `valuetype=int32`, one needs to read two registers (2 * 16bit = 32bit), thus `length = 2`. If three coils are of interest, one should specify `length = 3` | +| valuetype | optional | tells how interpret the register data. For details, consult [Register interpretation (valuetype) on read & write](#register-interpretation-valuetype-on-read--write). | updateunchangeditems | optional | **Since 1.9.0*. `true` or `false`. Controls whether the binding sends an update event on every successful poll (`true`) or only if the state of the item actually changes (`false`). Default is `false`. When polling many items with high poll frequency, setting this parameter to `true` may cause significant CPU usage. | +| postundefinedonreaderror | optional | **Since 1.9.0**. `true` or `false`. Controls whether the binding sends `Undefined` (`UnDefType.UNDEF`) to the items associated with this slave when a read error occurs. Here read error refers to connection issues (cannot establish connection), I/O error (e.g. uninterrupted connection, unexpected EOF), [modbus protocol exceptions](http://www.simplymodbus.ca/exceptions.htm) (e.g. "Illegal data address"), or response transaction id not matching the request. Note that when `updateunchangeditems` is enabled, the `Undefined` is sent only once on errors, unless the slave recovers from the error. | -

-port refers to COM port name on Windows and serial device path in *nix. Optionally one can configure one or more of the serial parameters: baud (default 9600), dataBits (default 8), parity (default none), stopBits (default 1), encoding (default ascii).
Options for the optional serial parameters are as follows: parity={even, odd}; encoding={ascii, rtu, bin}.

+### Advanced connection parameters -See also below for additional connection parameters introduced in 1.9.0. +Since 1.9.0, `connection` parameter can take additional colon (`:`) separated parameters: -
idoptionalslave id, default 1. Also known as Address, Station address, or Unit identifier, see wikipedia and simplymodbus articles for more information
typemandatoryobject type. Dictates the function codes used for read & write. See below for more information. Can be either coil, discrete, holding, or input.
startoptionaladdress of first coil/discrete input/register to read. Default is 0. The address is directly passed to the corresponding Modbus request, and thus is zero-based. See below for more information on the addressing.
lengthmandatorynumber of data items to read. Data items here refers to registers, coils or discrete inputs depending on the slave type. For example, if the goal is to read one item with valuetype=int32, one needs to read two registers (2 * 16bit = 32bit), thus length = 2. If three coils are of interest, one should specify length = 3
valuetypeoptionaltells how interpret the register data. For details, consult Register interpretation (valuetype) on read & write.
updateunchangeditemsoptionalSince 1.9.0. true or false. Controls whether the binding sends an update event on every successful poll (true) or only if the state of the item actually changes (false). Default is false. When polling many items with high poll frequency, setting this parameter to true may cause significant CPU usage.
postundefinedonreaderroroptionalSince 1.9.0. true or false. Controls whether the binding sends Undefined to the items associated with this slave when read error occurs. Here read error refers to connection issues (cannot establish connection), IO error (e.g. uninterrupted connection, unexpected EOF), modbus protocol exceptions (e.g. "Illegal data address"), or response transaction id not matching the request. Note that when updateunchangeditems is enabled, the Undefined is sent only once on errors, unless the slave recovers from the error.
- - -### Advanced connection parameters (**since 1.9.0**) - -Since 1.9.0 `connection` parameter can take additional colon (:) separated parameters: - -- For TCP slave the new format for connection parameter is: host_ip[:port[:interTransactionDelayMillis[:reconnectAfterMillis[:interConnectDelayMillis[:connectMaxTries[:connectTimeout]]]]]]. -- For the serial slaves the new format is: port[:baud[:dataBits[:parity[:stopBits[:encoding[:interTransactionDelayMillis[:receiveTimeoutMillis[:flowControlIn[:flowControlOut]]]]]]]] +- For TCP slave the new format for connection parameter is: `host_ip[:port[:interTransactionDelayMillis[:reconnectAfterMillis[:interConnectDelayMillis[:connectMaxTries[:connectTimeout]]]]]]`. +- For the serial slaves the new format is: `port[:baud[:dataBits[:parity[:stopBits[:encoding[:interTransactionDelayMillis[:receiveTimeoutMillis[:flowControlIn[:flowControlOut]]]]]]]]`. Explanation of these new parameters -- `interTransactionDelayMillis`: : Time to wait between consecutive modbus transactions (to the same host or serial device), in milliseconds. Each modbus transaction corresponds to read or write operation. Default 35 for serial slaves and 60 for tcp slaves. +- `interTransactionDelayMillis`: Time to wait between consecutive modbus transactions (to the same host or serial device), in milliseconds. Each modbus transaction corresponds to read or write operation. Default 35 for serial slaves and 60 for tcp slaves. - `reconnectAfterMillis`: Time after which connection is disconnected and re-established, in milliseconds. Default 0 (closes connection after every transaction). - `interConnectDelayMillis`: Time to wait between consecutive connection attempts (to the same host or ip), in milliseconds. Default 0. - `connectMaxTries`: Maximum tries when establishing connection. Default 3. @@ -156,7 +132,7 @@ There are three ways to bind an item to modbus coils/registers. ### Single coil/register per item -```ini +``` Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"} ``` @@ -166,16 +142,16 @@ Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"} ### Separate coils for reading and writing -```ini +``` Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:<6:>7"} ``` - In this case coil 6 is used as status coil (read-only) and commands are put to coil 7 by setting coil 7 to true. -- (?) Your hardware should then set coil 7 back to false to allow further commands processing (Note 16.3.2016: does this relate to [issue #3685](https://github.com/openhab/openhab/issues/3685)?). +- (?) Your hardware should then set coil 7 back to false to allow further commands processing (Note 16.3.2016: does this relate to [issue #3685](https://github.com/openhab/openhab1-addons/issues/3685)?). ### input coil only for reading -```ini +``` Contact Contact1 "Contact1 [MAP(en.map):%s]" (All) {modbus="slave2:0"} ``` @@ -186,13 +162,13 @@ counter values in most cases 16bit values, now we must do math: in rules to deal ### Read / write register (number) -```ini +``` Number Dimmer1 "Dimmer1 [%d]" (ALL) {modbus="slave4:0"} ``` and in sitemap you can for example -```ini +``` Setpoint item=Dimmer1 minValue=0 maxValue=100 step=5 ``` @@ -202,13 +178,13 @@ Setpoint item=Dimmer1 minValue=0 maxValue=100 step=5 5. read only register `type=input` -```ini +``` Number MyCounterH "My Counter high [%d]" (All) {modbus="slave3:0"} ``` this reads counter 1 high word when valuetype=`int8` or `uint8` -```ini +``` Number MyCounterL "My Counter low [%d]" (All) {modbus="slave3:1"} ``` @@ -218,16 +194,16 @@ this reads counter 1 low word when valuetype=`int8` or `uint8` When using a float32 value you must use [%f] in item description. -```ini +``` Number MyCounter "My Counter [%f]" (All) {modbus="slave5:0"}` ``` -# Details +## Details -## Modbus functions supported +### Modbus functions supported -### Supported Modbus object types +#### Supported Modbus object types Modbus binding allows to connect to multiple Modbus slaves. The binding supports following Modbus *object types* @@ -240,7 +216,7 @@ Binding can be configured to interpret values stored in the 16bit registers in d For more information on these object types, please consult [Modbus wikipedia article](https://en.wikipedia.org/wiki/Modbus). -### Read and write functions +#### Read and write functions Modbus specification has different operations for reading and writing different object types. These types of operations are identified by *function code*. Some devices support only certain function codes. @@ -255,9 +231,7 @@ The binding uses following function codes when communicating with the slaves: - read holding registers: FC 3 (*Read Multiple Holding Registers*) - write holding register: FC 6 (*Write Single Holding Register*), OR FC 16 (*Write Multiple Holding Registers*) (see note on `writemultipleregisters` configuration parameter below) - - -## Comment on addressing +### Comment on addressing [Modbus Wikipedia article](https://en.wikipedia.org/wiki/Modbus#Coil.2C_discrete_input.2C_input_register.2C_holding_register_numbers_and_addresses) summarizes this excellently: @@ -270,13 +244,13 @@ The binding uses following function codes when communicating with the slaves: > This translates into [entity] addresses between 0 and 9,998 in data frames. -The openhab modbus binding uses data frame entity addresses when referring to modbus entities. That is, the entity address configured in modbus binding is passed to modbus protocol frame as-is. For example, modbus slave definition with `start=3`, `length=2` and `type=holding` will read modbus entities with the following numbers 40004 and 40005. +The openHAB modbus binding uses data frame entity addresses when referring to modbus entities. That is, the entity address configured in modbus binding is passed to modbus protocol frame as-is. For example, modbus slave definition with `start=3`, `length=2` and `type=holding` will read modbus entities with the following numbers 40004 and 40005. -## Many modbus binding slaves for single physical slave +### Many modbus binding slaves for single physical slave -One needs to configure as many modbus slaves to openhab as there are corresponding modbus requests. For example, in order to poll status of `coil` and `holding` items from a single [physical] modbus slave, two separate modbus slave definitions need to be configured in the `modbus.cfg`. For example: +One needs to configure as many modbus slaves to openHAB as there are corresponding modbus requests. For example, in order to poll status of `coil` and `holding` items from a single [physical] modbus slave, two separate modbus slave definitions need to be configured in the `modbus.cfg`. For example: -```ini +``` serial.slave1.connection=/dev/pts/8:38400:8:none:1:rtu serial.slave1.type=coil serial.slave1.length=3 @@ -286,11 +260,11 @@ serial.slave2.type=holding serial.slave2.length=5 ``` -Please note that the binding requires that all slaves connecting to the same serial port share the same connection parameters (e.g. baud-rate, parity, ..). In particular are different parameter settings considered bad practice, because they can confuse the instances (slaves) on the modbus. For additional information, see [this discussion](https://community.openhab.org/t/connection-pooling-in-modbus-binding/5246/161?u=ssalonen) in the community forums. +Please note that the binding requires that all slaves connecting to the same serial port share the same connection parameters (e.g. baud-rate, parity, ..). In particular are different parameter settings considered bad practice, because they can confuse the instances (slaves) on the modbus. For additional information, see [this discussion](https://community.openHAB.org/t/connection-pooling-in-modbus-binding/5246/161?u=ssalonen) in the community forums. Similarly, one must have identical connection parameters for all tcp slaves connecting to same host+port. -## Read and write functions (modbus slave type) +### Read and write functions (modbus slave type) Modbus read functions @@ -311,9 +285,9 @@ See also [simplymodbus.ca](http://www.simplymodbus.ca) and [wikipedia article](h Note that this section applies to register elements only (`holding` or `input` type) -### Read +#### Read -When the binding interprets and converts polled input registers (`input`) or holding registers (`holding`) to openhab items, the process goes like this: +When the binding interprets and converts polled input registers (`input`) or holding registers (`holding`) to openHAB items, the process goes like this: - 1. register(s) are first parsed to a number (see below for the details, exact logic depends on `valuetype`) - 2a. if the item is Switch or Contact: zero is converted CLOSED / OFF. Other numbers are converted to OPEN / ON. @@ -321,7 +295,7 @@ When the binding interprets and converts polled input registers (`input`) or hol The logic for converting read registers to number goes as below. Different procedure is taken depending on `valuetype`. -Note that first register refers to register with address `start` (as defined in the slave definition), second register refers to register with address `start + 1` etc. The index refers to item read index, e.g. item `Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"}` has 5 as read index. +Note that _first register_ refers to register with address `start` (as defined in the slave definition), _second register_ refers to register with address `start + 1` etc. The _index_ refers to item read index, e.g. item `Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"}` has 5 as read index. `valuetype=bit`: @@ -403,7 +377,7 @@ If you get strange values using the int32, uint32 or float32 valuetypes then jus ### Write -When the binding processes openhab command (e.g. sent by `sendCommand` as explained [here](https://github.com/openhab/openhab/wiki/Actions)), the process goes as follows +When the binding processes openHAB command (e.g. sent by `sendCommand` as explained [here](https://github.com/openhab/openhab1-addons/wiki/Actions)), the process goes as follows 1. it is checked whether the associated item is bound to holding register. If not, command is ignored. 2. command is converted to 16bit integer (in [two's complement format](https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html)) (see below for details) @@ -430,13 +404,13 @@ Some devices uses modbus RTU over TCP. This is usually Modbus RTU encapsulation -### Config Examples +## Config Examples -Please take a look at [Samples-Binding-Config page](https://github.com/openhab/openhab/wiki/Samples-Binding-Config) or examine to the following examples. +Please take a look at [Samples-Binding-Config page](https://github.com/openhab/openhab1-addons/wiki/Samples-Binding-Config) or examine to the following examples. - Minimal construction in modbus.cfg for TCP connections will look like: -```ini +``` # read 10 coils starting from address 0 tcp.slave1.connection=192.168.1.50 tcp.slave1.length=10 @@ -445,7 +419,7 @@ tcp.slave1.type=coil - Minimal construction in modbus.cfg for serial connections will look like: -```ini +``` # read 10 coils starting from address 0 serial.slave1.connection=/dev/ttyUSB0 tcp.slave1.length=10 @@ -454,7 +428,7 @@ tcp.slave1.type=coil - More complex setup could look like -```ini +``` # Poll values very 300ms = 0.3 seconds poll=300 @@ -477,7 +451,7 @@ tcp.slave1.type=coil > you only read 6 input bits and say start from 0 > the moxa manual ist not right clear in this case -```ini +``` poll=300 # Query coils from 192.168.6.180 @@ -522,18 +496,18 @@ tcp.slave5.valuetype=float32 Above we used the same modbus gateway with ip 192.168.6.180 multiple times on different modbus address ranges and modbus functions. -# Troubleshooting +## Troubleshooting -## Enable verbose logging +### Enable verbose logging Enable `DEBUG` or `TRACE` (even more verbose) logging for the loggers named: * `net.wimpi.modbus` * `org.openhab.binding.modbus` -# For developers +## For developers -## Testing serial implementation +### Testing serial implementation You can use test serial slaves without any hardware on linux using these steps: @@ -544,9 +518,9 @@ You can use test serial slaves without any hardware on linux using these steps: ./diagslave -m rtu -a 1 -b 38400 -d 8 -s 1 -p none -4 10 /dev/pts/7 ``` -3. Configure openhab's modbus slave to connect to `/dev/pts/8`: +3. Configure openHAB's modbus slave to connect to `/dev/pts/8`: -```ini +``` xxx.connection=/dev/pts/8:38400:8:none:1:rtu ``` @@ -558,7 +532,7 @@ xxx.connection=/dev/pts/8:38400:8:none:1:rtu Naturally this is not the same thing as the real thing but helps to identify simple issues. -## Testing TCP implementation +### Testing TCP implementation 1. Download [diagslave](http://www.modbusdriver.com/diagslave.html) and start modbus tcp server (slave) using this command: @@ -566,29 +540,29 @@ Naturally this is not the same thing as the real thing but helps to identify sim ./diagslave -m tcp -a 1 -p 55502 ``` -2. Configure openhab's modbus slave to connect to `127.0.0.1:55502`: +2. Configure openHAB's modbus slave to connect to `127.0.0.1:55502`: -```ini +``` tcp.slave1.connection=127.0.0.1:55502 ``` -## Writing data +### Writing data See this [community post](https://community.openhab.org/t/something-is-rounding-my-float-values-in-sitemap/13704/32?u=ssalonen) explaining how `pollmb` and `diagslave` can be used to debug modbus communication. -## Troubleshooting +### Troubleshooting To troubleshoot, you might be asked to update to latest development version. You can find the "snapshot" or development version from [Cloudbees CI](https://openhab.ci.cloudbees.com/job/openHAB1-Addons/lastSuccessfulBuild/artifact/bundles/binding/org.openhab.binding.modbus/target/). With modbus binding before 1.9.0, it strongly recommended to try out with the latest development version since many bugs were fixed in 1.9.0. Furthermore, error logging is enhanced in this new version. -If the problem persists in the new version, it is recommended to try to isolate to issue using minimal configuration. Easiest would be to have a fresh openhab installation, and configure it minimally (if possible, single modbus slave in `modbus.cfg`, single item, no rules etc.). This helps the developers and community to debug the issue. +If the problem persists in the new version, it is recommended to try to isolate to issue using minimal configuration. Easiest would be to have a fresh openHAB installation, and configure it minimally (if possible, single modbus slave in `modbus.cfg`, single item, no rules etc.). This helps the developers and community to debug the issue. Problems can be communicated via [community.openhab.org](https://community.openhab.org). Please use the search function to find out existing reports of the same issue. -It helps greatly to document the issue in detail (especially how to reproduce the issue), and attach the related [verbose logs](#enable-verbose-debug-logging). Try to keep interaction minimal during this test; for example, if the problem occurs with modbus read alone, do not touch the the switch items in openhab sitemap (would trigger write). +It helps greatly to document the issue in detail (especially how to reproduce the issue), and attach the related [verbose logs](#enable-verbose-debug-logging). Try to keep interaction minimal during this test; for example, if the problem occurs with modbus read alone, do not touch the the switch items in openHAB sitemap (would trigger write). -For attaching the logs to a community post, [pastebin.com](http://pastebin.com/) service is strongly recommended to keep the thread readable. It is useful to store the logs from openhab startup, and let it run for a while. +For attaching the logs to a community post, the [pastebin.com](http://pastebin.com/) service is strongly recommended to keep the thread readable. It is useful to store the logs from openHAB startup, and let it run for a while. Remember to attach configuration lines from modbus.cfg, item definitions related to modbus binding, and any relevant rules (if any). You can use [pastebin.com](http://pastebin.com/) for this purpose as well. @@ -596,99 +570,4 @@ To summarize, here are the recommended steps in case of errors 1. Update to latest development version; especially if you are using modbus binding version before 1.9.0 2. isolate the issue using minimal configuration, and enable verbose logging (see above) -3. record logs and configuration to [pastebin.com](http://pastebin.com/)The page contains examples for use with the [[Modbus binding|Modbus-Binding]]. - -## Table of Contents - -* [Rollershutter Items](#rollershutter-items) - -## Rollershutter Items - -Since Modbus is a low-level protocol, more abstract concepts like controlling roller shutters can be implemented in a number of different ways. This example (offered by @ssalonen [here](https://github.com/openhab/openhab/pull/4654#issuecomment-248996109)) is one approach using openHAB rules and the standard Modbus binding. Adapt it to your needs, and please edit this wiki page to correct and clarify this example. - -### default.rules - -``` -import org.openhab.core.library.types.DecimalType -import org.openhab.core.library.types.PercentType -// comment out the above imports if running on openHAB 2+ - -rule "Process roller shutter commands" -when - Item myRS received command -then - logInfo("rollerShutterRules", "Processing RS command") - if(receivedCommand != null){ - switch(receivedCommand.toString.upperCase) { - case "UP" : { - sendCommand(myRSUpDown, 1) - } - case "DOWN":{ - sendCommand(myRSUpDown, -1) - } - case "STOP":{ - sendCommand(myRSMoveStop, 1) - } - case "MOVE":{ - sendCommand(myRSMoveStop, 0) - } - } - } -end - -rule "Update roller shutter position" -when - Item myRSMoveStop received update -then - logInfo("rollerShutterRules", "Processing position update") - var currentPosition = myRSMoveStop.state as DecimalType - postUpdate(myRS, new PercentType(currentPosition.toBigDecimal)) -end -``` - -### default.items - -``` - -// Main roller shutter item. -// - State will be updated from register index 0. -// - Up (1) & Down (-1) commands will be written to register index 1 -// - Move (0) & Stop (1) commands will be written to register index 2 -Rollershutter myRS "RollerShutter" (livingRoom) - -// Helper items for writing data to MODBUS -Number myRSUpDown "RollerShutter Up/Down Control (writing to index 1, read from index 0)" (livingRoom) {modbus="slave1:<0:>1"} -Number myRSMoveStop "RollerShutter Move/Stop Control (writing to index 2, read from index 0)" (livingRoom) {modbus="slave1:<0:>2"} -``` - -### default.sitemap - -``` -sitemap demo label="Main Menu" { - // https://github.com/openhab/openhab/wiki/Rollershutter-Bindings - Switch item=myRS label="Roller shutter [(%d)]" mappings=[UP="up", STOP="X", DOWN="down"] - Text item=myRSMoveStop - Text item=myRSUpDown -} -``` - -### For local testing - -Starting up modbus tcp server (i.e. modbus slave) - -``` -./diagslave -m tcp -p 55502 -``` - -services/modbus.cfg - -``` -tcp.slave1.connection=localhost:55502:0:0:0:1 -tcp.slave1.type=holding -tcp.slave1.length=20 -tcp.slave1.postundefinedonreaderror=true -``` - -As inspiration I used [Roller shutter wiki page](https://github.com/openhab/openhab1-addons/wiki/Rollershutter-Bindings) - -[Table of Contents](#table-of-contents) +3. record logs and configuration to [pastebin.com](http://pastebin.com/). The page contains examples for use with the [[Modbus binding|Modbus-Binding]]. diff --git a/addons/bindings/mpd1/readme.md b/addons/bindings/mpd1/readme.md index 18b45b267..3e2f5e6be 100644 --- a/addons/bindings/mpd1/readme.md +++ b/addons/bindings/mpd1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MPD - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mpd/README.md --- + {% include base.html %} diff --git a/addons/bindings/mqtt1/readme.md b/addons/bindings/mqtt1/readme.md index f31b39789..509db49f2 100644 --- a/addons/bindings/mqtt1/readme.md +++ b/addons/bindings/mqtt1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MQTT - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mqtt/README.md --- + {% include base.html %} diff --git a/addons/bindings/mqttitude1/readme.md b/addons/bindings/mqttitude1/readme.md index 5abd55a53..842f27283 100644 --- a/addons/bindings/mqttitude1/readme.md +++ b/addons/bindings/mqttitude1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OwnTracks (formerly MQTTitude) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mqttitude/README.md --- + {% include base.html %} diff --git a/addons/bindings/myq1/readme.md b/addons/bindings/myq1/readme.md index d28476106..30eb847d0 100644 --- a/addons/bindings/myq1/readme.md +++ b/addons/bindings/myq1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Chamberlain MyQ - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.myq/README.md --- + {% include base.html %} diff --git a/addons/bindings/mystromecopower1/readme.md b/addons/bindings/mystromecopower1/readme.md index af3e5c84d..9cb7ee348 100644 --- a/addons/bindings/mystromecopower1/readme.md +++ b/addons/bindings/mystromecopower1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Mystrom Eco Power - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.mystromecopower/README.md --- + {% include base.html %} diff --git a/addons/bindings/neohub1/readme.md b/addons/bindings/neohub1/readme.md index 202b93666..c079be72e 100644 --- a/addons/bindings/neohub1/readme.md +++ b/addons/bindings/neohub1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: NeoHub - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.neohub/README.md --- + {% include base.html %} diff --git a/addons/bindings/nest1/readme.md b/addons/bindings/nest1/readme.md index f7c1f7835..7850a56f3 100644 --- a/addons/bindings/nest1/readme.md +++ b/addons/bindings/nest1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Nest - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.nest/README.md --- + {% include base.html %} diff --git a/addons/bindings/netatmo1/readme.md b/addons/bindings/netatmo1/readme.md index 40a427acf..4a5265bc2 100644 --- a/addons/bindings/netatmo1/readme.md +++ b/addons/bindings/netatmo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Netatmo - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.netatmo/README.md --- + {% include base.html %} diff --git a/addons/bindings/network/readme.md b/addons/bindings/network/readme.md index fd5cf8295..569cf6385 100644 --- a/addons/bindings/network/readme.md +++ b/addons/bindings/network/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Network - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/networkhealth1/readme.md b/addons/bindings/networkhealth1/readme.md index 76b855b3a..6bc3ed4c4 100644 --- a/addons/bindings/networkhealth1/readme.md +++ b/addons/bindings/networkhealth1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Network Health - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.networkhealth/README.md --- + {% include base.html %} diff --git a/addons/bindings/networkupstools1/readme.md b/addons/bindings/networkupstools1/readme.md index 5a9a51c4e..59256f12b 100644 --- a/addons/bindings/networkupstools1/readme.md +++ b/addons/bindings/networkupstools1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Network UPS Tools - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.networkupstools/README.md --- + {% include base.html %} diff --git a/addons/bindings/nibeheatpump1/readme.md b/addons/bindings/nibeheatpump1/readme.md index 3315a80d3..f8cb0ec9e 100644 --- a/addons/bindings/nibeheatpump1/readme.md +++ b/addons/bindings/nibeheatpump1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Nibe Heatpump - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.nibeheatpump/README.md --- + {% include base.html %} diff --git a/addons/bindings/nikobus1/readme.md b/addons/bindings/nikobus1/readme.md index 1ecdeb6a9..31431fd65 100644 --- a/addons/bindings/nikobus1/readme.md +++ b/addons/bindings/nikobus1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Nikobus - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.nikobus/README.md --- + {% include base.html %} diff --git a/addons/bindings/novelanheatpump1/readme.md b/addons/bindings/novelanheatpump1/readme.md index 946a5ae81..e849788c3 100644 --- a/addons/bindings/novelanheatpump1/readme.md +++ b/addons/bindings/novelanheatpump1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Novelan/Luxtronic Heat Pump - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.novelanheatpump/README.md --- + {% include base.html %} diff --git a/addons/bindings/ntp1/readme.md b/addons/bindings/ntp1/readme.md index 7642b5482..71127c0c8 100644 --- a/addons/bindings/ntp1/readme.md +++ b/addons/bindings/ntp1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Network Time Protocol (NTP) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ntp/README.md --- + {% include base.html %} diff --git a/addons/bindings/oceanic/readme.md b/addons/bindings/oceanic/readme.md index 9c5ee9c29..1626a74cf 100644 --- a/addons/bindings/oceanic/readme.md +++ b/addons/bindings/oceanic/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Oceanic - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/omnilink1/readme.md b/addons/bindings/omnilink1/readme.md index b94ffb755..b86f8b32c 100644 --- a/addons/bindings/omnilink1/readme.md +++ b/addons/bindings/omnilink1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: HAI/Leviton Omni and Lumina - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.omnilink/README.md --- + {% include base.html %} diff --git a/addons/bindings/onewire1/readme.md b/addons/bindings/onewire1/readme.md index 537932c03..c09d0178a 100644 --- a/addons/bindings/onewire1/readme.md +++ b/addons/bindings/onewire1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OneWire - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.onewire/README.md --- + {% include base.html %} diff --git a/addons/bindings/onkyo/readme.md b/addons/bindings/onkyo/readme.md index 93d405b40..a5591bf86 100644 --- a/addons/bindings/onkyo/readme.md +++ b/addons/bindings/onkyo/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Onkyo - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/onkyo1/readme.md b/addons/bindings/onkyo1/readme.md index e00fd06b7..d28106b0d 100644 --- a/addons/bindings/onkyo1/readme.md +++ b/addons/bindings/onkyo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Onkyo AV Receiver - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.onkyo/README.md --- + {% include base.html %} diff --git a/addons/bindings/openenergymonitor1/readme.md b/addons/bindings/openenergymonitor1/readme.md index 8041af62c..723e538f0 100644 --- a/addons/bindings/openenergymonitor1/readme.md +++ b/addons/bindings/openenergymonitor1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Open Energy Monitor - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.openenergymonitor/README.md --- + {% include base.html %} diff --git a/addons/bindings/openpaths1/readme.md b/addons/bindings/openpaths1/readme.md index 51cfc53e6..baeb48fd7 100644 --- a/addons/bindings/openpaths1/readme.md +++ b/addons/bindings/openpaths1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OpenPaths - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.openpaths/README.md --- + {% include base.html %} diff --git a/addons/bindings/opensprinkler/readme.md b/addons/bindings/opensprinkler/readme.md index f262b8321..1db07b92d 100644 --- a/addons/bindings/opensprinkler/readme.md +++ b/addons/bindings/opensprinkler/readme.md @@ -3,6 +3,7 @@ layout: documentation title: OpenSprinkler - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/opensprinkler1/readme.md b/addons/bindings/opensprinkler1/readme.md index e855c2c57..9a5251be9 100644 --- a/addons/bindings/opensprinkler1/readme.md +++ b/addons/bindings/opensprinkler1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OpenSprinkler - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.opensprinkler/README.md --- + {% include base.html %} diff --git a/addons/bindings/orvibo/readme.md b/addons/bindings/orvibo/readme.md index f12fee2ff..3d107f692 100644 --- a/addons/bindings/orvibo/readme.md +++ b/addons/bindings/orvibo/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Orvibo - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/owserver1/readme.md b/addons/bindings/owserver1/readme.md index 5566031e2..396fa202d 100644 --- a/addons/bindings/owserver1/readme.md +++ b/addons/bindings/owserver1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: OWServer - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.owserver/README.md --- + {% include base.html %} diff --git a/addons/bindings/panasonictv1/readme.md b/addons/bindings/panasonictv1/readme.md index 0c915fd8d..66fbcb904 100644 --- a/addons/bindings/panasonictv1/readme.md +++ b/addons/bindings/panasonictv1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Panasonic TV - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.panasonictv/README.md --- + {% include base.html %} diff --git a/addons/bindings/panstamp1/readme.md b/addons/bindings/panstamp1/readme.md index 322745499..fb62b5974 100644 --- a/addons/bindings/panstamp1/readme.md +++ b/addons/bindings/panstamp1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: panStamp - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.panstamp/README.md --- + {% include base.html %} diff --git a/addons/bindings/piface1/readme.md b/addons/bindings/piface1/readme.md index f6bfb7d01..0998c24f1 100644 --- a/addons/bindings/piface1/readme.md +++ b/addons/bindings/piface1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Piface - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.piface/README.md --- + {% include base.html %} diff --git a/addons/bindings/pilight1/readme.md b/addons/bindings/pilight1/readme.md index 2226ba0f6..61da86829 100644 --- a/addons/bindings/pilight1/readme.md +++ b/addons/bindings/pilight1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: pilight - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.pilight/README.md --- + {% include base.html %} diff --git a/addons/bindings/pioneeravr/readme.md b/addons/bindings/pioneeravr/readme.md index 43fc21bf8..cc09ec6b6 100644 --- a/addons/bindings/pioneeravr/readme.md +++ b/addons/bindings/pioneeravr/readme.md @@ -3,6 +3,7 @@ layout: documentation title: PioneerAVR Configuration - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/pioneeravr1/readme.md b/addons/bindings/pioneeravr1/readme.md index 2bededb00..a50ba5da2 100644 --- a/addons/bindings/pioneeravr1/readme.md +++ b/addons/bindings/pioneeravr1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Pioneer AV Receiver (1.x) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.pioneeravr/README.md --- + {% include base.html %} diff --git a/addons/bindings/plcbus1/readme.md b/addons/bindings/plcbus1/readme.md index 8b4e96edd..75491ea7d 100644 --- a/addons/bindings/plcbus1/readme.md +++ b/addons/bindings/plcbus1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: PLCBus - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.plcbus/README.md --- + {% include base.html %} diff --git a/addons/bindings/plclogo1/readme.md b/addons/bindings/plclogo1/readme.md index 0b573e669..f93cdec9a 100644 --- a/addons/bindings/plclogo1/readme.md +++ b/addons/bindings/plclogo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: PLCLogo - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.plclogo/README.md --- + {% include base.html %} diff --git a/addons/bindings/plex1/readme.md b/addons/bindings/plex1/readme.md index bd93ea431..7c6c89ca5 100644 --- a/addons/bindings/plex1/readme.md +++ b/addons/bindings/plex1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Plex - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.plex/README.md --- + {% include base.html %} diff --git a/addons/bindings/plugwise1/readme.md b/addons/bindings/plugwise1/readme.md index 6bd07b0a5..c99bc9579 100644 --- a/addons/bindings/plugwise1/readme.md +++ b/addons/bindings/plugwise1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Plugwise - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.plugwise/README.md --- + {% include base.html %} diff --git a/addons/bindings/powerdoglocalapi1/readme.md b/addons/bindings/powerdoglocalapi1/readme.md index 2eacbbb45..351872ca2 100644 --- a/addons/bindings/powerdoglocalapi1/readme.md +++ b/addons/bindings/powerdoglocalapi1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: PowerDog Local API - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.powerdoglocalapi/README.md --- + {% include base.html %} diff --git a/addons/bindings/powermax1/readme.md b/addons/bindings/powermax1/readme.md index 5a5fcb881..1ae7a559c 100644 --- a/addons/bindings/powermax1/readme.md +++ b/addons/bindings/powermax1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Visonic Powermax - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.powermax/README.md --- + {% include base.html %} diff --git a/addons/bindings/primare1/readme.md b/addons/bindings/primare1/readme.md index fe550df28..cf6859a45 100644 --- a/addons/bindings/primare1/readme.md +++ b/addons/bindings/primare1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Primare - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.primare/README.md --- + {% include base.html %} diff --git a/addons/bindings/pulseaudio/readme.md b/addons/bindings/pulseaudio/readme.md index 990138232..f3c2dbb99 100644 --- a/addons/bindings/pulseaudio/readme.md +++ b/addons/bindings/pulseaudio/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Pulseaudio - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/pulseaudio1/readme.md b/addons/bindings/pulseaudio1/readme.md index 2ba4a6797..758c92529 100644 --- a/addons/bindings/pulseaudio1/readme.md +++ b/addons/bindings/pulseaudio1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Pulseaudio - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.pulseaudio/README.md --- + {% include base.html %} diff --git a/addons/bindings/rfxcom/readme.md b/addons/bindings/rfxcom/readme.md index b3f5ce190..0b52b9379 100644 --- a/addons/bindings/rfxcom/readme.md +++ b/addons/bindings/rfxcom/readme.md @@ -3,6 +3,7 @@ layout: documentation title: RFXCOM - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/rfxcom1/readme.md b/addons/bindings/rfxcom1/readme.md index e93494c9d..793db48a2 100644 --- a/addons/bindings/rfxcom1/readme.md +++ b/addons/bindings/rfxcom1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: RFXCOM - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.rfxcom/README.md --- + {% include base.html %} diff --git a/addons/bindings/rme/readme.md b/addons/bindings/rme/readme.md index 510983ca2..952ac0677 100644 --- a/addons/bindings/rme/readme.md +++ b/addons/bindings/rme/readme.md @@ -3,6 +3,7 @@ layout: documentation title: RME - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/rpircswitch1/readme.md b/addons/bindings/rpircswitch1/readme.md index e73275d16..d75bbb96e 100644 --- a/addons/bindings/rpircswitch1/readme.md +++ b/addons/bindings/rpircswitch1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Raspberry Pi RC Switch - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.rpircswitch/README.md --- + {% include base.html %} diff --git a/addons/bindings/russound/readme.md b/addons/bindings/russound/readme.md index 74275711a..2fd348819 100644 --- a/addons/bindings/russound/readme.md +++ b/addons/bindings/russound/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Russound - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/rwesmarthome1/readme.md b/addons/bindings/rwesmarthome1/readme.md index dc634d51a..f157d8586 100644 --- a/addons/bindings/rwesmarthome1/readme.md +++ b/addons/bindings/rwesmarthome1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: RWE SmartHome - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.rwesmarthome/README.md --- + {% include base.html %} diff --git a/addons/bindings/sagercaster1/readme.md b/addons/bindings/sagercaster1/readme.md index d7e4b147a..38108bbdf 100644 --- a/addons/bindings/sagercaster1/readme.md +++ b/addons/bindings/sagercaster1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Sager Weathercaster - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.sagercaster/README.md --- + {% include base.html %} diff --git a/addons/bindings/sallegra1/readme.md b/addons/bindings/sallegra1/readme.md index 39e49b7a2..aafd0c9c5 100644 --- a/addons/bindings/sallegra1/readme.md +++ b/addons/bindings/sallegra1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Sallegra - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.sallegra/README.md --- + {% include base.html %} diff --git a/addons/bindings/samsungac1/readme.md b/addons/bindings/samsungac1/readme.md index cee9112c1..26ed8ef98 100644 --- a/addons/bindings/samsungac1/readme.md +++ b/addons/bindings/samsungac1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Samsung Air Conditioner - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.samsungac/README.md --- + {% include base.html %} diff --git a/addons/bindings/samsungtv/readme.md b/addons/bindings/samsungtv/readme.md index 4b1f38b8a..2b700e339 100644 --- a/addons/bindings/samsungtv/readme.md +++ b/addons/bindings/samsungtv/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Samsung TV - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/samsungtv1/readme.md b/addons/bindings/samsungtv1/readme.md index 6eb87ec46..0d70fe230 100644 --- a/addons/bindings/samsungtv1/readme.md +++ b/addons/bindings/samsungtv1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Samsung TV - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.samsungtv/README.md --- + {% include base.html %} diff --git a/addons/bindings/sapp1/readme.md b/addons/bindings/sapp1/readme.md index e107055ae..1e6f22a9f 100644 --- a/addons/bindings/sapp1/readme.md +++ b/addons/bindings/sapp1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Picnet Sapp - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.sapp/README.md --- + {% include base.html %} diff --git a/addons/bindings/satel1/readme.md b/addons/bindings/satel1/readme.md index 3c218251f..714a5d59a 100644 --- a/addons/bindings/satel1/readme.md +++ b/addons/bindings/satel1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Satel Integra Alarm System - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.satel/README.md --- + {% include base.html %} diff --git a/addons/bindings/serial1/readme.md b/addons/bindings/serial1/readme.md index aa3a01a1c..92c5bc2df 100644 --- a/addons/bindings/serial1/readme.md +++ b/addons/bindings/serial1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Serial - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.serial/README.md --- + {% include base.html %} diff --git a/addons/bindings/silvercrestwifisocket/readme.md b/addons/bindings/silvercrestwifisocket/readme.md index 1620a7c1e..5b10e8298 100644 --- a/addons/bindings/silvercrestwifisocket/readme.md +++ b/addons/bindings/silvercrestwifisocket/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Silvercrest Wifi Plug - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/smaenergymeter/readme.md b/addons/bindings/smaenergymeter/readme.md index 7e314debb..9e39be3d5 100644 --- a/addons/bindings/smaenergymeter/readme.md +++ b/addons/bindings/smaenergymeter/readme.md @@ -3,6 +3,7 @@ layout: documentation title: SMA Energy Meter - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/smarthomatic1/readme.md b/addons/bindings/smarthomatic1/readme.md index eebad862c..ebf192995 100644 --- a/addons/bindings/smarthomatic1/readme.md +++ b/addons/bindings/smarthomatic1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Smarthomatic - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.smarthomatic/README.md --- + {% include base.html %} diff --git a/addons/bindings/snmp1/readme.md b/addons/bindings/snmp1/readme.md index 84e6284da..fdcc9e54f 100644 --- a/addons/bindings/snmp1/readme.md +++ b/addons/bindings/snmp1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: SNMP - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.snmp/README.md --- + {% include base.html %} diff --git a/addons/bindings/sonance1/readme.md b/addons/bindings/sonance1/readme.md index ce2fc3e24..f8a462f8a 100644 --- a/addons/bindings/sonance1/readme.md +++ b/addons/bindings/sonance1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Sonance - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.sonance/README.md --- + {% include base.html %} diff --git a/addons/bindings/sonos1/readme.md b/addons/bindings/sonos1/readme.md index f49967630..fe471f0d7 100644 --- a/addons/bindings/sonos1/readme.md +++ b/addons/bindings/sonos1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Sonos - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.sonos/README.md --- + {% include base.html %} diff --git a/addons/bindings/souliss1/readme.md b/addons/bindings/souliss1/readme.md index 583a9ea73..adb249dae 100644 --- a/addons/bindings/souliss1/readme.md +++ b/addons/bindings/souliss1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Souliss - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.souliss/README.md --- + {% include base.html %} diff --git a/addons/bindings/squeezebox/readme.md b/addons/bindings/squeezebox/readme.md index ce34981b4..1c8c49dc1 100644 --- a/addons/bindings/squeezebox/readme.md +++ b/addons/bindings/squeezebox/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Logitech Squeezebox - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/squeezebox1/readme.md b/addons/bindings/squeezebox1/readme.md index f4514aa3e..549e91e0e 100644 --- a/addons/bindings/squeezebox1/readme.md +++ b/addons/bindings/squeezebox1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Squeezebox - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.squeezebox/README.md --- + {% include base.html %} diff --git a/addons/bindings/stiebelheatpump1/readme.md b/addons/bindings/stiebelheatpump1/readme.md index 60bce1cfb..e94027eb4 100644 --- a/addons/bindings/stiebelheatpump1/readme.md +++ b/addons/bindings/stiebelheatpump1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Stiebel Eltron LWZ - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.stiebelheatpump/README.md --- + {% include base.html %} diff --git a/addons/bindings/swegonventilation1/readme.md b/addons/bindings/swegonventilation1/readme.md index 1258f1c13..0776b4658 100644 --- a/addons/bindings/swegonventilation1/readme.md +++ b/addons/bindings/swegonventilation1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Swegon Ventilation - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.swegonventilation/README.md --- + {% include base.html %} diff --git a/addons/bindings/systeminfo/readme.md b/addons/bindings/systeminfo/readme.md index a210ac6cd..99ee055d1 100644 --- a/addons/bindings/systeminfo/readme.md +++ b/addons/bindings/systeminfo/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Systeminfo - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/systeminfo1/readme.md b/addons/bindings/systeminfo1/readme.md index b36e74397..0276c9ec4 100644 --- a/addons/bindings/systeminfo1/readme.md +++ b/addons/bindings/systeminfo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: System Information - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.systeminfo/README.md --- + {% include base.html %} diff --git a/addons/bindings/tacmi1/readme.md b/addons/bindings/tacmi1/readme.md index caa376775..0baaa2ada 100644 --- a/addons/bindings/tacmi1/readme.md +++ b/addons/bindings/tacmi1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: TACmi - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.tacmi/README.md --- + {% include base.html %} diff --git a/addons/bindings/tcp1/readme.md b/addons/bindings/tcp1/readme.md index 7dc34cf1d..4b8a7cee1 100644 --- a/addons/bindings/tcp1/readme.md +++ b/addons/bindings/tcp1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: TCP & UDP - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.tcp/README.md --- + {% include base.html %} diff --git a/addons/bindings/tellstick/readme.md b/addons/bindings/tellstick/readme.md index 152b86b9b..8c0ee8061 100644 --- a/addons/bindings/tellstick/readme.md +++ b/addons/bindings/tellstick/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Tellstick - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/tellstick1/readme.md b/addons/bindings/tellstick1/readme.md index 04cb0ffde..2c6f45cbf 100644 --- a/addons/bindings/tellstick1/readme.md +++ b/addons/bindings/tellstick1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Tellstick - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.tellstick/README.md --- + {% include base.html %} diff --git a/addons/bindings/tesla/readme.md b/addons/bindings/tesla/readme.md index df2e05546..5c306a6df 100644 --- a/addons/bindings/tesla/readme.md +++ b/addons/bindings/tesla/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Tesla - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/tinkerforge1/readme.md b/addons/bindings/tinkerforge1/readme.md index 31571a218..16204bbe4 100644 --- a/addons/bindings/tinkerforge1/readme.md +++ b/addons/bindings/tinkerforge1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: TinkerForge - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.tinkerforge/README.md --- + {% include base.html %} diff --git a/addons/bindings/tivo1/readme.md b/addons/bindings/tivo1/readme.md index 293288365..9ea3e085c 100644 --- a/addons/bindings/tivo1/readme.md +++ b/addons/bindings/tivo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: TiVo - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.tivo/README.md --- + {% include base.html %} diff --git a/addons/bindings/ucprelayboard1/readme.md b/addons/bindings/ucprelayboard1/readme.md index 7fc4e064d..84f42a1b5 100644 --- a/addons/bindings/ucprelayboard1/readme.md +++ b/addons/bindings/ucprelayboard1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: UCProjects.eu Relay Board - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.ucprelayboard/README.md --- + {% include base.html %} diff --git a/addons/bindings/upb1/readme.md b/addons/bindings/upb1/readme.md index 93c7d850b..d1727e67c 100644 --- a/addons/bindings/upb1/readme.md +++ b/addons/bindings/upb1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: UPB - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.upb/README.md --- + {% include base.html %} diff --git a/addons/bindings/urtsi/readme.md b/addons/bindings/urtsi/readme.md index 658664919..a48f27c13 100644 --- a/addons/bindings/urtsi/readme.md +++ b/addons/bindings/urtsi/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Somfy URTSI II - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/urtsi1/readme.md b/addons/bindings/urtsi1/readme.md index 42e7c5c85..e13ab916b 100644 --- a/addons/bindings/urtsi1/readme.md +++ b/addons/bindings/urtsi1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Somfy URTSI II - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.urtsi/README.md --- + {% include base.html %} diff --git a/addons/bindings/vdr1/readme.md b/addons/bindings/vdr1/readme.md index ac163ceb3..ec29d5aac 100644 --- a/addons/bindings/vdr1/readme.md +++ b/addons/bindings/vdr1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Video Disk Recorder (VDR) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.vdr/README.md --- + {% include base.html %} diff --git a/addons/bindings/vitotronic/readme.md b/addons/bindings/vitotronic/readme.md index 8339ab43f..021c50e28 100644 --- a/addons/bindings/vitotronic/readme.md +++ b/addons/bindings/vitotronic/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Vitotronic - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/wago1/readme.md b/addons/bindings/wago1/readme.md index ed7191c13..e7f901fee 100644 --- a/addons/bindings/wago1/readme.md +++ b/addons/bindings/wago1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: WAGO - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.wago/README.md --- + {% include base.html %} diff --git a/addons/bindings/weather1/readme.md b/addons/bindings/weather1/readme.md index 7feff15d8..1fdbe8f7a 100644 --- a/addons/bindings/weather1/readme.md +++ b/addons/bindings/weather1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Weather - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.weather/README.md --- + {% include base.html %} diff --git a/addons/bindings/wemo1/readme.md b/addons/bindings/wemo1/readme.md index 3dc2c9699..85911e996 100644 --- a/addons/bindings/wemo1/readme.md +++ b/addons/bindings/wemo1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Wemo - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.wemo/README.md --- + {% include base.html %} diff --git a/addons/bindings/wifiled/readme.md b/addons/bindings/wifiled/readme.md index 6a9d497ce..13377af8a 100644 --- a/addons/bindings/wifiled/readme.md +++ b/addons/bindings/wifiled/readme.md @@ -3,6 +3,7 @@ layout: documentation title: WiFi LED - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/withings1/readme.md b/addons/bindings/withings1/readme.md index 5b3d7cdf0..894e8641b 100644 --- a/addons/bindings/withings1/readme.md +++ b/addons/bindings/withings1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Withings - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.withings/README.md --- + {% include base.html %} diff --git a/addons/bindings/wol1/readme.md b/addons/bindings/wol1/readme.md index c2335d91c..7548db007 100644 --- a/addons/bindings/wol1/readme.md +++ b/addons/bindings/wol1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Wake-on-LAN - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.wol/README.md --- + {% include base.html %} diff --git a/addons/bindings/xbmc1/readme.md b/addons/bindings/xbmc1/readme.md index 1d48a794c..4adf0e2e8 100644 --- a/addons/bindings/xbmc1/readme.md +++ b/addons/bindings/xbmc1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: XBMC binding (for KODI) (1.x) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.xbmc/README.md --- + {% include base.html %} diff --git a/addons/bindings/xpl1/readme.md b/addons/bindings/xpl1/readme.md index 7b84e72b9..c6b009136 100644 --- a/addons/bindings/xpl1/readme.md +++ b/addons/bindings/xpl1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: xPL - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.xpl/README.md --- + {% include base.html %} diff --git a/addons/bindings/yamahareceiver/readme.md b/addons/bindings/yamahareceiver/readme.md index eca081ffb..c372e9550 100644 --- a/addons/bindings/yamahareceiver/readme.md +++ b/addons/bindings/yamahareceiver/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Yamahareceiver - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/yamahareceiver1/readme.md b/addons/bindings/yamahareceiver1/readme.md index 54bc12407..6dbbdddce 100644 --- a/addons/bindings/yamahareceiver1/readme.md +++ b/addons/bindings/yamahareceiver1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Yamaha Receiver (1.x) - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.yamahareceiver/README.md --- + {% include base.html %} diff --git a/addons/bindings/zibase1/readme.md b/addons/bindings/zibase1/readme.md index fee282579..fed69085f 100644 --- a/addons/bindings/zibase1/readme.md +++ b/addons/bindings/zibase1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Zibase - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.zibase/README.md --- + {% include base.html %} diff --git a/addons/bindings/zoneminder/readme.md b/addons/bindings/zoneminder/readme.md index aed27e2e4..b0d32d817 100644 --- a/addons/bindings/zoneminder/readme.md +++ b/addons/bindings/zoneminder/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Zoneminder - Bindings source: external --- + {% include base.html %} diff --git a/addons/bindings/zwave1/readme.md b/addons/bindings/zwave1/readme.md index 927af586a..9ad6dfcb3 100644 --- a/addons/bindings/zwave1/readme.md +++ b/addons/bindings/zwave1/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Z-Wave - Bindings -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/binding/org.openhab.binding.zwave/README.md --- + {% include base.html %} diff --git a/addons/bindings/zway/readme.md b/addons/bindings/zway/readme.md index dad78f918..dc5aebe65 100644 --- a/addons/bindings/zway/readme.md +++ b/addons/bindings/zway/readme.md @@ -3,6 +3,7 @@ layout: documentation title: Z-Way - Bindings source: external --- + {% include base.html %} diff --git a/addons/io/dropbox/readme.md b/addons/io/dropbox/readme.md new file mode 100644 index 000000000..01800b8e3 --- /dev/null +++ b/addons/io/dropbox/readme.md @@ -0,0 +1,132 @@ +--- +layout: documentation +title: Dropbox Synchronization - Services +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/io/org.openhab.io.dropbox/README.md +--- + + + +{% include base.html %} + +# Dropbox Synchronization Service + +This service will synchronize files on the openHAB server, such as configuration and log files, to and/or from a Dropbox account. + +The main use case is backing up openHAB configuration and log files +to a version-able cloud space and transporting changed files back to openHAB +after editing them with the openHAB Designer on the administrator's desktop PC. + + +## Service Configuration + +This service can be configured in the file `services/dropbox.cfg`. + +### Authentication settings + +| Property | Default | Required | Description | +|---------------------|---------|:--------:|-------------| +| personalAccessToken | | Yes* | The generated access token | +| appkey | | Yes* | A valid appkey | +| appsecret | | Yes* | A valid appsecret | + +\* In order to authenticate with Dropbox, the configuration must include +**either** the `personalAccessToken` or **BOTH** the `appkey` AND the +`appsecret`. + +The `personalAccessToken` is the newer method of authentication, and is +a simpler process, but the `appkey`/`appsecret` method would theoretically +work if configured. + +If all three properties are defined in the configuration, the +`personalAccessToken` method will be used and the others ignored. + + +### General settings + +| Property | Default | Required | Description | +|----------|---------|:--------:|-------------| +| fakemode | `false` | No | operates the synchronizer in fake mode which avoids sending files to or from Dropbox. Set to `true` as a test mode for the filter settings. | +| contentdir | openHAB configuration directory | No | the base directory to synchronize with openHAB | +| uploadInterval | `0 0 2 * * ?` | No | a [cron expression](http://quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-06) to set the schedule for uploading changes to Dropbox. The default schedule uploads changes every day at 2am. | +| downloadInterval | `0 0/5 * * * ?` | No | a [cron expression](http://quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-06) to set the schedule for downloading changes from Dropbox. The default schedule downloads any changes every five minutes. | +| syncmode | `LOCAL_TO_DROPBOX` | No | There are three different synchronization modes available:

`DROPBOX_TO_LOCAL` - changed files will be downloaded from your Dropbox to openHAB only
`LOCAL_TO_DROPBOX` - locally changed files will be uploaded to your Dropbox only
`BIDIRECTIONAL` - files will be synchronized from Dropbox to your local openHAB and vice versa. All changes will be downloaded from Dropbox to your local system first. After that any local changes will be uploaded to Dropbox. Hence a concurrent change to one file will be overruled by Dropbox in any case.

In case your Dropbox returns the `reset` flag, all local files will be uploaded to your Dropbox once, even if your synchronization mode is set to `DROPBOX_TO_LOCAL`. The `reset` flag might be returned either if the synchronization has been the first call ever (so no delta cursor is available) or there might be technical issues at Dropbox which causes the connected clients to resynchronize their states with Dropbox again. | +| uploadfilter | `^([^/]*/){1}[^/]*$,/configurations.*,/logs/.*,/etc/.*` | No | The defaults are specific to openHAB 1.x running on Unix-like systems | +| downloadfilter | `^([^/]*/){1}[^/]*$,/configurations.*` | No | The defaults are specific to openHAB 1.x running on Unix-like systems | + + +## Dropbox App + +An app must be created on Dropbox. + +### Creating an app + +- Create an account in [Dropbox](http://www.dropbox.com) +- Navigate to the [developer section of the site](http://www.dropbox.com/developers) +- Click the "My apps" link in the left navigation menu, then click the "Create app" button +- In the next screen, select "Dropbox API" in step 1 +- Select "Full Dropbox" in step 2 (This is probably not critical, as "App folder" may also work, but this has not been tested) +- Choose a name for your app in step 3 and click "Create app" +- The following screen will summarize your app; verify the "Allow implicit grant" setting is set to "Allow" +- Under the heading that says "Generated access token", click the "Generate" button to generate an access token that openHAB can use to connect with your app +- Copy the long code string that is generated and paste it into the openHAB configuration file as the value for the `personalAccessToken` setting shown above + +[This tutorial](http://www.iperiusbackup.net/en/create-dropbox-app-get-authentication-token/) +also contains a video of the process. + + +## Troubleshooting + +Installations that used the Dropbox Synchronization Service in earlier versions +of openHAB may encounter this error: + +>[WARN ] [d.internal.DropboxSynchronizer] - Synchronizing data with Dropbox throws an exception: {"error": "Invalid \"cursor\" parameter: this cursor is for a different app."} + +To eliminate this error, delete the `deltacursor.dbx` file. It should be in the same folder as the openHAB startup scripts. + + +## Authentication via appkey/appsecret + +This is a three-step process. openHAB requests a token which is used as a +one-time-password to obtain an access token which will be used for all future +requests to Dropbox. + +### Step 1: Monitor Log for Authorization Message + +The following message will be sent to the log on first startup: + +``` + ######################################################################################### + # Dropbox-Integration: U S E R I N T E R A C T I O N R E Q U I R E D !! + # 1. Open URL 'https://www.dropbox.com/1/oauth2/_type=code' + # 2. Allow openHAB to access Dropbox + # 3. Paste the authorisation code here using the command 'dropbox:finishAuthentication ""' + ######################################################################################### +``` + +### Step 2: Obtain Authorization Token + +Copy the given URL to your browser and authorize openHAB to use Dropbox in +the future. Be aware that the request token is only valid for the next five +minutes. + +After successful authorization, a token is shown on the Dropbox web page: + +![](https://github.com/openhab/openhab1-addons/wiki/images/screenshots/dropbox-authorization.png) + +### Step 3: Save Token in openHAB Console + +Access the openHAB console to reach the `openhab>` prompt. One way you can +access the openHAB 2 console: + +``` +ssh openhab@localhost -p 8101 +``` + +The default password is `habopen`. If this is the first time accessing your +console, it may take some time to generate cryptographic keys. + +Copy the token shown on the Dropbox web page and issue the following command: + +``` +dropbox:finishAuthentication "replace with the token" +``` diff --git a/addons/io/gcal/readme.md b/addons/io/gcal/readme.md new file mode 100644 index 000000000..32dcbdb04 --- /dev/null +++ b/addons/io/gcal/readme.md @@ -0,0 +1,167 @@ +--- +layout: documentation +title: Google Calendar Scheduler - Services +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/io/org.openhab.io.gcal/README.md +--- + + + +{% include base.html %} + +# Google Calendar Scheduler + +The Google Calendar Scheduler allows you to control items in openHAB at scheduled times in the future. It will send commands to items or update the state of items when defined on one of your Google Calendars. + +An additional persistence service, the Google Calendar Presence Simulator, writes item state changes as events on the calendar that will occur again some number of days in the future, to simulate your activity at home (such as turning lights on and off) when on vacation. + +## Table of Contents + + + +- [Obtaining Credentials](#obtaining-credentials) +- [Service Configuration](#service-configuration) +- [Calendar Event Configuration](#calendar-event-configuration) +- [Presence Simulation](#presence-simulation) + - [Solving Google Calendar Presence Simulation errors](#solving-google-calendar-presence-simulation-errors) + + + +## Obtaining Credentials + +Before you can integrate this service with your Google Calendar, you must have a Google API Console project. + +* Login to your [Google API Manager](https://console.developers.google.com). +* From the project drop-down, select an existing project or create a new one by selecting **Create project**. +* In the sidebar under "API Manager", select Credentials, then select the OAuth consent screen tab. +* Choose an **Email Address**, specify a **Product Name**, and press Save. +* In the Credentials tab, select the Create credentials drop-down list, and choose **OAuth client ID**. +* Under **Application type**, select **Other**. +* Put **Name** and press the **Create** button. +* Copy **client id** and **client secret** + +## Service Configuration + +This service can be configured in the file `services/gcal.cfg`. + +| Property | Default | Required | Description | +|----------|---------|:--------:|-------------| +| client_id | | Yes | Copied from the "Client ID" field on the Credentials page as described above in [Obtaining Credentials](#obtaining-credentials) | +| client_secret | | Yes | Copied from the "Client secret" field on the Credentials page as described above in [Obtaining Credentials](#obtaining-credentials) | +| calendar_name | | Yes | This is the name you gave to your Google Calendar, or the word 'primary' if you want to use your default Google calendar (not recommended). The service will download calendar events from this calendar. | +| filter | | No | The filter criteria by which calendar events are searched. The Google Calendar API will do a text search to find calendar events that match the supplied terms. All calendar event fields are searched, except for extended properties. | +| refresh | 900000 | No | the frequency (in milliseconds) with which the Google calendar will be checked for calendar events (900000 milliseconds is 15 minutes). If you change this value, you must restart the service. | + +After the first start, you need to authorize openHAB to allow use your calendar. Follow the instructions that appear in the openHAB log. At the `openhab>` prompt, enter `log:tail`, or at the shell prompt enter `tail -f /path/to/your/openhab.log`. + +``` +[INFO ] [g.internal.GCalEventDownloader] -################################################################################################ +[INFO ] [g.internal.GCalEventDownloader] - # Google-Integration: U S E R I N T E R A C T I O N R E Q U I R E D !! +[INFO ] [g.internal.GCalEventDownloader] - # 1. Open URL 'https://www.google.com/device' +[INFO ] [g.internal.GCalEventDownloader] - # 2. Type provided code ZPWT-UVXXS +[INFO ] [g.internal.GCalEventDownloader] - # 3. Grant openHAB access to your Google calendar +[INFO ] [g.internal.GCalEventDownloader] - # 4. openHAB will automatically detect the permissions and complete the authentication process +[INFO ] [g.internal.GCalEventDownloader] - # NOTE: You will only have 1800 mins before openHAB gives up waiting for the access!!! +[INFO ] [g.internal.GCalEventDownloader] -################################################################################################ +``` + +> If you later change your `client_id` and `client_secret` in the configuration, you will have to locate and delete the file `gcal_oauth2_token`, and stop and restart the service. This is because the Google Calendar Scheduler does not detect that the OAuth token is no longer valid. On openHAB 2.0.0 installed via `apt-get`, this file is located in the directory `/var/lib/openhab2/gcal`. + +## Calendar Event Configuration + +When creating or modifying an event on the calendar, its title can be anything, and its event description must contain the instructions in the following format: + +``` +start { + send|update +} +end { + send|update +} +``` + +or just + +``` +send|update +``` + +The commands in the `start` section will be executed at the event start time and the `end` section at the event end time. If these sections are not present, the commands will be executed at the event start time. + +As a result, your lines in a calendar event might look like this: + +``` +start { + send Light_Garden ON + send Pump_Garden ON +} +end { + send Light_Garden OFF + send Pump_Garden OFF +} +``` + +or just: + +``` +send Light_Garden ON +send Pump_Garden ON +``` + +If the event description is entirely blank, then the event's start and end times are used to exclude that time period from processing. + +> :warning: The calendar must not contain any events that do not conform to the above description, including public holidays, birthdays, any all-day events at all, personal calendar entries, etc. It is recommended that you create a Google Calendar that is dedicated to the use of the Google Calendar Scheduler service. Alternatively, careful use of the `filter` configuration parameter can be used to select only a subset of matching events on the calendar. + +## Presence Simulation + +The Google Calendar Presence Simulator is an openHAB Persistence service can be used to realize a simple but effective presence simulation feature (thanks Ralf for providing the concept). Every single change of an item that belongs to a certain group is posted as new calendar entry in the future. By default each entry is posted with an offset of 14 days (If you'd like to change the offset please change the parameter `offset` in your `services/gcal-persistence.cfg` file). Each calendar entry looks like the following: + +* title: `[PresenceSimulation] ` +* content: `send ` + +To make use of Presence Simulation you have to walk through these configuration steps: + +* configure the gcal-persistence bundle by adding the appropriate configuration. You must add only calendar_name. If you want to use your primary calendar just use the keyword `primary`. All other credentials are shared from Google Calendar Scheduler configuration. +* make sure your items file contains items that belong to the group `G_PresenceSimulation` - if you would like to change the group name, change it in `persistence/gcal.persist`. +* make sure one of your items files contains an item called `PresenceSimulation`. If you would like to change the group name please change the parameter `executescript` in your `services/gcal-persistence.cfg` file. +* make sure the referenced Google Calendar is writeable by the given user at google.com. + +Note: you also need to configure the Google Calendar Scheduler to be able to read the entries from the calendar and act on them. + +To activate the Presence Simulation simply set `PresenceSimulation` to `ON` and the already downloaded events are being executed. Items in your smart home will then behave like they did 14 days earlier. + +A sample `persist/gcal.persist` file looks like this: + +``` +Strategies { + default = everyChange +} + +Items { + G_PresenceSimulation* : strategy = everyChange +} +``` + +### Solving Google Calendar Presence Simulation errors + +To solve any issues with any service bundle, increase the logging. At the `openhab>` prompt you can enter: + +``` +log:set TRACE org.openhab.persistence.gcal +log:set TRACE org.openhab.io.gcal +``` + +You can later return them to `DEFAULT` or `INFO` level. + +* "GCal PresenceSimulation Service isn't initialized properly! No entries will be uploaded to your Google Calendar" + + The persistence configuration is not correct; check that the `client_id` and `client_secret` are correct in the gcal configuration. + +* "creating a new calendar entry throws an exception: Forbidden" + + This can have several causes: + + * The `client_id` or `client_secret` might not be correct. + + * The calendar name is not correct. + + * If your not using your own calendar, make sure the sharing settings are correct and the user has sufficient rights to create calendar entries. diff --git a/addons/io/homekit/readme.md b/addons/io/homekit/readme.md new file mode 100644 index 000000000..97dd3222e --- /dev/null +++ b/addons/io/homekit/readme.md @@ -0,0 +1,117 @@ +--- +layout: documentation +title: HomeKit Add-on - Services +source: external +--- + + + +{% include base.html %} + +# HomeKit Add-on + +This is an add-on that exposes your openHAB system as a bridge over the HomeKit protocol. + +Using this add-on, you will be able to control your openHAB system using Apple's Siri, or any of a number of HomeKit enabled iOS apps. In order to do so, you will need to make some configuration changes. HomeKit organizes your home into "accessories" that are made up of a number of "characteristics". Some accessory types require a specific set of characteristics. + +## Global Configuration +Your first step will be to create the homekit.cfg in your conf/services folder. At the very least, you will need to define a pin number for the bridge. This will be used in iOS when pairing. The pin code is in the form "###-##-###". Requirements beyond this are not clear, and Apple enforces limitations on eligible pins within iOS. At the very least, you cannot use repeating (111-11-111) or sequential (123-45-678) pin codes. If your home network is secure, a good starting point is the pin code used in most sample applications: 031-45-154. + +Other settings, such as using fahrenheit temperatures, customizing the thermostat heat/cool/auto modes, and specifying the interface to advertise the Homekit bridge on are also illustrated in the following sample: + +``` +org.openhab.homekit:port=9124 +org.openhab.homekit:pin=031-45-154 +org.openhab.homekit:useFahrenheitTemperature=true +org.openhab.homekit:thermostatCoolMode=CoolOn +org.openhab.homekit:thermostatHeatMode=HeatOn +org.openhab.homekit:thermostatAutoMode=Auto +org.openhab.homekit:thermostatOffMode=Off +org.openhab.homekit:networkInterface=192.168.0.6 + +``` + +## Item Configuration +After setting this global configuration, you will need to tag your openHAB items in order to map them to an ontology. For our purposes, you may consider HomeKit accessories to be of two forms: simple and complex. + +A simple accessory will be mapped to a single openHAB item (i.e. a Lighbulb is mapped to a Switch, Dimmer, or Color item). A complex accessory will be made up of multiple openHAB items (i.e. a Thermostat is composed of Heating and Cooling thresholds, a mode, and current temperature). Complex accessories require a tag on a Group indicating the accessory type, as well as tags on the items it composes. + +A full list of supported accessory types can be found in the table below. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tagchild tagsupported itemsdescription
Lighting Switch, Dimmer, ColorA lightbulb, switchable, dimmable or rgb
Switchable Switch, Dimmer, ColorAn accessory that can be turned off and on. While similar to a lightbulb, this will be presented differently in the Siri grammar and iOS apps
CurrentTemperature NumberAn accessory that provides a single read-only temperature value. The units default to celsius but can be overridden globally using the useFahrenheitTemperature global property
CurrentHumidity NumberAn accessory that provides a single read-only value indicating the relative humidity.
Thermostat GroupA thermostat requires all child tags defined below
 CurrentTemperatureNumberThe current temperature, same as above
 homekit:HeatingCoolingModeStringIndicates the current mode of the device: OFF, AUTO, HEAT, COOL. The string's value must match those defined in the thermostat*Mode properties. This is a homekit-specific term and therefore the tags needs to be prefixed with "homekit:"
 TargetTemperatureNumberA target temperature that will engage the thermostat's heating and cooling actions as necessary, depending on the heatingCoolingMode
+ +See the sample below for example items: + +``` +Switch KitchenLights "Kitchen Lights" (gKitchen) [ "Lighting" ] +Dimmer BedroomLights "Bedroom Lights" (gBedroom) [ "Lighting" ] +Number BedroomTemperature "Bedroom Temperature" (gBedroom) [ "CurrentTemperature" ] +Group gDownstairsThermostat "Downstairs Thermostat" (gFF) [ "Thermostat" ] +Number DownstairsThermostatCurrentTemp "Downstairs Thermostat Current Temperature" (gDownstairsThermostat) [ "CurrentTemperature" ] +Number DownstairsThermostatTargetTemperature "Downstairs Thermostat Target Temperature" (gDownstairsThermostat) [ "TargetTemperature" ] +String DownstairsThermostatHeatingCoolingMode "Downstairs Thermostat Heating/Cooling Mode" (gDownstairsThermostat) [ "homekit:HeatingCoolingMode" ] +``` + +## Additional Notes +HomeKit allows only a single pairing to be established with the bridge. This pairing is normally shared across devices via iCloud. If you need to establish a new pairing, you'll need to clear the existing pairings. To do this, you can issue the command ```smarthome homekit clearPairings``` from the OSGi console. + +HomeKit requires a unique identifier for each accessory advertised by the bridge. This unique identifier is hashed from the Item's name. For that reason, it is important that the name of your Items exposed to HomeKit remain consistent. + +If you encounter any issues with the add-on and need support, it may be important to get detailed logs of your device's communication with openHAB. In order to get logs from the underlying library used to implement the HomeKit protocol, enable trace logging using the following command: + +```openhab> log:set TRACE com.beowulfe.hap``` diff --git a/addons/io/hueemulation/readme.md b/addons/io/hueemulation/readme.md new file mode 100644 index 000000000..7576832ad --- /dev/null +++ b/addons/io/hueemulation/readme.md @@ -0,0 +1,44 @@ +--- +layout: documentation +title: openHAB Hue Emulation - Services +source: external +--- + + + +{% include base.html %} + +# openHAB Hue Emulation Service + +Hue Emulation exposes openHAB items as Hue devices to other Hue HTTP API compatible applications like an Amazon Echo. + +## Features: + +* UPNP automatic discovery +* Support ON/OFF and Percent/Decimal item types +* Can expose any type of item, not just lights +* Pairing (security) can be enabled/disabled in real time using the configuration service (under services in the PaperUI for example) + +## Configuration: + +Pairing can be turned on and off: + +``` +org.openhab.hueemulation:pairingEnabled=false +``` + +(Optional) For systems with multiple IP addresses the IP to use for UPNP may be specified, otherwise the first non loopback address will be used. + +``` +org.openhab.hueemulation:discoveryIp=192.168.1.100 +``` + +## Device Tagging +To expose an item on the service, apply a supported tag (which are "Lighting", "Switchable", "TargetTemperature") to it. The item label will be used as the Hue device name. + +``` +Switch TestSwitch1 "Kitchen Switch" [ "Switchable" ] +Switch TestSwitch2 "Bathroom" [ "Lighting" ] +Dimmer TestDimmer3 "Hallway" [ "Lighting" ] +Number TestNumber4 "Temperature Set Point" [ "TargetTemperature" ] +``` diff --git a/addons/io/imperihome/readme.md b/addons/io/imperihome/readme.md new file mode 100644 index 000000000..2a9ca55cf --- /dev/null +++ b/addons/io/imperihome/readme.md @@ -0,0 +1,477 @@ +--- +layout: documentation +title: ImperiHome integration service - Services +source: external +--- + + + +{% include base.html %} + +# ImperiHome integration service + +This IO service exposes openHAB Items to the Evertygo [ImperiHome](http://www.evertygo.com/imperihome) dashboard app for Android and iOS. +It creates a REST service at _/imperihome/iss_ that implements the [ImperiHome Standard System API](http://dev.evertygo.com/api/iss) (ISS). + +## Installation + +The ImperiHome integration service can be installed through the Paper UI. Navigate to Add-ons > Misc and click Install. + + + +## Configuration + +### openHAB Add-on + +To configure the ImperiHome integration add-on in openHAB, create a _imperihome.cfg_ file in the _conf/services_ directory. The following configuration options can be used: + +**System ID** + +The ImperiHome integration service identifies itself to ImperiHome using a system ID. By default the unique identifier of your openHAB installation is used. To override the ID, use the _system.id_ configuration option. + +``` +system.id=my-openhab-123 +``` + +*Warning*: the system ID can not contain the underscore character (_). + +**Root URL** + +Root URL of your openHAB installation. Should point to the openHAB welcome page. This option is currently only required when using the custom icon tag. + +``` +openhab.rootUrl=http://myserver.example.org:7070/ +``` + +### ImperiHome + +ImperiHome must be configured to connect to your openHAB instance. + +Start ImperiHome, open the menu and go to My Systems. Add a new system (+) and choose 'ImperiHome Standard System' as the object type. Now enter the URL to your openHAB instance + as Local URL, followed by _/imperihome/iss_. For example, if your openHAB instance is running at _http://192.168.1.10:8080/_, the Local URL would be _http://192.168.1.10:8080/imperihome/iss_. + +If you have port forwarding or similar set up to access your OH form the internet, you can also fill the Remote URL in the same way. For example: +_http://my-openhab-url.dyndns.org:8080/imperihome/iss_. Please be aware that this service provides no authentication mechanism, so anyone could use the API to control your +system when accessible from the internet. + +Click Next to let ImperiHome validate the URL. After validation succeeded the system is added and you can continue to configure your Items for use in ImperiHome. + +## Device Tagging + +This service uses Item tags to determine how to expose your Items to ImperiHome. All tags are formatted like this: + +``` +iss:: +``` + +For example: + +``` +iss:room:Kitchen +``` + +If you've defined your Items in _.items_ files, tags can be added using the + +``` +[ "mytag" ] +``` + +syntax (after the _(Groups)_ and before the _{channel}_). +If you created your items another way, e.g. using the Paper UI, [HABmin](https://github.com/openhab/org.openhab.ui.habmin) allows you to modify the tags. + +### Tag: _type_ + +Specifies the device type to expose to ImperiHome. Take a look at [Device types](#deviceTypes) below for the supported device types and how to configure them. +If no type is specified, this service will try to auto-detect the type from the Item, based on supported value types (OnOff for a switch, HSB for color light) and Item name. + +_Required_: no
+_Default_: auto-detect
+Example: + +``` +iss:type:DevSwitch +``` + +### Tag: _room_ + +Specifies the room the device will show up in in ImperiHome. + +_Required_: no
+_Default_: 'No Room'
+_Example_: + +``` +iss:room:Kitchen +``` + +### Tag: _label_ + +Sets the device label in ImperiHome. If no label is specified, the Item label is used if available. Otherwise the Item name will be used. + +_Required_: no
+_Default_: Item label or name
+_Example_: + +``` +iss:label:Kitchen light +``` + +### Tag: _mapping_ + +Sets the mapping for a ImperiHome MultiSwitch device, just like an openHAB sitemap mapping does. +In the example below, 'All off', 'Relax' and 'Reading' will be visible in ImperiHome. Clicking one of the options will send +a 0, 1 or 2 value command to the openHAB item. + +_Required_: only for MultiSwitch device
+_Default_: none
+_Example_: + +``` +iss:mapping:0=All off,1=Relax,2=Reading +``` + +### Tag: _link_ + +Links two devices together, using the value from the linked device as an additional value in the device containing the link tag. +See [Device links](#deviceLinks) for details. + +_Required_: no
+_Default_: none
+_Example_: + +``` +iss:link:energy:Kitchen_Current_Consumption +``` + +### Tag: _unit_ + +Sets the unit for devices with a numeric value, such as _DevTemperature_ and _DevGenericSensor_. +The unit is only used to tell ImperiHome what to display; no conversion is performed. + +_Required_: no
+_Default_: none
+_Example_: + +``` +iss:unit:°C +``` + +### Tag: _invert_ + +Inverts the state of on/off devices such as switches and dimmers. + +_Required_: no
+_Default_: false
+_Example_: + +``` +iss:invert:true +``` + +### Tag: _icon_ + +Sets a custom icon to be shown in ImperiHome. You can use all icon names that are also available for use in your sitemaps, including custom icons. +To use this tag you must set the openHAB root URL in your [configuration](#configuration). + +_Required_: no
+_Default_: none
+_Example_: + +``` +iss:icon:sofa +``` + + + +## Device types + +The following table lists the ImperiHome API device types that you can use in a _iss:type_ tag. Not all device types are currently supported. For those that are supported, +the Item types you can use them on are listed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DeviceDescriptionSupportedItem typesLink types
DevCameraMJPEG IP CameraNo-
DevCO2CO2 sensorYesNumber-
DevCO2AlertCO2 Alert sensorYesContact, Number, String(1), Switch-
DevDimmerDimmable lightYesDimmerenergy
DevDoorDoor / window security sensorYesContact, Number, String(1), Switch-
DevElectricityElectricity consumption sensorYesNumberkwh, watt
DevFloodFlood security sensorYesContact, Number, String(1), Switch-
DevGenericSensorGeneric sensor (any value)YesNumber, String-
DevHygrometryHygro sensorYesNumber-
DevLockDoor lockYesContact, Switch-
DevLuminosityLuminance sensorYesNumber-
DevMotionMotion security sensorYesContact, Number, String(1), Switch-
DevMultiSwitchMultiple choice actuatorYesNumber-
DevNoiseNoise sensorYesNumber-
DevPlayerAudio/Video playerNo-
DevPlaylistAudio/Video playlistNo-
DevPressurePressure sensorYesNumber-
DevRainRain sensorYesNumberaccum
DevRGBLightRGB(W) Light (dimmable)YesColorenergy
DevSceneScene (launchable)YesSwitch, Number-
DevShutterShutter actuatorNo-
DevSmokeSmoke security sensorYesContact, Number, String(1), Switch-
DevSwitchStandard on/off switchYesSwitchenergy
DevTemperatureTemperature sensorYesNumber-
DevTempHygroTemperature and Hygrometry combined sensorYesNumberhygro, temp
DevThermostatThermostatNo-
DevUVUV sensorYesNumber-
DevWindWind sensorYesNumberdirection
+ +(1) When using a String Item for trippable devices, any non-empty value other than 'ok' will set the device to tripped. This makes it compatible with the Nest Protect binding. + + + +## Device links + +Some devices can be linked to another device. This allows you to create combined devices reporting multiple values, or reporting the energy consumption with a switch device. + +The _link_ tag refers to the name of the Item it should link to. The item must be an ImperiHome device itself, so it must have at least one _iss_ tag. + +### Switch energy consumption + +ImperiHome allows you to show the current energy consumption for a _DevDimmer_, _DevRGBLight_ and _DevSwitch_. +This example links the _MyLightEnergy_ Number Item to the _MyLight_ Switch Item, +so the _DevSwitch_ device will also report the energy consumption value to ImperiHome: + +``` +Switch MyLight "My Light" ["iss:type:DevSwitch", "iss:link:energy:MyLight_Energy"] { channel="zwave:device:1:node14:switch_binary1" } +Number MyLightEnergy "My Light Usage [%.1f W]" ["iss:type:DevElectricity"] { channel="zwave:device:1:node14:meter_watts1" } +``` + +### Total energy consumption + +The _DevElectricity_ devices main value is the current consumption in Watts. To add the total consumption in KWh, link your electricity device to +a generic sensor device containing the total energy consumption value: + +``` +Number MyLight_Energy "My Light Usage [%.1f W]" ["iss:type:DevElectricity", "iss:link:kwh:MyLight_Total_Energy"] { channel="zwave:device:1:node14:meter_watts1" } +Number MyLight_Total_Energy "My Light Total usage [%.1f KWh]" ["iss:type:DevGenericSensor", "iss:unit:KWh"] { channel="zwave:device:1:node14:sensor_power1" } +``` + +### TempHygro + +ImperiHome recognizes the special _DevTempHygro_ device, combining a temperature and hydrometry sensor. You can create such a device by linking either from a temperature Item to a hygro Item: + +``` +Number MyTemp "Temperature [%.1f °C]" ["iss:type:DevTempHygro", "iss:link:hygro:MyHum"] { channel="zwave:device:1:node8:sensor_temperature" } +Number MyHum "Humidity [%d%%]" ["iss:type:DevHygrometry"] { channel="zwave:device:1:node8:sensor_relhumidity" } +``` + +or vise versa: + +``` +Number MyTemp "Temperature [%.1f °C]" ["iss:type:DevTemperature"] { channel="zwave:device:1:node8:sensor_temperature" } +Number MyHum "Humidity [%d%%]" ["iss:type:DevTempHygro", "iss:link:temp:MyTemp"] { channel="zwave:device:1:node8:sensor_relhumidity" } +``` + +### Rain accumulation + +The _DevRain_ devices main value is the current instant rain value (default in mm per hour). To add the total rain accumulation value, link your rain device to +a generic sensor device: + +``` +Number RainCurrent "Rain current [%.1f mm/h]" ["iss:type:DevRain", "iss:link:accum:RainAccumulation"] { channel="..." } +Number RainAccumulation "Rain accumulation [%.1f mm]" ["iss:type:DevGenericSensor", "iss:unit:mm"] { channel="..." } +``` + +### Wind direction + +The _DevWind_ devices main value is the current wind speed (default in km per hour). To add the wind direction value (default in degrees), link your wind device to +a generic sensor device: + +``` +Number WindSpeed "Wind speed [%.1f km/h]" ["iss:type:DevWind", "iss:link:direction:WindDirection"] { channel="..." } +Number WindDirection "Wind direction [%d deg]" ["iss:type:DevGenericSensor", "iss:unit:deg"] { channel="..." } +``` + +## Items example + +``` +Color LVR_Billy "Billy" (Lights) ["iss:room:Living room", "iss:type:DevRGBLight"] { channel="hue:0210:001122334455:bulb1:color" } +Switch LVR_TallLamp "Tall lamp" (Lights) ["iss:room:Living room", "iss:type:DevSwitch", "iss:invert:true"] { channel="zwave:device:1:node3:switch_binary" } +Dimmer LVR_DinnerTable "Dinner table" (Lights) ["iss:room:Living room", "iss:type:DevDimmer"] { channel="zwave:device:1:node13:switch_dimmer" } + +Number ENT_Entrance_Current "Entrance usage [%.1f W]" (Wattage) ["iss:room:Entrance", "iss:type:DevElectricity", "iss:unit:Watt"] { channel="zwave:device:1:node14:meter_watts1" } + +Number ENT_Temperature "Entrance temperature [%.1f °C]" (Temperature) ["iss:room:Entrance", "iss:type:DevTempHygro", "iss:link:hygro:ENT_Humidity"] { channel="zwave:device:1:node8:sensor_temperature" } +Number ENT_Luminance "Entrance light [%d lm]" (Luminance) ["iss:room:Entrance", "iss:type:DevLuminosity", "iss:unit:lux"] { channel="zwave:device:1:node8:sensor_luminance" } +Number ENT_Humidity "Entrance humidity [%d%%]" (Humidity) ["iss:room:Entrance", "iss:type:DevHygrometry"] { channel="zwave:device:1:node8:sensor_relhumidity" } +``` + diff --git a/addons/io/openhabcloud/doc/cfg.png b/addons/io/openhabcloud/doc/cfg.png new file mode 100644 index 0000000000000000000000000000000000000000..9720dd4ffb6be66d2384ba23d02f162baf6aaee9 GIT binary patch literal 85698 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%0A!GI(1qYAmNm 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 + +{% include base.html %} + +# openHAB Cloud Connector + +The openHAB Cloud Connector allows connecting the local openHAB runtime to a remote [openHAB Cloud](https://github.com/openhab/openhab-cloud/blob/master/README.md) instance, such as [myopenHAB.org](http://www.myopenHAB.org), which is an instance of the +openHAB Cloud service hosted by the [openHAB Foundation](http://www.openhabfoundation.org/). + +## Features + +The openHAB Cloud service (and thus the connector to it) is useful for different use cases: + +* It allows remote access to local openHAB instances without having to expose ports to the Internet or to require a complex VPN setup. +* It serves as a connector to Google Cloud Messaging (GCM) and Apple Push Notifications (APN) for pushing notifications to mobile phone apps. +* It brings integration possibilities with services that require an OAuth2 authentication against a web server, such as IFTTT or Amazon Alexa Skills. + +## UUID and Secret + +To authenticate with the openHAB Cloud your local openHAB runtime generates two values, which need to be entered in your account settings of the openHAB Cloud service. The first one is a unique identifier, which allows to identify your runtime. One can think of it as something similar like a username for the cloud authentication. The second one is a random secret key which serves as a password. Both values are written to the local file system. If you loose these files for some reason, openHAB will automatically generates new ones. You will then have to reconfigure UUID and secret in the openHAB Cloud service under the _My account_ section. + +Location of UUID and Secret: + +|File | regular Installation | APT Installation | +|-----|----------------------|------------------| +|UUID | userdata/uuid | /var/lib/openhab2/uuid | +|Secret | userdata/openhabcloud/secret | /var/lib/openhab2/openhabcloud/secret | + +## Configuration + +After installing this add-on, you will find configuration options in the Paper UI under _Configuration->Services->IO->openHAB Cloud_: + +![Configuration](doc/cfg.png) + +Alternatively, you can configure the settings in the file `conf/services/openhabcloud.cfg`: + +``` +############################## openHAB Cloud Connector ############################# + +# The URL of the openHAB Cloud service to connect to. +# Optional, default is set to the service offered by the openHAB Foundation +# (https://myopenhab.org/) +#baseURL= + +# Defines the mode in which you want to operate the connector. +# Possible values are: +# - notification: Only push notifications are enabled, no remote access is allowed. +# - remote: Push notifications and remote access are enabled. +# Optional, default is 'remote'. +#mode= + +# A comma-separated list of items to be exposed to external services like IFTTT. +# Events of those items are pushed to the openHAB Cloud and commands received for +# these items from the openHAB Cloud service are accepted and sent to the local bus. +# Optional, default is an empty list. +#expose= +``` + diff --git a/addons/persistence/caldav/readme.md b/addons/persistence/caldav/readme.md index e135cf370..db0dd6f3b 100644 --- a/addons/persistence/caldav/readme.md +++ b/addons/persistence/caldav/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: CalDAV - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.caldav/README.md --- + {% include base.html %} diff --git a/addons/persistence/cosm/readme.md b/addons/persistence/cosm/readme.md index 196f230c7..e884a9e98 100644 --- a/addons/persistence/cosm/readme.md +++ b/addons/persistence/cosm/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Xively (formerly Cosm) - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.cosm/README.md --- + {% include base.html %} diff --git a/addons/persistence/db4o/readme.md b/addons/persistence/db4o/readme.md index a8ef8d395..97b9d2424 100644 --- a/addons/persistence/db4o/readme.md +++ b/addons/persistence/db4o/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: db4o - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.db4o/README.md --- + {% include base.html %} diff --git a/addons/persistence/dynamodb/readme.md b/addons/persistence/dynamodb/readme.md index e5e0f3c65..26974dd4a 100644 --- a/addons/persistence/dynamodb/readme.md +++ b/addons/persistence/dynamodb/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Amazon DynamoDB - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.dynamodb/README.md --- + {% include base.html %} diff --git a/addons/persistence/exec/readme.md b/addons/persistence/exec/readme.md index 05b49d295..e200663c9 100644 --- a/addons/persistence/exec/readme.md +++ b/addons/persistence/exec/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Exec - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.exec/README.md --- + {% include base.html %} diff --git a/addons/persistence/influxdb/readme.md b/addons/persistence/influxdb/readme.md index 631331844..6a5e79661 100644 --- a/addons/persistence/influxdb/readme.md +++ b/addons/persistence/influxdb/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: InfluxDB (0.9 and newer) - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.influxdb/README.md --- + {% include base.html %} diff --git a/addons/persistence/influxdb08/readme.md b/addons/persistence/influxdb08/readme.md index 5bb99b536..53ade6ad7 100644 --- a/addons/persistence/influxdb08/readme.md +++ b/addons/persistence/influxdb08/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: InfluxDB (up to 0.8.x) - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.influxdb08/README.md --- + {% include base.html %} diff --git a/addons/persistence/jdbc/readme.md b/addons/persistence/jdbc/readme.md index 70dafa783..e1226a801 100644 --- a/addons/persistence/jdbc/readme.md +++ b/addons/persistence/jdbc/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: JDBC - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.jdbc/README.md --- + {% include base.html %} diff --git a/addons/persistence/jpa/readme.md b/addons/persistence/jpa/readme.md index 9eb9b4784..64d780a1c 100644 --- a/addons/persistence/jpa/readme.md +++ b/addons/persistence/jpa/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Java Persistence API (JPA) - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.jpa/README.md --- + {% include base.html %} diff --git a/addons/persistence/mapdb/readme.md b/addons/persistence/mapdb/readme.md index 7e7a4551f..8b4ddb991 100644 --- a/addons/persistence/mapdb/readme.md +++ b/addons/persistence/mapdb/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: mapdb - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.mapdb/README.md --- + {% include base.html %} diff --git a/addons/persistence/mongodb/readme.md b/addons/persistence/mongodb/readme.md index a5bc4b62d..61ed33df4 100644 --- a/addons/persistence/mongodb/readme.md +++ b/addons/persistence/mongodb/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MongoDB - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.mongodb/README.md --- + {% include base.html %} diff --git a/addons/persistence/mqtt/readme.md b/addons/persistence/mqtt/readme.md index 90e00e98e..def755391 100644 --- a/addons/persistence/mqtt/readme.md +++ b/addons/persistence/mqtt/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MQTT - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.mqtt/README.md --- + {% include base.html %} diff --git a/addons/persistence/mysql/readme.md b/addons/persistence/mysql/readme.md index d03f8b2d1..65e115528 100644 --- a/addons/persistence/mysql/readme.md +++ b/addons/persistence/mysql/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: MySQL - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.mysql/README.md --- + {% include base.html %} diff --git a/addons/persistence/rrd4j/readme.md b/addons/persistence/rrd4j/readme.md index ce14abdbe..8b4643f6b 100644 --- a/addons/persistence/rrd4j/readme.md +++ b/addons/persistence/rrd4j/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: rrd4j - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.rrd4j/README.md --- + {% include base.html %} diff --git a/addons/persistence/sense/readme.md b/addons/persistence/sense/readme.md index e6f0fe585..75c7b3465 100644 --- a/addons/persistence/sense/readme.md +++ b/addons/persistence/sense/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: Sen.Se - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.sense/README.md --- + {% include base.html %} diff --git a/addons/persistence/sitewhere/readme.md b/addons/persistence/sitewhere/readme.md index b454690f8..8e844118b 100644 --- a/addons/persistence/sitewhere/readme.md +++ b/addons/persistence/sitewhere/readme.md @@ -1,8 +1,9 @@ --- layout: documentation title: SiteWhere - Persistence -source: external +source: https://github.com/openhab/openhab1-addons/blob/master/bundles/persistence/org.openhab.persistence.sitewhere/README.md --- + {% include base.html %} diff --git a/addons/uis/habmin/readme.md b/addons/uis/habmin/readme.md index 360400853..cff454f72 100644 --- a/addons/uis/habmin/readme.md +++ b/addons/uis/habmin/readme.md @@ -1,7 +1,11 @@ --- layout: documentation +title: habmin - UI +source: external --- + + {% include base.html %} HABmin diff --git a/addons/uis/habpanel/readme.md b/addons/uis/habpanel/readme.md index c78519e0c..20fb4e5fb 100644 --- a/addons/uis/habpanel/readme.md +++ b/addons/uis/habpanel/readme.md @@ -1,7 +1,11 @@ --- layout: documentation +title: Configuration - UI +source: external --- + + {% include base.html %} HABPanel diff --git a/addons/voice/voicerss/readme.md b/addons/voice/voicerss/readme.md index 4a57d686b..febf69512 100644 --- a/addons/voice/voicerss/readme.md +++ b/addons/voice/voicerss/readme.md @@ -1,7 +1,11 @@ --- layout: documentation +title: VoiceRSS Text-to-Speech - Voice +source: external --- + + {% include base.html %} # VoiceRSS Text-to-Speech