updated generated content

Signed-off-by: Kai Kreuzer <kai@openhab.org>
pull/671/head
Kai Kreuzer 2018-04-26 16:41:20 +02:00
parent 117ee07353
commit dae6cbc34b
No known key found for this signature in database
GPG Key ID: 5110767B6248D3C0
47 changed files with 1741 additions and 1326 deletions

View File

@ -22,7 +22,10 @@ The Pushbullet action allows you to notify iOS, Android & Windows 10 Phone & Des
The following is a valid action call that can be made when the plugin is loaded. The following is a valid action call that can be made when the plugin is loaded.
For specific information on each item, see the [Pushbullet API](https://docs.pushbullet.com/). For specific information on each item, see the [Pushbullet API](https://docs.pushbullet.com/).
The recipient can either be an email address or a channel tag.
If it is not specified or invalid, the note will be broadcast to all of the user account's devices.
- `sendPushbulletNote(String title, String message)`
- `sendPushbulletNote(String receiver, String title, String message)` - `sendPushbulletNote(String receiver, String title, String message)`
- `sendPushbulletNote(String botname, String receiver, String title, String message)` - `sendPushbulletNote(String botname, String receiver, String title, String message)`

View File

@ -14,55 +14,83 @@ install: auto
{% include base.html %} {% include base.html %}
# Pushover Actions # Pushover Actions
The Pushover action service allows you to notify mobile devices of a message using the Pushover API web service. The Pushover action service allows you to notify mobile devices of a message using the Pushover API web service.
## Configuration ## Configuration
You may define default values for parameters to action calls in the file `services/pushover.cfg`. You may define default values for parameters to action calls in the file `services/pushover.cfg`.
None of the configuration parameters are required as you can specify required configuration items in the action call, but you must at least provide an *API Token*, *User/Group Key* and a *Message* in some manner before a message can be pushed. None of the configuration parameters are required as you can specify required configuration items in the action call, but you must at least provide an *API Token*, *User/Group Key* and a *Message* in some manner before a message can be pushed.
| Property | Default | Required | Description | | Property | Default | Required | method to set | Description |
|-----------------|---------|:-------------------------------------------------:|------------------------------------------------------------------------------------------------------------------------| |-----------------|---------|:-------------------------------------------------:|-------------------------------------|------------------------------------------------------------------------------------------------------------------------|
| defaultTimeout | 10000 | No | Timeout in milliseconds for the connection to pushover.net | | defaultTimeout | 10000 | No | - | Timeout in milliseconds for the connection to pushover.net |
| defaultToken | | if using action call without `apiToken` parameter | Pushover [API token](https://pushover.net/api) to send to devices | | defaultToken | | if using action call without `apiToken` parameter | withApiKey(String apiKey) | Pushover [API token](https://pushover.net/api) to send to devices |
| defaultUser | | if using action call without `userKey` parameter | Pushover User or Group key (not e-mail address) of your user (or you) to send to devices. | | defaultUser | | if using action call without `userKey` parameter | withUser(String user) | Pushover User or Group key (not e-mail address) of your user (or you) to send to devices. |
| defaultTitle | openHAB | No | Application title for the notification | | defaultTitle | openHAB | No | withTitle(String title) | Application title for the notification |
| defaultPriority | 0 | No | Priority of the notification, from -2 (low priority) to 2 (high priority) | | defaultPriority | 0 | No | withPriority(int priority) | Priority of the notification, from -2 (low priority) to 2 (high priority) |
| defaultUrl | | No | URL to attach to the message if not specified in the command. This can be used to trigger actions on the device. | | defaultUrl | | No | withUrl(String url) | URL to attach to the message if not specified in the command. This can be used to trigger actions on the device. |
| defaultUrlTitle | | No | URL title to attach to the message if not specified in the command. This can be used to trigger actions on the device. | | defaultUrlTitle | | No | withUrlTitle(String urlTitle) | URL title to attach to the message if not specified in the command. This can be used to trigger actions on the device. |
| defaultRetry | 300 | No | When priority is 2 (high priority), how often (in seconds) should messages be resent | | defaultRetry | 300 | No | - | When priority is 2 (high priority), how often (in seconds) should messages be resent |
| defaultExpire | 3600 | No | When priority is 2 (high priority), how long (in seconds) to continue resending messages until acknowledged | | defaultExpire | 3600 | No | - | When priority is 2 (high priority), how long (in seconds) to continue resending messages until acknowledged |
| attachment | | No | withAttachment(String attachment) | The full path of a JPEG image attachment to be pushed with the message. |
## Actions | contentType | | No | withContentType(String contentType) | Content type, ie "image/png" |
The following are valid action calls that can be made when the plugin is loaded. ## Actions
For specific information on each item, see the [Pushover API](https://pushover.net/api).
The following are valid action calls that can be made when the plugin is loaded.
- `pushover(String message)` For specific information on each item, see the [Pushover API](https://pushover.net/api).
- `pushover(String message, String device)`
- `pushover(String message, int priority)` - `Deprecated ~~pushover(String message)~~`
- `pushover(String message, int priority, String url)` - `Deprecated ~~pushover(String message, int priority)~~`
- `pushover(String message, int priority, String url, String urlTitle)` - `Deprecated ~~pushover(String message, int priority, String url)~~`
- `pushover(String message, int priority, String url, String urlTitle, String soundFile)` - `Deprecated ~~pushover(String message, int priority, String url, String urlTitle)~~`
- `pushover(String message, String device, int priority)` - `Deprecated ~~pushover(String message, int priority, String url, String urlTitle, String soundFile)~~`
- `pushover(String message, String device, int priority, String url)` - `Deprecated ~~pushover(String message, String device)~~`
- `pushover(String message, String device, int priority, String url, String urlTitle)` - `Deprecated ~~pushover(String message, String device, int priority)~~`
- `pushover(String message, String device, int priority, String url, String urlTitle, String soundFile)` - `Deprecated ~~pushover(String message, String device, int priority, String url)~~`
- `pushover(String apiToken, String userKey, String message)` - `Deprecated ~~pushover(String message, String device, int priority, String url, String urlTitle)~~`
- `pushover(String apiToken, String userKey, String message, String device)` - `Deprecated ~~pushover(String message, String device, int priority, String url, String urlTitle, String soundFile)~~`
- `pushover(String apiToken, String userKey, String message, int priority)` - `Deprecated ~~pushover(String apiToken, String userKey, String message)~~`
- `pushover(String apiToken, String userKey, String message, String device, int priority)` - `Deprecated ~~pushover(String apiToken, String userKey, String message, int priority)~~`
- `pushover(String apiToken, String userKey, String message, String device, String title, String url, String urlTitle, int priority, String soundFile)` - `Deprecated ~~pushover(String apiToken, String userKey, String message, String device)~~`
- `Deprecated ~~pushover(String apiToken, String userKey, String message, String device, int priority)~~`
The action calls have to be configured in the above sequence, if you need to omit one of the call parameters you may use a null value or two double quotes. - `Deprecated ~~pushover(String apiToken, String userKey, String message, String device, String title, String url, String urlTitle, int priority, String soundFile)~~`
In this case any default values from `services/pushover.cfg` will be used. - `Deprecated ~~pushover(String apiToken, String userKey, String message, String device, String title, String url, String urlTitle, int priority, String soundFile, String attachment)~~`
Note that you cannot use a null value for int priority. - `sendPushoverMessage(Pushover pushover)`
### Example The action calls have to be configured in the above sequence. The builder pattern is used to provide the parameters. The most parameters are optional and may have a default value. See the examples how to call use the pushover action.
In this case any default values from `services/pushover.cfg` will be used.
Send a message without a sound, omit String url and String urlTitle. Note that you cannot use a null value for int priority.
- `pushover("test message", 1, null, null, "none")` or
- `pushover("test message", 1, "", "", "none")` - `cancelPushoverEmergency(String receipt)`
- `cancelPushoverEmergency(String apiToken, String userKey, String receipt)`
The actions which are send using `withEmergencyPriority()` will send a message with [Emergency Priority](https://pushover.net/api#priority).
The actions return a receipt identifier (String).
The identifier has to be passed on to the `cancelPushoverEmergency` actions to cancel the notification prior to reaching the `defaultExpire` value of one hour.
### Basic example
Different ways to send a message. You can combine the withXXX methods as you need.
- `sendPushoverMessage(pushoverBuilder("test message"))` or
- `sendPushoverMessage(pushoverBuilder("test message").withEmergencyPriority())` or
- `sendPushoverMessage(pushoverBuilder("test message").withAttachment("/path/to/file.jpeg"))` or
- `sendPushoverMessage(pushoverBuilder("test message").withAttachment("/path/to/file.png").withContentType("image/png"))` or
- `sendPushoverMessage(pushoverBuilder("test message").withApiKey("KEY").withUser("USER").withDevice("DEVICE").withTitle("TITLE").withUrl("URL").withUrlTitle("URL_TITLE").withPriority(0).withSound("SOUND").withAttachment("/path/to/file.png").withContentType("image/png"))`
### Emergency example
```
var String receipt = sendPushoverMessage(pushoverBuilder("Attention, front door opened!").withEmergencyPriority())
// wait for your cancel condition
if( receipt !== null ) {
cancelPushoverEmergency(receipt)
receipt = null
}
```

View File

@ -32,6 +32,17 @@ As described in the Telegram Bot API, this is the manual procedure needed in ord
- Open a browser and invoke `https://api.telegram.org/bot<token>/getUpdates` (where `<token>` is the authentication token previously obtained) - Open a browser and invoke `https://api.telegram.org/bot<token>/getUpdates` (where `<token>` is the authentication token previously obtained)
- Look at the JSON result and write down the value of `result[0].message.chat.id`. That is the chatId. Note that Telegram group chat chatIds are prefixed with a dash "-" that must be included in the config file. (e.g. bot1.chatId: -22334455) - Look at the JSON result and write down the value of `result[0].message.chat.id`. That is the chatId. Note that Telegram group chat chatIds are prefixed with a dash "-" that must be included in the config file. (e.g. bot1.chatId: -22334455)
## Actions
Each of the actions returns `true` on success or `false` on failure.
- `sendTelegram(String group, String message)`: Sends a Telegram via Telegram REST API - direct message
- `sendTelegram(String group, String format, Object... args)`: Sends a Telegram via Telegram REST API - build message with format and args
- `sendTelegramPhoto(String group, String photoURL, String caption)`: Sends a Picture via Telegram REST API
- `sendTelegramPhoto(String group, String photoURL, String caption, Integer timeoutMillis)`: Sends a Picture via Telegram REST API, using custom HTTP timeout
- `sendTelegramPhoto(String group, String photoURL, String caption, String username, String password)`: Sends a Picture, protected by username/password authentication, via Telegram REST API
- `sendTelegramPhoto(String group, String photoURL, String caption, String username, String password, int timeoutMillis, int retries)`: Sends a Picture, protected by username/password authentication, using custom HTTP timeout and retries, via Telegram REST API
## Configuration ## Configuration
The action can be configured in `services/telegram.cfg`. The action can be configured in `services/telegram.cfg`.
@ -86,6 +97,12 @@ end
### Send an image to telegram chat ### Send an image to telegram chat
When sending an image from a URL, do not place the username/password in the URL like this:
`http://<username>:<password>@server/image.png`; pass the credentials to the `sendTelegramPhoto`
method instead.
`http` and `https` are the only protocols allowed.
telegram.rules telegram.rules
```java ```java
@ -110,7 +127,7 @@ then
end end
``` ```
In case your image is behind an authenticated web server (locked by username and password) you can pass the credentials as additional parameters to the extended `sendTelegramPhoto` method. If an image is on a web server requiring authentication, credentials can be passed as additional parameters:
telegram.rules telegram.rules
@ -124,11 +141,7 @@ then
end end
``` ```
Do not use username/password in url like in this example `http://<username>:<password>@server/image.png`; pass the credentials to the `sendTelegramPhoto` method instead. To send a base64 jpeg or png image:
`http` and `https` are the only protocols allowed.
If you would like to send a base64 jpeg or png image.
telegram.rules telegram.rules
@ -141,3 +154,16 @@ then
sendTelegramPhoto("bot1", base64Image, "sent from Openhab") sendTelegramPhoto("bot1", base64Image, "sent from Openhab")
end end
``` ```
To send an image based on an Image Item:
telegram.rules
```java
rule "Send telegram with Image Item image and caption"
when
Item Webcam_Image changed
then
sendTelegramPhoto("bot1", Webcam_Image.state.toFullString, "sent from Openhab")
end
```

View File

@ -43,13 +43,20 @@ This device does not contain a temperature sensor.
### FRITZ!DECT 301 / FRITZ!DECT 300 / Comet DECT ### FRITZ!DECT 301 / FRITZ!DECT 300 / Comet DECT
These devices [FRITZ!DECT 301](https://avm.de/produkte/fritzdect/fritzdect-301/), These devices [FRITZ!DECT 301](https://avm.de/produkte/fritzdect/fritzdect-301/), FRITZ!DECT 300 and [Comet DECT](https://www.eurotronic.org/produkte/comet-dect.html) ( [EUROtronic Technology GmbH](https://www.eurotronic.org) ) are used to regulate radiators via DECT protocol.
FRITZ!DECT 300 and [Comet DECT](https://www.eurotronic.org/produkte/comet-dect.html) ( [EUROtronic Technology GmbH](https://www.eurotronic.org) ) are used to regulate radiators via DECT protocol.
The FRITZ!Box can handle up to twelve heating thermostats. The FRITZ!Box can handle up to twelve heating thermostats.
The binding provides channels for reading and setting the temperature. The binding provides channels for reading and setting the temperature.
Additionally you can check the eco temperature, the comfort temperature and the battery level of the device. Additionally you can check the eco temperature, the comfort temperature and the battery level of the device.
The FRITZ!Box has to run at least on firmware FRITZ!OS 6.35. The FRITZ!Box has to run at least on firmware FRITZ!OS 6.35.
### FRITZ! groups
The FRITZ!OS supports two different types of groups.
On the one hand there are groups for heating thermostats on the other hand there are groups for switchable outlets and power meters.
The first one provides the same channels like the [FRITZ!DECT 301 / FRITZ!DECT 300 / Comet DECT](http://docs.openhab.org/addons/bindings/avmfritz/readme.html#fritzdect-301--fritzdect-300--comet-dect) devices.
The later one provides the same channels like the [FRITZ!DECT 200 / FRITZ!DECT 210](http://docs.openhab.org/addons/bindings/avmfritz/readme.html#fritzdect-200--fritzdect-210) / [FRITZ!Powerline 546E](http://docs.openhab.org/addons/bindings/avmfritz/readme.html#fritzpowerline-546e) devices.
The FRITZ!Box has to run at least on firmware FRITZ!OS 6.69.
## Discovery ## Discovery
The FRITZ!Box and the powerline adapter are discovered through UPNP in the local network. The FRITZ!Box and the powerline adapter are discovered through UPNP in the local network.
@ -87,23 +94,23 @@ If correct credentials are set in the bridge configuration, connected AHA device
## Supported Channels ## Supported Channels
| Channel Type ID | Item Type | Description | Available on thing | | Channel Type ID | Item Type | Description | Available on thing |
|-----------------|-----------|--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| |-----------------|--------------------|--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|
| mode | String | States the mode of the device (MANUAL/AUTOMATIC) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | mode | String | States the mode of the device (MANUAL/AUTOMATIC) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| locked | Contact | Device is locked for switching over external sources (OPEN/CLOSE) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | locked | Contact | Device is locked for switching over external sources (OPEN/CLOSE) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| device_locked | Contact | Device is locked for switching manually (OPEN/CLOSE) - FRITZ!OS 6.90 | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | device_locked | Contact | Device is locked for switching manually (OPEN/CLOSE) - FRITZ!OS 6.90 | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| temperature | Number | Actual measured temperature (in °C) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!DECT Repeater 100, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | temperature | Number:Temperature | Actual measured temperature | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!DECT Repeater 100, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| energy | Number | Accumulated energy consumption (in kWh) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E | | energy | Number:Energy | Accumulated energy consumption | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| power | Number | Current power consumption (in W) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E | | power | Number:Power | Current power consumption | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| outlet | Switch | Switchable outlet (ON/OFF) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E | | outlet | Switch | Switchable outlet (ON/OFF) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| actual_temp | Number | Actual Temperature of heating thermostat (in °C) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | actual_temp | Number:Temperature | Actual Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| set_temp | Number | Set Temperature of heating thermostat (in °C) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | set_temp | Number:Temperature | Set Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| eco_temp | Number | Eco Temperature of heating thermostat (in °C) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | eco_temp | Number:Temperature | Eco Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| comfort_temp | Number | Comfort Temperature of heating thermostat (in °C) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | comfort_temp | Number:Temperature | Comfort Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| radiator_mode | String | Mode of heating thermostat (ON/OFF/COMFORT/ECO/BOOST) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | radiator_mode | String | Mode of heating thermostat (ON/OFF/COMFORT/ECO/BOOST) | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| next_change | DateTime | Next change of the Set Temperature if scheduler is activated in the FRITZ!Box settings - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | next_change | DateTime | Next change of the Set Temperature if scheduler is activated in the FRITZ!Box settings - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| next_temp | Number | Next Set Temperature if scheduler is activated in the FRITZ!Box settings (in °C) - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | next_temp | Number:Temperature | Next Set Temperature if scheduler is activated in the FRITZ!Box settings - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| battery_low | Switch | Battery Level Low (ON/OFF) - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT | | battery_low | Switch | Battery Level Low (ON/OFF) - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
## Full Example ## Full Example
@ -114,6 +121,8 @@ Bridge avmfritz:fritzbox:1 @ "Office" [ ipAddress="192.168.x.x", password="xxx",
Thing FRITZ_DECT_200 xxxxxxxxxxxx "FRITZ!DECT 200 #1" @ "Living Room" [ ain="xxxxxxxxxxxx" ] Thing FRITZ_DECT_200 xxxxxxxxxxxx "FRITZ!DECT 200 #1" @ "Living Room" [ ain="xxxxxxxxxxxx" ]
Thing FRITZ_Powerline_546E yy_yy_yy_yy_yy_yy "FRITZ!Powerline 546E #2" @ "Office" [ ain="yy:yy:yy:yy:yy:yy" ] Thing FRITZ_Powerline_546E yy_yy_yy_yy_yy_yy "FRITZ!Powerline 546E #2" @ "Office" [ ain="yy:yy:yy:yy:yy:yy" ]
Thing Comet_DECT aaaaaabbbbbb "Comet DECT #3" @ "Office" [ ain="aaaaaabbbbbb" ] Thing Comet_DECT aaaaaabbbbbb "Comet DECT #3" @ "Office" [ ain="aaaaaabbbbbb" ]
Thing FRITZ_GROUP_HEATING AA_AA_AA_900 "Heating group" @ "Office" [ ain="AA:AA:AA-900" ]
Thing FRITZ_GROUP_SWITCH BB_BB_BB_900 "Switch group" @ "Living Room" [ ain="BB:BB:BB-900" ]
} }
``` ```
@ -121,41 +130,43 @@ demo.items:
```java ```java
Switch Outlet1 "Switchable outlet" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:outlet" } Switch Outlet1 "Switchable outlet" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:outlet" }
Number Temperature1 "Actual measured temperature [%.1f °C]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:temperature" } Number:Temperature Temperature1 "Current measured temperature [%.1f %unit%]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:temperature" }
Number Energy1 "Accumulated energy consumption [%.3f Wh]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:energy" } Number:Energy Energy1 "Accumulated energy consumption [%.3f kWh]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:energy" }
Number Power1 "Current power consumption [%.2f W]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:power" } Number:Power Power1 "Current power consumption [%.2f %unit%]" { channel="avmfritz:FRITZ_DECT_200:1:xxxxxxxxxxxx:power" }
Switch Outlet2 { channel="avmfritz:FRITZ_Powerline_546E:1:yy_yy_yy_yy_yy_yy:outlet" } Switch Outlet2 "Switchable outlet" { channel="avmfritz:FRITZ_Powerline_546E:1:yy_yy_yy_yy_yy_yy:outlet" }
Group gCOMETDECT "Comet DECT heating thermostat" <temperature> Number:Temperature COMETDECTTemperature "Current measured temperature [%.1f %unit%]" { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:actual_temp" }
Number:Temperature COMETDECTSetTemperature "Thermostat temperature set point [%.1f %unit%]" { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:set_temp" }
String COMETDECTRadiatorMode "Radiator mode [%s]" { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:radiator_mode" }
Switch COMETDECTBattery "Battery low" { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:battery_low" }
Number COMETDECTActualTemp "Actual measured temperature [%.1f °C]" (gCOMETDECT) { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:actual_temp" } Number:Temperature FRITZ_GROUP_HEATINGSetTemperature "Group temperature set point [%.1f %unit%]" { channel="avmfritz:FRITZ_GROUP_HEATING:1:AA_AA_AA_900:set_temp" }
Number COMETDECTSetTemp "Thermostat temperature set point [%.1f °C]" (gCOMETDECT) { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:set_temp" }
String COMETDECTRadiatorMode "Radiator mode [%s]" (gCOMETDECT) { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:radiator_mode" } Switch Outlet3 "Group switch" { channel="avmfritz:FRITZ_GROUP_SWITCH:1:BB_BB_BB_900:outlet" }
Switch COMETDECTBattery "Battery low" (gCOMETDECT) { channel="avmfritz:Comet_DECT:1:aaaaaabbbbbb:battery_low" }
``` ```
demo.sitemap: demo.sitemap:
```perl ```perl
sitemap demo label="Main Menu"{ sitemap demo label="Main Menu" {
Frame label="FRITZ!DECT 200 switchable outlet" { Frame label="FRITZ!DECT 200 switchable outlet" {
Switch item=Outlet1 icon="poweroutlet" Switch item=Outlet1 icon="poweroutlet"
Text item=Temperature1 icon="temperature" Text item=Temperature1 icon="temperature"
Text item=Energy1 icon="energy" Text item=Energy1 icon="energy"
Text item=Power1 icon="energy" Text item=Power1 icon="energy"
} }
Frame label="FRITZ!Powerline 546E switchable outlet" { Frame label="FRITZ!Powerline 546E switchable outlet" {
Switch item=Outlet2 Switch item=Outlet2 icon="poweroutlet"
} }
Frame "Comet DECT heating thermostat" { Frame "Comet DECT heating thermostat" {
Text item=COMETDECTActualTemp icon="temperature" Text item=COMETDECTTemperature icon="temperature"
Setpoint item=COMETDECTSetTemp minValue=8.0 maxValue=28.0 step=0.5 icon="temperature" Setpoint item=COMETDECTSetTemperature minValue=8.0 maxValue=28.0 step=0.5 icon="temperature"
Selection item=COMETDECTRadiatorMode mappings=["ON"="ON", "OFF"="OFF", "COMFORT"="COMFORT", "ECO"="ECO", "BOOST"="BOOST"] Selection item=COMETDECTRadiatorMode mappings=["ON"="ON", "OFF"="OFF", "COMFORT"="COMFORT", "ECO"="ECO", "BOOST"="BOOST"] icon="heating"
Switch item=COMETDECTBattery icon="battery" Switch item=COMETDECTBattery icon="lowbattery"
} }
} }
``` ```

View File

@ -0,0 +1,141 @@
---
id: bosesoundtouch
label: Bose SoundTouch
title: Bose SoundTouch - Bindings
type: binding
description: "This binding supports the Bose SoundTouch multiroom system."
since: 2x
install: auto
---
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
{% include base.html %}
# Bose SoundTouch Binding
This binding supports the Bose SoundTouch multiroom system.
## Supported Things
The following Bose devices are supported:
| Name | Thing Type |
|---------------------------------------|-----------------------------|
| Bose SoundTouch 10 | 10 |
| Bose SoundTouch 20 | 20 |
| Bose SoundTouch 30 | 30 |
| Bose SoundTouch 300 | 300 |
| Bose Wave SoundTouch Music System IV | waveSoundTouchMusicSystemIV |
| Bose SoundTouch Wireless Link Adapter | wirelessLinkAdapter |
| Bose SoundTouch SA-5 Amplifier | sa5Amplifier |
| Any other Bose SoundTouch device | device |
## Discovery
Speakers are automatically discovered using mDNS in the local network.
## Binding Configuration
The binding has no configuration options, all configuration is done at Thing level.
## Thing Configuration
All thing types have the same configuration parameters:
| Parameter Name | Type | Required | Description |
|----------------|--------|----------|--------------------------------------------------------------|
| host | String | Yes | The host name or IP address of the device |
| macAddress | String | Yes | The MAC address of the used interface (format "123456789ABC")|
Both are set when using discovery. For manual configuration, these values can be found in the Bose smartphone app (Settings -> About -> Device Name).
Note that the device might have two MAC addresses, one for ethernet and one for Wifi.
## Channels
All devices share the same set of channels, while some of them might not be available on all devices.
| Channel ID | Item Type | Description |
|---------------------------|-----------|--------------------------------------------------------------|
| keyCode | String | Simulates pushing a remote control button |
| mute | Switch | Mutes the sound |
| nowPlayingAlbum | String | Current playing album name |
| nowPlayingArtist | String | Current playing artist name |
| nowPlayingArtwork | Image | Artwork for the current playing song |
| nowPlayingDescription | String | Description to current playing song |
| nowPlayingGenre | String | Genre of current playing song |
| nowPlayingItemName | String | Visible description shown in display |
| nowPlayingStationLocation | String | Location of current playing radio station |
| nowPlayingStationName | String | Name of current playing radio station |
| nowPlayingTrack | String | Track currently playing |
| operationMode | String | Current Operation Mode |
| playerControl | Player | Control the Player |
| power | Switch | SoundTouch power state |
| preset | Number | 1-6 Preset of Soundtouch, >7 Binding Presets |
| rateEnabled | Switch | Current source allows rating |
| saveAsPreset | Number | A selected presetable item is saved as preset with number >6 |
| skipEnabled | Switch | Current source allows skipping to next track |
| skipPreviousEnabled | Switch | Current source allows scrolling through tracks |
| volume | Dimmer | Set or get the volume |
| bass | Number | Bass (-9 minimum, 0 maximum) |
## Full Example
Things:
```
bosesoundtouch:device:demo @ "Living" [ host="192.168.1.2", macAddress="123456789ABC" ]
```
Items:
```
Switch Bose1_Power "Power: [%s]" <switch> { channel="bosesoundtouch:device:demo:power" }
Dimmer Bose1_Volume "Volume: [%d %%]" <volume> { channel="bosesoundtouch:device:demo:volume" }
Number Bose1_Bass "Bass: [%d %%]" <volume> { channel="bosesoundtouch:device:demo:bass" }
Switch Bose1_Mute "Mute: [%s]" <volume_mute> { channel="bosesoundtouch:device:demo:mute" }
String Bose1_OperationMode "OperationMode: [%s]" <text> { channel="bosesoundtouch:device:demo:operationMode" }
String Bose1_PlayerControl "Player Control: [%s]" <text> { channel="bosesoundtouch:device:demo:playerControl" }
Number Bose1_Preset "Preset: [%d]" <text> { channel="bosesoundtouch:device:demo:preset" }
Number Bose1_SaveAsPreset "Save as Preset: [%d]" <text> { channel="bosesoundtouch:device:demo:saveAsPreset" }
String Bose1_KeyCode "Key Code: [%s]" <text> { channel="bosesoundtouch:device:demo:keyCode" }
Switch Bose1_RateEnabled "Rate: [%s]" <switch> { channel="bosesoundtouch:device:demo:rateEnabled" }
Switch Bose1_SkipEnabled "Skip: [%s]" <switch> { channel="bosesoundtouch:device:demo:skipEnabled" }
Switch Bose1_SkipPreviousEnabled "SkipPrevious: [%s]" <switch> { channel="bosesoundtouch:device:demo:skipPreviousEnabled" }
String Bose1_nowPlayingAlbum "Album: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingAlbum" }
String Bose1_nowPlayingArtist "Artist: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingArtist" }
Image Bose1_nowPlayingArtwork "Artwork" <text> { channel="bosesoundtouch:device:demo:nowPlayingArtwork" }
String Bose1_nowPlayingDescription "Description: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingDescription" }
String Bose1_nowPlayingGenre "Genre: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingGenre" }
String Bose1_nowPlayingItemName "Playing: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingItemName" }
String Bose1_nowPlayingStationLocation "Radio Location: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingStationLocation" }
String Bose1_nowPlayingStationName "Radio Name: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingStationName" }
String Bose1_nowPlayingTrack "Track: [%s]" <text> { channel="bosesoundtouch:device:demo:nowPlayingTrack" }
```
Sitemap:
```
sitemap demo label="Bose Test Items"
{
Frame label="Bose 1" {
Switch item=Bose1_Power
Slider item=Bose1_Volume
Number item=Bose1_Bass
Switch item=Bose1_Mute
Text item=Bose1_OperationMode
Text item=Bose1_PlayerControl
Number item=Bose1_Preset
Number item=Bose1_SaveAsPreset
Text item=Bose1_KeyCode
Text item=Bose1_nowPlayingAlbum
Text item=Bose1_nowPlayingArtist
Text item=Bose1_nowPlayingArtwork
Text item=Bose1_nowPlayingDescription
Text item=Bose1_nowPlayingGenre
Text item=Bose1_nowPlayingItemName
Text item=Bose1_nowPlayingStationLocation
Text item=Bose1_nowPlayingTrack
}
}
```

View File

@ -34,6 +34,8 @@ This binding can be configured in the file `services/bticino.cfg`.
| webserver.port | 20000 | No | OpenWebNet gateway port | | webserver.port | 20000 | No | OpenWebNet gateway port |
| webserver.passwd | 12345 | No | OpenWebNet gateway password | | webserver.passwd | 12345 | No | OpenWebNet gateway password |
| webserver.rescan_secs | 120 | No | OpenWebNet bus status rescan interval | | webserver.rescan_secs | 120 | No | OpenWebNet bus status rescan interval |
| webserver.heating_zones | 0 | No | OpenWebNet heating zones |
| webserver.shutter_run_msecs | 0 | No | OpenWebNet Runtime of Shutter to calculate Position Feedback |
A sample configuration could look like: A sample configuration could look like:
@ -86,6 +88,8 @@ Group Corridor
Group Living Group Living
Group Plugs Group Plugs
Group RollerUpShutters Group RollerUpShutters
Group Heating
Group HeatingActor
// Sceneries // Sceneries
Switch Movie_Scenery "Movie scenery" Switch Movie_Scenery "Movie scenery"
@ -103,6 +107,85 @@ Switch Doorbell_Light "Doorbell courtesy light" (Entrance, Lights) {bticino="if=
// Rollershutters // Rollershutters
Rollershutter RollUpShutter_1 "Roller-up shutter 1" (Living, RollerUpShutters) {bticino="if=webserver;who=2;what=0;where=46"} Rollershutter RollUpShutter_1 "Roller-up shutter 1" (Living, RollerUpShutters) {bticino="if=webserver;who=2;what=0;where=46"}
Rollershutter RollUpShutter_2 "Roller-up shutter 2" (Living, RollerUpShutters) {bticino="if=webserver;who=2;what=0;where=47"} Rollershutter RollUpShutter_2 "Roller-up shutter 2" (Living, RollerUpShutters) {bticino="if=webserver;who=2;what=0;where=47"}
//Heating
Number ActualTemp_1 "Actual Temperature 1 [%.1f °C]" <temperature> (Heating) {bticino="if=default;who=4;what=0;where=1"}
Number ControlTemp_1 "Control Temperature 1 [%.1f °C]" <temperature> (Heating) {bticino="if=default;who=4;what=12;where=1"}
Number OffsetTemp_1 "Offset Temperature 1 [MAP(yourbticino_offset.map):%s]" <heating_offset> (Heating) {bticino="if=default;who=4;what=13;where=1"}
Number SetTemp_1 "Set Temperature [%.1f °C]" <heating_set> (Heating) {bticino="if=default;who=4;what=14;where=1"}
Number HCtrlMode_1 "Control Mode [MAP(yourbticino.map):%s]" <settings> (Heating) {bticino="if=default;who=4;what=100;where=1"}
Number HOpMode_1 "Operation Mode [MAP(yourbticino.map):%s]" <heating_cooling> (Heating) {bticino="if=default;who=4;what=101;where=1"}
Contact HValve_1 "Actor 1 [MAP(yourbticino.map):%s]" <undefloor_heating> (HeatingActor) {bticino="if=default;who=4;what=20;where=1"}
Contact HPumpe "Pump [MAP(yourbticino.map):%s]" <pump> (HeatingActor) {bticino="if=default;who=4;what=20;where=0"}
Number MHCtrlMode "Main Unit Control Mode [MAP(yourbticino.map):%s]" <heating> (Heating) {bticino="if=default;who=4;what=100;where=0"}
Number HMCtrlRemote "Main Unit Remote [MAP(yourbticino.map):%s]" <heating> (Heating) {bticino="if=default;who=4;what=102;where=0"}
String HMCtrlStatus "Main Unit Status [%s]" <heating> (Heating) {bticino="if=default;who=4;what=103;where=0"}
String HMCtrlFailure "Main Unit Failure [%s]" <heating> (Heating) {bticino="if=default;who=4;what=104;where=0"}
```
transform/yourbticino.map
```
CLOSED=Heating OFF
OPEN=Heating ON
1=HEATING
2=COLLING
20=Remote Control disabled
21=Remote Control enabled
102=FREEZE PROTECTION
103=OFF
110=MANUAL
111=AUTOMATIK
202=FREEZE PROTECTION
203=OFF
210=MANUAL
211=AUTOMATIK
302=FREEZE PROTECTION
303=OFF
310=MANUAL
311=AUTOMATIK
1101=Program Winter 1
1102=Program Winter 2
1103=Program Winter 3
1201=Scenario Winter 1
1202=Scenario Winter 2
..
1216=Scenario Winter 16
2101=Program Summer 1
2102=Program Summer 2
2103=Program Summer 3
2201=Scenario Winter 1
2202=Scenario Winter 2
..
2216=Scenario Winter 16
```
transform/yourbticino_offset.map
```
NULL=----
0=+0 °C
1=+1 °C
2=+2 °C
3=+3 °C
4=-OFF-
5=FREEZE
-1=-1 °C
-2=-2 °C
-3=-3 °C
``` ```
sitemaps/yourbticino.sitemap sitemaps/yourbticino.sitemap
@ -118,6 +201,23 @@ sitemap yourbticino label="Main panel" {
Frame label="Sceneries" { Frame label="Sceneries" {
Switch item=Movie_Scenery mappings=[OFF="Turn OFF",ON="Turn ON"] Switch item=Movie_Scenery mappings=[OFF="Turn OFF",ON="Turn ON"]
} }
Frame label="Heating Main Control Unit" {
Selection item=HMCtrlMode label="Control Mode Main Unit [%.1f]" mappings=[103="OFF", 102="FREEZE PROTECTION", 1101="Program Winter 1", 1201="Scenario Winter 1"]
Text item=HMCtrlRemote
Text item=HMCtrlStatus
Text item=HMCtrlFailure
Default item=HPumpe
}
Frame label="Heating Room 1" {
Text item=ActualTemp_1
Text item=OffsetTemp_1
Setpoint item=SetTemp_1 label="Set Point Temperature [%.1f °C]" step=0.5 minValue=16 maxValue=25
Text item=ControlTemp_1
Selection item=HCtrlMode_1 label="Control Mode [%.1f]" mappings=[103="OFF", 110="MANUAL", 111="AUTOMATIC", 102="FREEZE PROTECTION"]
Text item=HOpMode_1
Text item=HValve_1
}
} }
``` ```
@ -148,8 +248,8 @@ then
} }
end end
// Doorbel ringer light // Doorbell ringer light
rule "Doorbel ringer" rule "Doorbell ringer"
when when
Item Doorbell_Light received update Item Doorbell_Light received update
then then

View File

@ -67,16 +67,16 @@ String fboxName "FBox Model [%s]" {fritzboxtr064="modelNam
String fboxManufacturer "FBox Manufacturer [%s]" {fritzboxtr064="manufacturerName"} String fboxManufacturer "FBox Manufacturer [%s]" {fritzboxtr064="manufacturerName"}
String fboxSerial "FBox Serial [%s]" {fritzboxtr064="serialNumber"} String fboxSerial "FBox Serial [%s]" {fritzboxtr064="serialNumber"}
String fboxVersion "FBox Version [%s]" {fritzboxtr064="softwareVersion"} String fboxVersion "FBox Version [%s]" {fritzboxtr064="softwareVersion"}
# get wan ip if FritzBox establishes the internet connection (e. g. via DSL) // get wan ip if FritzBox establishes the internet connection (e. g. via DSL)
String fboxWanIP "FBox WAN IP [%s]" {fritzboxtr064="wanip"} String fboxWanIP "FBox WAN IP [%s]" {fritzboxtr064="wanip"}
# get wan ip if FritzBox uses internet connection of external router // get wan ip if FritzBox uses internet connection of external router
String fboxWanIPExternal "FBox external WAN IP [%s]" {fritzboxtr064="externalWanip"} String fboxWanIPExternal "FBox external WAN IP [%s]" {fritzboxtr064="externalWanip"}
Switch fboxWifi24 "2,4GHz Wifi" {fritzboxtr064="wifi24Switch"} Switch fboxWifi24 "2,4GHz Wifi" {fritzboxtr064="wifi24Switch"}
Switch fboxWifi50 "5,0GHz Wifi" {fritzboxtr064="wifi50Switch"} Switch fboxWifi50 "5,0GHz Wifi" {fritzboxtr064="wifi50Switch"}
Switch fboxGuestWifi "Guest Wifi" {fritzboxtr064="wifiGuestSwitch"} Switch fboxGuestWifi "Guest Wifi" {fritzboxtr064="wifiGuestSwitch"}
Contact cFboxMacOnline "Presence (WiFi) [%s]" {fritzboxtr064="maconline:11-11-11-11-11-11" } Contact cFboxMacOnline "Presence (WiFi) [%s]" {fritzboxtr064="maconline:11-11-11-11-11-11" }
# WAN statistics // WAN statistics
String fboxWanAccessType "FBox WAN access type [%s]" {fritzboxtr064="wanWANAccessType"} String fboxWanAccessType "FBox WAN access type [%s]" {fritzboxtr064="wanWANAccessType"}
Number fboxWanLayer1UpstreamMaxBitRate "FBox WAN us max bit rate [%s]" {fritzboxtr064="wanLayer1UpstreamMaxBitRate"} Number fboxWanLayer1UpstreamMaxBitRate "FBox WAN us max bit rate [%s]" {fritzboxtr064="wanLayer1UpstreamMaxBitRate"}
@ -85,7 +85,7 @@ String fboxWanPhysicalLinkStatus "FBox WAN physical link status [%s]" {fritzbox
Number fboxWanTotalBytesSent "WAN total bytes sent [%s]" {fritzboxtr064="wanTotalBytesSent"} Number fboxWanTotalBytesSent "WAN total bytes sent [%s]" {fritzboxtr064="wanTotalBytesSent"}
Number fboxWanTotalBytesReceived "WAN total bytes received [%s]" {fritzboxtr064="wanTotalBytesReceived"} Number fboxWanTotalBytesReceived "WAN total bytes received [%s]" {fritzboxtr064="wanTotalBytesReceived"}
# DSL statistics // DSL statistics
Contact fboxDslEnable "FBox DSL Enable [%s]" {fritzboxtr064="dslEnable"} Contact fboxDslEnable "FBox DSL Enable [%s]" {fritzboxtr064="dslEnable"}
String fboxDslStatus "FBox DSL Status [%s]" {fritzboxtr064="dslStatus"} String fboxDslStatus "FBox DSL Status [%s]" {fritzboxtr064="dslStatus"}
@ -101,30 +101,25 @@ Number fboxDslFECErrors "DSL FEC Errors [%s]" {fritzboxtr064="dslFECErrors"}
Number fboxDslHECErrors "DSL HEC Errors [%s]" {fritzboxtr064="dslHECErrors"} Number fboxDslHECErrors "DSL HEC Errors [%s]" {fritzboxtr064="dslHECErrors"}
Number fboxDslCRCErrors "DSL CRC Errors [%s]" {fritzboxtr064="dslCRCErrors"} Number fboxDslCRCErrors "DSL CRC Errors [%s]" {fritzboxtr064="dslCRCErrors"}
# only when using call monitor // only when using call monitor
Switch fboxRinging "Phone ringing [%s]" {fritzboxtr064="callmonitor_ringing" } Switch fboxRinging "Phone ringing [%s]" {fritzboxtr064="callmonitor_ringing" }
Switch fboxRinging_Out "Phone ringing [%s]" {fritzboxtr064="callmonitor_outgoing" } Switch fboxRinging_Out "Phone ringing [%s]" {fritzboxtr064="callmonitor_outgoing" }
Call fboxIncomingCall "Incoming call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_ringing" } Call fboxIncomingCall "Incoming call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_ringing" }
Call fboxOutgoingCall "Outgoing call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_outgoing" } Call fboxOutgoingCall "Outgoing call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_outgoing" }
# resolve numbers to names according phonebook // resolve numbers to names based on phonebook
Call fboxIncomingCallResolved "Incoming call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_ringing:resolveName" } Call fboxIncomingCallResolved "Incoming call: [%1$s to %2$s]" {fritzboxtr064="callmonitor_ringing:resolveName" }
# Telephone answering machine (TAM) items // Telephone answering machine (TAM) items
# Number after tamSwitch is ID of configured TAM, start with 0 // Number after tamSwitch is ID of configured TAM, start with 0
Switch fboxTAM0Switch "Answering machine ID 0" {fritzboxtr064="tamSwitch:0"} Switch fboxTAM0Switch "Answering machine ID 0" {fritzboxtr064="tamSwitch:0"}
Number fboxTAM0NewMsg "New Messages TAM 0 [%s]" {fritzboxtr064="tamNewMessages:0"} Number fboxTAM0NewMsg "New Messages TAM 0 [%s]" {fritzboxtr064="tamNewMessages:0"}
# Missed calls: specify the number of last days which should be searched for missed calls // Missed calls: specify the number of last days which should be searched for missed calls
Number fboxMissedCalls "Missed Calls [%s]" {fritzboxtr064="missedCallsInDays:5"} Number fboxMissedCalls "Missed Calls [%s]" {fritzboxtr064="missedCallsInDays:5"}
``` ```
## Known issues
See issues [here](https://github.com/gitbock/fritzboxtr064/issues?q=is%3Aissue+is%3Aclosed).
## Examples and Hints ## Examples and Hints
### Sitemap ### Sitemap
@ -138,14 +133,15 @@ Use a map for presence detection item:
Create file `transform/presence.map` and add: Create file `transform/presence.map` and add:
``` ```
1=present OPEN=present
0=not present CLOSED=not present
NULL=unknown
``` ```
Now, as item configuration use: Now, as item configuration use (the addon "Map Transformation" must be installed):
``` ```
Contact cFboxMacOnline "Presence (Wifi) [MAP(presence.map):%d]" <present> {fritzboxtr064="maconline:11-22-33-44-55-66 } Contact cFboxMacOnline "Presence (Wifi) [MAP(presence.map):%s]" <presence> {fritzboxtr064="maconline:11-22-33-44-55-66 }
``` ```
### Rules ### Rules
@ -159,9 +155,11 @@ when
Item fboxRinging changed from OFF to ON Item fboxRinging changed from OFF to ON
then then
logInfo("Anrufermeldung", "Generating caller name message...") logInfo("Anrufermeldung", "Generating caller name message...")
// fboxIncoming call receives numbers/name of incoming call
val CallType incCall = fboxIncomingCall.state as CallType val incCall = fboxIncomingCall.state as StringListType
var callerName = incCall.destNum //destNum is external number OR resolved Name if no phonebook entry exists val callerNumber = incCall.getValue(1)
val incCallResolved = fboxIncomingCallResolved.state as StringListType
val callerName = incCallResolved.getValue(1)
// do something with callerName // do something with callerName
end end

View File

@ -12,78 +12,78 @@ install: auto
{% include base.html %} {% include base.html %}
# Fronius Binding # Fronius Binding
This binding uses the [Fronius Solar API V1](http://www.fronius.com/en/photovoltaics/products/all-products/system-monitoring/open-interfaces/fronius-solar-api-json-) to obtain data from a Fronius devices. This binding uses the [Fronius Solar API V1](http://www.fronius.com/en/photovoltaics/products/all-products/system-monitoring/open-interfaces/fronius-solar-api-json-) to obtain data from a Fronius devices.
## Supported Things ## Supported Things
Support Fronius Galvo, Fronius Symo inverters and other Fronius inverters in combination with the Fronius Datamanager 1.0 / 2.0 or Fronius Datalogger. Support Fronius Galvo, Fronius Symo inverters and other Fronius inverters in combination with the Fronius Datamanager 1.0 / 2.0 or Fronius Datalogger.
You can add multiple inverters that depend on the same datalogger with different device ids. ( Default 1 ) You can add multiple inverters that depend on the same datalogger with different device ids. ( Default 1 )
## Discovery ## Discovery
There is no discovery implemented. You have to create your things manually and specify the IP of the Datalogger and the DeviceId. There is no discovery implemented. You have to create your things manually and specify the IP of the Datalogger and the DeviceId.
## Binding Configuration ## Binding Configuration
The binding has no configuration options, all configuration is done at Thing level. The binding has no configuration options, all configuration is done at Thing level.
## Thing Configuration ## Thing Configuration
The thing has a few configuration parameters: The thing has a few configuration parameters:
| Parameter | Description | | Parameter | Description |
|-----------|------------------------------------------------------------------------- | |-----------|------------------------------------------------------------------------- |
| Ip | the ip-address of your Fronius Datalogger | | Ip | the ip-address of your Fronius Datalogger |
| DeviceId | The identifier of your device ( Default: 1) | | DeviceId | The identifier of your device ( Default: 1) |
| refresh | Refresh interval in seconds | | refresh | Refresh interval in seconds |
## Channels ## Channels
| Channel ID | Item Type | Description | | Channel ID | Item Type | Description |
|------------|--------------|------------------------- | |------------|--------------|------------------------- |
| day_energy | Number | Energy generated on current day | | day_energy | Number | Energy generated on current day |
| pac | Number | AC powery | | pac | Number | AC powery |
| total_energy | Number | Energy generated overall | | total_energy | Number | Energy generated overall |
| year_energy | Number | Energy generated in current year | | year_energy | Number | Energy generated in current year |
| fac | Number | AC frequency | | fac | Number | AC frequency |
| iac | Number | AC current | | iac | Number | AC current |
| idc | Number | DC current | | idc | Number | DC current |
| uac | Number | AC voltage | | uac | Number | AC voltage |
| udc | Number | DC voltage | | udc | Number | DC voltage |
| pGrid | Number | Power + from grid, - to grid | | pGrid | Number | Power + from grid, - to grid |
| pLoad | Number | Power + generator, - consumer | | pLoad | Number | Power + generator, - consumer |
| pAkku | Number | Power + charge, - discharge | | pAkku | Number | Power + charge, - discharge |
## Full Example ## Full Example
demo.things: demo.things:
``` ```
Bridge fronius:bridge:mybridge [hostname="192.168.66.148",refreshInterval=5] { Bridge fronius:bridge:mybridge [hostname="192.168.66.148",refreshInterval=5] {
Thing powerinverter myinverter [ deviceId=1 ] Thing powerinverter myinverter [ deviceId=1 ]
} }
``` ```
demo.items: demo.items:
``` ```
Number AC_Powery { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelpac" } Number AC_Powery { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelpac" }
Number Day_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneldayenergy" } Number Day_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneldayenergy" }
Number Total_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneltotal" } Number Total_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneltotal" }
Number Year_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelyear" } Number Year_Energy { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelyear" }
Number FAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelfac" } Number FAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelfac" }
Number IAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneliac" } Number IAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneliac" }
Number IDC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelidc" } Number IDC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelidc" }
Number UAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneluac" } Number UAC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneluac" }
Number UDC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneludc" } Number UDC { channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneludc" }
Number Grid_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpgrid" } Number Grid_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpgrid" }
Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" } Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" }
Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" } Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" }
Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" } Number Load_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload" }
Number Battery_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpakku" } Number Battery_Power { channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpakku" }
``` ```
Tested with a Fronius Symo 8.2-3-M Tested with a Fronius Symo 8.2-3-M

View File

@ -134,6 +134,9 @@ Think in hours when configuring (one hour = 3600)
- **timeout** - **timeout**
The timeout in seconds for connections to a Homematic gateway (default = 15) The timeout in seconds for connections to a Homematic gateway (default = 15)
- **discoveryTimeToLive**
The time to live in seconds for discovery results of a Homematic gateway (default = -1, which means infinite)
- **socketMaxAlive** - **socketMaxAlive**
The maximum lifetime of a pooled socket connection to the Homematic gateway in seconds (default = 900) The maximum lifetime of a pooled socket connection to the Homematic gateway in seconds (default = 900)

View File

@ -407,7 +407,7 @@ rpc=bin -> No BinX signature
rpc=xml -> BadRequestException: Binsystem.multicall rpc=xml -> BadRequestException: Binsystem.multicall
``` ```
The binding registers itself with the CCU at startup with the specified communication mode. If you shutdown openHAB (or kill it) and the binding can not unregister successfully from the CCU, the CCU still sends messages. It does this for about three minutes, if there is no answer, it gives up. If you start openHAB in this period of time with another communication mode, these exceptions occur. The binding registers itself with the CCU at startup with the specified communication mode. If you shutdown openHAB (or kill it) and the binding cannot unregister successfully from the CCU, the CCU still sends messages. It does this for about three minutes, if there is no answer, it gives up. If you start openHAB in this period of time with another communication mode, these exceptions occur.
Just wait untill the exceptions disappear and restart openHAB. This happens only after switching the communication mode. Just wait untill the exceptions disappear and restart openHAB. This happens only after switching the communication mode.

View File

@ -64,9 +64,9 @@ demo.things:
Bridge irtrans:ethernet:kitchen [ ipAddress="192.168.0.56", portNumber=21000, bufferSize=1024, responseTimeOut=100, pingTimeOut=2000, reconnectInterval=10 ] Bridge irtrans:ethernet:kitchen [ ipAddress="192.168.0.56", portNumber=21000, bufferSize=1024, responseTimeOut=100, pingTimeOut=2000, reconnectInterval=10 ]
{ {
Channels: Channels:
Receiver : any [remote="*", command="*"] Type receiver : any [remote="*", command="*"]
Receiver : telenet_power [remote="telenet", command="power"] Type receiver : telenet_power [remote="telenet", command="power"]
Blaster : samsung [led="E", remote="samsung", command="*"] Type blaster : samsung [led="E", remote="samsung", command="*"]
} }
``` ```
@ -76,10 +76,10 @@ In the above example, the first channel will be updated when any IR command from
Bridge irtrans:ethernet:technicalfacilities [ ipAddress="192.168.0.58", portNumber=21000, bufferSize=1024, responseTimeOut=100, pingTimeOut=2000, reconnectInterval=10 ] Bridge irtrans:ethernet:technicalfacilities [ ipAddress="192.168.0.58", portNumber=21000, bufferSize=1024, responseTimeOut=100, pingTimeOut=2000, reconnectInterval=10 ]
{ {
Channels: Channels:
Receiver : any [remote="*", command="*"] Type receiver : any [remote="*", command="*"]
Blaster : telenet1 [led="2", remote="telenet", command="*"] Type blaster : telenet1 [led="2", remote="telenet", command="*"]
Blaster : telenet2 [led="1", remote="telenet", command="*"] Type blaster : telenet2 [led="1", remote="telenet", command="*"]
Blaster : appletv [led="3", remote="appletv", command="*"] Type blaster : appletv [led="3", remote="appletv", command="*"]
} }
``` ```

View File

@ -49,7 +49,7 @@ where
It is possible to define wildcards for `<device>` and `<ircommand>`: if either of them are equal to `**` then respectively, any device that defines the given `<ircommand>`, or any `<ircommand>` for the given `<device>`, will match and trigger the status update of the item. If you would put `**` for both `<device>` and `<ircommand>` then any infrared command received by the transceiver will cause the item to be updated. It is possible to define wildcards for `<device>` and `<ircommand>`: if either of them are equal to `**` then respectively, any device that defines the given `<ircommand>`, or any `<ircommand>` for the given `<device>`, will match and trigger the status update of the item. If you would put `**` for both `<device>` and `<ircommand>` then any infrared command received by the transceiver will cause the item to be updated.
> **Note:** the IRtrans device does not communicate which `<led>` a command is received by, so that information can not be used to wildcard infrared commands received > **Note:** the IRtrans device does not communicate which `<led>` a command is received by, so that information cannot be used to wildcard infrared commands received
> **Note:** If the item is of the type String, then any infrared command received by the transceiver will cause the Item to be updated with "`<device>`,`<ircommand>`". Likewise, any string passed on by the OpenHAB runtime will simply be parsed using the "`<device>`,`<ircommand>`" pattern. For such Items the `<command>` element has to be omitted in the configuration string > **Note:** If the item is of the type String, then any infrared command received by the transceiver will cause the Item to be updated with "`<device>`,`<ircommand>`". Likewise, any string passed on by the OpenHAB runtime will simply be parsed using the "`<device>`,`<ircommand>`" pattern. For such Items the `<command>` element has to be omitted in the configuration string

View File

@ -66,6 +66,7 @@ The following configuration options are available for the Kodi binding:
The Kodi thing requires the IP address of the device hosting your Kodi media center instance, the TCP port to access it (default: `9090`) and the HTTP port to build URLs to the Kodi webinterface for downloading thumbnail and fanart images (default: `8080`). The Kodi thing requires the IP address of the device hosting your Kodi media center instance, the TCP port to access it (default: `9090`) and the HTTP port to build URLs to the Kodi webinterface for downloading thumbnail and fanart images (default: `8080`).
You optionally can define a `httpUser` and a `httpPassword` parameter if the access to your Kodi webinterface is protected. You optionally can define a `httpUser` and a `httpPassword` parameter if the access to your Kodi webinterface is protected.
The IP address will be found by the auto-discovery feature. The IP address will be found by the auto-discovery feature.
You can use the `notificationVolume` property for setting a default volume (in %) as well as a `notificationTimeout` (in s) to be used to play notifications.
A manual setup through a `things/kodi.things` file could look like this: A manual setup through a `things/kodi.things` file could look like this:
@ -82,7 +83,7 @@ The Kodi thing supports the following channels:
| mute | Switch | Mute/unmute your playback | | mute | Switch | Mute/unmute your playback |
| volume | Dimmer | Read or control the volume of your playback | | volume | Dimmer | Read or control the volume of your playback |
| control | Player | Control the Kodi player, e.g. `PLAY`, `PAUSE`, `NEXT`, `PREVIOUS`, `FASTFORWARD`, `REWIND` | | control | Player | Control the Kodi player, e.g. `PLAY`, `PAUSE`, `NEXT`, `PREVIOUS`, `FASTFORWARD`, `REWIND` |
| stop | Switch | Write `ON` to this channel: Stops the Kodi player. If this channel is `ON`, the player is stopped, otherwise kodi is in another state (see control channel) | | stop | Switch | Write `ON` to this channel: Stops the Kodi player. If this channel is `ON`, the player is stopped, otherwise Kodi is in another state (see control channel) |
| title | String | Title of the currently played song/movie/tv episode | | title | String | Title of the currently played song/movie/tv episode |
| showtitle | String | Title of the currently played tv-show; empty for other types | | showtitle | String | Title of the currently played tv-show; empty for other types |
| album | String | Album name of the currently played song | | album | String | Album name of the currently played song |
@ -96,21 +97,32 @@ The Kodi thing supports the following channels:
| input | String | Allows to control Kodi. Valid values are: `Up`, `Down`, `Left`, `Right`, `Select`, `Back`, `Home`, `ContextMenu`, `Info`, `ShowOSD`, `ShowPlayerProcessInfo`, `SendText` and `ExecuteAction` | | input | String | Allows to control Kodi. Valid values are: `Up`, `Down`, `Left`, `Right`, `Select`, `Back`, `Home`, `ContextMenu`, `Info`, `ShowOSD`, `ShowPlayerProcessInfo`, `SendText` and `ExecuteAction` |
| inputtext | String | This channel emulates a keyboard input | | inputtext | String | This channel emulates a keyboard input |
| inputaction | String | Send a predefined action to the Kodi Player to control the UI and/or perform other tasks. Valid values are: `left`, `right`, `up`, `down`, `pageup`, `pagedown`, `select`, `highlight`, `parentdir`, `parentfolder`, `back`, `menu`, `previousmenu`, `info`, `pause`, `stop`, `skipnext`, `skipprevious`, `fullscreen`, `aspectratio`, `stepforward`, `stepback`, `bigstepforward`, `bigstepback`, `chapterorbigstepforward`, `chapterorbigstepback`, `osd`, `showsubtitles`, `nextsubtitle`, `cyclesubtitle`, `playerdebug`, `codecinfo`, `playerprocessinfo`, `nextpicture`, `previouspicture`, `zoomout`, `zoomin`, `playlist`, `queue`, `zoomnormal`, `zoomlevel1`, `zoomlevel2`, `zoomlevel3`, `zoomlevel4`, `zoomlevel5`, `zoomlevel6`, `zoomlevel7`, `zoomlevel8`, `zoomlevel9`, `nextcalibration`, `resetcalibration`, `analogmove`, `analogmovex`, `analogmovey`, `rotate`, `rotateccw`, `close`, `subtitledelayminus`, `subtitledelay`, `subtitledelayplus`, `audiodelayminus`, `audiodelay`, `audiodelayplus`, `subtitleshiftup`, `subtitleshiftdown`, `subtitlealign`, `audionextlanguage`, `verticalshiftup`, `verticalshiftdown`, `nextresolution`, `audiotoggledigital`, `number0`, `number1`, `number2`, `number3`, `number4`, `number5`, `number6`, `number7`, `number8`, `number9`, `smallstepback`, `fastforward`, `rewind`, `play`, `playpause`, `switchplayer`, `delete`, `copy`, `move`, `screenshot`, `rename`, `togglewatched`, `scanitem`, `reloadkeymaps`, `volumeup`, `volumedown`, `mute`, `backspace`, `scrollup`, `scrolldown`, `analogfastforward`, `analogrewind`, `moveitemup`, `moveitemdown`, `contextmenu`, `shift`, `symbols`, `cursorleft`, `cursorright`, `showtime`, `analogseekforward`, `analogseekback`, `showpreset`, `nextpreset`, `previouspreset`, `lockpreset`, `randompreset`, `increasevisrating`, `decreasevisrating`, `showvideomenu`, `enter`, `increaserating`, `decreaserating`, `setrating`, `togglefullscreen`, `nextscene`, `previousscene`, `nextletter`, `prevletter`, `jumpsms2`, `jumpsms3`, `jumpsms4`, `jumpsms5`, `jumpsms6`, `jumpsms7`, `jumpsms8`, `jumpsms9`, `filter`, `filterclear`, `filtersms2`, `filtersms3`, `filtersms4`, `filtersms5`, `filtersms6`, `filtersms7`, `filtersms8`, `filtersms9`, `firstpage`, `lastpage`, `guiprofile`, `red`, `green`, `yellow`, `blue`, `increasepar`, `decreasepar`, `volampup`, `volampdown`, `volumeamplification`, `createbookmark`, `createepisodebookmark`, `settingsreset`, `settingslevelchange`, `stereomode`, `nextstereomode`, `previousstereomode`, `togglestereomode`, `stereomodetomono`, `channelup`, `channeldown`, `previouschannelgroup`, `nextchannelgroup`, `playpvr`, `playpvrtv`, `playpvrradio`, `record`, `togglecommskip`, `showtimerrule`, `leftclick`, `rightclick`, `middleclick`, `doubleclick`, `longclick`, `wheelup`, `wheeldown`, `mousedrag`, `mousemove`, `tap`, `longpress`, `pangesture`, `zoomgesture`, `rotategesture`, `swipeleft`, `swiperight`, `swipeup`, `swipedown`, `error`, `noop` | | inputaction | String | Send a predefined action to the Kodi Player to control the UI and/or perform other tasks. Valid values are: `left`, `right`, `up`, `down`, `pageup`, `pagedown`, `select`, `highlight`, `parentdir`, `parentfolder`, `back`, `menu`, `previousmenu`, `info`, `pause`, `stop`, `skipnext`, `skipprevious`, `fullscreen`, `aspectratio`, `stepforward`, `stepback`, `bigstepforward`, `bigstepback`, `chapterorbigstepforward`, `chapterorbigstepback`, `osd`, `showsubtitles`, `nextsubtitle`, `cyclesubtitle`, `playerdebug`, `codecinfo`, `playerprocessinfo`, `nextpicture`, `previouspicture`, `zoomout`, `zoomin`, `playlist`, `queue`, `zoomnormal`, `zoomlevel1`, `zoomlevel2`, `zoomlevel3`, `zoomlevel4`, `zoomlevel5`, `zoomlevel6`, `zoomlevel7`, `zoomlevel8`, `zoomlevel9`, `nextcalibration`, `resetcalibration`, `analogmove`, `analogmovex`, `analogmovey`, `rotate`, `rotateccw`, `close`, `subtitledelayminus`, `subtitledelay`, `subtitledelayplus`, `audiodelayminus`, `audiodelay`, `audiodelayplus`, `subtitleshiftup`, `subtitleshiftdown`, `subtitlealign`, `audionextlanguage`, `verticalshiftup`, `verticalshiftdown`, `nextresolution`, `audiotoggledigital`, `number0`, `number1`, `number2`, `number3`, `number4`, `number5`, `number6`, `number7`, `number8`, `number9`, `smallstepback`, `fastforward`, `rewind`, `play`, `playpause`, `switchplayer`, `delete`, `copy`, `move`, `screenshot`, `rename`, `togglewatched`, `scanitem`, `reloadkeymaps`, `volumeup`, `volumedown`, `mute`, `backspace`, `scrollup`, `scrolldown`, `analogfastforward`, `analogrewind`, `moveitemup`, `moveitemdown`, `contextmenu`, `shift`, `symbols`, `cursorleft`, `cursorright`, `showtime`, `analogseekforward`, `analogseekback`, `showpreset`, `nextpreset`, `previouspreset`, `lockpreset`, `randompreset`, `increasevisrating`, `decreasevisrating`, `showvideomenu`, `enter`, `increaserating`, `decreaserating`, `setrating`, `togglefullscreen`, `nextscene`, `previousscene`, `nextletter`, `prevletter`, `jumpsms2`, `jumpsms3`, `jumpsms4`, `jumpsms5`, `jumpsms6`, `jumpsms7`, `jumpsms8`, `jumpsms9`, `filter`, `filterclear`, `filtersms2`, `filtersms3`, `filtersms4`, `filtersms5`, `filtersms6`, `filtersms7`, `filtersms8`, `filtersms9`, `firstpage`, `lastpage`, `guiprofile`, `red`, `green`, `yellow`, `blue`, `increasepar`, `decreasepar`, `volampup`, `volampdown`, `volumeamplification`, `createbookmark`, `createepisodebookmark`, `settingsreset`, `settingslevelchange`, `stereomode`, `nextstereomode`, `previousstereomode`, `togglestereomode`, `stereomodetomono`, `channelup`, `channeldown`, `previouschannelgroup`, `nextchannelgroup`, `playpvr`, `playpvrtv`, `playpvrradio`, `record`, `togglecommskip`, `showtimerrule`, `leftclick`, `rightclick`, `middleclick`, `doubleclick`, `longclick`, `wheelup`, `wheeldown`, `mousedrag`, `mousemove`, `tap`, `longpress`, `pangesture`, `zoomgesture`, `rotategesture`, `swipeleft`, `swiperight`, `swipeup`, `swipedown`, `error`, `noop` |
| 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. Valid return values are: `unknown`, `channel`, `episode`, `movie`, `musicvideo`, `picture`, `radio`, `song`, `video` | | mediatype | String | The media type of the current file. Valid return values are: `unknown`, `channel`, `episode`, `movie`, `musicvideo`, `picture`, `radio`, `song`, `video` |
| thumbnail | Image | The URL to the thumbnail of the current file | | thumbnail | Image | The URL to the thumbnail of the current file |
| fanart | Image | The URL to the fanart of the current file | | fanart | Image | The URL to the fanart of the current file |
| playnotification | String | Plays the notification sound by a given URI |
### Channel Configuration ### Channel Configuration
**group** The PVR channels can be put into user-defined PVR channel groups. **group** The PVR channels can be put into user-defined PVR channel groups.
There are two default PVR channel groups. There are two default PVR channel groups.
One for PVR TV channels and one for PVR radio channels. One for PVR TV channels and one for PVR radio channels.
The default labels are "All channels" (in german systems "Alle Kanäle"). The default labels are "All channels" (in German systems "Alle Kanäle").
You have to adjust this configuration to use the `pvr-open-tv` and `pvr-open-radio` channels properly. You have to adjust this configuration to use the `pvr-open-tv` and `pvr-open-radio` channels properly.
You can optionally configure an user-defined PVR channel group. You can optionally configure an user-defined PVR channel group.
The PVR channels from Kodi will be populated during runtime into the state options of the `pvr-open-tv` and `pvr-open-radio` channels. The PVR channels from Kodi will be populated during runtime into the state options of the `pvr-open-tv` and `pvr-open-radio` channels.
## Audio Support
All Kodi instances are registered as an audio sink in the framework.
Audio streams are sent to the `playnotification` channel and will change the volume of the audio sink using the `notificationVolume` defined in the properties for the thing, not the `volume`.
URL audio streams (e.g. an Internet radio stream) are an exception and do not get sent to the `playnotification` channel.
Instead, these will be sent to the `playuri` channel.
## Full Example
A manual setup through a `things/kodi.things` file could look like this: A manual setup through a `things/kodi.things` file could look like this:
``` ```
@ -122,34 +134,35 @@ Thing kodi:kodi:myKodi "Kodi" @ "Living Room" [ipAddress="192.168.1.100", port=9
} }
``` ```
## Item Configuration ### Item Configuration
demo.items demo.items
``` ```
Switch myKodi_mute "Mute" { channel="kodi:kodi:myKodi:mute" } Switch myKodi_mute "Mute" { channel="kodi:kodi:myKodi:mute" }
Dimmer myKodi_volume "Volume [%d]" { channel="kodi:kodi:myKodi:volume" } Dimmer myKodi_volume "Volume [%d]" { channel="kodi:kodi:myKodi:volume" }
Player myKodi_control "Control" { channel="kodi:kodi:myKodi:control" } Player myKodi_control "Control" { channel="kodi:kodi:myKodi:control" }
Switch myKodi_stop "Stop" { channel="kodi:kodi:myKodi:stop" } Switch myKodi_stop "Stop" { channel="kodi:kodi:myKodi:stop" }
String myKodi_title "Title [%s]" { channel="kodi:kodi:myKodi:title" } String myKodi_title "Title [%s]" { channel="kodi:kodi:myKodi:title" }
String myKodi_showtitle "Show title [%s]" { channel="kodi:kodi:myKodi:showtitle" } String myKodi_showtitle "Show title [%s]" { channel="kodi:kodi:myKodi:showtitle" }
String myKodi_album "Album [%s]" { channel="kodi:kodi:myKodi:album" } String myKodi_album "Album [%s]" { channel="kodi:kodi:myKodi:album" }
String myKodi_artist "Artist [%s]" { channel="kodi:kodi:myKodi:artist" } String myKodi_artist "Artist [%s]" { channel="kodi:kodi:myKodi:artist" }
String myKodi_playuri "Play URI" { channel="kodi:kodi:myKodi:playuri" } String myKodi_playuri "Play URI" { channel="kodi:kodi:myKodi:playuri" }
String myKodi_playfavorite "Play favorite" { channel="kodi:kodi:myKodi:playfavorite" } String myKodi_playfavorite "Play favorite" { channel="kodi:kodi:myKodi:playfavorite" }
String myKodi_pvropentv "Play PVR TV channel" { channel="kodi:kodi:myKodi:pvr-open-tv" } String myKodi_pvropentv "Play PVR TV channel" { channel="kodi:kodi:myKodi:pvr-open-tv" }
String myKodi_pvropenradio "Play PVR Radio channel" { channel="kodi:kodi:myKodi:pvr-open-radio" } String myKodi_pvropenradio "Play PVR Radio channel" { channel="kodi:kodi:myKodi:pvr-open-radio" }
String myKodi_pvrchannel "PVR channel [%s]" { channel="kodi:kodi:myKodi:pvr-channel" } String myKodi_pvrchannel "PVR channel [%s]" { channel="kodi:kodi:myKodi:pvr-channel" }
String myKodi_notification "Notification" { channel="kodi:kodi:myKodi:shownotification" } String myKodi_notification "Notification" { channel="kodi:kodi:myKodi:shownotification" }
String myKodi_input "Input" { channel="kodi:kodi:myKodi:input" } String myKodi_input "Input" { channel="kodi:kodi:myKodi:input" }
String myKodi_inputtext "Inputtext" { channel="kodi:kodi:myKodi:inputtext" } String myKodi_inputtext "Inputtext" { channel="kodi:kodi:myKodi:inputtext" }
String myKodi_systemcommand "Systemcommand" { channel="kodi:kodi:myKodi:systemcommand" } String myKodi_systemcommand "Systemcommand" { channel="kodi:kodi:myKodi:systemcommand" }
String myKodi_mediatype "Mediatype [%s]" { channel="kodi:kodi:myKodi:mediatype" } String myKodi_mediatype "Mediatype [%s]" { channel="kodi:kodi:myKodi:mediatype" }
Image myKodi_thumbnail { channel="kodi:kodi:myKodi:thumbnail" } Image myKodi_thumbnail { channel="kodi:kodi:myKodi:thumbnail" }
Image myKodi_fanart { channel="kodi:kodi:myKodi:fanart" } Image myKodi_fanart { channel="kodi:kodi:myKodi:fanart" }
String myKodi_playnotification "Play notification URI" { channel="kodi:kodi:myKodi:playnotification" }
``` ```
## Sitemap Configuration ### Sitemap Configuration
demo.sitemap demo.sitemap
@ -177,8 +190,3 @@ sitemap demo label="myKodi"
} }
} }
``` ```
## Audio Support
All supported Kodi instances are registered as an audio sink in the framework.
Audio streams are sent to the `playuri` channel.

View File

@ -67,8 +67,18 @@ Please note that at least one channel must be bound to an item before the bindin
## Example ## Example
This example assumes your TV has ThingID lgwebos:WebOSTV:3aab9eea-953b-4272-bdbd-f0cd0ecf4a46. Assuming your TV has device ID 3aab9eea-953b-4272-bdbd-f0cd0ecf4a46.
You can find it in the discovery results in Paper UI. By default this binding will create ThingIDs for discovery results with prefix lgwebos:WebOSTV: and the device ID. e.g. lgwebos:WebOSTV:3aab9eea-953b-4272-bdbd-f0cd0ecf4a46.
Thus, you can find your TV's device ID by looking into discovery results in Paper UI.
You could also specify an alternate ThingID using a .things file, specifying the deviceId as a mandatory configuration parameter:
```
Thing lgwebos:WebOSTV:tv1 [ deviceId="3aab9eea-953b-4272-bdbd-f0cd0ecf4a46" ]
```
However, for the next steps of this example we will assumes you are using automatic discovery and the default ThingID.
demo.items: demo.items:
@ -102,8 +112,6 @@ sitemap demo label="Main Menu"
Text item=LG_TV0_ChannelNo Text item=LG_TV0_ChannelNo
Switch item=LG_TV0_ChannelDummy icon="television" label="Kanal" mappings=[1="▲", 0="▼"] Switch item=LG_TV0_ChannelDummy icon="television" label="Kanal" mappings=[1="▲", 0="▼"]
Text item=LG_TV0_Channel Text item=LG_TV0_Channel
Switch item=LG_TV0_ChannelDown
Switch item=LG_TV0_ChannelUp
Default item=LG_TV0_Player Default item=LG_TV0_Player
Text item=LG_TV0_Application Text item=LG_TV0_Application
Selection item=LG_TV0_Application mappings=[ Selection item=LG_TV0_Application mappings=[

View File

@ -113,31 +113,31 @@ The account Thing Type does not have any channels.
### Thermostat Channels ### Thermostat Channels
| Channel Type ID | Item Type | Description | Read Write | | Channel Type ID | Item Type | Description | Read Write |
|-----------------------------|-----------|---------------------------------------------------------------------------------------------|:----------:| |-----------------------------|--------------------|---------------------------------------------------------------------------------------------|:----------:|
| can_cool | Switch | If the thermostat can actually turn on cooling | R | | can_cool | Switch | If the thermostat can actually turn on cooling | R |
| can_heat | Switch | If the thermostat can actually turn on heating | R | | can_heat | Switch | If the thermostat can actually turn on heating | R |
| fan_timer_active | Switch | If the fan timer is engaged | R/W | | fan_timer_active | Switch | If the fan timer is engaged | R/W |
| fan_timer_duration | Number | Length of time (in minutes) that the fan is set to run (15, 30, 45, 60, 120, 240, 480, 960) | R/W | | fan_timer_duration | Number | Length of time (in minutes) that the fan is set to run (15, 30, 45, 60, 120, 240, 480, 960) | R/W |
| fan_timer_timeout | DateTime | Timestamp when the fan stops running | R | | fan_timer_timeout | DateTime | Timestamp when the fan stops running | R |
| has_fan | Switch | If the thermostat can control the fan | R | | has_fan | Switch | If the thermostat can control the fan | R |
| has_leaf | Switch | If the thermostat is currently in a leaf mode | R | | has_leaf | Switch | If the thermostat is currently in a leaf mode | R |
| humidity | Number | Indicates the current relative humidity | R | | humidity | Number | Indicates the current relative humidity | R |
| last_connection | DateTime | Timestamp of the last successful interaction with Nest | R | | last_connection | DateTime | Timestamp of the last successful interaction with Nest | R |
| locked | Switch | If the thermostat has the temperature locked to only be within a set range | R | | locked | Switch | If the thermostat has the temperature locked to only be within a set range | R |
| locked_max_set_point | Number | The locked range max set point in degrees Celsius | R/W | | locked_max_set_point | Number:Temperature | The locked range max set point temperature | R/W |
| locked_min_set_point | Number | The locked range min set point in degrees Celsius | R/W | | locked_min_set_point | Number:Temperature | The locked range min set point temperature | R/W |
| max_set_point | Number | The max set point in degrees Celsius | R/W | | max_set_point | Number:Temperature | The max set point temperature | R/W |
| min_set_point | Number | The min set point in degrees Celsius | R/W | | min_set_point | Number:Temperature | The min set point temperature | R/W |
| mode | String | Current mode of the Nest thermostat (HEAT, COOL, HEAT_COOL, ECO, OFF) | R/W | | mode | String | Current mode of the Nest thermostat (HEAT, COOL, HEAT_COOL, ECO, OFF) | R/W |
| previous_mode | String | The previous mode of the Nest thermostat (HEAT, COOL, HEAT_COOL, ECO, OFF) | R | | previous_mode | String | The previous mode of the Nest thermostat (HEAT, COOL, HEAT_COOL, ECO, OFF) | R |
| state | String | The active state of the Nest thermostat (HEATING, COOLING, OFF) | R | | state | String | The active state of the Nest thermostat (HEATING, COOLING, OFF) | R |
| temperature | Number | Current temperature in degrees Celsius | R | | temperature | Number:Temperature | Current temperature | R |
| time_to_target_mins | Number | Time left to the target temperature (mins) approximately | R | | time_to_target_mins | Number | Time left to the target temperature (mins) approximately | R |
| set_point | Number | The set point in degrees Celsius | R/W | | set_point | Number:Temperature | The set point temperature | R/W |
| sunlight_correction_active | Switch | If sunlight correction is active | R | | sunlight_correction_active | Switch | If sunlight correction is active | R |
| sunlight_correction_enabled | Switch | If sunlight correction is enabled | R | | sunlight_correction_enabled | Switch | If sunlight correction is enabled | R |
| using_emergency_heat | Switch | If the system is currently using emergency heat | R | | using_emergency_heat | Switch | If the system is currently using emergency heat | R |
Note that the Nest API rounds Thermostat values so they will differ from what shows up in the Nest App. Note that the Nest API rounds Thermostat values so they will differ from what shows up in the Nest App.
The Nest API applies the following rounding: The Nest API applies the following rounding:
@ -199,17 +199,17 @@ Switch Thermostat_Has_Leaf "Has Leaf"
Number Thermostat_Humidity "Humidity [%.1f %%]" { channel="nest:thermostat:demo_account:living_thermostat:humidity" } Number Thermostat_Humidity "Humidity [%.1f %%]" { channel="nest:thermostat:demo_account:living_thermostat:humidity" }
DateTime Thermostat_Last_Conn "Last Connection [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" { channel="nest:thermostat:demo_account:living_thermostat:last_connection" } DateTime Thermostat_Last_Conn "Last Connection [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" { channel="nest:thermostat:demo_account:living_thermostat:last_connection" }
Switch Thermostat_Locked "Locked" { channel="nest:thermostat:demo_account:living_thermostat:locked" } Switch Thermostat_Locked "Locked" { channel="nest:thermostat:demo_account:living_thermostat:locked" }
Number Thermostat_LMaxSP "Locked Max Set Point [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:locked_max_set_point" } Number:Temperature Therm_LMaxSP "Locked Max Set Point [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:locked_max_set_point" }
Number Thermostat_LMinSP "Locked Min Set Point [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:locked_min_set_point" } Number:Temperature Therm_LMinSP "Locked Min Set Point [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:locked_min_set_point" }
Number Thermostat_Max_SP "Max Set Point [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:max_set_point" } Number:Temperature Therm_Max_SP "Max Set Point [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:max_set_point" }
Number Thermostat_Min_SP "Min Set Point [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:min_set_point" } Number:Temperature Therm_Min_SP "Min Set Point [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:min_set_point" }
String Thermostat_Mode "Mode [%s]" { channel="nest:thermostat:demo_account:living_thermostat:mode" } String Thermostat_Mode "Mode [%s]" { channel="nest:thermostat:demo_account:living_thermostat:mode" }
String Thermostat_Previous_Mode "Previous Mode [%s]" { channel="nest:thermostat:demo_account:living_thermostat:previous_mode" } String Thermostat_Previous_Mode "Previous Mode [%s]" { channel="nest:thermostat:demo_account:living_thermostat:previous_mode" }
String Thermostat_State "State [%s]" { channel="nest:thermostat:demo_account:living_thermostat:state" } String Thermostat_State "State [%s]" { channel="nest:thermostat:demo_account:living_thermostat:state" }
Number Thermostat_Set_Point "Set Point [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:set_point" } Number:Temperature Thermostat_SP "Set Point [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:set_point" }
Switch Thermostat_Sunlight_CA "Sunlight Correction Active" { channel="nest:thermostat:demo_account:living_thermostat:sunlight_correction_active" } Switch Thermostat_Sunlight_CA "Sunlight Correction Active" { channel="nest:thermostat:demo_account:living_thermostat:sunlight_correction_active" }
Switch Thermostat_Sunlight_CE "Sunlight Correction Enabled" { channel="nest:thermostat:demo_account:living_thermostat:sunlight_correction_enabled" } Switch Thermostat_Sunlight_CE "Sunlight Correction Enabled" { channel="nest:thermostat:demo_account:living_thermostat:sunlight_correction_enabled" }
Number Thermostat_Temperature "Temperature [%.1f °C]" { channel="nest:thermostat:demo_account:living_thermostat:temperature" } Number:Temperature Therm_Temp "Temperature [%.1f %unit%]" { channel="nest:thermostat:demo_account:living_thermostat:temperature" }
Number Thermostat_Time_To_Target "Time To Target [%s]" { channel="nest:thermostat:demo_account:living_thermostat:time_to_target_mins" } Number Thermostat_Time_To_Target "Time To Target [%s]" { channel="nest:thermostat:demo_account:living_thermostat:time_to_target_mins" }
Switch Thermostat_Using_Em_Heat "Using Emergency Heat" { channel="nest:thermostat:demo_account:living_thermostat:using_emergency_heat" } Switch Thermostat_Using_Em_Heat "Using Emergency Heat" { channel="nest:thermostat:demo_account:living_thermostat:using_emergency_heat" }
@ -226,10 +226,6 @@ String Home_Smoke_Alarm_State "Smoke Alarm State [%s]"
String Home_Time_Zone "Time Zone [%s]" { channel="nest:structure:demo_account:home:time_zone" } String Home_Time_Zone "Time Zone [%s]" { channel="nest:structure:demo_account:home:time_zone" }
``` ```
## Known Issues
* The binding uses Celsius as unit for all Themostat temperature channels.
## Attribution ## Attribution
This documentation contains parts written by John Cocula which were copied from the 1.0 Nest binding. This documentation contains parts written by John Cocula which were copied from the 1.0 Nest binding.

View File

@ -57,7 +57,7 @@ The variables to fill in are:
* `<CLIENT_ID>` Your client ID taken from your App at https://dev.netatmo.com/dev/listapps * `<CLIENT_ID>` Your client ID taken from your App at https://dev.netatmo.com/dev/listapps
* `<SCOPE>` A list of devices and capabilities. The full scope would be `read_station read_thermostat write_thermostat read_camera access_camera`, see the [Netatmo Scope Documentation](https://dev.netatmo.com/doc/authentication/scopes) for more info. Please ensure that the variable is [URL encoded](http://www.w3schools.com/tags/ref_urlencode.asp) if your browser doesn't do it automatically, e.g. the URL encoded complete list of scopes would be `read_station%20read_thermostat%20write_thermostat%20read_camera%20access_camera` * `<SCOPE>` A list of devices and capabilities. The full scope would be `read_station read_thermostat write_thermostat read_camera access_camera`, see the [Netatmo Scope Documentation](https://dev.netatmo.com/doc/authentication/scopes) for more info. Please ensure that the variable is [URL encoded](http://www.w3schools.com/tags/ref_urlencode.asp) if your browser doesn't do it automatically, e.g. the URL encoded complete list of scopes would be `read_station%20read_thermostat%20write_thermostat%20read_camera%20access_camera`
When entering the URL to your browser it will take you to the Netatmo Webpage asking you to authorize your application to access your Netatmo data. The page should look something like [this](https://dev.netatmo.com/images/dev/auth_app.jpg). After this step your Application should appear as an authorized application in your Netatmo profile. Please make sure it is there, the setup can not continue if your app is not authorized. When entering the URL to your browser it will take you to the Netatmo Webpage asking you to authorize your application to access your Netatmo data. The page should look something like [this](https://dev.netatmo.com/images/dev/auth_app.jpg). After this step your Application should appear as an authorized application in your Netatmo profile. Please make sure it is there, the setup cannot continue if your app is not authorized.
### 3. Retrieve a refresh token ### 3. Retrieve a refresh token
[Retrieve a refresh token](https://dev.netatmo.com/doc/authentication/refreshtoken) from Netatmo API, using e.g. curl. [Retrieve a refresh token](https://dev.netatmo.com/doc/authentication/refreshtoken) from Netatmo API, using e.g. curl.

View File

@ -3,7 +3,7 @@ id: network
label: Network label: Network
title: Network - Bindings title: Network - Bindings
type: binding type: binding
description: "This binding allows to check, whether a device is currently available on the network." description: "This binding allows checking whether a device is currently available on the network."
since: 2x since: 2x
install: auto install: auto
--- ---
@ -14,27 +14,30 @@ install: auto
# Network Binding # Network Binding
This binding allows to check, whether a device is currently available on the network. This binding allows checking whether a device is currently available on the network.
This happens by either using [ping](https://en.wikipedia.org/wiki/Ping_%28networking_utility%29) or by a successful TCP connection on a port of your choice. This is either done using [ping](https://en.wikipedia.org/wiki/Ping_%28networking_utility%29) or by a successful TCP connection on a specified port.
## Binding configuration ## Binding configuration
You can use the following configuration options: The binding has the following configuration options:
- **allowSystemPings:** Use the external ICMP ping program of the operating system, instead of the Java ping. Useful if the devices cannot be reached by Java ping. Default is true. - **allowSystemPings:** Use the external ICMP ping program of the operating system instead of the Java ping. Useful if the devices cannot be reached by Java ping. Default is true.
- **allowDHCPlisten:** If devices leave and reenter a network, they usually request their last IPv4 address by using DHCP requests. If we listen for those messages, we can make the status update more "real-time" and do not have to wait for the next refresh cycle. Default is true. - **allowDHCPlisten:** If devices leave and reenter a network, they usually request their last IPv4 address by using DHCP requests. By listening for those messages, the status update can be more "real-time" without having to wait for the next refresh cycle. Default is true.
- **arpPingToolPath:** If your arp ping tool is not called arping and cannot be found in the PATH environment, you can configure the absolute path here. Default is "arping". - **arpPingToolPath:** If the arp ping tool is not called `arping` and cannot be found in the PATH environment variable, the absolute path can be configured here. Default is `arping`.
- **cacheDeviceStateTimeInMS:** The result of a device presence detection is cached for a small amount of time. Set this time here in milliseconds. Be aware that no new pings will be issued within this time frame, even if explicitly requested. Default is 2000. - **cacheDeviceStateTimeInMS:** The result of a device presence detection is cached for a small amount of time. Set this time here in milliseconds. Be aware that no new pings will be issued within this time frame, even if explicitly requested. Default is 2000.
Create a file *org.openHAB.binding.network.cfg* in your openHAB/etc directory and use the above options like this: Create a `<openHAB-conf>/services/network.cfg` file and use the above options like this:
``` ```
allowSystemPings=false binding.network:allowSystemPings=true
binding.network:allowDHCPlisten=false
binding.network:arpPingToolPath=arping
binding.network:cacheDeviceStateTimeInMS=2000
``` ```
## Supported Things ## Supported Things
- **pingdevice:** Detects device presence by using icmp pings, arp pings and dhcp packet sniffing. - **pingdevice:** Detects device presence by using ICMP pings, arp pings and dhcp packet sniffing.
- **servicedevice:** Detects device presence by scanning for a specific open tcp port. - **servicedevice:** Detects device presence by scanning for a specific open tcp port.
## Discovery ## Discovery
@ -48,18 +51,16 @@ Please note: things discovered by the network binding will be provided with a ti
``` ```
network:pingdevice:one_device [ hostname="192.168.0.64" ] network:pingdevice:one_device [ hostname="192.168.0.64" ]
network:pingdevice:second_device [ hostname="192.168.0.65", retry=1, timeout=5000, refreshInterval=60000 ] network:pingdevice:second_device [ hostname="192.168.0.65", retry=1, timeout=5000, refreshInterval=60000 ]
network:servicedevice:important_server [ hostname="192.168.0.62", port=1234 ] network:servicedevice:important_server [ hostname="192.168.0.62", port=1234 ]
``` ```
Use the following options for a **network:pingdevice**: Use the following options for a **network:pingdevice**:
- **hostname:** IP address or hostname of the device - **hostname:** IP address or hostname of the device
- **retry:** After how many refresh interval cycles shall the device be assumed as offline. Default is 1. - **retry:** After how many refresh interval cycles the device will be assumed to be offline. Default is 1.
- **timeout:** How long shall the ping wait for an answer (in milliseconds. Default: `5000` = 5 seconds) - **timeout:** How long the ping will wait for an answer, in milliseconds. Default: `5000` (5 seconds)
- **refreshInterval:** How often shall the device be checked (in milliseconds. Default: `60000` = one minute) - **refreshInterval:** How often the device will be checked, in milliseconds. Default: `60000` (one minute)
Use the following additional options for a **network:servicedevice**: Use the following additional options for a **network:servicedevice**:
@ -67,35 +68,33 @@ Use the following additional options for a **network:servicedevice**:
## Presence detection - Configure target device ## Presence detection - Configure target device
You may need to configure devices to be reachable. Devices may need to be configured to be reachable, as a device may not answer ping requests by default.
A device may not answer ping requests by default.
This is the case with Windows 10 equipped systems or Android and iOS devices in deep sleep mode. This is the case with Windows 10 equipped systems or Android and iOS devices in deep sleep mode.
### Respond to pings on Windows 10+ ### Respond to pings on Windows 10+
Pings on windows 10 are usually blocked by the internal firewall. Pings on Windows 10 are usually blocked by the internal firewall.
You need to allow "Echo Request for ICMPv4" to allow your windows to respond to pings. Windows 10 must be configured to allow "Echo Request for ICMPv4" so that it can respond to pings.
### Android and iOS devices ### Android and iOS devices
Because mobile devices put themselves in a deep sleep mode after some inactivity, they do not react to normal ICMP pings. Because mobile devices put themselves in a deep sleep mode after some inactivity, they do not react to normal ICMP pings.
Configure ARP ping to realize presence detection for those devices. Configure ARP ping to realize presence detection for those devices.
This only works if your devices have WIFI enabled, have been configured to use your home WIFI network, and have the option "Disable wifi in standby" disabled (default). This only works if the devices have WIFI enabled, have been configured to use the WIFI network, and have the option "Disable wifi in standby" disabled (default).
An almost immediate presence detection for phones and tables, if they (re)join the home Wifi network, is to use DHCP listen. Use DHCP listen for an almost immediate presence detection for phones and tablets when they (re)join the home Wifi network.
### iPhones, iPads ### iPhones, iPads
Apple iOS devices are usually in a deep sleep mode and do not respond to ARP pings under all conditions, but to Bonjour service discovery messages (UDP port 5353). Apple iOS devices are usually in a deep sleep mode and do not respond to ARP pings under all conditions, but to Bonjour service discovery messages (UDP port 5353).
Therefore first a Bonjour message is send, before the ARP presence detection is performed. Therefore first a Bonjour message is sent, before the ARP presence detection is performed.
The binding automatically figures out if the target device is an iOS device. The binding automatically figures out if the target device is an iOS device.
You can check if the binding has correctly recognised your device by having a look at the *uses_ios_wakeup* property of your thing. To check if the binding has correctly recognised a device, have a look at the *uses_ios_wakeup* property of the THING.
An almost immediate presence detection for phones and tables, if they (re)join the home Wifi network, is to use DHCP listen.
### Use open TCP ports ### Use open TCP ports
Many devices provide services on TCP ports (web-frontends, streaming servers, ...), which you can use to confirm there presence in the network. Many devices provide services on TCP ports (web-frontends, streaming servers, etc.), which can be used to confirm their presence in the network.
Most operating systems have options to list open ports. Most operating systems have options to list open ports.
On a linux-based system, you may use *nmap* to discover all open TCP ports on the device with the specified IP address: On a Linux-based system, *nmap* may be used to discover all open TCP ports on the device with the specified IP address:
``` ```
$ sudo nmap -Pn -sT -p- 192.168.0.42 $ sudo nmap -Pn -sT -p- 192.168.0.42
@ -117,17 +116,16 @@ In this example, there are four suitable ports to use.
The port 554 (Windows network file sharing service) is open on most Windows PCs and Windows compatible Linux systems. The port 554 (Windows network file sharing service) is open on most Windows PCs and Windows compatible Linux systems.
Port 1025 (MS RPC) is open on XBox systems. Port 548 (Apple Filing Protocol (AFP)) is open on Mac OS X systems. Port 1025 (MS RPC) is open on XBox systems. Port 548 (Apple Filing Protocol (AFP)) is open on Mac OS X systems.
Please don't forget to open the required ports in your firewall setup. Please don't forget to open the required ports in the system's firewall setup.
## Presence detection - Configure your openHAB installation ## Presence detection - Configure your openHAB installation
Because we use external tools for some of the presence detection mechanism or need elevated permissions for others, your OpenHAB installation needs to be altered. Because external tools are used for some of the presence detection mechanism or need elevated permissions for others, the openHAB installation needs to be altered.
### Arping ### Arping
For arp pings to work, you need a separate tool, called "arping". For arp pings to work, a separate tool called "arping" is used.
On Linux there exists three different tools: Linux has three different tools:
* arp-scan (not yet supported by this binding) * arp-scan (not yet supported by this binding)
* arping of the ip-utils (Ubuntu/Debian: `apt-get install iputils-arping`) * arping of the ip-utils (Ubuntu/Debian: `apt-get install iputils-arping`)
@ -135,19 +133,16 @@ On Linux there exists three different tools:
arping by Thomas Habets runs on Windows and MacOS as well. arping by Thomas Habets runs on Windows and MacOS as well.
Make sure the tool is available in $PATH (%PATH% respectively on Windows) or in the same path as the openHAB executable. Make sure the tool is available in the PATH, or in the same path as the openHAB executable.
On Linux and MacOS you might need elevated access permissions, for instance by making the executable a suid executable (`chmod u+s /usr/sbin/arping`). On Linux and MacOS elevated access permissions may be needed, for instance by making the executable a suid executable (`chmod u+s /usr/sbin/arping`).
Just test the executable on the command line, if `sudo` is required, you need to grant elevated permissions. Just test the executable on the command line; if `sudo` is required, grant elevated permissions.
### DHCP Listen ### DHCP Listen
If devices leave and reenter a network, they usually request their last IPv4 address by using DHCP requests.
If we listen for those messages, we can make the status update more "real-time" and do not have to wait for the next refresh cycle.
Some operating systems such as Linux restrict applications to only use ports >= 1024 without elevated privileges. Some operating systems such as Linux restrict applications to only use ports >= 1024 without elevated privileges.
If the binding is not able to use port 67 (DHCP), because of such a restriction or because the same system is used as a DHCP server, port 6767 will be used instead. If the binding is not able to use port 67 (DHCP) because of such a restriction, or because the same system is used as a DHCP server, port 6767 will be used instead.
Check the property *dhcp_state* on your thing for such a hint. You need to establish a port forwarding in this case: Check the property *dhcp_state* on the THING for such a hint. In this case, establish port forwarding:
```shell ```shell
sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv4.ip_forward=1
@ -155,8 +150,7 @@ iptables -A INPUT -p udp --dport 6767 -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport 67 -j REDIRECT --to-ports 6767 iptables -t nat -A PREROUTING -p udp --dport 67 -j REDIRECT --to-ports 6767
``` ```
If you operate a DHCP server on port 67, you need to duplicate the received traffic and If a DHCP server is operating on port 67, duplicate the received traffic and forward it to port 6767:
forward it to port 6767:
```shell ```shell
iptables -A PREROUTING -t mangle -p udp ! -s 127.0.0.1 --dport 67 -j TEE --gateway 127.0.0.1 iptables -A PREROUTING -t mangle -p udp ! -s 127.0.0.1 --dport 67 -j TEE --gateway 127.0.0.1
@ -169,11 +163,11 @@ Things support the following channels:
| Channel Type ID | Item Type | Description | | Channel Type ID | Item Type | Description |
|-----------------|-----------|--------------------------------------------------------------------------------------------| |-----------------|-----------|--------------------------------------------------------------------------------------------|
| online | Switch | This channel indicates whether a device is online or not | | online | Switch | This channel indicates whether a device is online |
| lastseen | DateTime | The last seen date/time of the device in question. May be 1. Jan 1970 if no time is known. | | lastseen | DateTime | The last seen date/time of the device in question. May be 1. Jan 1970 if no time is known |
| latency | Number | This channel indicates the ping latency in milliseconds. May be 0 if no time is known. | | latency | Number | This channel indicates the ping latency in milliseconds. May be 0 if no time is known |
## Example ## Examples
demo.things: demo.things:

View File

@ -119,6 +119,7 @@ Thing examples:
``` ```
nibeheatpump:f1x45-udp:myPump [hostName="192.168.1.50", port=9999] nibeheatpump:f1x45-udp:myPump [hostName="192.168.1.50", port=9999]
``` ```
``` ```
nibeheatpump:f1x45-udp:myPump [hostName="192.168.1.50", port=9999, readCommandsPort=10000, writeCommandsPort=10001, refreshInterval=30, enableReadCommands=true, enableWriteCommands=true, enableRegistersForWriteCommands="44266, 47004"] nibeheatpump:f1x45-udp:myPump [hostName="192.168.1.50", port=9999, readCommandsPort=10000, writeCommandsPort=10001, refreshInterval=30, enableReadCommands=true, enableWriteCommands=true, enableRegistersForWriteCommands="44266, 47004"]
``` ```

View File

@ -3,7 +3,7 @@
Command to convert Nibe CSV file character set to UTF-8: Command to convert Nibe CSV file character set to UTF-8:
```iconv -f iso-8859-1 -t utf-8 F1X45.csv > F1X45_utf8.csv``` ```iconv -f iso-8859-1 -t utf-8 F1X45.csv > F1X45_utf8.csv```
Command to create channel-types from CSV file: Command to create channel-types from CSV file (all channels are marked as advanced, so remove it manually from desired channels):
```awk -f create_channel_types.awk F1X45_utf8.csv > F1X45.xml``` ```awk -f create_channel_types.awk F1X45_utf8.csv > F1X45.xml```
Command to create all channels from CSV file: Command to create all channels from CSV file:

View File

@ -60,7 +60,8 @@ where `<eventType>` is one of the following values:
| `temperature_supplay` | Number | the temperature sent to the floor heating | | `temperature_supplay` | Number | the temperature sent to the floor heating |
| `temperature_servicewater_reference` | Number | the reference temperature of the servicewater | | `temperature_servicewater_reference` | Number | the reference temperature of the servicewater |
| `temperature_servicewater` | Number | the temperature of the servicewater | | `temperature_servicewater` | Number | the temperature of the servicewater |
| `state` | String | contains the time of the state and the state; Possible states are error, running, stoped, defrosting | | `state` | String | contains the time of the state and the state; Possible states are error, running, stopped, defrosting |
| `simple_state` | String | contains only the short statename; Possible states are error, running, stopped, defrosting |
| `extended_state` | String | contains the time of the state and the state; Possible states are error, heating, standby, switch-on delay, switching cycle | blocked, provider lock time, service water, screed heat up, defrosting, pump flow, desinfection, cooling, pool water, heating ext., service water ext., | flow monitoring, ZWE operation | | `extended_state` | String | contains the time of the state and the state; Possible states are error, heating, standby, switch-on delay, switching cycle | blocked, provider lock time, service water, screed heat up, defrosting, pump flow, desinfection, cooling, pool water, heating ext., service water ext., | flow monitoring, ZWE operation |
| `temperature_solar_collector` | Number | the temperature of the sensor in the solar collector | | `temperature_solar_collector` | Number | the temperature of the sensor in the solar collector |
| `temperature_hot_gas` | Number | | `temperature_hot_gas` | Number |

View File

@ -56,7 +56,7 @@ pioneeravr:serialAvr:vsx921Serial [ serialPort="COM9" ]
## Channels ## Channels
* power: power On/Off the AVR. Receive power events. * power: power On/Off the AVR. Receive power events.
* volumeDimmer: Increase/Decrease the volume on the AVR or set the volume as %. Receive volume change events (in %). * volumeDimmer: Increase/Decrease the volume on the AVR or set the volume as %. Receive volume change events (in %).
* volumeDb: Set the volume of the AVR in dB (from -80.0 to 12 with 0.5 dB steps). Receive volume change events (in dB). * volumeDb: Set the volume of the AVR in dB (from -80.0 to 12 with 0.5 dB steps). Receive volume change events (in dB).
* mute: Mute/Unmute the AVR. Receive mute events. * mute: Mute/Unmute the AVR. Receive mute events.
* setInputSource: Set the input source of the AVR. See input source mapping for more details. Receive source input change events with the input source ID. * setInputSource: Set the input source of the AVR. See input source mapping for more details. Receive source input change events with the input source ID.
@ -64,30 +64,42 @@ pioneeravr:serialAvr:vsx921Serial [ serialPort="COM9" ]
## Input Source Mapping ## Input Source Mapping
Here after are the ID values of the input sources: Here after are the ID values of the input sources (depending on you AVR input sources might not be available):
* 04: DVD * 04: DVD
* 25: BD * 25: BD
* 05: TV/SAT * 05: TV/SAT
* 15: DVR/BDR * 06: SAT/CBL
* 10: VIDEO 1(VIDEO) * 15: DVR/BDR
* 14: VIDEO 2 * 10: VIDEO 1(VIDEO)
* 19: HDMI 1 * 14: VIDEO 2
* 20: HDMI 2 * 19: HDMI 1
* 21: HDMI 3 * 20: HDMI 2
* 22: HDMI 4 * 21: HDMI 3
* 23: HDMI 5 * 22: HDMI 4
* 26: HOME MEDIA GALLERY(Internet Radio) * 23: HDMI 5
* 17: iPod/USB * 24: HDMI 6
* 18: XM RADIO * 34: HDMI 7
* 01: CD * 35: HDMI 8
* 03: CD-R/TAPE * 26: HOME MEDIA GALLERY(Internet Radio)
* 02: TUNER * 44: Media Server
* 00: PHONO * 38: Internet Radio
* 12: MULTI CH IN * 17: iPod/USB
* 33: ADAPTER PORT * 48: MHL
* 27: SIRIUS * 01: CD
* 31: HDMI (cyclic) * 03: CD-R/TAPE
* 02: TUNER
* 00: PHONO
* 13: USB-DAC
* 12: MULTI CH IN
* 33: ADAPTER PORT (BT)
* 18: XM RADIO
* 27: SIRIUS
* 40: SiriusXM
* 41: PANDORA
* 45: Favourites
* 57: Spotify
* 31: HDMI (cyclic)
## Example ## Example
@ -101,12 +113,12 @@ pioneeravr:ipAvr:vsx921 [ address="192.168.188.89" ]
``` ```
/* Pioneer AVR Items */ /* Pioneer AVR Items */
Switch vsx921PowerSwitch "Power" (All) { channel="pioneeravr:ipAvr:vsx921:power" } Switch vsx921PowerSwitch "Power" (All) { channel="pioneeravr:ipAvr:vsx921:power" }
Switch vsx921MuteSwitch "Mute" <none> (All) { channel="pioneeravr:ipAvr:vsx921:mute" } Switch vsx921MuteSwitch "Mute" <none> (All) { channel="pioneeravr:ipAvr:vsx921:mute" }
Dimmer vsx921VolumeDimmer "Volume [%.1f] %" <none> (All) { channel="pioneeravr:ipAvr:vsx921:volumeDimmer" } Dimmer vsx921VolumeDimmer "Volume [%.1f] %" <none> (All) { channel="pioneeravr:ipAvr:vsx921:volumeDimmer" }
Number vsx921VolumeNumber "Volume [%.1f] dB" <none> (All) { channel="pioneeravr:ipAvr:vsx921:volumeDb" } Number vsx921VolumeNumber "Volume [%.1f] dB" <none> (All) { channel="pioneeravr:ipAvr:vsx921:volumeDb" }
String vsx921InputSourceSet "Input" <none> (All) { channel="pioneeravr:ipAvr:vsx921:setInputSource" } String vsx921InputSourceSet "Input" <none> (All) { channel="pioneeravr:ipAvr:vsx921:setInputSource" }
String vsx921InformationDisplay "Information [%s]" <none> (All) { channel="pioneeravr:ipAvr:vsx921:displayInformation" } String vsx921InformationDisplay "Information [%s]" <none> (All) { channel="pioneeravr:ipAvr:vsx921:displayInformation" }
``` ```
*demo.sitemap: *demo.sitemap:

View File

@ -25,15 +25,15 @@ Currently only "V2" of the Plugwise protocol is supported. It is adviced that us
The binding supports the following Plugwise devices: The binding supports the following Plugwise devices:
| Device Type | Description | Thing Type | | Device Type | Description | Thing Type |
|---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|------------| |---------------------------------------------------------------|------------------------------------------------------------------------------------------|------------|
| [Circle](https://www.plugwise.com/products/appliances-and-lighting/energy-meters-and-switches/circle) | A power outlet plug that provides energy measurement and switching control of appliances | circle | | [Circle](https://www.plugwise.com/en_US/products/circle) | A power outlet plug that provides energy measurement and switching control of appliances | circle |
| [Circle+](https://www.plugwise.com/products/appliances-and-lighting/energy-meters-and-switches/circle) | A special Circle that coordinates the ZigBee network and acts as network gateway | circleplus | | [Circle+](https://www.plugwise.com/en_US/products/circle) | A special Circle that coordinates the ZigBee network and acts as network gateway | circleplus |
| [Scan](https://www.plugwise.com/products/appliances-and-lighting/presence-and-light-sensor/scan) | A wireless motion (PIR) and light sensor | scan | | [Scan](https://www.plugwise.com/en_US/products/scan) | A wireless motion (PIR) and light sensor | scan |
| [Sense](https://www.plugwise.com/products/indoor-climate/humidity-and-temperature-sensor/sense) | A wireless temperature and humidity sensor | sense | | [Sense](https://www.plugwise.com/en_US/products/sense) | A wireless temperature and humidity sensor | sense |
| [Stealth](https://www.plugwise.com/products/appliances-and-lighting/energy-meters-and-switches/stealth) | A Circle with a more compact form factor that can be built-in | stealth | | [Stealth](https://www.plugwise.com/en_US/products/stealth) | A Circle with a more compact form factor that can be built-in | stealth |
| [Stick](https://www.plugwise.com/home-start) | A ZigBee USB controller that openHAB uses to communicate with the Circle+ | stick | | [Stick](https://www.plugwise.com/en_US/products/start-source) | A ZigBee USB controller that openHAB uses to communicate with the Circle+ | stick |
| [Switch](https://www.plugwise.com/products/appliances-and-lighting/energy-meters-and-switches/switch) | A wireless wall switch | switch | | [Switch](https://www.plugwise.com/en_US/products/switch) | A wireless wall switch | switch |
## Discovery ## Discovery
@ -117,20 +117,20 @@ To access the serial port of the Stick on Linux, the user running openHAB needs
## Channels ## Channels
| Channel Type ID | Item Type | Description | Thing Types | | Channel Type ID | Item Type | Description | Thing Types |
|------------------|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------| |------------------|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|
| clock | String | Time as indicated by the internal clock of the device | circle, circleplus, stealth | | clock | String | Time as indicated by the internal clock of the device | circle, circleplus, stealth |
| energy | Number | Energy consumption/production (kWh) during the last measurement interval | circle, circleplus, stealth | | energy | Number:Energy | Energy consumption/production during the last measurement interval | circle, circleplus, stealth |
| energystamp | DateTime | Timestamp of the start of the last energy measurement interval | circle, circleplus, stealth | | energystamp | DateTime | Timestamp of the start of the last energy measurement interval | circle, circleplus, stealth |
| humidity | Number | Current relative humidity (%) | sense | | humidity | Number:Dimensionless | Current relative humidity | sense |
| lastseen | DateTime | Timestamp of the last received message. Because there is no battery level indication this is a helpful value to determine if a battery powered device is still operating properly even when no state changes occur | circle, circleplus, scan, sense, stealth, switch | | lastseen | DateTime | Timestamp of the last received message. Because there is no battery level indication this is a helpful value to determine if a battery powered device is still operating properly even when no state changes occur | circle, circleplus, scan, sense, stealth, switch |
| leftbuttonstate | Switch | Current state of the left button | switch | | leftbuttonstate | Switch | Current state of the left button | switch |
| power | Number | Current power consumption (Watt), measured over 1 second interval | circle, circleplus, stealth | | power | Number:Power | Current power consumption, measured over 1 second interval | circle, circleplus, stealth |
| realtimeclock | DateTime | Time as indicated by the internal clock of the Circle+ | circleplus | | realtimeclock | DateTime | Time as indicated by the internal clock of the Circle+ | circleplus |
| rightbuttonstate | Switch | Current state of the right button | switch | | rightbuttonstate | Switch | Current state of the right button | switch |
| state | Switch | Switches the power state on/off | circle, circleplus, stealth | | state | Switch | Switches the power state on/off | circle, circleplus, stealth |
| temperature | Number | Current temperature (°C) | sense | | temperature | Number:Temperature | Current temperature | sense |
| triggered | Switch | Most recent switch action initiated by the device. When daylight override is disabled on a Scan this corresponds one to one with motion detection | scan, sense | | triggered | Switch | Most recent switch action initiated by the device. When daylight override is disabled on a Scan this corresponds one to one with motion detection | scan, sense |
## Example ## Example
@ -169,16 +169,16 @@ demo.items
/* Circle */ /* Circle */
Switch Fan_Switch "Switch" <switch> { channel="plugwise:circle:fan:state" } Switch Fan_Switch "Switch" <switch> { channel="plugwise:circle:fan:state" }
String Fan_Clock "Clock [%s]" <clock> { channel="plugwise:circle:fan:clock" } String Fan_Clock "Clock [%s]" <clock> { channel="plugwise:circle:fan:clock" }
Number Fan_Power "Power [%.1f W]" <energy> { channel="plugwise:circle:fan:power" } Number:Power Fan_Power "Power [%.1f %unit%]" <energy> { channel="plugwise:circle:fan:power" }
Number Fan_Energy "Energy [%.3f kWh]" <chart> { channel="plugwise:circle:fan:energy" } Number:Energy Fan_Energy "Energy [%.3f %unit%]" <chart> { channel="plugwise:circle:fan:energy" }
DateTime Fan_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circle:fan:energystamp" } DateTime Fan_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circle:fan:energystamp" }
DateTime Fan_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circle:fan:lastseen" } DateTime Fan_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circle:fan:lastseen" }
/* Circle+ */ /* Circle+ */
Switch Lamp_Switch "Switch" <switch> { channel="plugwise:circleplus:lamp:state" } Switch Lamp_Switch "Switch" <switch> { channel="plugwise:circleplus:lamp:state" }
String Lamp_Clock "Clock [%s]" <clock> { channel="plugwise:circleplus:lamp:clock" } String Lamp_Clock "Clock [%s]" <clock> { channel="plugwise:circleplus:lamp:clock" }
Number Lamp_Power "Power [%.1f W]" <energy> { channel="plugwise:circleplus:lamp:power" } Number:Power Lamp_Power "Power [%.1f %unit%]" <energy> { channel="plugwise:circleplus:lamp:power" }
Number Lamp_Energy "Energy [%.3f kWh]" <chart> { channel="plugwise:circleplus:lamp:energy" } Number:Energy Lamp_Energy "Energy [%.3f %unit%]" <chart> { channel="plugwise:circleplus:lamp:energy" }
DateTime Lamp_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circleplus:lamp:energystamp" } DateTime Lamp_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circleplus:lamp:energystamp" }
DateTime Lamp_Real_Time_Clock "Real time clock [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <clock> { channel="plugwise:circleplus:lamp:realtimeclock" } DateTime Lamp_Real_Time_Clock "Real time clock [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <clock> { channel="plugwise:circleplus:lamp:realtimeclock" }
DateTime Lamp_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circleplus:lamp:lastseen" } DateTime Lamp_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:circleplus:lamp:lastseen" }
@ -189,15 +189,15 @@ DateTime Motion_Sensor_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS
/* Sense */ /* Sense */
Switch Climate_Sensor_Switch "Triggered [%s]" <switch> { channel="plugwise:sense:climatesensor:triggered" } Switch Climate_Sensor_Switch "Triggered [%s]" <switch> { channel="plugwise:sense:climatesensor:triggered" }
Number Climate_Sensor_Humidity "Humidity [%.1f %%]" <humidity> { channel="plugwise:sense:climatesensor:humidity" } Number:Dimensionless Climate_Sensor_Humidity "Humidity [%.1f %unit%]" <humidity> { channel="plugwise:sense:climatesensor:humidity" }
Number Climate_Sensor_Temperature "Temperature [%.1f °C]" <temperature> { channel="plugwise:sense:climatesensor:temperature" } Number:Temperature Climate_Sensor_Temperature "Temperature [%.1f %unit%]" <temperature> { channel="plugwise:sense:climatesensor:temperature" }
DateTime Climate_Sensor_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <clock> { channel="plugwise:sense:climatesensor:lastseen" } DateTime Climate_Sensor_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <clock> { channel="plugwise:sense:climatesensor:lastseen" }
/* Stealth */ /* Stealth */
Switch Fridge_Switch "Switch" <switch> { channel="plugwise:stealth:fridge:state" } Switch Fridge_Switch "Switch" <switch> { channel="plugwise:stealth:fridge:state" }
String Fridge_Clock "Clock [%s]" <clock> { channel="plugwise:stealth:fridge:clock" } String Fridge_Clock "Clock [%s]" <clock> { channel="plugwise:stealth:fridge:clock" }
Number Fridge_Power "Power [%.1f W]" <energy> { channel="plugwise:stealth:fridge:power" } Number:Power Fridge_Power "Power [%.1f %unit%]" <energy> { channel="plugwise:stealth:fridge:power" }
Number Fridge_Energy "Energy [%.3f kWh]" <chart> { channel="plugwise:stealth:fridge:energy" } Number:Energy Fridge_Energy "Energy [%.3f %unit%]" <chart> { channel="plugwise:stealth:fridge:energy" }
DateTime Fridge_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:stealth:fridge:energystamp" } DateTime Fridge_Energy_Stamp "Energy stamp [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:stealth:fridge:energystamp" }
DateTime Fridge_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:stealth:fridge:lastseen" } DateTime Fridge_Last_Seen "Last seen [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <calendar> { channel="plugwise:stealth:fridge:lastseen" }

View File

@ -16,14 +16,15 @@ install: auto
The Rego heat pump binding supports: The Rego heat pump binding supports:
* Rego 6xx controllers family and * Rego 6xx controllers family and
* Husdata interface. * Husdata interface.
## The Rego 6xx family ## The Rego 6xx family
The Rego 6xx controllers family is used in many heat pumps, like IVT/Bosch/Autotherm/Carrier and others. The Rego 6xx controllers family is used in many heat pumps such as IVT/Bosch/Autotherm/Carrier and others.
Rego 6xx unit contain an interface marked as service. Header of this interface is close to the control unit. This is 5V (TTL) serial interface and is connected by a 9 pin can/d-sub connector. Pinout: Rego 6xx unit contain an interface marked as service.
Header of this interface is close to the control unit. This is 5V (TTL) serial interface and is connected by a 9 pin can/d-sub connector. Pinout:
2 - RxD 2 - RxD
3 - TxD 3 - TxD
@ -36,12 +37,13 @@ Serial communication is using 19200 bps, 8 bit, no parity, 1 stop bit.
Two connection types are supported: Two connection types are supported:
* TCP/IP and * TCP/IP and
* serial (RS232). * serial (RS232).
#### TCP/IP connection #### TCP/IP connection
A transparent bridge between the serial interface of the heat pump and network (i.e. wifi) is used. This way no additional wires are required between heat pump and computer, running openhab. A transparent bridge between the serial interface of the heat pump and network (i.e. wifi) is used.
This way no additional wires are required between heat pump and computer, running openhab.
There are many existing project providing such functionality, i.e. [ser2net](http://ser2net.sourceforge.net/). There are many existing project providing such functionality, i.e. [ser2net](http://ser2net.sourceforge.net/).
@ -51,13 +53,14 @@ Board:
![board](doc/board.png) ![board](doc/board.png)
The code running on the ESP module can be found [here](https://github.com/crnjan/esp8266-bridge). There are other projects providing ESP firmware with similar functionality, i.e. [ESP-LINK](https://github.com/jeelabs/esp-link), but did not test with those. The code running on the ESP module can be found [here](https://github.com/crnjan/esp8266-bridge).
There are other projects providing ESP firmware with similar functionality, i.e. [ESP-LINK](https://github.com/jeelabs/esp-link), but did not test with those.
Configuration of the TCP/IP thing: Configuration of the TCP/IP thing:
- address: the hostname/IP address of the transparent bridge on the local network - mandatory, - address: the hostname/IP address of the transparent bridge on the local network - mandatory,
- tcpPort: the port number to use to connect to the transparent bridge - optional, defaults to 9265, - tcpPort: the port number to use to connect to the transparent bridge - optional, defaults to 9265,
- refreshInterval: refresh interval in seconds, used to fetch new values from the heat pump - optional, defaults to 60 seconds. - refreshInterval: refresh interval in seconds, used to fetch new values from the heat pump - optional, defaults to 60 seconds.
Example thing definition: Example thing definition:
@ -71,8 +74,8 @@ In order to connect directly to the rego 6xx controller, one needs to adjust the
Parameters: Parameters:
- portName: the name of the serial port on your computer - mandatory, - portName: the name of the serial port on your computer - mandatory,
- refreshInterval: refresh interval in seconds, used to fetch new values from the heat pump - optional, defaults to 60 seconds. - refreshInterval: refresh interval in seconds, used to fetch new values from the heat pump - optional, defaults to 60 seconds.
Example thing definition: Example thing definition:
@ -80,7 +83,6 @@ Example thing definition:
regoheatpump:serialRego6xx:ivtSerial [ portName="COM3" ] regoheatpump:serialRego6xx:ivtSerial [ portName="COM3" ]
``` ```
### Channels ### Channels
Below is the list of supported channels, all values are read only: Below is the list of supported channels, all values are read only:
@ -161,8 +163,8 @@ Above list is informational, please consult with the Husdata interface provider
Two connection types are supported: Two connection types are supported:
* TCP/IP and * TCP/IP and
* serial (RS232). * serial (RS232).
#### TCP/IP connection #### TCP/IP connection
@ -172,8 +174,8 @@ There are many existing project providing such functionality, i.e. [ser2net](htt
Configuration of the TCP/IP thing: Configuration of the TCP/IP thing:
- address: the hostname/IP address of the transparent bridge on the local network - mandatory, - address: the hostname/IP address of the transparent bridge on the local network - mandatory,
- tcpPort: the port number to use to connect to the transparent bridge - optional, defaults to 9265. - tcpPort: the port number to use to connect to the transparent bridge - optional, defaults to 9265.
Example thing definition: Example thing definition:
@ -187,7 +189,7 @@ One can connect the Husdata interface directly to a computer that runs openHAB.
Parameters: Parameters:
- portName: the name of the serial port on your computer - mandatory. - portName: the name of the serial port on your computer - mandatory.
Example thing definition: Example thing definition:
@ -195,7 +197,6 @@ Example thing definition:
regoheatpump:serialHusdata:ivtSerial [ portName="COM3" ] regoheatpump:serialHusdata:ivtSerial [ portName="COM3" ]
``` ```
### Channels ### Channels
Below is the list of supported channels, all values are read only: Below is the list of supported channels, all values are read only:

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ id: rme
label: RME label: RME
title: RME - Bindings title: RME - Bindings
type: binding type: binding
description: "This binding integrates the RME RainManager rain water pump and management system" description: "This binding is for the RME RainManager rain water pump and management system"
since: 2x since: 2x
install: auto install: auto
--- ---
@ -14,7 +14,7 @@ install: auto
# RME Binding # RME Binding
This binding integrates the RME RainManager rain water pump and management system This binding is for the RME RainManager rain water pump and management system
## Supported Things ## Supported Things
@ -22,21 +22,21 @@ Manager
## Thing Configuration ## Thing Configuration
The Thing configuration requires the name of the serial port that is used to connect the ESH host with the RME unit The Thing configuration requires the name of the serial port that is used to connect the host with the RME unit
## Channels ## Channels
All devices support some of the following channels: All devices support some of the following channels:
| Channel Type ID | Item Type | Description | | Channel Type ID | Item Type | Description | | |
|-----------------|------------------------|--------------|----------------- |------------- | |-----------------|-----------|---------------------------------------------------------------------------|---|---|
| waterlevel | Number | Indicates the % the cistern is filled with water | | waterlevel | Number | Indicates the % the cistern is filled with water | | |
| mode | String | Indicates the operation mode of the RME Rain Manager, Automatic or Manual | | mode | String | Indicates the operation mode of the RME Rain Manager, Automatic or Manual | | |
| source | String | Indicates water source used to supply water, e.g cistern or city | | source | String | Indicates water source used to supply water, e.g cistern or city | | |
| exitpump | Switch | Indicates whether the exit pump is switched on | | exitpump | Switch | Indicates whether the exit pump is switched on | | |
| entrypump | Switch | Indicates whether the entry pump is switched on | | entrypump | Switch | Indicates whether the entry pump is switched on | | |
## Full Example ## Example
.things .things

View File

@ -3,7 +3,7 @@ id: rotelra1x
label: Rotel Amplifier label: Rotel Amplifier
title: Rotel Amplifier - Bindings title: Rotel Amplifier - Bindings
type: binding type: binding
description: "Connects to a Rotel RA11 or RA12 integrated amplifier via a serial (RS232) interface. The Rotel amplifiers supported by this binding also include an integrated DAC unit. To use the binding, connect a serial cable between the amplifier and the computer running openHAB." description: "Connects to a Rotel RA11 or RA12 integrated amplifier via a serial (RS232) interface."
since: 2x since: 2x
install: auto install: auto
--- ---
@ -14,60 +14,61 @@ install: auto
# Rotel Amplifier Binding # Rotel Amplifier Binding
Connects to a Rotel RA11 or RA12 integrated amplifier via a serial (RS232) interface. The Rotel amplifiers supported by this binding also include an integrated DAC unit. To use the binding, connect a serial cable between the amplifier and the computer running openHAB. Connects to a Rotel RA11 or RA12 integrated amplifier via a serial (RS232) interface.
The Rotel amplifiers supported by this binding also include an integrated DAC unit.
To use the binding, connect a serial cable between the amplifier and the computer running openHAB.
## Overview ## Overview
This binding implements the serial protocol specified by Rotel in their documentation. The protocol allows one to control the amplifier, to query its state, and to receive live updates of changed values. For example, when turning the volume knob, the unit sends updates as different volumes are set. This binding implements the serial protocol specified by Rotel in their documentation.
The protocol allows one to control the amplifier, to query its state, and to receive live updates of changed values.
For example, when turning the volume knob, the unit sends updates as different volumes are set.
## Supported things ## Supported things
* Rotel Amplifier. Each thing represent an amplifier unit, connected * Rotel Amplifier. Each thing represent an amplifier unit, connected over an RS232 connection.
over a RS232 connection.
## Discovery ## Discovery
Auto-discovery is not supported -- things can be added manually. Auto-discovery is not supported; things can be added manually.
## Thing configuration ## Thing configuration
The thing has the following configuration parameter: The thing has the following configuration parameter:
| Parameter | Parameter name | Description | | Parameter | Parameter name | Description |
|----------------|-------------------------------------------------------------------------------------------------------------------| |----------------|--------------------------------------------------------------------------------------------------------------------|
| Serial port | port | Specifies the name of the serial port used to communicate with the device. (String) | | Serial port | port | Specifies the name of the serial port used to communicate with the device. (String) |
| Maximum volume | maximum-volume | This is the value to send to the amplifier when the volume channel is set to 100 % (1). (Integer)| | Maximum volume | maximum-volume | This is the value to send to the amplifier when the volume channel is set to 100 % (1). (Integer) |
(1) The RA11's max. volume is 96, but it is still supported to use 100 as the maximum volume, only the volume will not increase when going beyond 96 %. (1) The RA11's max. volume is 96, but it is still supported to use 100 as the maximum volume, only the volume will not increase when going beyond 96 %.
## Channel summary ## Channel summary
| Channel ID | Item Type | Description | | Channel ID | Item Type | Description |
|------------|-----------|--------------------------------------------------------------------------------------------------| |------------|-----------|-------------------------------------------------------------------------------------------------|
| power | Switch | Controls and reports the power state (soft on/off) | | power | Switch | Controls and reports the power state (soft on/off) |
| volume | Dimmer | Volume control. | | volume | Dimmer | Volume control |
| mute | Switch | Enable / disable mute. | | mute | Switch | Enable / disable mute |
| source | String | Selects from a list of input sources (see options). | | source | String | Selects from a list of input sources (see options) |
| frequency | Number | Reports the current sampling frequency if playing from a digital input. | | frequency | Number | Reports the current sampling frequency if playing from a digital input |
| brightness | Dimmer | Sets the backlight level of the display. Maps from percentage to 6 levels (can't be turned off). | | brightness | Dimmer | Sets the backlight level of the display. Maps from percentage to 6 levels (can't be turned off) |
All channels are updated in real time if modified by other means, e.g. by the remote control. All channels are updated in real time if modified by other means, e.g. by the remote control.
## Configuration example ## Configuration example
The following lines The following lines can be added to the configuration files in order to set up an amplifier at serial port `/dev/ttyS0`.
can be added to the configuration files in order to set up an amplifier at serial port `/dev/ttyS0`.
*demo.things demo.things
``` ```
Thing rotelra1x:amp:living_room_amp [ port="/dev/ttyS0" ] Thing rotelra1x:amp:living_room_amp [ port="/dev/ttyS0" ]
``` ```
*demo.items demo.items
``` ```
Switch Amp_Power "On/off" { channel="rotelra1x:amp:living_room_amp:power" } Switch Amp_Power "On/off" { channel="rotelra1x:amp:living_room_amp:power" }
@ -78,8 +79,7 @@ Number Amp_Frequency "Frequency" { channel="rotelra1x:amp:l
Dimmer Amp_Brightness "Display brightness" <light> { channel="rotelra1x:amp:living_room_amp:brightness" } Dimmer Amp_Brightness "Display brightness" <light> { channel="rotelra1x:amp:living_room_amp:brightness" }
``` ```
demo.sitemap:
*demo.sitemap:
``` ```
sitemap demo label="Main Menu" sitemap demo label="Main Menu"
@ -97,6 +97,4 @@ sitemap demo label="Main Menu"
## References ## References
Rotel serial protocol is available here: http://www.rotel.com/sites/default/files/product/rs232/RA12%20Protocol.pdf . Rotel serial protocol is available here: <http://www.rotel.com/sites/default/files/product/rs232/RA12%20Protocol.pdf>.

View File

@ -3,7 +3,7 @@ id: russound
label: Russound label: Russound
title: Russound - Bindings title: Russound - Bindings
type: binding type: binding
description: "This binding provides integration with any Russound system that support the RIO protocol (all MCA systems, all X systems). This binding provides compatibility with RIO Protocol v1.10. The protocol document can be found in the Russound Portal ('RIO Protocol for 3rd Party Integrators.pdf'). Please update to the latest firmware to provide full compatibility with this binding. This binding does provide full feedback from the Russound system if events occur outside of openHAB (such as keypad usage)." description: "This binding provides integration with any Russound system that support the RIO protocol (all MCA systems, all X systems)."
since: 2x since: 2x
logo: images/addons/russound.png logo: images/addons/russound.png
install: auto install: auto
@ -15,26 +15,39 @@ install: auto
# Russound Binding # Russound Binding
This binding provides integration with any Russound system that support the RIO protocol (all MCA systems, all X systems). This binding provides compatibility with RIO Protocol v1.10. The protocol document can be found in the Russound Portal ("RIO Protocol for 3rd Party Integrators.pdf"). Please update to the latest firmware to provide full compatibility with this binding. This binding does provide full feedback from the Russound system if events occur outside of openHAB (such as keypad usage). This binding provides integration with any Russound system that support the RIO protocol (all MCA systems, all X systems).
This binding provides compatibility with RIO Protocol v1.10.
The protocol document can be found in the Russound Portal ("RIO Protocol for 3rd Party Integrators.pdf").
Please update to the latest firmware to provide full compatibility with this binding.
This binding does provide full feedback from the Russound system if events occur outside of openHAB (such as keypad usage).
*Warning:* Russound becomes unstable if you have two IP based clients connected to the same system. Do NOT run multiple instances of this binding against the same system - this definitely causes unstability. Running this binding in addition to the MyRussound application seems to work fine however. *Warning:* Russound becomes unstable if you have two IP based clients connected to the same system.
Do NOT run multiple instances of this binding against the same system - this definitely causes instability.
Running this binding in addition to the MyRussound application seems to work fine, however.
*Warning:* Try to avoid having multiple media management functions open in different clients (keypads, My Russound app, HABPanel, etc). Although it seems to work a majority of the times, there have been instances where the sessions become confused. *Warning:* Try to avoid having multiple media management functions open in different clients (keypads, My Russound app, HABPanel, etc).
Although it seems to work a majority of the times, there have been instances where the sessions become confused.
## Supported Bridges/Things ## Supported Bridges/Things
* Bridge: Russound System (usually the main controller) * Bridge: Russound System (usually the main controller)
* Bridge: Russound Controller (1-6 controllers supported) * Bridge: Russound Controller (1-6 controllers supported)
* Thing: Russound Source (1-8 sources supported) * Thing: Russound Source (1-8 sources supported)
* Thing: Russound Zone (1-8 [depending on the controller] zones supported for each controller) * Thing: Russound Zone (1-8 &lsqb;depending on the controller&rsqb; zones supported for each controller)
## Device Discovery ## Device Discovery
The Russound binding does support devices discovery via the paperUI. When you start device discovery, the system will scan all network interfaces and **all IP Addresses in the subnet on each interface** looking for a Russound system device. If found, the device will be added to the inbox. Adding the device will then start a scan of the device to discover all the controllers, sources, and zones attached defined on the device. As these are found, they will be added to the inbox. The Russound binding does support devices discovery via the paperUI.
When you start device discovery, the system will scan all network interfaces and **all IP Addresses in the subnet on each interface** looking for a Russound system device.
If found, the device will be added to the inbox.
Adding the device will then start a scan of the device to discover all the controllers, sources, and zones attached defined on the device.
As these are found, they will be added to the inbox.
## HABPANEL or other UI ## HABPANEL or other UI
All media management functions are supported to allow building of a dynamic UI for the various streaming sources. All media management channels begin with "mm". An example HABPanel implementation can be found in the HABPanel forum. All media management functions are supported to allow building of a dynamic UI for the various streaming sources.
All media management channels begin with "mm".
An example HABPanel implementation can be found in the HABPanel forum.
## Thing Configuration ## Thing Configuration
@ -51,22 +64,21 @@ The following configurations occur for each of the bridges/things:
### Russound Source ### Russound Source
| Name | Type | Description | | Name | Type | Description |
|--------------|---------------|--------------------------------------------------------------------------| |--------|------|---------------------|
| source | int | The source # (1-12) | | source | int | The source # (1-12) |
### Russound Controller ### Russound Controller
| Name | Type | Description | | Name | Type | Description |
|--------------|---------------|--------------------------------------------------------------------------| |------------|------|--------------------------------|
| controller | int | The controller address # (1-6) | | controller | int | The controller address # (1-6) |
### Russound Zone ### Russound Zone
| Name | Type | Description | | Name | Type | Description |
|--------------|---------------|--------------------------------------------------------------------------| |------|------|------------------|
| zone | int | The zone # (1-6) | | zone | int | The zone # (1-6) |
## Channels ## Channels
@ -74,111 +86,114 @@ The following channels are supported for each bridge/thing
### Russound System ### Russound System
| Channel Type ID | Read/Write | Item Type | Description | | Channel Type ID | Read/Write | Item Type | Description |
|--------------------|------------|--------------|--------------------------------------------------------------------- | |-----------------|------------|-----------|--------------------------------------------------------------|
| lang | RW | String | System language (english, chinese and russian are supported) | | lang | RW | String | System language (english, chinese and russian are supported) |
| allon | RW | Switch | Turn on/off all zones | | allon | RW | Switch | Turn on/off all zones |
| controller | R | String | JSON representation of all controllers in the system | | controller | R | String | JSON representation of all controllers in the system |
| sources | R | String | JSON representation of all sources in the system | | sources | R | String | JSON representation of all sources in the system |
#### Notes #### Notes
1. The JSON will look like: `[{"id":1, "name":"XXX"},...]`. The controller channel will contain up to 6 controllers and the sources will contain up to 8 sources (depending on how the system is configured). - The JSON will look like: `[{"id":1, "name":"XXX"},...]`.
The controller channel will contain up to 6 controllers and the sources will contain up to 8 sources (depending on how the system is configured).
### Russound Source (please see source cross-reference below for what is supported by which sources) ### Russound Source (please see source cross-reference below for what is supported by which sources)
| Channel Type ID | Read/Write | Item Type | Description | | Channel Type ID | Read/Write | Item Type | Description |
|----------------------|------------|--------------|--------------------------------------------------------------------- | |----------------------|------------|-----------|--------------------------------------------------------------------|
| name | R | String | The name of the source | | name | R | String | The name of the source |
| type | R | String | The type of source | | type | R | String | The type of source |
| channel | R | String | The currently playing channel (usually tuner frequency) | | channel | R | String | The currently playing channel (usually tuner frequency) |
| channelname | R | String | The currently playing channel name | | channelname | R | String | The currently playing channel name |
| composername | R | String | The currently playing composer name | | composername | R | String | The currently playing composer name |
| genre | R | String | The currently playing genre | | genre | R | String | The currently playing genre |
| artistname | R | String | The currently playing artist name | | artistname | R | String | The currently playing artist name |
| albumname | R | String | The currently playing album name | | albumname | R | String | The currently playing album name |
| coverarturl | R | String | The currently playing URL to the cover art | | coverarturl | R | String | The currently playing URL to the cover art |
| playlistname | R | String | The currently playing play list name | | playlistname | R | String | The currently playing play list name |
| songname | R | String | The currently playing song name | | songname | R | String | The currently playing song name |
| rating | R | String | The rating for the currently played song (can be changed via zone) | | rating | R | String | The rating for the currently played song (can be changed via zone) |
| mode | R | String | The provider mode or streaming service | | mode | R | String | The provider mode or streaming service |
| shufflemode | R | String | The current shuffle mode | | shufflemode | R | String | The current shuffle mode |
| repeatmode | R | String | The current repeat mode | | repeatmode | R | String | The current repeat mode |
| programservicename | R | String | The program service name (PSN) | | programservicename | R | String | The program service name (PSN) |
| radiotext | R | String | The radio text | | radiotext | R | String | The radio text |
| radiotext2 | R | String | The radio text (line 2) | | radiotext2 | R | String | The radio text (line 2) |
| radiotext3 | R | String | The radio text (line 3) | | radiotext3 | R | String | The radio text (line 3) |
| radiotext4 | R | String | The radio text (line 4) | | radiotext4 | R | String | The radio text (line 4) |
| volume | R | String | The source's volume level (undocumented) | | volume | R | String | The source's volume level (undocumented) |
| banks | RW | String | JSON representation of all banks in the system | | banks | RW | String | JSON representation of all banks in the system |
| mmscreen | R | String | The media management screen id | | mmscreen | R | String | The media management screen id |
| mmtitle | R | String | The media management screen title | | mmtitle | R | String | The media management screen title |
| mmmenu | R | String | The media management screen menu json | | mmmenu | R | String | The media management screen menu json |
| mmattr | R | String | The media management attribute | | mmattr | R | String | The media management attribute |
| mmmenubuttonoktext | R | String | The media management OK button text | | mmmenubuttonoktext | R | String | The media management OK button text |
| mmmenubuttonbacktext | R | String | The media management Cancel button text | | mmmenubuttonbacktext | R | String | The media management Cancel button text |
| mminfotext | R | String | The media management information text | | mminfotext | R | String | The media management information text |
| mmhelptext | R | String | The media management help text | | mmhelptext | R | String | The media management help text |
| mmtextfield | R | String | The media management text field | | mmtextfield | R | String | The media management text field |
#### Notes #### Notes
1. Banks are only supported tuner sources and the JSON array will have exactly 6 banks in it (with IDs from 1 to 6). For non-tuner sources, an empty JSON array (`[]`) will be returned. For tuner sources, the JSON will look like: `[{"id":1, "name":"XXX"},...]`. A bank's name can be updated by sending the representation back to the channel. Example: `[{"id":1,"name":"FM1"},{"id":3,"name":"FM3"}]` will set the name of bank #1 to "FM1 and bank#3 to "FM3" (leaving all other bank names the same). After an update, the banks channel will be refreshed with the full JSON representation of all banks. If the name has not been changed in the refreshed value, the russound rejected the name change for some reason (generally too long of a name or a duplicate name). 1. Banks are only supported tuner sources and the JSON array will have exactly 6 banks in it (with IDs from 1 to 6). For non-tuner sources, an empty JSON array (`[]`) will be returned. For tuner sources, the JSON will look like: `[{"id":1, "name":"XXX"},...]`. A bank's name can be updated by sending the representation back to the channel. Example: `[{"id":1,"name":"FM1"},{"id":3,"name":"FM3"}]` will set the name of bank #1 to "FM1 and bank#3 to "FM3" (leaving all other bank names the same). After an update, the banks channel will be refreshed with the full JSON representation of all banks. If the name has not been changed in the refreshed value, the russound rejected the name change for some reason (generally too long of a name or a duplicate name).
2. All media management channels are ONLY valid on streaming sources (not tuners). All channels will return a JSON representation like `{"id":xxx, "value":"yyy"}` where 'xxx' will be a sequential identifier of the message and 'yyy' will be the payload. The payload will be a simple string in all cases. However, the mmmenu string will be a raw JSON string representing the menu structure. Please review the media management section in the RIO protocol document from russound for the specifications. 2. All media management channels are ONLY valid on streaming sources (not tuners). All channels will return a JSON representation like `{"id":xxx, "value":"yyy"}` where 'xxx' will be a sequential identifier of the message and 'yyy' will be the payload. The payload will be a simple string in all cases. However, the mmmenu string will be a raw JSON string representing the menu structure. Please review the media management section in the RIO protocol document from russound for the specifications.
### Russound Controller ### Russound Controller
| Channel Type ID | Read/Write | Item Type | Description | | Channel Type ID | Read/Write | Item Type | Description |
|-----------------|------------|--------------|--------------------------------------------------------------------- | |-----------------|------------|-----------|--------------------------------------------------------|
| zones | R | String | The JSON representation of all zones in the controller | | zones | R | String | The JSON representation of all zones in the controller |
#### Notes #### Notes
* The JSON will look like: `[{"id":1, "name":"XXX"},...]` * The JSON will look like: `[{"id":1, "name":"XXX"},...]`
### Russound Zone ### Russound Zone
| Channel Type ID | Read/Write | Item Type | Description | | Channel Type ID | Read/Write | Item Type | Description |
|--------------------|------------|--------------|--------------------------------------------------------------------- | |--------------------|------------|------------|-------------------------------------------------------------------------------------------|
| name | R | String | The name of the zone (changed by SCS-C5 software) | | name | R | String | The name of the zone (changed by SCS-C5 software) |
| source | RW | Number | The (physical) number for the current source | | source | RW | Number | The (physical) number for the current source |
| bass | RW | Number | The bass setting (-10 to 10) | | bass | RW | Number | The bass setting (-10 to 10) |
| treble | RW | Number | The treble setting (-10 to 10) | | treble | RW | Number | The treble setting (-10 to 10) |
| balance | RW | Number | The balance setting (-10 [full left] to 10 [full right]) | | balance | RW | Number | The balance setting (-10 &lsqb;full left&rsqb; to 10 &lsqb;full right&rsqb;) |
| loudness | RW | Switch | Set's the loudness on/off | | loudness | RW | Switch | Set's the loudness on/off |
| turnonvolume | RW | Dimmer | The initial volume when turned on (0 to 100) | | turnonvolume | RW | Dimmer | The initial volume when turned on (0 to 100) |
| donotdisturb | RW | String | The do not disturb setting (on/off/slave) | | donotdisturb | RW | String | The do not disturb setting (on/off/slave) |
| partymode | RW | String | The party mode (on/off/master) | | partymode | RW | String | The party mode (on/off/master) |
| status | RW | Switch | Whether the zone is on or off | | status | RW | Switch | Whether the zone is on or off |
| volume | RW | Dimmer | The current volume of the zone (0 to 100) | | volume | RW | Dimmer | The current volume of the zone (0 to 100) |
| mute | RW | Switch | Whether the zone is muted or not | | mute | RW | Switch | Whether the zone is muted or not |
| page | R | Switch | Whether the zone is in paging mode or not | | page | R | Switch | Whether the zone is in paging mode or not |
| sharedsource | R | Switch | Whether the zone's source is being shared or not | | sharedsource | R | Switch | Whether the zone's source is being shared or not |
| sleeptimeremaining | RW | Number | Sleep time, in minutes, remaining (0 to 60 in 5 step increments) | | sleeptimeremaining | RW | Number | Sleep time, in minutes, remaining (0 to 60 in 5 step increments) |
| lasterror | R | String | The last error that occurred in the zone | | lasterror | R | String | The last error that occurred in the zone |
| enabled | R | Switch | Whether the zone is enabled or not | | enabled | R | Switch | Whether the zone is enabled or not |
| repeat | W | Switch | Toggle the repeat mode for the current source | | repeat | W | Switch | Toggle the repeat mode for the current source |
| shuffle | W | Switch | Toggle the shuffle mode for the current source | | shuffle | W | Switch | Toggle the shuffle mode for the current source |
| rating | W | Switch | Signal a like (ON) or dislike (OFF) to the current source | | rating | W | Switch | Signal a like (ON) or dislike (OFF) to the current source |
| keypress | W | String | (Advanced) Send a keypress from the zone | | keypress | W | String | (Advanced) Send a keypress from the zone |
| keyrelease | W | String | (Advanced) Send a keyrelease from the zone | | keyrelease | W | String | (Advanced) Send a keyrelease from the zone |
| keyhold | W | String | (Advanced) Send a keyhold from the zone | | keyhold | W | String | (Advanced) Send a keyhold from the zone |
| keycode | W | String | (Advanced) Send a keycode from the zone | | keycode | W | String | (Advanced) Send a keycode from the zone |
| event | W | String | (Advanced) Send an event from the zone | | event | W | String | (Advanced) Send an event from the zone |
| systemfavorites | RW | String* | The JSON representation for system favorites | | systemfavorites | RW | String* | The JSON representation for system favorites |
| zonefavorites | RW | String** | The JSON representation for zone favorites | | zonefavorites | RW | String** | The JSON representation for zone favorites |
| presets | RW | String*** | The JSON representation for zone presets | | presets | RW | String*** | The JSON representation for zone presets |
| mminit | W | Switch**** | Whether to initial a media management session (ON) or close an existing one (OFF) | | mminit | W | Switch**** | Whether to initial a media management session (ON) or close an existing one (OFF) |
| mmcontextmenu | W | Switch**** | Whether to initial a media management context session (ON) or close an existing one (OFF) | | mmcontextmenu | W | Switch**** | Whether to initial a media management context session (ON) or close an existing one (OFF) |
#### Notes: #### Notes:
1. As of the time of this document, rating ON (like) produced an error in the firmware from the related command. This has been reported to Russound. 1. As of the time of this document, rating ON (like) produced an error in the firmware from the related command. This has been reported to Russound.
2. keypress/keyrelease/keyhold/keycode/event are advanced commands that will pass the related event string to Russound (i.e. "EVENT C[x].Z[y]!KeyPress [stringtype]"). Please see the "RIO Protocol for 3rd Party Integrators.pdf" (found at the Russound Portal) for proper string forms. 2. keypress/keyrelease/keyhold/keycode/event are advanced commands that will pass the related event string to Russound (i.e. `EVENT C[x].Z[y]!KeyPress [stringtype]`). Please see the "RIO Protocol for 3rd Party Integrators.pdf" (found at the Russound Portal) for proper string forms.
3. If you send a OnOffType to the volume will have the same affect as turning the zone on/off (ie sending OnOffType to "status") 3. If you send a OnOffType to the volume will have the same affect as turning the zone on/off (ie sending OnOffType to "status")
4. The volume PercentType will be scaled to Russound's volume of 0-50 (ie 50% = volume of 25, 100% = volume of 50) 4. The volume PercentType will be scaled to Russound's volume of 0-50 (ie 50% = volume of 25, 100% = volume of 50)
5. Initialize a media management session by sending ON to the channel. The related source thing will then start sending out media management information in the MM channels. To close the session - simply send OFF to the channel. Sending OFF to the channel when a session has not been initialized does nothing. Likewise if the related source is a tuner, this command does nothing. 5. Initialize a media management session by sending ON to the channel. The related source thing will then start sending out media management information in the MM channels. To close the session - simply send OFF to the channel. Sending OFF to the channel when a session has not been initialized does nothing. Likewise if the related source is a tuner, this command does nothing.
##### System Favorites ##### System Favorites
@ -186,9 +201,9 @@ The JSON will look like `[{"id":xxx,"valid":true,"name":"yyyy"},...]` and will h
There are three different ways to use this channel: There are three different ways to use this channel:
1. Save a system favorite. Send a representation with "valid" set to true. Example: to set system favorite 3 to what is playing in the zone: `[{"id":3,"valid":true,"name":"80s Rock"}]`. If system favorite 3 was invalid, this would save what is currently playing and make it valid. If system favorite 3 was already valid, this would overlay the favorite with what is currently playing and change it's name. 1. Save a system favorite. Send a representation with "valid" set to true. Example: to set system favorite 3 to what is playing in the zone: `[{"id":3,"valid":true,"name":"80s Rock"}]`. If system favorite 3 was invalid, this would save what is currently playing and make it valid. If system favorite 3 was already valid, this would overlay the favorite with what is currently playing and change it's name.
2. Update the name of a system favorite. Send a representation of an existing ID with "valid" set to true and the new name. Example: we could update system favorite 3 (after the above statement) by sending: `[{"id":3,"valid":true,"name":"80s Rock Even More"}]`. Note this will ONLY change the name (this will NOT save what is currently playing to the system favorite). 2. Update the name of a system favorite. Send a representation of an existing ID with "valid" set to true and the new name. Example: we could update system favorite 3 (after the above statement) by sending: `[{"id":3,"valid":true,"name":"80s Rock Even More"}]`. Note this will ONLY change the name (this will NOT save what is currently playing to the system favorite).
3. Delete a system favorite. Send a representation with "valid" as false. Example: deleting system favorite 3 (after the above statements) by sending: `[{"id":3","valid":false"}]` 3. Delete a system favorite. Send a representation with "valid" as false. Example: deleting system favorite 3 (after the above statements) by sending: `[{"id":3","valid":false"}]`
The channel will be refreshed with the new representation after processing. If the refreshed representation doesn't include the changes, the russound system rejected them for some reason (generally length of the name). The channel will be refreshed with the new representation after processing. If the refreshed representation doesn't include the changes, the russound system rejected them for some reason (generally length of the name).
@ -198,8 +213,8 @@ The JSON will look like `[{"id":xxx,"valid":true,"name":"yyyy"},...]` and will h
There are two different ways to use this channel: There are two different ways to use this channel:
1. Save a zone favorite. Send a representation with "valid" set to true. Example: to set zone favorite 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"80s Rock"}]`. 1. Save a zone favorite. Send a representation with "valid" set to true. Example: to set zone favorite 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"80s Rock"}]`.
2. Delete a zone favorite. Send a representation with "valid" as false. Example: deleting zone favorite 2 (after the above statement) by sending: `[{"id":2","valid":false"}] ` 2. Delete a zone favorite. Send a representation with "valid" as false. Example: deleting zone favorite 2 (after the above statement) by sending: `[{"id":2","valid":false"}] `
There is no ability to change JUST the name. Sending a new name will save the new name AND set the favorite to what is currently playing. There is no ability to change JUST the name. Sending a new name will save the new name AND set the favorite to what is currently playing.
@ -211,9 +226,9 @@ The JSON will look like `[{"id":xxx,"valid":true,"name":"yyyy", "bank": xxx, "ba
There are two different ways to use this channel: There are two different ways to use this channel:
1. Save a preset. Send a representation to an ID that is invalid with "valid" set to true. Example: to set a zone pret 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"103.7 FM"}]`. 1. Save a preset. Send a representation to an ID that is invalid with "valid" set to true. Example: to set a zone pret 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"103.7 FM"}]`.
2. Save a preset with default name. Send a representation to an ID that is invalid with "valid" set to true. Example: to set a zone pret 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"103.7 FM"}]`. 2. Save a preset with default name. Send a representation to an ID that is invalid with "valid" set to true. Example: to set a zone pret 2 to what is playing in the zone: `[{"id":2,"valid":true,"name":"103.7 FM"}]`.
2. Delete a zone favorite. Send a representation with "valid" as false. Example: deleting zone favorite 2 (after the above statement) by sending: `[{"id":2","valid":false"}]` 3. Delete a zone favorite. Send a representation with "valid" as false. Example: deleting zone favorite 2 (after the above statement) by sending: `[{"id":2","valid":false"}]`
There is no ability to change JUST the name. Sending a new name will save the new name AND set the favorite to what is currently playing. There is no ability to change JUST the name. Sending a new name will save the new name AND set the favorite to what is currently playing.
@ -224,42 +239,42 @@ The channel will be refreshed with the new representation after processing. If
| Channel Type ID | Sirius | XM | SMS3 | DMS 3.1 Media | DMS 3.1 AM/FM | iBridge | Internal AM/FM | Arcam T32 | Others | | Channel Type ID | Sirius | XM | SMS3 | DMS 3.1 Media | DMS 3.1 AM/FM | iBridge | Internal AM/FM | Arcam T32 | Others |
|--------------------|--------|----|------|---------------|---------------|---------|----------------|-----------|--------| |--------------------|--------|----|------|---------------|---------------|---------|----------------|-----------|--------|
| name | X | X | X | X | X | X | X | X | X | | name | X | X | X | X | X | X | X | X | X |
| type | X | X | X | X | X | X | X | X | X | | type | X | X | X | X | X | X | X | X | X |
| ipaddress | | | X | X | X | | | | | | ipaddress | | | X | X | X | | | | |
| composername | X | | | | | | | | | | composername | X | | | | | | | | |
| channel | | | | | X | | X | | | | channel | | | | | X | | X | | |
| channelname | X | X | | X | | | | X | | | channelname | X | X | | X | | | | X | |
| genre | X | X | | | | | | X | | | genre | X | X | | | | | | X | |
| artistname | X | X | X | X | | X | | | | | artistname | X | X | X | X | | X | | | |
| albumname | | | X | X | | X | | | | | albumname | | | X | X | | X | | | |
| coverarturl | 1 | | | X | | | | | | | coverarturl | 1 | | | X | | | | | |
| playlistname | | | X | X | | X | | | | | playlistname | | | X | X | | X | | | |
| songname | X | X | X | X | | X | | | | | songname | X | X | X | X | | X | | | |
| mode | | | | X | | | | | | | mode | | | | X | | | | | |
| shufflemode | | | | X | | X | | | | | shufflemode | | | | X | | X | | | |
| repeatmode | | | | X | | | | | | | repeatmode | | | | X | | | | | |
| rating | | | | X | | | | | | | rating | | | | X | | | | | |
| programservicename | | | | | X | | X | | | | programservicename | | | | | X | | X | | |
| radiotext | | | | | X | | X | X | | | radiotext | | | | | X | | X | X | |
| radiotext2 | | | | | | | | X | | | radiotext2 | | | | | | | | X | |
| radiotext3 | | | | | | | | X | | | radiotext3 | | | | | | | | X | |
| radiotext4 | | | | | | | | X | | | radiotext4 | | | | | | | | X | |
1. Sirius Internal Radio Only 1. Sirius Internal Radio Only
## Full Example ## Example
The following is an example of The following is an example of
1. Main controller (#1) at ipaddress 192.168.1.24 1. Main controller (#1) at ipaddress 192.168.1.24
2. One Sources connected to it (#1 is the internal AM/FM) 2. One Sources connected to it (#1 is the internal AM/FM)
3. Four zones on the controller (1-4 in various rooms) 3. Four zones on the controller (1-4 in various rooms)
.things .things
``` ```
russound:rio:home [ ipAddress="192.168.1.24", ping=30, retryPolling=10 ] russound:rio:home [ ipAddress="192.168.1.24", ping=30, retryPolling=10 ]
russound:controller:1 (russound:rio:home) [ controller=1 ] russound:controller:1 (russound:rio:home) [ controller=1 ]
russound:source:1 (russound:rio:home) [ source=1 ] russound:source:1 (russound:rio:home) [ source=1 ]
russound:zone:1 (russound:controller:1) [ zone=1 ] russound:zone:1 (russound:controller:1) [ zone=1 ]
russound:zone:2 (russound:controller:1) [ zone=2 ] russound:zone:2 (russound:controller:1) [ zone=2 ]
@ -315,8 +330,6 @@ String Rio_Src_RadioText "Radio Text [%s]" { channel="russound:source:1:radiotex
String Rio_Src_RadioText2 "Radio Text #2 [%s]" { channel="russound:source:1:radiotext2" } String Rio_Src_RadioText2 "Radio Text #2 [%s]" { channel="russound:source:1:radiotext2" }
String Rio_Src_RadioText3 "Radio Text #3 [%s]" { channel="russound:source:1:radiotext3" } String Rio_Src_RadioText3 "Radio Text #3 [%s]" { channel="russound:source:1:radiotext3" }
String Rio_Src_RadioText4 "Radio Text #4 [%s]" { channel="russound:source:1:radiotext4" } String Rio_Src_RadioText4 "Radio Text #4 [%s]" { channel="russound:source:1:radiotext4" }
``` ```
.sitemap .sitemap
@ -329,7 +342,7 @@ Frame label="Russound" {
} }
Text label="Controller 1" { Text label="Controller 1" {
Text label="Zone 1" { Text label="Zone 1" {
Text item=Rio_Zone_Name Text item=Rio_Zone_Name
Switch item=Rio_Zone_Status Switch item=Rio_Zone_Status
@ -338,7 +351,7 @@ Frame label="Russound" {
Setpoint item=Rio_Zone_Treble Setpoint item=Rio_Zone_Treble
Setpoint item=Rio_Zone_Balance Setpoint item=Rio_Zone_Balance
Switch item=Rio_Zone_Loudness Switch item=Rio_Zone_Loudness
Setpoint item=Rio_Zone_TurnOnVolume Setpoint item=Rio_Zone_TurnOnVolume
Selection item=Rio_Zone_DoNotDisturb mappings=[ON="On", OFF="Off", SLAVE="Slave"] Selection item=Rio_Zone_DoNotDisturb mappings=[ON="On", OFF="Off", SLAVE="Slave"]
Selection item=Rio_Zone_PartyMode mappings=[ON="On", OFF="Off", MASTER="Master"] Selection item=Rio_Zone_PartyMode mappings=[ON="On", OFF="Off", MASTER="Master"]
Slider item=Rio_Zone_Volume Slider item=Rio_Zone_Volume
@ -379,5 +392,3 @@ Frame label="Russound" {
} }
} }
``` ```

View File

@ -13,91 +13,91 @@ install: auto
{% include base.html %} {% include base.html %}
# Serial Binding # Serial Binding
The Serial binding allows openHAB to communicate in ASCII over serial ports attached to the openHAB server. The Serial binding allows openHAB to communicate in ASCII over serial ports attached to the openHAB server.
| Item Type | Function | | Item Type | Function |
|-----------|----------| |-----------|----------|
| Switch | the item will update its state to `ON` or `OFF` whenever data becomes available on the serial interface (or simply by short-cutting pins 2 and 7 on the RS-232 interface) | | Switch | the item will update its state to `ON` or `OFF` whenever data becomes available on the serial interface (or simply by short-cutting pins 2 and 7 on the RS-232 interface) |
| String | the item will update its state to a string that is the data received from the serial interface. Sending a command to the String item will be sent out as data through the serial interface. | | String | the item will update its state to a string that is the data received from the serial interface. Sending a command to the String item will be sent out as data through the serial interface. |
| Number | the item will receive the RegEx result and attempt to convert the string to a number. | | Number | the item will receive the RegEx result and attempt to convert the string to a number. |
## Port Configuration Notes ## Port Configuration Notes
In most cases you will not need to perform special steps to access your serial ports, but these notes might be helpful. In most cases it will not be needed to perform special steps to access serial ports, but these notes might be helpful.
### Linux Users ### Linux Users
* If you are using **non standard serial ports** you have to adapt start.sh to have the serial port included. The `java` command line should then include the following parameters: * When using **non standard serial ports**, adapt start.sh to have the serial port included. The `java` command line should then include the following parameters:
``` ```
-Dgnu.io.rxtx.SerialPorts=/dev/ttyAMA0 -Dgnu.io.rxtx.SerialPorts=/dev/ttyAMA0
``` ```
where `/dev/ttyAMA0` is the path to your serial port. Please be aware to change all scripts you might use for startup (debug, automatic start in Linux, etc.). where `/dev/ttyAMA0` is the path to the serial port. Remember to change all scripts used for startup (debug, automatic start in Linux, etc.).
* Your Linux distro might require that you add the `openhab` user to the `dialout` group to grant permission to read/write to the serial port. * A Linux distro might require adding the `openhab` user to the `dialout` group to grant permission to read/write to the serial port.
``` ```
sudo usermod -a -G dialout openhab sudo usermod -a -G dialout openhab
``` ```
The user will need to logout from all login instances and log back in to see their new group added. If you add your user to this group and still cannot get permission, rebooting the box to ensure the new group permission is attached to your user is suggested. The user will need to logout from all login instances and log back in to see their new group added. If the user added to this group still cannot get permission, rebooting the box to ensure the new group permission is attached to the user is suggested.
* If you use more than one USB serial converter like FTDI or CP2102, it may happen that your /dev/ttyUSB0 device is named /dev/ttyUSB1 after a reboot. To prevent this problem you can assign alias names for your serial devices by adding them to `/etc/udev/rules.d/99-com.rules`. * When using more than one USB serial converter like FTDI or CP2102, it may happen that the /dev/ttyUSB0 device is named /dev/ttyUSB1 after a reboot. To prevent this problem, alias names can be assigned to serial devices by adding them to `/etc/udev/rules.d/99-com.rules`.
example: example:
``` ```
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AE01F0PD", SYMLINK+="ttyMySensors" SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AE01F0PD", SYMLINK+="ttyMySensors"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", SYMLINK+="ttyCulStick" SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", SYMLINK+="ttyCulStick"
``` ```
### Mac Users ### Mac Users
If you are working with a Mac, you might need to install a driver for your USB-RS232 converter (e.g. [osx-pl2303](http://osx-pl2303.sourceforge.net/) or [pl2303](http://mac.softpedia.com/get/Drivers/PL2303-OS-X-driver.shtml)) and create the /var/lock folder, see the [rxtx troubleshooting guide](http://rxtx.qbang.org/wiki/index.php/Trouble_shooting#Mac_OS_X_users). When working with a Mac, it may be necessary to install a driver for the USB-RS232 converter (e.g. [osx-pl2303](http://osx-pl2303.sourceforge.net/) or [pl2303](http://mac.softpedia.com/get/Drivers/PL2303-OS-X-driver.shtml)) and create the /var/lock folder; see the [rxtx troubleshooting guide](http://rxtx.qbang.org/wiki/index.php/Trouble_shooting#Mac_OS_X_users).
## Binding Configuration ## Binding Configuration
This binding does not have a configuration. This binding does not have a configuration.
## Item Configuration ## Item Configuration
The format has the following variations: The format has the following variations:
``` ```
serial="<port>@<baudrate>" serial="<port>@<baudrate>"
serial="<port>@<baudrate>,REGEX(<regular expression>)" serial="<port>@<baudrate>,REGEX(<regular expression>)"
serial="<port>@<baudrate>,BASE64 serial="<port>@<baudrate>,BASE64
serial="<port>@<baudrate>,ON(<On string>),OFF(<Off string>)" serial="<port>@<baudrate>,ON(<On string>),OFF(<Off string>)"
serial="<port>@<baudrate>,REGEX(<regular expression>), UP(<Up string>),DOWN(<Down string>), STOP(<Stop string>)" serial="<port>@<baudrate>,REGEX(<regular expression>), UP(<Up string>),DOWN(<Down string>), STOP(<Stop string>)"
``` ```
where: where:
* `<port>` is the identification of the serial port on the host system, e.g. `COM1` on Windows, `/dev/ttyS0` on Linux or `/dev/tty.PL2303-0000103D` on Mac. The same `<port>` can be bound to multiple items. * `<port>` is the identification of the serial port on the host system, e.g. `COM1` on Windows, `/dev/ttyS0` on Linux or `/dev/tty.PL2303-0000103D` on Mac. The same `<port>` can be bound to multiple items.
* `<baudrate>` is the baud rate of the port. Backward compatibility is given; if no baud rate is specified the serial binding defaults to 9600 baud. * `<baudrate>` is the baud rate of the port. If no baud rate is specified, the binding defaults to 9600 baud.
* `REGEX(<regular expression>)` allows parsing for special strings or numbers in the serial stream. You can use a capture group (e.g. REGEX(Position:([0-9.]*)) to capture 12 in "Position:12" or substitution (e.g. REGEX(s/Position:100/ON/) or REGEX(s/Position:100/ON/g)) to replace (FIRST or ALL) "Position:100" strings in response with "ON". This is based on the [RegEx Service](https://github.com/openhab/openhab1-addons/wiki/Transformations#regex-transformation-service) and [ESH RegExTransformationService](https://github.com/eclipse/smarthome/tree/master/extensions/transform/org.eclipse.smarthome.transform.regex). This is optional. * `REGEX(<regular expression>)` allows parsing for special strings or numbers in the serial stream. A capture group (e.g. REGEX(Position:([0-9.]*)) can be used to capture "12" in `Position:12` or substitution (e.g. REGEX(s/Position:100/ON/) or REGEX(s/Position:100/ON/g)) to replace (FIRST or ALL) "Position:100" strings in response with "ON". This is based on the [RegEx Service](https://github.com/openhab/openhab1-addons/wiki/Transformations#regex-transformation-service) and [ESH RegExTransformationService](https://github.com/eclipse/smarthome/tree/master/extensions/transform/org.eclipse.smarthome.transform.regex). This is optional.
* `BASE64` enables the Base64 mode. With this mode all data received on the serial port is saved in Base64 format. In this mode also all data that is sent to the serial port has to be Base64 encoded. (This was implemented because some serial devices are using bytes that are not supported by the REST interface). * `BASE64` enables the Base64 mode. With this mode all data received on the serial port is saved in Base64 format. All data that is sent to the serial port also has to be Base64 encoded. (This was implemented because some serial devices are using bytes that are not supported by the REST interface).
* `ON(<On string>),OFF(<Off string>)` if used in conjunction with a Switch this mapping will send specific commands to serial port and also match a serial command to specific ON/OFF state. This way you don't have to use a rule to send a command to serial * `ON(<On string>),OFF(<Off string>)` used in conjunction with a Switch, this mapping will send specific commands to serial port and also match a serial command to specific ON/OFF state. This makes it unnecessary to use a rule to send a command to serial.
* `UP(<Up string>),DOWN(<Down string>),STOP(<Stop string>)` if used in conjunction with a Rollershutter this mapping will send specific commands to serial port. Use REGEX to parse Rollershutter postion (0-100%) comming as feedback over serial link * `UP(<Up string>),DOWN(<Down string>),STOP(<Stop string>)` used in conjunction with a Rollershutter, this mapping will send specific commands to serial port. Use REGEX to parse Rollershutter postion (0-100%) coming as feedback over serial link.
Base64 can be decoded in the rules by importing `javax.xml.bind.DatatypeConverter` and then decoding the value like this: Base64 can be decoded in the rules by importing `javax.xml.bind.DatatypeConverter` and then decoding the value like this:
``` ```
DatatypeConverter::parseBase64Binary(ITEM.state.toString) DatatypeConverter::parseBase64Binary(ITEM.state.toString)
``` ```
For encoding use the `printBase64Binary` method of the `DatatypeConverter`. This is optional. For encoding, use the `printBase64Binary` method of the `DatatypeConverter`. This is optional.
As a result, your lines in the items file might look like these: As a result, lines in the items file might look like these:
``` ```
Switch HardwareButton "Bell" (Entrance) { serial="/dev/ttyS0" } Switch HardwareButton "Bell" (Entrance) { serial="/dev/ttyS0" }
String AVR "Surround System" (Multimedia) { serial="/dev/ttyS1@115200" } String AVR "Surround System" (Multimedia) { serial="/dev/ttyS1@115200" }
Number Temperature "My Temp. Sensor" (Weather) { serial="/dev/ttyS1@115200,REGEX(ID:2.*,T:([0-9.]*))" } Number Temperature "My Temp. Sensor" (Weather) { serial="/dev/ttyS1@115200,REGEX(ID:2.*,T:([0-9.]*))" }
Switch SerialRelay "Relay Q1" (Entrance) { serial="/dev/ttyS0,ON(Q1_ON\n),OFF(Q1_OFF\n)" } Switch SerialRelay "Relay Q1" (Entrance) { serial="/dev/ttyS0,ON(Q1_ON\n),OFF(Q1_OFF\n)" }
Rollershutter SerialRollo "Entrance Rollo" (Entrance) { serial="/dev/ttyS0,REGEX(Position:([0-9.]*)),UP(Rollo_UP\n),DOWN(Rollo_Down\n),STOP(Rollo_Stop\n)" } Rollershutter SerialRollo "Entrance Rollo" (Entrance) { serial="/dev/ttyS0,REGEX(Position:([0-9.]*)),UP(Rollo_UP\n),DOWN(Rollo_Down\n),STOP(Rollo_Stop\n)" }
Switch RoloAt100 "Rolo at 100" (Entrance) { serial="/dev/ttyS0,REGEX(s/Position:100/ON/)" } Switch RoloAt100 "Rolo at 100" (Entrance) { serial="/dev/ttyS0,REGEX(s/Position:100/ON/)" }
``` ```

View File

@ -50,8 +50,13 @@ The binding requires no special configuration
The Squeeze Server bridge requires the ip address, web port, and cli port to access it on. The Squeeze Server bridge requires the ip address, web port, and cli port to access it on.
If Squeeze Server authentication is enabled, the userId and password also are required. If Squeeze Server authentication is enabled, the userId and password also are required.
Squeeze Players are identified by their MAC address.
In the thing file, this looks e.g. like Squeeze Players are identified by their MAC address, which is required.
In addition, the notification timeout can be specified.
If omitted, the default timeout value will be used.
A notification volume can be optionally specified, which, if provided, will override the player's current volume level when playing notifications.
Here are some examples of how to define the Squeeze Server and Player things in a things file.
``` ```
Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=9000, cliport=9090 ] Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=9000, cliport=9090 ]
@ -60,7 +65,7 @@ Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=
} }
``` ```
Or, if Squeeze Server authentication is enabled: If Squeeze Server authentication is enabled, the user ID and password can be specified for the Squeeze Server:
``` ```
Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=9000, cliport=9090, userId="yourid", password="yourpassword" ] Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=9000, cliport=9090, userId="yourid", password="yourpassword" ]
@ -69,6 +74,15 @@ Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=
} }
``` ```
The notification timeout and/or notification volume can be specified for the Squeeze Player:
```
Bridge squeezebox:squeezeboxserver:myServer [ ipAddress="192.168.1.10", webport=9000, cliport=9090 ]
{
Thing squeezeboxplayer myplayer[ mac="00:f1:bb:00:00:f1", notificationTimeout=30, notificationVolume=35 ]
}
```
## Server Channels ## Server Channels
The Squeezebox server supports the following channel: The Squeezebox server supports the following channel:
@ -103,7 +117,6 @@ All devices support some of the following channels:
| coverartdata | Image | Image data of cover art of the current song | | coverartdata | Image | Image data of cover art of the current song |
| ircode | String | Received IR code | | ircode | String | Received IR code |
| numberPlaylistTracks | Number | Number of playlist tracks | | numberPlaylistTracks | Number | Number of playlist tracks |
| notificationSoundVolume | Dimmer | Volume for playing notifications |
| playFavorite | String | ID of Favorite to play (channel's state options contains available favorites) | | playFavorite | String | ID of Favorite to play (channel's state options contains available favorites) |
## Playing Favorites ## Playing Favorites
@ -114,6 +127,38 @@ The Selection widget in HABpanel can be used to present the favorites as a choic
Selecting from that choice list will play the favorite on the SqueezeBox player. Selecting from that choice list will play the favorite on the SqueezeBox player.
Currently, only favorites from the root level of the LMS favorites list are exposed on the **playFavorite** channel. Currently, only favorites from the root level of the LMS favorites list are exposed on the **playFavorite** channel.
### How to Set Up Favorites
- Add some favorites to your favorites list in LMS (local music playlists, Pandora, Slacker, Internet radio, etc.).
Keep all favorites at the root level (i.e. favorites in sub-folders will be ignored).
- If you're on an older openHAB build, you may need to delete and readd your squeezebox server and player things to pick up the new channels.
- Create a new item on each player
```
String YourPlayer_PlayFavorite "Play Favorite [%s]" { channel="squeezebox:squeezeboxplayer:736549a3:00042016e7a0:playFavorite" }
```
#### For HABpanel (do this for each player)
- Add a Selection widget to your dashboard
- In the Selection widget settings
- Enter the **YourPlayer_PlayFavorite** item
- Select *Choices source* of *Server-provided item options*
- Modify other settings to suite your taste
- When you load the dashboard and click on the selection widget, you should see the favorites.
Selecting a favorite from the list will play it.
#### For Sitemap
- Currently, the Selection widget in Basic UI doesnt use the state options.
## Notifications ## Notifications
### How To Set Up ### How To Set Up
@ -121,20 +166,9 @@ Currently, only favorites from the root level of the LMS favorites list are expo
Squeeze Players can be set up as audio sinks in openHAB. Squeeze Players can be set up as audio sinks in openHAB.
Please follow the [openHAB multimedia documentation](http://docs.openhab.org/configuration/multimedia.html) for setup guidance. Please follow the [openHAB multimedia documentation](http://docs.openhab.org/configuration/multimedia.html) for setup guidance.
You can create an item and sitemap entry in order to set the notification volume independently from the Squeeze Player's current volume setting. You can set the default notification volume in the player thing configuration.
If the notification volume is not specified, it will use the Player's current volume setting.
Item for setting notification volume. You can override the default notification volume by supplying it as a parameter to `say` and `playSound`.
```
Dimmer NotificationVolume "Notification Volume [%d %%]" {channel="squeezebox:squeezeboxplayer:5919BEA2-764B-4590-BC70-D74DCC15491B:20cfbf221510:notificationSoundVolume"}
```
Sitemap entry for setting notification volume.
```
Slider item=NotificationVolume label="Notification Volume"
```
You can play notifications from within rules. You can play notifications from within rules.
@ -143,14 +177,14 @@ rule "Garage Door Open Notification"
when when
Item GarageDoorOpenNotification received command ON Item GarageDoorOpenNotification received command ON
then then
// Play the notification on the default sink // Play the notification on the default sink at a specified volume level
say("The garage door is open!", "voicerss:enUS") say("The garage door is open!", "voicerss:enUS", 35)
// Play the notification on a specific sink // Play the notification on a specific sink
say("The garage door is open!", "voicerss:enUS", "squeezebox:squeezeboxplayer:5919BEA2-764B-4590-BC70-D74DCC15491B:20cfbf221510") say("The garage door is open!", "voicerss:enUS", "squeezebox:squeezeboxplayer:5919BEA2-764B-4590-BC70-D74DCC15491B:20cfbf221510")
end end
``` ```
And, you can play sounds from the conf/sounds directory. And, you can play sounds from the `conf/sounds` directory.
``` ```
rule "Play Sounds" rule "Play Sounds"
@ -158,16 +192,23 @@ when
Item PlaySounds received command ON Item PlaySounds received command ON
then then
// Play the sound on the default sink // Play the sound on the default sink
playsound("doorbell.mp3") playSound("doorbell.mp3")
// Play the sound on a specific sink // Play the sound on a specific sink at a specified volume level
playsound("squeezebox:squeezeboxplayer:5919BEA2-764B-4590-BC70-D74DCC15491B:20cfbf221510", "doorbell.mp3") playSound("squeezebox:squeezeboxplayer:5919BEA2-764B-4590-BC70-D74DCC15491B:20cfbf221510", "doorbell.mp3", 45)
end end
``` ```
### Known Issues ### Known Issues
- There are some versions of squeezelite that will not correctly play very short duration mp3 files. Versions of squeezelite after v1.7 and before v1.8.6 will not play very short duration mp3 files reliably. For example, if you're using piCorePlayer (which uses squeezelite), please check your version of squeezelite if you're having trouble playing notifications. This bug has been fixed in squeezelite version 1.8.6-985, which is included in piCorePlayer version 3.20. - There are some versions of squeezelite that will not correctly play very short duration mp3 files.
Versions of squeezelite after v1.7 and before v1.8.6 will not play very short duration mp3 files reliably.
For example, if you're using piCorePlayer (which uses squeezelite), please check your version of squeezelite if you're having trouble playing notifications.
This bug has been fixed in squeezelite version 1.8.6-985, which is included in piCorePlayer version 3.20.
- When streaming from a remote service (such as Pandora or Spotify), after the notification plays, the Squeezebox Server starts playing a new track, instead of picking up from where it left off on the currently playing track. - When streaming from a remote service (such as Pandora or Spotify), after the notification plays, the Squeezebox Server starts playing a new track, instead of picking up from where it left off on the currently playing track.
- There have been reports that notifications do not play reliably, or do not play at all, when using Logitech Media Server (LMS) version 7.7.5. Therefore, it is recommended that the LMS be on a more current version than 7.7.5. - There have been reports that notifications do not play reliably, or do not play at all, when using Logitech Media Server (LMS) version 7.7.5.
Therefore, it is recommended that the LMS be on a more current version than 7.7.5.
- There have been reports that the LMS does not play some WAV files reliably.
If you're using a TTS service that produces WAV files, and the notifications are not playing, try using an MP3-formatted TTS notification.

View File

@ -44,7 +44,7 @@ The attentive reader discovers that there is many missing sensor types; `UV`, `L
Support have not been implemented on the openhab side yet, contributions are welcome. Support have not been implemented on the openhab side yet, contributions are welcome.
***Switchbased sensors workaround*** <br> ***Switchbased sensors workaround*** <br>
* Some 433MHz magnetic & PIR sensors for example magnetic door sensors are detected as a regular `switch` things instead of a separate type. There is technically no way of distinguish them apart from regulur `switch` things. * Some 433MHz magnetic & PIR sensors, for example, magnetic door sensors, are detected as regular `switch` Things instead of type `contact`. There is technically no way of distinguish them apart from regulur `switch` Things.
For using them as sensors only (not paired to a lamp) please consult the workaround in the channel section. For using them as sensors only (not paired to a lamp) please consult the workaround in the channel section.
## Discovery ## Discovery
@ -57,16 +57,13 @@ If you want to use the *Telldus Live* its bridge, *Telldus Live bridge* need to
## Binding Configuration ## Binding Configuration
***For USB connected tellsticks only, eg. Basic and DUO*** The binding itself requires no configuration.
First of all you need to make sure that your JVM is matching your installed Telldus Center.
This normally means openHab must run on a 32bit JVM for windows and a 64bit JVM for linux.
For windows the binding is hardcoded to look for Telldus Center in Programs Files ("C:/Program Files/Telldus/;C:/Program Files (x86)/Telldus/").
If you have trouble getting the telldus core library to work you can modify the library path using
## Thing Configuration ## Thing Configuration
Only the bridges require manual configuration. Only the bridges require manual configuration.
The devices and sensors should not be added by hand, let the discovery/inbox initially configure these. It is preferable that devices and sensors are discovered automatically; let the discovery/inbox initially configure them.
You can add them either with karaf: `inbox approve <thingId>` or by using the inbox of the Paper UI.
### Dimmers & switches ### Dimmers & switches
@ -80,10 +77,10 @@ The binding implements two different API:
**1)** *Telldus Core* which is a local only interface supported by USB based device. <br> **1)** *Telldus Core* which is a local only interface supported by USB based device. <br>
**2)** *Telldus Live* which is a REST based cloud service maintained by Telldus. <br> **2)** *Telldus Live* which is a REST based cloud service maintained by Telldus. <br>
> Not implemented yet but supported by some new devices: <br> > Not implemented yet but supported by some new devices, contributions are welcome. [API documention.](http://api.telldus.net/localapi/api.html) <br>
> **3)** *Local Rest API* is a local API which would work similar to Telldus Live but local. > **3)** *Local Rest API* is a local API which would work similar to Telldus Live but local.
Depending on your Tellstick model different API methods is available: Depending on your Tellstick model, different bridge-types are available:
<table> <table>
<tr><td><b>Model</b></td> <td><b>Telldus Core</b></td> <td><b>Telldus Live</b></td> <td>Local REST API</td> <td><b>Verified working with openHAB</b></td></tr> <tr><td><b>Model</b></td> <td><b>Telldus Core</b></td> <td><b>Telldus Live</b></td> <td>Local REST API</td> <td><b>Verified working with openHAB</b></td></tr>
@ -93,18 +90,23 @@ Depending on your Tellstick model different API methods is available:
<tr><td>Tellstick Net v.2</td><td></td><td>X</td><td>X</td><td></td></tr> <tr><td>Tellstick Net v.2</td><td></td><td>X</td><td>X</td><td></td></tr>
<tr><td>Tellstick ZNet Lite v.1</td><td></td><td>X</td><td>X</td><td>X</td></tr> <tr><td>Tellstick ZNet Lite v.1</td><td></td><td>X</td><td>X</td><td>X</td></tr>
<tr><td>Tellstick ZNet Lite v.2</td><td></td><td>X</td><td>X</td><td></td></tr> <tr><td>Tellstick ZNet Lite v.2</td><td></td><td>X</td><td>X</td><td></td></tr>
<tr><td><i>Tellstick ZNet Pro (Not released)</i></td><td></td><td>X</td><td>X</td><td></td></tr>
</table> </table>
#### Telldus Core Bridge #### Telldus Core Bridge
> To enable communication between openhab and tellstick-core service (Telldus center) they must use same architecture, eg. 32-bit or 64-bit. The supplied version from Telldus is compiled against 32-bit architecture. Therefore, it is better to use 32-bit java for openHAB. To check which version of Java is currently in use, run: `java -d32 -version`
>
> *For changing architecture in linux check out: `dpkg --add-architecture`*
The telldus-core bridge uses a library on the local computer which is a `.dll` file for Windows and a `.so` file for Linux. The default one is usually correct.
``` ```
Bridge tellstick:telldus-core:1 "Tellstick Duo" [resendInterval=200] Bridge tellstick:telldus-core:1 "Tellstick Duo" [resendInterval=200,libraryPath="C:/Program Files/Telldus/;C:/Program Files (x86)/Telldus/"]
``` ```
Optional: Optional:
- **libraryPath:** The path to tellduscore.dll/so, - **libraryPath:** The path to tellduscore.dll/so semicolon seperated list of folders.
- **resendInterval:** The interval between each transmission of command in ms, default 100ms. - **resendInterval:** The interval between each transmission of command in ms, default 100ms.
#### Telldus Live Bridge #### Telldus Live Bridge
@ -129,7 +131,7 @@ Optional:
## Channels ## Channels
Actuators (&lsqb;dimmer&rsqb;/&lsqb;switch&rsqb;) support the following channels: Actuators (dimmer/switch) support the following channels:
<table> <table>
<tr><td><b>Channel Type ID</b></td> <td><b>Item Type</b></td> <td><b>Description</b></td> </tr> <tr><td><b>Channel Type ID</b></td> <td><b>Item Type</b></td> <td><b>Description</b></td> </tr>
@ -138,7 +140,7 @@ Actuators (&lsqb;dimmer&rsqb;/&lsqb;switch&rsqb;) support the following channels
<tr><td>timestamp</td><td>DateTime</td><td>This channel reports the last time this device state changed.</td></tr> <tr><td>timestamp</td><td>DateTime</td><td>This channel reports the last time this device state changed.</td></tr>
</table> </table>
Sensors (&lsqb;sensor&rsqb;) support the following channels: Sensors (sensor) support the following channels:
<table> <table>
<tr><td><b>Channel Type ID</b></td> <td><b>Item Type</b></td> <td><b>Description</b></td> </tr> <tr><td><b>Channel Type ID</b></td> <td><b>Item Type</b></td> <td><b>Description</b></td> </tr>
@ -183,20 +185,22 @@ end
### tellstick.things ### tellstick.things
``` ```
Bridge tellstick:telldus-core:1 "Tellstick Duo" [resendInterval=200] Bridge tellstick:telldus-core:1 "Tellstick Duo" [resendInterval=200] {
Bridge tellstick:telldus-live:2 "Tellstick ZWave" [refreshInterval=10000, publicKey="XXXXXXXX", privateKey="YYYYYY", token= "ZZZZZZZZ", tokenSecret="UUUUUUUUUU"] dimmer BedroomCeilingLamp1 [protocol="arctech",model="selflearning-dimmer",name="BedroomCeilingLamp1",deviceId="8"]
switch LivingTV [protocol="arctech",name="LivingTV",deviceId="5"]
sensor OutsideSensor1 [protocol="fineoffset",model="temperaturehumidity",name="temperaturehumidity:125",deviceId="125_temperaturehumidity_fineoffset"]
}
Bridge tellstick:telldus-live:2 "Tellstick ZWave" [refreshInterval=10000, publicKey="XXXXXXXX", privateKey="YYYYYY", token= "ZZZZZZZZ", tokenSecret="UUUUUUUUUU"] {
sensor OutsideSensor2 [protocol="fineoffset",model="temperaturehumidity",name="temperaturehumidity:120",deviceId="120_temperaturehumidity_fineoffset"]
}
``` ```
Devices are preferable discovered automatically.
Add them either with karaf: `inbox approve <thingId>` or in paperUI. The bridges can also be added with PaperUI.
### tellstick.items ### tellstick.items
List available devices in karaf with `things` or get the channels in paperUI. ```
Number OutsideSensor1_Temperture <temperature> { channel="tellstick:sensor:tellstickgateway:OutsideSensor1:temperature"}
Number OutsideSensor1_Humidity <humidity> { channel="tellstick:sensor:tellstickgateway:OutsideSensor1:humidity"}
``` Switch LivingTV_Power <screen> { channel="tellstick:switch:tellstickgateway:LivingTV:switch"}
Slider living_room_ceiling "Living room ceiling" <light> {channel="tellstick:dimmer:1:3:state"} Dimmer BedroomCeilingLamp1_Brightness <lightbulb> { channel="tellstick:dimmer:tellstickgateway:BedroomCeilingLamp1:dimmer"}
Switch living_room_table "Living room table" <light> {channel="tellstick:switch:1:3:state"}
Number inside_temperature "Inside temperature [%.1f °C]" <temperature> {channel="tellstick:sensor:1:47_temperaturehumidity_fineoffset:temperature"}
Number inside_humidity "Inside humidity [%.1f RH]" <humidity> {channel="tellstick:sensor:1:47_temperaturehumidity_fineoffset:humidity"}
``` ```

View File

@ -1542,7 +1542,7 @@ Technical description see [Tinkerforge Website](http://www.tinkerforge.com/en/do
| property | description | values | | property | description | values |
|----------|--------------|--------| |----------|--------------|--------|
| uid | tinkerforge uid | same as bricklet | | uid | tinkerforge uid | same as bricklet |
| subid | openHAB subid of the device | in0, in2, in3, in4 | | subid | openHAB subid of the device | in0, in1, in2, in3 |
| type | openHAB type name | | | type | openHAB type name | |
##### tinkerforge.cfg: ##### tinkerforge.cfg:
@ -1585,7 +1585,7 @@ Technical description see [Tinkerforge Website](http://www.tinkerforge.com/en/do
| property | description | values | | property | description | values |
|----------|--------------|--------| |----------|--------------|--------|
| uid | tinkerforge uid | same as bricklet | | uid | tinkerforge uid | same as bricklet |
| subid | openHAB subid of the device | out0, out2, out3, out4 | | subid | openHAB subid of the device | out0, out1, out2, out3 |
| type | openHAB type name | | | type | openHAB type name | |
##### tinkerforge.cfg: ##### tinkerforge.cfg:
@ -2076,7 +2076,7 @@ Technical description see [Tinkerforge Website](http://www.tinkerforge.com/en/do
There are three sub devices: joystick_xposition, joystick_yposition and joystick_button. There are three sub devices: joystick_xposition, joystick_yposition and joystick_button.
Callback period for xy position defaults to 10 milli seconds. CallbackPeriod must be configured Callback period for xy position defaults to 10 milli seconds. CallbackPeriod must be configured
on bricklet_joystick device, because x and y position can not have on bricklet_joystick device, because x and y position cannot have
different callback periods. different callback periods.
##### Button ##### Button

View File

@ -13,113 +13,113 @@ install: auto
{% include base.html %} {% include base.html %}
# Vitotronic Binding # Vitotronic Binding
Viessmann heating systems with Vitotronic has a optolink Interface for maintenance. Viessmann heating systems with Vitotronic has a optolink Interface for maintenance.
This interface can use for get/set data in the heating system. [see on openv](http://openv.wikispaces.com) This interface can use for get/set data in the heating system. [see on openv](http://openv.wikispaces.com)
The Vitotronic binding is a solution to bind this interface into openHAB2. The Vitotronic binding is a solution to bind this interface into openHAB2.
It supports the separation of the heating adaption from the integration in [openHAB2](http://www.openhab.org/). It supports the separation of the heating adaption from the integration in [openHAB2](http://www.openhab.org/).
![Architectur](doc/architecture_vitotronic.jpg) ![Architectur](doc/architecture_vitotronic.jpg)
The adapter transform the address oriented raw interface of the Vitotronic to a abstract format. The adapter transform the address oriented raw interface of the Vitotronic to a abstract format.
The adapter itself is not a part of the openhab2 binding. The adapter itself is not a part of the openhab2 binding.
[A alpha version is available here](https://github.com/steand/optolink) [A alpha version is available here](https://github.com/steand/optolink)
[More Information about the adapter](https://github.com/steand/optolink/wiki) [More Information about the adapter](https://github.com/steand/optolink/wiki)
## Supported Things ## Supported Things
For easy using are the main things of a heating system are already define in this binding: For easy using are the main things of a heating system are already define in this binding:
* heating (Vitotronic core system) * heating (Vitotronic core system)
* pelletburner (Pellet Fireplace, works for wood also) * pelletburner (Pellet Fireplace, works for wood also)
* oilburner (Oil Fireplace) * oilburner (Oil Fireplace)
* storagetank (Storage Tank, stores heat in a water tank on 3 levels: bottom, middle, top=hot water) * storagetank (Storage Tank, stores heat in a water tank on 3 levels: bottom, middle, top=hot water)
* circuit (Heating circuit controls the flow between the heating system and the radiators in the rooms) * circuit (Heating circuit controls the flow between the heating system and the radiators in the rooms)
* solar (Solar water heating (SWH): Convert sunlight into energy for water heating) * solar (Solar water heating (SWH): Convert sunlight into energy for water heating)
For advanced used 3 basic things of a headingsystem define also. For advanced used 3 basic things of a headingsystem define also.
* temperaturesensor (Single temperature sensor) * temperaturesensor (Single temperature sensor)
* pump (Single pump) * pump (Single pump)
* valve (Single valve) * valve (Single valve)
Note: The mapping of things and channels to the heating system addresses must be done in the adapter. Note: The mapping of things and channels to the heating system addresses must be done in the adapter.
## Discovery ## Discovery
The binding discovers the adapter with broadcast and put the found `vitotronic:bridge` into the inbox. For automatic detection the adapter and **openHAB** must be on the same LAN. The discovery itself must be start in the Paper-UI. The binding discovers the adapter with broadcast and put the found `vitotronic:bridge` into the inbox. For automatic detection the adapter and **openHAB** must be on the same LAN. The discovery itself must be start in the Paper-UI.
If the bridge isn't on the same LAN the bridge can also add manually. In this case the `IP-Address` and the `adapterID` is required. If the bridge isn't on the same LAN the bridge can also add manually. In this case the `IP-Address` and the `adapterID` is required.
Íf the `vitotronic:bridge` added a second discovery will be start. It discovers all things, define in the adapter and put found things into the inbox. Íf the `vitotronic:bridge` added a second discovery will be start. It discovers all things, define in the adapter and put found things into the inbox.
## Binding Configuration ## Binding Configuration
Binding itself has 4 configuration parameters: Binding itself has 4 configuration parameters:
* ipAddress (The IP address of the Optolink adapter) * ipAddress (The IP address of the Optolink adapter)
* port (Port of the LAN gateway. Default: 31113) * port (Port of the LAN gateway. Default: 31113)
* adapterID (The ID/Name of the adapter) * adapterID (The ID/Name of the adapter)
* refreshInterval (Refresh time for data in seconds. Default: 600 seconds) * refreshInterval (Refresh time for data in seconds. Default: 600 seconds)
If the adapter is automatic discovered the ipAddress, and adapterID will be set by discovery. If the adapter is automatic discovered the ipAddress, and adapterID will be set by discovery.
The rereshInterval can be set between 60 and 600 seconds. The minimal setting is dependent of the performance of the adapter. The rereshInterval can be set between 60 and 600 seconds. The minimal setting is dependent of the performance of the adapter.
## Thing Configuration ## Thing Configuration
There is no configuration of Things necessary. Only some channels are set active by default. If this channels are defined in the adapter and will be used in **openHAB** it must set active manually. There is no configuration of Things necessary. Only some channels are set active by default. If this channels are defined in the adapter and will be used in **openHAB** it must set active manually.
Don't change the Thing Name. It is the reference to the name in the adapter. Don't change the Thing Name. It is the reference to the name in the adapter.
## Channels ## Channels
The follow channels are implemented: The follow channels are implemented:
| Channel Type ID | Item Type | Description | | Channel Type ID | Item Type | Description |
|------------------|-----------|-------------------------------------------------------| |------------------|-----------|-------------------------------------------------------|
| systemtime | DateTime | DateTime of the heating system | | systemtime | DateTime | DateTime of the heating system |
| outside_temp | Number | Outside temperature sensor | | outside_temp | Number | Outside temperature sensor |
| boiler_temp | Number | Temperature sensor of boiler (fireplace) | | boiler_temp | Number | Temperature sensor of boiler (fireplace) |
| flowuprating | Switch | Pump state of flow up rating | | flowuprating | Switch | Pump state of flow up rating |
| flame_temp | Number | Temperature of flame | | flame_temp | Number | Temperature of flame |
| airshutter_prim | Number | Position of the primary air shutter | | airshutter_prim | Number | Position of the primary air shutter |
| airshutter_sec | Number | Position of the secondary air shutter | | airshutter_sec | Number | Position of the secondary air shutter |
| lambdasensor | Number | Oxygen content of the exhaust air | | lambdasensor | Number | Oxygen content of the exhaust air |
| fanspeed | Number | Fan Speed in rpm | | fanspeed | Number | Fan Speed in rpm |
| fanspeed_target | Number | Fan Speed in rpm | | fanspeed_target | Number | Fan Speed in rpm |
| error | Switch | | | error | Switch | |
| starts | Number | Count of starts | | starts | Number | Count of starts |
| ontime | Number | Ontime in hours | | ontime | Number | Ontime in hours |
| consumedpellets | Number | Consumed Pellets since start of heating in tons | | consumedpellets | Number | Consumed Pellets since start of heating in tons |
| power | Number | Power of the pellet burner | | power | Number | Power of the pellet burner |
| powerlevel | Number | Power of the oil burner | | powerlevel | Number | Power of the oil burner |
| actualpower | Number | Actual power of the burner | | actualpower | Number | Actual power of the burner |
| ontimelevel1 | Number | Ontime in hours | | ontimelevel1 | Number | Ontime in hours |
| ontimelevel2 | Number | Ontime in hours | | ontimelevel2 | Number | Ontime in hours |
| consumedoil | Number | Consumed Oil since start of heating in Liter | | consumedoil | Number | Consumed Oil since start of heating in Liter |
| hotwater_temp | Number | Temperature sensor of the hot water | | hotwater_temp | Number | Temperature sensor of the hot water |
| middle_temp | Number | Temperature sensor in the middle of the storage tank | | middle_temp | Number | Temperature sensor in the middle of the storage tank |
| bottom_temp | Number | Temperature sensor at the bottom of the storage tank | | bottom_temp | Number | Temperature sensor at the bottom of the storage tank |
| circuitpump | Switch | Circuit pump state | | circuitpump | Switch | Circuit pump state |
| flowtemperature | Number | Temperature sensor of the ciruit flow | | flowtemperature | Number | Temperature sensor of the ciruit flow |
| pump | Switch | Pump state | | pump | Switch | Pump state |
| operationmode | Number | Operationmode | | operationmode | Number | Operationmode |
| savemode | Switch | Savemode on/off | | savemode | Switch | Savemode on/off |
| partymode | Switch | Partymode on/off | | partymode | Switch | Partymode on/off |
| party_temp | Number | Target temperature of party mode | | party_temp | Number | Target temperature of party mode |
| room_temp | Number | Target temperature of rooms | | room_temp | Number | Target temperature of rooms |
| save_temp | Number | Target temperature of save mode | | save_temp | Number | Target temperature of save mode |
| gradient | Number | The gradient relativ to outside temperature | | gradient | Number | The gradient relativ to outside temperature |
| niveau | Number | The niveau relativ to outside temperature | | niveau | Number | The niveau relativ to outside temperature |
| collector_temp | Number | Actual temperature of the collector | | collector_temp | Number | Actual temperature of the collector |
| storagetank_temp | Number | Actual temperature of the storage tank (solar sensor) | | storagetank_temp | Number | Actual temperature of the storage tank (solar sensor) |
| bufferload | Switch | State of the pump (on/off) | | bufferload | Switch | State of the pump (on/off) |
| loadsuppression | Switch | State of the load suppression (on/off) | | loadsuppression | Switch | State of the load suppression (on/off) |
| producedheat | Number | Produced heat since starting solar system | | producedheat | Number | Produced heat since starting solar system |
| temperature | Number | Generic temperature sensor | | temperature | Number | Generic temperature sensor |
| valve | Number | Value of a generic valve | | valve | Number | Value of a generic valve |
## Example ## Example
t.b.d t.b.d

View File

@ -31,34 +31,62 @@ No binding configuration required.
## Thing Configuration ## Thing Configuration
The thing mandatory configuration is the selection of the mill. | Configuration Parameter | Required | Default | Description |
Optional configuration is the number of wind shares ("Winddelen") and the refresh interval. |-------------------------|----------|---------|-----------------------------------------------------|
| millId | X | 131 | Identifies the windmill (see table below) |
| wd | | 1 | Number of wind shares ("Winddelen") |
| refreshInterval | | 30 | Refresh interval for refreshing the data in seconds |
| millId | Windmill name |
|--------|-------------------|
| 1 | De Grote Geert |
| 2 | De Jonge Held |
| 31 | Het Rode Hert |
| 41 | De Ranke Zwaan |
| 51 | De Witte Juffer |
| 111 | De Bonte Hen |
| 121 | De Trouwe Wachter |
| 131 | De Blauwe Reiger |
| 141 | De Vier Winden |
| 201 | De Boerenzwaluw |
## Channels ## Channels
- **windSpeed** Measured current wind speed | Channel Type ID | Item Type | Description |
- **windDirection** Current wind direction |-----------------|----------------------|-------------------------------------|
- **powerAbsTot** Total power | kwh | Number:Energy | Current energy |
- **powerAbsWd** Power provided for your wind shares | kwhForecast | Number:Energy | Energy forecast |
- **powerRel** Relative power | powerAbsTot | Number:Power | Total power |
- **kwh** Current energy | powerAbsWd | Number:Power | Power provided for your wind shares |
- **kwhForecast** Energy forecast | powerRel | Number:Dimensionless | Relative power |
- **runPercentage** Run percentage this year | runPercentage | Number:Dimensionless | Run percentage this year |
- **timestamp** Timestamp of the last update | runTime | Number:Time | Run time this year |
| timestamp | DateTime | Timestamp of the last update |
| windDirection | String | Current wind direction |
| windSpeed | Number | Measured current wind speed (Bft) |
## Example ## Example
``` ### demo.things
Group gReiger "Windcentrale Reiger" <wind>
Number ReigerWindSpeed "Windsnelheid [%1.0f Bft]" <wind> (gReiger) {channel="windcentrale:mill:reiger:windSpeed") ```
String ReigerWindDirection "Windrichting [%s]" <wind> (gReiger) {channel="windcentrale:mill:reiger:windDirection") Thing windcentrale:mill:geert [ millId=1 ]
Number ReigerPowerAbsTot "Productie molen [%1.0f kW]" <wind> (gReiger) {channel="windcentrale:mill:reiger:powerAbsTot") Thing windcentrale:mill:reiger [ millId=131, wd=3, refreshInterval=60 ]
Number ReigerPowerAbsWd "WD power [%1.0f W]" <wind> (gReiger) {channel="windcentrale:mill:reiger:powerAbsWd") ```
Number ReigerPowerRel "Productie vermogen [%1.0f %%]" <wind> (gReiger) {channel="windcentrale:mill:reiger:powerRel")
Number ReigerKwh "kwh [%1.0f]" <wind> (gReiger) {channel="windcentrale:mill:reiger:kwh") ### demo.items
Number ReigerKwhForecast "Productie forecast [%1.0f]" <wind> (gReiger) {channel="windcentrale:mill:reiger:kwhForecast")
Number ReigerRunPercentage "Run percentage [%1.0f %%]" <wind> (gReiger) {channel="windcentrale:mill:reiger:runPercentage") ```
Number ReigerTimestamp "Update timestamp [%1$ta %1$tR]" <wind> (gReiger) {channel="windcentrale:mill:reiger:timestamp") Group gReiger "Windcentrale Reiger" <wind>
Number ReigerWindSpeed "Wind speed [%d Bft]" <wind> (gReiger) { channel="windcentrale:mill:reiger:windSpeed" }
String ReigerWindDirection "Wind direction [%s]" <wind> (gReiger) { channel="windcentrale:mill:reiger:windDirection" }
Number:Power ReigerPowerAbsTot "Total mill power [%.1f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:powerAbsTot" }
Number:Power ReigerPowerAbsWd "Wind shares power [%.1f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:powerAbsWd" }
Number:Dimensionless ReigerPowerRel "Relative power [%.1f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:powerRel" }
Number:Energy ReigerKwh "Current energy [%.0f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:kwh" }
Number:Energy ReigerKwhForecast "Energy forecast [%.0f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:kwhForecast" }
Number:Dimensionless ReigerRunPercentage "Run percentage [%.1f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:runPercentage" }
Number:Time ReigerRunTime "Run time [%.0f %unit%]" <wind> (gReiger) { channel="windcentrale:mill:reiger:runTime" }
DateTime ReigerTimestamp "Update timestamp [%1$ta %1$tR]" <wind> (gReiger) { channel="windcentrale:mill:reiger:timestamp" }
``` ```

View File

@ -97,7 +97,7 @@ If you're not sure about endpoint numbering, look in the logs to see if sensor d
This indicates that the binding cant find an item linked to this sensor - often this is because the endpoint numbering is incorrect. If the warning above says endpoint = 0, then the binding string shouldn't include an endpoint number. This indicates that the binding cant find an item linked to this sensor - often this is because the endpoint numbering is incorrect. If the warning above says endpoint = 0, then the binding string shouldn't include an endpoint number.
The `<command>` is optional, but recommended if you have multiple items bound to the same device, or the device reports multiple bits of information. Without the command class, the binding can not unambiguously differentiate different data, so it is recommended to provide a command class. Z-Wave nodes support functionality through command classes. A specific command class can be specified to use that specific functionality of the node. A node can contain multiple supported command classes. If the command is omitted, the best suitable command class for the item / node combination is automatically chosen. The `<command>` is optional, but recommended if you have multiple items bound to the same device, or the device reports multiple bits of information. Without the command class, the binding cannot unambiguously differentiate different data, so it is recommended to provide a command class. Z-Wave nodes support functionality through command classes. A specific command class can be specified to use that specific functionality of the node. A node can contain multiple supported command classes. If the command is omitted, the best suitable command class for the item / node combination is automatically chosen.
Command classes may support parameters. A parameter is a name=value pair that configures some aspect of the command class on the node or in the binding. Command classes may support parameters. A parameter is a name=value pair that configures some aspect of the command class on the node or in the binding.

View File

@ -3,17 +3,6 @@
# Prepare Z-Way Server # Prepare Z-Way Server
1. [Download](https://razberry.z-wave.me/z-way-server/) Z-Way v2.2.3 or newer (further information about installing Z-Way you can find [here](http://razberry.z-wave.me/index.php?id=24)) 1. [Download](https://razberry.z-wave.me/z-way-server/) Z-Way v2.2.3 or newer (further information about installing Z-Way you can find [here](http://razberry.z-wave.me/index.php?id=24))
2. Install openHAB Connector
- via "ZWave.Me App Store"
- via Git
```shell
cd /opt/z-way-server/automation/userModules
git clone https://github.com/pathec/ZWay-OpenHABConnector.git OpenHABConnector
service z-way-server restart
```
3. Instantiate the app once (under Configuration - Apps - Local Apps). Important: Change the selection from "Featured Apps" to "All Apps" to make the app visible. It is not necessary to make the configuration manually.
# Prepare openHAB # Prepare openHAB
@ -52,11 +41,6 @@ Open the *Configuration* - *Things* and select Z-Way Server
Change configuration: In order for the Observer mechanism works, the IP address, port and protocol of both systems are required. Change configuration: In order for the Observer mechanism works, the IP address, port and protocol of both systems are required.
- **openHAB**
- **openHAB Alias** by default, the alias is generated
- **IP address** (default: localhost)
- **port** (default: 8080)
- **protocol** (default: http)
- **Z-Way Server** - **Z-Way Server**
- **IP address** (default: localhost) - **IP address** (default: localhost)
- **port** (default: 8083) - **port** (default: 8083)
@ -65,8 +49,8 @@ Change configuration: In order for the Observer mechanism works, the IP address,
- **password** must be set (no default value) - **password** must be set (no default value)
- **options** - **options**
- **polling interval** (default: 3600) in seconds - **polling interval** (default: 3600) in seconds
- **Observer mechanism** (default: active)
**The following picture is no longer up to date!**
![openHAB Thing settings](images/getting-started/06-Bridge-settings.png) ![openHAB Thing settings](images/getting-started/06-Bridge-settings.png)
## Create and configure Z-Way Devices ## Create and configure Z-Way Devices

View File

@ -77,27 +77,21 @@ But the configuration and properties of things are changed at runtime and channe
### Z-Way Server (Bridge) ### Z-Way Server (Bridge)
The information about accessing openHAB are needed so that the Observer mechanism works.
Besides the username and password all required Z-Way information are found during discovery. Besides the username and password all required Z-Way information are found during discovery.
| Configuration Name | Mandatory | Default | Desciption | | Configuration Name | Mandatory | Default | Desciption |
|--------------------------|-----------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |--------------------------|-----------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| openHABAlias | | | By default, the alias is generated during initialization or configuration update of thing handler. |
| openHABIpAddress | | localhost | The IP address or hostname of the openHAB server. If Z-Way and openHAB are running on the same machine, the default value can be used. |
| openHABPort | | 8080 | The port of the openHAB server (0 to 65335) |
| openHABProtocol | | http | Protocol to connect to the openHAB server (http or https) |
| zwayServerIpAddress | | localhost | The IP address or hostname of the Z-Way server. If Z-Way and openHAB are running on the same machine, the default value can be used. | | zwayServerIpAddress | | localhost | The IP address or hostname of the Z-Way server. If Z-Way and openHAB are running on the same machine, the default value can be used. |
| zwayServerPort | | 8083 | The port of the Z-Way server (0 to 65335) | | zwayServerPort | | 8083 | The port of the Z-Way server (0 to 65335) |
| zwayServerProtocol | | http | Protocol to connect to the Z-Way server (http or https) | | zwayServerProtocol | | http | Protocol to connect to the Z-Way server (http or https) |
| zwayServerUsername | | admin | Username to access the Z-Way server. | | zwayServerUsername | | admin | Username to access the Z-Way server. |
| zwayServerPassword | X | | Password to access the Z-Way server. | | zwayServerPassword | X | | Password to access the Z-Way server. |
| pollingInterval | | 3600 | Refresh device states and registration from Z-Way server in seconds (at least 60). | | pollingInterval | | 3600 | Refresh device states and registration from Z-Way server in seconds (at least 60). |
| observerMechanismEnabled | | true | The observer functionality is responsible for the item registration as observer in Z-Way. Attention: if disable this option, you have to setup an other synchronization mechanism like MQTT. |
Only the Z-Way server can be configured textual (Attention! *openHABAlias* has to be set because the bridge configuration can not be changed at runtime): Only the Z-Way server can be configured textual:
``` ```
Bridge zway:zwayServer:192_168_2_42 [ openHABAlias="development", openHABIpAddress="localhost", openHABPort=8080, openHABProtocol="http", zwayServerIpAddress="localhost", zwayServerPort=8083, zwayServerProtocol="http", zwayServerUsername="admin", zwayServerPassword="admin", pollingInterval=3600, observerMechanismEnabled=true ] { Bridge zway:zwayServer:192_168_2_42 [ zwayServerIpAddress="localhost", zwayServerPort=8083, zwayServerProtocol="http", zwayServerUsername="admin", zwayServerPassword="admin", pollingInterval=3600 ] {
// associated things have to be created with the Paper UI // associated things have to be created with the Paper UI
} }
``` ```
@ -171,22 +165,12 @@ Unsupported Z-Way device types: Camera, SensorMultiline, Text. The integration o
### Channels for the Z-Way Server (Bridge) ### Channels for the Z-Way Server (Bridge)
-| Channel Type ID | Item Type | Category | Description |
Markdown Table Formatter -| --------------- | --------- | -------- | ----------- |
-| actions | String | - | It is currently possible to update all devices. |
This tool formats basic MultiMarkdown style tables for easier plain text reading. -| secureInclusion | Switch | Switch | Change inclusion type for further inclusions. |
It adds padding to all the cells to line up the pipe separators when using a mono-space font. -| inclusion | Switch | Switch | Start inclusion mode (after a timeout the inclusion will be automatically finished). |
-| exclusion | Switch | Switch | Start exclusion mode (after a timeout the exclusion will be automatically finished). ||
To see what it's all about, try one of these examples, or format your own.
Load: Example 1 - Example 2 - Example 3
For more information:
I'm on Twitter as @TheIdOfAlan
I sometimes post on my personal site alanwsmith.com
This is an Open Source GitHub Project.
It has a Jasmine Test Suite.
What to show your appreciation? Buy me a book
## Locations ## Locations
@ -217,7 +201,7 @@ Because textual configuration isn't useful, follow the instructions in the [Gett
- Z-Way device types (especially the probe types) supported by openHAB channels with detailed information (scale types and so on) are not complete. - Z-Way device types (especially the probe types) supported by openHAB channels with detailed information (scale types and so on) are not complete.
- Configuration of the Z-Wave network by the binding is currently not possible (physical device configuration) - Configuration of the Z-Wave network by the binding is currently not possible (physical device configuration)
- Z-Way App "openHAB Connector" is required. Further versions will contain other mechanisms under usage of the WebSocket implementation of Z-Way or MQTT. - Only polling is available. Further versions will contain other mechanisms under usage of the WebSocket implementation of Z-Way or MQTT.
<br> <br>
<img src="doc/BMWi_4C_Gef_en.jpg" width="200"> <img src="doc/BMWi_4C_Gef_en.jpg" width="200">

View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" style="enable-background:new 0 0 64 64">
<g style="fill:#797878">
<path d="m37.25 50h-10.5c-.55 0-1-.45-1-1 0-.55.45-1 1-1h10.5c.55 0 1 .45 1 1 0 .55-.45 1-1 1"/>
<path d="m37.25 53h-10.5c-.55 0-1-.45-1-1 0-.55.45-1 1-1h10.5c.55 0 1 .45 1 1 0 .55-.45 1-1 1"/>
<path d="m37.07 56h-10.14c-.65 0-1.18-.53-1.18-1.18 0-.45.37-.82.82-.82h10.85c.45 0 .82.37.82.82.01.65-.52 1.18-1.17 1.18"/>
<path d="m32 60c2.21 0 4-1.34 4-3h-8c0 1.66 1.79 3 4 3"/>
</g>
<path d="m48 20.58c0-8.61-7.16-15.58-16-15.58s-16 6.97-16 15.58c0 2.73.72 5.29 1.98 7.51.77 1.49 1.32 2.56 1.67 3.23.72 1.4 1.14 2.21 1.66 3.42.22.51.55 1.28.86 2.16 1.23 3.49 1.7 6.82 1.7 6.82s.23 1.74 1.16 2.59c.26.24.52.38.65.44.45.21.86.25 1.11.25.16 0 .32 0 .48 0h4.66.13 4.66c.16 0 .32 0 .48 0 .24 0 .66-.04 1.11-.25.13-.06.39-.2.65-.44.93-.85 1.16-2.59 1.16-2.59s.47-3.33 1.7-6.82c.31-.88.64-1.65.86-2.16.52-1.21.94-2.02 1.66-3.42.35-.68.9-1.74 1.67-3.23 1.27-2.23 1.99-4.79 1.99-7.51" style="fill:#ffc84d"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,27 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<linearGradient id="0" y2="70.362" gradientUnits="userSpaceOnUse" x2="0" gradientTransform="matrix(1.9998887 0 0 1.2424276-47.993281 955.21738)" y1="73.362">
<stop style="stop-color:#fff"/>
<stop offset="1" style="stop-color:#ccc"/>
</linearGradient>
<linearGradient id="1" y2="70.362" gradientUnits="userSpaceOnUse" y1="73.362" gradientTransform="matrix(1.9998887 0 0 2.0000677-47.871459 861.62697)" x2="0">
<stop style="stop-color:#fff"/>
<stop offset="1" style="stop-color:#cdcdcd"/>
</linearGradient>
</defs>
<g transform="translate(0-988.36218)">
<path d="m12.253 994.45h9.187 30.498v51.689h-39.685z" style="fill:#fff;color:#000"/>
<g style="fill:#d3d3d3">
<path d="m34 996.36h4v4h-4z"/>
<path d="m40 996.36h4v4h-4z"/>
<path d="m46 996.36h4v4h-4z"/>
</g>
<path d="m12 1002.4h40v6h-40z" style="fill:url(#1)"/>
<path d="m12 1042.4h40v4h-40z" style="fill:url(#0)"/>
<path d="m10 992.36v56h44l.000001-56zm2 2h40v52h-40z" style="fill:#969696;color:#000"/>
<path d="m47.38 1023.6c0 8.5523-6.9324 15.485-15.484 15.485s-15.484-6.9331-15.484-15.485c0-8.5524 6.9324-15.485 15.484-15.485s15.484 6.933 15.484 15.485z" style="fill:none;stroke:#4c4c4c;stroke-width:2.21210146"/>
<path d="m15 1020.4h6v6h-6z" style="fill:#939393"/>
<path d="m17 10l2.672-2.3594.89 2.3594z" transform="translate(0 988.36218)" style="fill:#4f4f4f"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -30,7 +30,7 @@ Requirements beyond this are not clear, and Apple enforces limitations on eligib
At the very least, you cannot use repeating (111-11-111) or sequential (123-45-678) pin codes. 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. 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: Other settings, such as using Fahrenheit temperatures, customizing the thermostat heat/cool/auto modes, and specifying the interface to advertise the Homekit bridge (which can be edited in PaperUI standard mode) are also illustrated in the following sample:
``` ```
org.openhab.homekit:port=9124 org.openhab.homekit:port=9124
@ -41,8 +41,31 @@ org.openhab.homekit:thermostatHeatMode=HeatOn
org.openhab.homekit:thermostatAutoMode=Auto org.openhab.homekit:thermostatAutoMode=Auto
org.openhab.homekit:thermostatOffMode=Off org.openhab.homekit:thermostatOffMode=Off
org.openhab.homekit:networkInterface=192.168.0.6 org.openhab.homekit:networkInterface=192.168.0.6
```
The following additional settings can be added or edited in PaperUI after switching to expert mode:
``` ```
org.openhab.homekit:name=openHAB
org.openhab.homekit:minimumTemperature=-100
org.openhab.homekit:maximumTemperature=100
```
### Overview of all settings
| Setting | Description | Default value |
|-------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |--------------- |
| networkInterface | IP address or domain name under which the HomeKit bridge can be reached. If no value is configured, the addon tries to determine the IP address from the local hostname. | (none) |
| port | Port under which the HomeKit bridge can be reached. | 9123 |
| pin | Pin code used for pairing with iOS devices. Apparently, pin codes are provided by Apple and represent specific device types, so they cannot be chosen freely. The pin code 031-45-154 is used in sample applications and known to work. | 031-45-154 |
| useFahrenheitTemperature | Set to true to use Fahrenheit degrees, or false to use Celsius degrees. | false |
| thermostatCoolMode | Word used for activating the cooling mode of the device (if applicable). | CoolOn |
| thermostatHeatMode | Word used for activating the heating mode of the device (if applicable). | HeatOn |
| thermostatAutoMode | Word used for activating the automatic mode of the device (if applicable). | Auto |
| thermostatOffMode | Word used to set the thermostat mode of the device to off (if applicable). | Off |
| minimumTemperature | Lower bound of possible temperatures, used in the user interface of the iOS device to display the allowed temperature range. Note that this setting applies to all devices in HomeKit. | -100 |
| maximumTemperature | Upper bound of possible temperatures, used in the user interface of the iOS device to display the allowed temperature range. Note that this setting applies to all devices in HomeKit. | 100 |
| name | Name under which this HomeKit bridge is announced on the network. This is also the name displayed on the iOS device when searching for available bridges. | openHAB |
## Item Configuration ## Item Configuration
@ -55,62 +78,16 @@ Complex accessories require a tag on a Group indicating the accessory type, as w
A full list of supported accessory types can be found in the table below. A full list of supported accessory types can be found in the table below.
<table> | Tag | Child tag | Supported items | Description |
<tr> |-------------------- |---------------------------- |----------------------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
<td><b>tag</b></td> | Lighting | | Switch, Dimmer, Color | A lightbulb, switchable, dimmable or rgb |
<td><b>child tag</b></td> | Switchable | | Switch, Dimmer, Color | An 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 |
<td><b>supported items</b></td> | CurrentTemperature | | Number | An accessory that provides a single read-only temperature value. The units default to celsius but can be overridden globally using the useFahrenheitTemperature global property |
<td><b>description</b></td> | CurrentHumidity | | Number | An accessory that provides a single read-only value indicating the relative humidity. |
</tr> | Thermostat | | Group | A thermostat requires all child tags defined below |
<tr> | | CurrentTemperature | Number | The current temperature, same as above |
<td>Lighting</td> | | homekit:HeatingCoolingMode | String | Indicates 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:" |
<td>&nbsp;</td> | | TargetTemperature | Number | A target temperature that will engage the thermostat's heating and cooling actions as necessary, depending on the heatingCoolingMode |
<td>Switch, Dimmer, Color</td>
<td>A lightbulb, switchable, dimmable or rgb</td>
</tr>
<tr>
<td>Switchable</td>
<td>&nbsp;</td>
<td>Switch, Dimmer, Color</td>
<td>An 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</td>
</tr>
<tr>
<td>CurrentTemperature</td>
<td>&nbsp;</td>
<td>Number</td>
<td>An accessory that provides a single read-only temperature value. The units default to celsius but can be overridden globally using the useFahrenheitTemperature global property</td>
</tr>
<tr>
<td>CurrentHumidity</td>
<td>&nbsp;</td>
<td>Number</td>
<td>An accessory that provides a single read-only value indicating the relative humidity.</td>
</tr>
<tr>
<td>Thermostat</td>
<td>&nbsp;</td>
<td>Group</td>
<td>A thermostat requires all child tags defined below</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>CurrentTemperature</td>
<td>Number</td>
<td>The current temperature, same as above</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>homekit:HeatingCoolingMode</td>
<td>String</td>
<td>Indicates 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:"</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>TargetTemperature</td>
<td>Number</td>
<td>A target temperature that will engage the thermostat's heating and cooling actions as necessary, depending on the heatingCoolingMode</td>
</tr>
</table>
See the sample below for example items: See the sample below for example items:
@ -139,3 +116,4 @@ If you encounter any issues with the add-on and need support, it may be importan
In order to get logs from the underlying library used to implement the HomeKit protocol, enable trace logging using the following command: 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``` ```openhab> log:set TRACE com.beowulfe.hap```

View File

@ -63,4 +63,4 @@ The only condition here is that the received value has to be lower or equal than
If **none** of the configured conditions matches the given value, the response will be empty. If **none** of the configured conditions matches the given value, the response will be empty.
Please note that all ranges for values above **3** are opened with a `]`. Please note that all ranges for values above **3** are opened with a `]`.
So the border values (3, 6, 8 and 10) are always transformed to the lower range, since the `]` excludes the given critera. So the border values (3, 6, 8 and 10) are always transformed to the lower range, since the `]` excludes the given critera.

View File

@ -115,4 +115,4 @@ Now the resulting Number can also be used in the label to [change the color](htt
* An [introduction](https://www.w3schools.com/xml/xpath_intro.asp) to XPath at W3School * An [introduction](https://www.w3schools.com/xml/xpath_intro.asp) to XPath at W3School
* A informative explanation of [common mistakes](https://qxf2.com/blog/common-xpath-mistakes/). * A informative explanation of [common mistakes](https://qxf2.com/blog/common-xpath-mistakes/).
* Online validation tools like [this](https://www.freeformatter.com/xpath-tester.html) to check the syntax. * Online validation tools like [this](https://www.freeformatter.com/xpath-tester.html) to check the syntax.

View File

@ -41,4 +41,4 @@ Google's Material Design approach uses so called "cards", which looks like paper
### Why does it not support sitemaps? ### Why does it not support sitemaps?
Sitemaps require the Xtext DSL. The Paper UI aims to provide a full UI-only experience without any need for modifying configuration files. Thus the Paper UI can not make use of Sitemaps now, until it is refactored to have DSL support optional as it was done for items and things. Sitemaps require the Xtext DSL. The Paper UI aims to provide a full UI-only experience without any need for modifying configuration files. Thus the Paper UI can not make use of Sitemaps now, until it is refactored to have DSL support optional as it was done for items and things.

View File

@ -16,6 +16,9 @@ The app follows the basic principles of the other openHAB UIs, like Basic UI, an
<a href="https://play.google.com/store/apps/details?id=org.openhab.habdroid"> <a href="https://play.google.com/store/apps/details?id=org.openhab.habdroid">
<img alt="Get it on Google Play" src="images/en_badge_web_generic.png" width="240px"> <img alt="Get it on Google Play" src="images/en_badge_web_generic.png" width="240px">
</a> </a>
<a href="https://f-droid.org/app/org.openhab.habdroid">
<img alt="Get it on F-Droid" src="images/get-it-on-fdroid.png" width="240px">
</a>
## Features ## Features

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -26,20 +26,7 @@ To speed up the contribution process, we therefore advice to go through this che
1. For dependency injection, OSGi Declarative Services should be used. 1. For dependency injection, OSGi Declarative Services should be used.
1. OSGi Declarative Services should be declared using annotations. The IDE will take care of the service *.xml file creation. See the official OSGi documentation for an [example here](http://enroute.osgi.org/services/org.osgi.service.component.html). We always use `@Activate`, `@Deactivate` and `@Modified` if we define these methods, even if they exist in a super class, to make the code more readable. 1. OSGi Declarative Services should be declared using annotations. The IDE will take care of the service *.xml file creation. See the official OSGi documentation for an [example here](http://enroute.osgi.org/services/org.osgi.service.component.html). We always use `@Activate`, `@Deactivate` and `@Modified` if we define these methods, even if they exist in a super class, to make the code more readable.
1. Packages that contain classes that are not meant to be used by other bundles should have "internal" in their package name. 1. Packages that contain classes that are not meant to be used by other bundles should have "internal" in their package name.
1. [Null annotations](https://wiki.eclipse.org/JDT_Core/Null_Analysis) are used from the Eclipse JDT project. Therefore every bundle should have an **optional** `Import-Package` dependency to `org.eclipse.jdt.annotation`. 1. [Null annotations](https://wiki.eclipse.org/JDT_Core/Null_Analysis) are used from the Eclipse JDT project. `@NonNullByDefault` and `@Nullable` should be used, for details see [Null annotation conventions](conventions.html#null-annotations).
Classes should be annotated by `@NonNullByDefault` and return types, parameter types, generic types etc. are annotated with `@Nullable` only.
Fields that get a static and mandatory reference injected through OSGi Declarative Services can be annotated with
```java
@NonNullByDefault({})
private MyService injectedService;
```
to skip the nullevaluation for these fields.
Fields within `ThingHandler` classes that are initialized within the `initialize()` method may also be annotated like this, because the framework ensures that `initialize()` will be called before any other method. However please watch the scenario where the initialization of the handler fails, because then fields might not have been initialized and using them should be prepended by a `null` check.
There is **no need** for a `@NonNull` annotation because it is set as default.
The transition of existing classes could be a longer process but if you want to use nullness annotation in a class / interface you need to set the default for the whole class and annotate all types that differ from the default.
Test classes do not have to be annotated.
## B. OSGi Bundles ## B. OSGi Bundles
@ -63,7 +50,7 @@ Test classes do not have to be annotated.
1. A few common utility libraries are available that every Eclipse SmartHome based solution has to provide and which can be used throughout the code (and which are made available in the target platform): 1. A few common utility libraries are available that every Eclipse SmartHome based solution has to provide and which can be used throughout the code (and which are made available in the target platform):
- Apache Commons IO (v2.2) - Apache Commons IO (v2.2)
- Apache Commons Lang (v2.6) - Apache Commons Lang (v2.6)
- Google Guava (v10.0.1) - ~~Google Guava (v10.0.1)~~ (historically allowed, to be avoided in new contributions)
## D. Runtime Behavior ## D. Runtime Behavior

View File

@ -137,3 +137,23 @@ Here is a short table demonstrating conversions for the examples above:
| Color | `HSBType` | &bull; `OnOffType` - `OFF` if the brightness level in the `HSBType` equals 0, `ON` otherwise <br/> &bull; `PercentType` - the value for the brightness level in the `HSBType` | | Color | `HSBType` | &bull; `OnOffType` - `OFF` if the brightness level in the `HSBType` equals 0, `ON` otherwise <br/> &bull; `PercentType` - the value for the brightness level in the `HSBType` |
| Dimmer | `PercentType` | `OnOffType` - `OFF` if the brightness level indicated by the percent type equals 0, `ON` otherwise | | Dimmer | `PercentType` | `OnOffType` - `OFF` if the brightness level indicated by the percent type equals 0, `ON` otherwise |
| Rollershutter | `PercentType` | `UpDownType` - `UP` if the shutter level indicated by the percent type equals 0, `DOWN` if it equals 100, and `UnDefType.UNDEF` for any other value| | Rollershutter | `PercentType` | `UpDownType` - `UP` if the shutter level indicated by the percent type equals 0, `DOWN` if it equals 100, and `UnDefType.UNDEF` for any other value|
## Item Metadata
Sometimes additional information is required to be attached to items for certain use-cases.
This could be e.g. an application which needs some hints in order to render the items in a generic way or an integration with voice controlled assistants or any other services which access the items and need to understand their "meaning".
For this purpose, such meta-information can be attached to items using disjunct namespaces so they won't conflict with each other.
Each metadata entry has a main value and optionally additional key/value pairs.
There can be metadata attached to an item for as many namespaces as desired, like in the following example:
Switch "My Fan" { homekit="Fan.v2", alexa="Fan" [ type="oscillating", speedSteps=3 ] }
The metadata can alternatively maintained via a dedicated REST endpoint and is included in the `EnrichedItemDTO` responses.
Extensions which can infer some metadata automatically need to implement an register a `MetadataProvider` service in order to make them available to the system.
They may provision them from any source they like and also dynamically remove or add data.
They are also not restricted to a single namespace.
The `MetadataRegistry` provides access for all extensions which need to read the item metadata programmatically.
It is the central place where additional information about items is kept.

View File

@ -45,7 +45,6 @@ The following table provides an overview of the different statuses:
| UNKNOWN | The handler is fully initialized but due to the nature of the represented device/service it cannot really tell yet whether the thing is ONLINE or OFFLINE. Therefore the thing potentially might be working correctly already and may or may not process commands. But the framework is allowed to send commands, because some radio-based devices may go ONLINE if a command is sent to them. The handler should take care to switch the thing to ONLINE or OFFLINE as soon as possible. | | UNKNOWN | The handler is fully initialized but due to the nature of the represented device/service it cannot really tell yet whether the thing is ONLINE or OFFLINE. Therefore the thing potentially might be working correctly already and may or may not process commands. But the framework is allowed to send commands, because some radio-based devices may go ONLINE if a command is sent to them. The handler should take care to switch the thing to ONLINE or OFFLINE as soon as possible. |
| ONLINE | The device/service represented by a thing is assumed to be working correctly and can process commands. | | ONLINE | The device/service represented by a thing is assumed to be working correctly and can process commands. |
| OFFLINE | The device/service represented by a thing is assumed to be not working correctly and may not process commands. But the framework is allowed to send commands, because some radio-based devices may go back to ONLINE, if a command is sent to them. | | OFFLINE | The device/service represented by a thing is assumed to be not working correctly and may not process commands. But the framework is allowed to send commands, because some radio-based devices may go back to ONLINE, if a command is sent to them. |
| GONE | The device has been removed from the bridge or the network to which it belongs and is no longer available for use. The user can now remove the thing from the system. |
| REMOVING | The device/service represented by a thing should be removed, but the binding did not confirm the deletion yet. Some bindings need to communicate with the device to unpair it from the system. Thing is probably not working and commands can not be processed. | | REMOVING | The device/service represented by a thing should be removed, but the binding did not confirm the deletion yet. Some bindings need to communicate with the device to unpair it from the system. Thing is probably not working and commands can not be processed. |
| REMOVED | This status indicates that the device/service represented by a thing was removed from the external system after the REMOVING was initiated by the framework. Usually this status is an intermediate status because the thing gets removed from the database after this status was assigned. | | REMOVED | This status indicates that the device/service represented by a thing was removed from the external system after the REMOVING was initiated by the framework. Usually this status is an intermediate status because the thing gets removed from the database after this status was assigned. |
@ -82,12 +81,13 @@ The following table lists the different status details for each status:
<tr valign="top"><td>UNKNOWN</td> <td>NONE</td><td>No further status details available.</td></tr> <tr valign="top"><td>UNKNOWN</td> <td>NONE</td><td>No further status details available.</td></tr>
<tr valign="top"><td rowspan="2">ONLINE</td> <td>NONE</td><td>No further status details available.</td></tr> <tr valign="top"><td rowspan="2">ONLINE</td> <td>NONE</td><td>No further status details available.</td></tr>
<tr valign="top"> <td>CONFIGURATION_PENDING</td><td>The thing is waiting to transfer configuration information to a device. Some bindings need to communicate with the device to make sure the configuration is accepted.</td></tr> <tr valign="top"> <td>CONFIGURATION_PENDING</td><td>The thing is waiting to transfer configuration information to a device. Some bindings need to communicate with the device to make sure the configuration is accepted.</td></tr>
<tr valign="top"><td rowspan="6">OFFLINE</td> <td>NONE</td><td>No further status details available.</td></tr> <tr valign="top"><td rowspan="7">OFFLINE</td> <td>NONE</td><td>No further status details available.</td></tr>
<tr valign="top"> <td>COMMUNICATION_ERROR</td><td>Error in communication with the device. This may also be only a temporary error.</td></tr> <tr valign="top"> <td>COMMUNICATION_ERROR</td><td>Error in communication with the device. This may also be only a temporary error.</td></tr>
<tr valign="top"> <td>CONFIGURATION_ERROR</td><td>An issue with the configuration of a thing prevents the communication with the represented device or service. This issue might be solved by reconfiguring the thing.</td></tr> <tr valign="top"> <td>CONFIGURATION_ERROR</td><td>An issue with the configuration of a thing prevents the communication with the represented device or service. This issue might be solved by reconfiguring the thing.</td></tr>
<tr valign="top"> <td>BRIDGE_OFFLINE</td><td>Assuming the thing to be offline because the corresponding bridge is offline.</td></tr> <tr valign="top"> <td>BRIDGE_OFFLINE</td><td>Assuming the thing to be offline because the corresponding bridge is offline.</td></tr>
<tr valign="top"> <td>FIRMWARE_UPDATING</td><td>The thing is currently operating a firmware update.</td></tr> <tr valign="top"> <td>FIRMWARE_UPDATING</td><td>The thing is currently operating a firmware update.</td></tr>
<tr valign="top"> <td>DUTY_CYCLE</td><td>The thing is currently in DUTY_CYCLE state, which means it is blocked for further usage.</td></tr> <tr valign="top"> <td>DUTY_CYCLE</td><td>The thing is currently in DUTY_CYCLE state, which means it is blocked for further usage.</td></tr>
<tr valign="top"> <td>GONE</td><td>The thing has been removed from the bridge or the network to which it belongs and is no longer available for use. The user can now remove the thing from the system.</td></tr>
<tr valign="top"><td>REMOVING</td> <td>NONE</td><td>No further status details available.</td></tr> <tr valign="top"><td>REMOVING</td> <td>NONE</td><td>No further status details available.</td></tr>
<tr valign="top"><td>REMOVED</td> <td>NONE</td><td>No further status details available.</td></tr> <tr valign="top"><td>REMOVED</td> <td>NONE</td><td>No further status details available.</td></tr>
</table> </table>