## Code reuse
-One can place *.groovy files with Groovy classes under `automation/groovy` configuration directory.
+One can place *.groovy files with Groovy classes under `automation/groovy` configuration directory.
Those classes can be imported in JSR-223 scripts or the UI rules action with the usual Groovy `import` statement.
To apply shared code changes, one has to restart the `openHAB Core :: Bundles :: Automation` bundle on the Console or an openHAB instance altogether.
# dimension Temperature inferred
number_item OutdoorTemp, format: "%.1f %unit%", unit: "°F"
-
+
# unit lx, dimension Illuminance, format "%s %unit%" inferred
number_item OutdoorBrightness, state: 10_000 | "lx"
end
wasteCollection.things
```java
-Thing ahawastecollection:collectionSchedule:wasteCollectionSchedule "aha Abfuhrkalender" [ commune="Isernhagen", street="67269@Rosmarinweg+/+Kirchhorst@Kirchhorst", houseNumber="10", houseNumberAddon="", collectionPlace="67269-0010+" ]
+Thing ahawastecollection:collectionSchedule:wasteCollectionSchedule "aha Abfuhrkalender" [ commune="Isernhagen", street="67269@Rosmarinweg+/+Kirchhorst@Kirchhorst", houseNumber="10", houseNumberAddon="", collectionPlace="67269-0010+" ]
```
wasteCollection.items
## Supported Things
-- `service` Amber Electric API
+- `service` Amber Electric API
## Discovery
| electricity-price | Number:EnergyPrice | Current price to import power from the grid
| controlled-load-price | Number:EnergyPrice | Current price to import power for Controlled Load
| feed-in-price | Number:EnergyPrice | Current price to export power to the grid
-| electricity-status | String | Current price status of grid import
+| electricity-status | String | Current price status of grid import
| controlled-load-status | String | Current price status of controlled load import
| feed-in-status | String | Current price status of Feed-In
| nem-time | String | NEM time of last pricing update
Number AmberElectric_Renewables { channel="amberelectric:service:AmberElectric:renewables" }
Switch AmberElectric_Spike { channel="amberelectric:service:AmberElectric:spike" }
```
-
+
### `amberelectric.sitemap`:
```perl
## Discovery
-All relevant thing types should be added automatically to the inbox through the mDNS discovery process.
+All relevant thing types should be added automatically to the inbox through the mDNS discovery process.
In the case of the ShieldTV or PhilipsTV, openHAB will likely create an inbox entry for both a GoogleTV and a ShieldTV or PhilipsTV device.
Only the ShieldTV or PhilipsTV device should be configured, the GoogleTV can be ignored.
## Binding Configuration
-This binding does not require any special configuration files.
+This binding does not require any special configuration files.
This binding does require a PIN login process (documented below) upon first connection.
- KEY_MUTE
- KEY_SUBMIT
-The list above causes an instantanious "press and release" of each button.
+The list above causes an instantanious "press and release" of each button.
If you would like to manually control the press and release of each you may append _PRESS and _RELEASE to the end of each.
(e.g. KEY_FORWARD_PRESS or KEY_FORWARD_RELEASE)
Use KEY_SUBMIT when full text entry is complete to tell the shield to process the line.
KEY_SUBMIT is automatically sent by KEYBOARD when a command is sent to the channel.
-APP will display the currently active app as presented by the AndroidTV.
+APP will display the currently active app as presented by the AndroidTV.
You may also send it a command of the app package name (e.g. com.google.android.youtube.tv) to start/change-to that app.
KEYCODE values are listed at the bottom of this README.
## Pin Code Process
-For the AndroidTV to be successfully accessed an on-screen PIN authentication is required on the first connection.
+For the AndroidTV to be successfully accessed an on-screen PIN authentication is required on the first connection.
To begin the PIN process, send the text "REQUEST" to the pincode channel while watching your AndroidTV.
-CLI Example Usage:
+CLI Example Usage:
```shell
openhab> openhab:androidtv androidtv:googletv:theater pincode REQUEST
Thing argoclima:local:argoHvacLocalDirectEx "Argo HVAC (connected locally) - extended example (with explicit options)" [
hostname="192.168.0.3",
connectionMode="LOCAL_CONNECTION",
- refreshInterval=30,
+ refreshInterval=30,
hvacListenPort=1001,
// Schedule options (these are valid for all thing types)
- schedule1DayOfWeek="[FRI, SAT, SUN, MON]",
- schedule1OnTime="7:35",
+ schedule1DayOfWeek="[FRI, SAT, SUN, MON]",
+ schedule1OnTime="7:35",
schedule1OffTime="18:00",
- schedule2DayOfWeek="[MON, TUE, WED, THU, FRI]",
+ schedule2DayOfWeek="[MON, TUE, WED, THU, FRI]",
schedule2OnTime="15:00",
schedule2OffTime="22:00",
schedule3DayOfWeek="SUN","SAT", //Alternative syntax for the weekdays list
- schedule3OnTime="11:00",
- schedule3OffTime="22:00"
+ schedule3OnTime="11:00",
+ schedule3OffTime="22:00"
//,resetToFactoryDefaults=true //This triggers a one-shot command each time the thing
- // definition is (re)loaded from file.
+ // definition is (re)loaded from file.
// Use only intermittently - it is not designed with prolonged
- // usage via Things text file in mind (mostly a MainUI feature!)
+ // usage via Things text file in mind (mostly a MainUI feature!)
]
//ADVANCED MODES examples
Thing argoclima:local:argoHvacLocalWithPassthroughPlusDirectEx "Argo HVAC (accessible both indirectly and directly, via pass-through mode, with explicit options)" [
hostname="192.168.0.3", // Direct address of the device (reachable from openHAB)
connectionMode="REMOTE_API_PROXY",
-
+
hvacListenPort=1001,
refreshInterval=30,
useLocalConnection=true,
-
+
// Stub server-specific
- stubServerPort=8240,
- stubServerListenAddresses="7d47:86bd:0bfe:0413:4688:4523:4284:5936","192.168.0.195",
- includeDeviceSidePasswordsInProperties="MASKED",
- matchAnyIncomingDeviceIp=false,
+ stubServerPort=8240,
+ stubServerListenAddresses="7d47:86bd:0bfe:0413:4688:4523:4284:5936","192.168.0.195",
+ includeDeviceSidePasswordsInProperties="MASKED",
+ matchAnyIncomingDeviceIp=false,
deviceCpuId="deadbeefdeadbeef", // For direct match to a concrete device (optional)
localDeviceIP="192.168.4.2", // Address in local subnet (used for indirect request matching)
-
+
// Pass-through-specific
oemServerAddress="uisetup.ddns.net",
oemServerPort=80
Thing argoclima:local:argoHvacLocalWithStub "Argo HVAC (accessible both indirectly and directly with a stub) - **RECOMMENDED MODE**" [
hostname="192.168.0.3", // Has to be reachable, since useLocalConnection is true (default)
- connectionMode="REMOTE_API_STUB",
+ connectionMode="REMOTE_API_STUB",
localDeviceIP="192.168.4.2" // Or use matchAnyIncomingDeviceIp=true
]
```
Group GArgoClimaHVACRemote "Ulisse 13 DCI ECO - remote mode" ["HVAC"]
Switch ArgoClimaHVACRemote_Power "Power" <switch> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:ac-controls#power"
+ channel="argoclima:remote:argoHvacRemote:ac-controls#power"
}
String ArgoClimaHVACRemote_Mode "Mode" <climate> (GArgoClimaHVACRemote) ["Control"] {
- channel="argoclima:remote:argoHvacRemote:ac-controls#mode"
+ channel="argoclima:remote:argoHvacRemote:ac-controls#mode"
}
Number:Temperature ArgoClimaHVACRemote_SetTemperature "Set Temperature" <temperature> (GArgoClimaHVACRemote) ["Temperature", "Setpoint"] {
}
Number:Temperature ArgoClimaHVACRemote_CurrentTemperature "Current Temperature" <temperature> (GArgoClimaHVACRemote) ["Temperature", "Measurement"] {
- channel="argoclima:remote:argoHvacRemote:ac-controls#current-temperature"
+ channel="argoclima:remote:argoHvacRemote:ac-controls#current-temperature"
}
String ArgoClimaHVACRemote_FanSpeed "Fan Speed" <fan> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:ac-controls#fan-speed"
+ channel="argoclima:remote:argoHvacRemote:ac-controls#fan-speed"
}
Switch ArgoClimaHVACRemote_EcoMode "Eco Mode" <vacation> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:modes#eco-mode"
+ channel="argoclima:remote:argoHvacRemote:modes#eco-mode"
}
Switch ArgoClimaHVACRemote_TurboMode "Turbo Mode" <party> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:modes#turbo-mode"
+ channel="argoclima:remote:argoHvacRemote:modes#turbo-mode"
}
Switch ArgoClimaHVACRemote_NightMode "Night Mode" <moon> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:modes#night-mode"
+ channel="argoclima:remote:argoHvacRemote:modes#night-mode"
}
String ArgoClimaHVACRemote_ActiveTimer "Active timer" <calendar> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:timers#active-timer"
+ channel="argoclima:remote:argoHvacRemote:timers#active-timer"
}
Number:Time ArgoClimaHVACRemote_DelayTimer "Delay timer value" <time> (GArgoClimaHVACRemote) ["Setpoint"] {
}
Switch ArgoClimaHVACRemote_IFeelEnabled "Use iFeel Temperature" <network> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:settings#ifeel-enabled"
+ channel="argoclima:remote:argoHvacRemote:settings#ifeel-enabled"
}
Switch ArgoClimaHVACRemote_DeviceLights "Device Lights" <light> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:settings#device-lights"
+ channel="argoclima:remote:argoHvacRemote:settings#device-lights"
}
String ArgoClimaHVACRemote_TemperatureDisplayUnit "Temperature Display Unit []" <settings> (GArgoClimaHVACRemote) {
stateDescription="" [ options="SCALE_CELSIUS=°C,SCALE_FAHRENHEIT=°F" ],
commandDescription="" [ options="SCALE_CELSIUS=°C,SCALE_FAHRENHEIT=°F" ],
- channel="argoclima:remote:argoHvacRemote:settings#temperature-display-unit"
+ channel="argoclima:remote:argoHvacRemote:settings#temperature-display-unit"
}
Number:Dimensionless ArgoClimaHVACRemote_EcoPowerLimit "Power limit in eco mode" <price> (GArgoClimaHVACRemote) ["Setpoint"] {
}
String ArgoClimaHVACRemote_ModeEx "Extended Mode" <heating> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:unsupported#mode-ex"
+ channel="argoclima:remote:argoHvacRemote:unsupported#mode-ex"
}
String ArgoClimaHVACRemote_SwingMode "Airflow Direction" <flow> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:unsupported#swing-mode"
+ channel="argoclima:remote:argoHvacRemote:unsupported#swing-mode"
}
Switch ArgoClimaHVACRemote_FilterMode "Filter Mode" <switch> (GArgoClimaHVACRemote) {
- channel="argoclima:remote:argoHvacRemote:unsupported#filter-mode"
+ channel="argoclima:remote:argoHvacRemote:unsupported#filter-mode"
}
```
Default item=GArgoClimaHVACRemote label="All settings"
}
Frame label="⛄ HVAC Modes"
-{
+{
Switch item=ArgoClimaHVACRemote_TurboMode
Switch item=ArgoClimaHVACRemote_NightMode
Switch item=ArgoClimaHVACRemote_EcoMode
}
Frame label="⏲ HVAC timers" {
Selection item=ArgoClimaHVACRemote_ActiveTimer mappings=[
- NO_TIMER="No Timer", DELAY_TIMER="Delay Timer",
+ NO_TIMER="No Timer", DELAY_TIMER="Delay Timer",
SCHEDULE_TIMER_1="Schedule 1", SCHEDULE_TIMER_2="Schedule 2", SCHEDULE_TIMER_3="Schedule 3"
]
Setpoint item=ArgoClimaHVACRemote_DelayTimer minValue=10 maxValue=1190 step=10
## Discovery
-Supported things should be discovered automatically upon receipt of periodic SDDP announcements from the switch.
+Supported things should be discovered automatically upon receipt of periodic SDDP announcements from the switch.
If the thing is not discovered automatically, login to the switch configuration UI and press the "SDDP" button on the "Network" tab to force the switch to send the SDDP announcement.
If "Telnet Login" is enabled in the switch configuration, you will need to set the username and password in the newly discovered thing before a connection can be made.
The `identifyer 'tmpFC0F2C-3960B7EE6'` contains the templates AINs you need for using them in rules.
```text
-Name 'Demo Template', identifyer 'tmpFC0F2C-3960B7EE6', firmware version '0.1'
+Name 'Demo Template', identifyer 'tmpFC0F2C-3960B7EE6', firmware version '0.1'
[aktive] ID 60013, emc 0x0, model 0x0, grouphash=0x0, devicetype 'avm_home_device_type_template', functionbitmask 0x4000, sortid 0, batt perc 255 low 255, pollinterval 0, polltimeout 0, validchangetime: 0
--------------------
```
```java
String CallState "Call State [%s]" { channel="avmfritz:fritzbox:1:call_state" }
-Call IncomingCall "Incoming call: [%1$s to %2$s]" { channel="avmfritz:fritzbox:1:incoming_call" }
+Call IncomingCall "Incoming call: [%1$s to %2$s]" { channel="avmfritz:fritzbox:1:incoming_call" }
Call OutgoingCall "Outgoing call: [%1$s to %2$s]" { channel="avmfritz:fritzbox:1:outgoing_call" }
Call ActiveCall "Call established [%1$s]" { channel="avmfritz:fritzbox:1:active_call" }
String ApplyTemplate "Apply template" { channel="avmfritz:fritzbox:1:apply_template" }
Text item=COMETDECTBattery icon="battery"
Switch item=COMETDECTBatteryLow icon="lowbattery"
}
-
+
Frame label="HAN-FUN Contact" {
Text item=HANFUNContactState
}
# BenQ Projector Binding
This binding is compatible with BenQ projectors that support the control protocol via the built-in Ethernet port, serial port or USB to serial adapter.
-If your projector does not have built-in networking, you can connect to your projector's serial port via a TCP connection using a serial over IP device or by using`ser2net`.
+If your projector does not have built-in networking, you can connect to your projector's serial port via a TCP connection using a serial over IP device or by using`ser2net`.
The manufacturer's guide for connecting to the projector and the control protocol can be found in this document: [LX9215_RS232 Control Guide_0_Windows7_Windows8_WinXP.pdf](https://esupportdownload.benq.com/esupport/Projector/Control%20Protocols/LX9215/LX9215_RS232%20Control%20Guide_0_Windows7_Windows8_WinXP.pdf)
| temperature | Number:Temperature | The measured temperature |
| humidity | Number:Dimensionless | The measured humidity |
-Note: For the `Airthings Wave Gen 1`, only one channel can be updated at each refreshInterval, so it will take refreshInterval x 4 cycles to sequentially update all 4 channels
+Note: For the `Airthings Wave Gen 1`, only one channel can be updated at each refreshInterval, so it will take refreshInterval x 4 cycles to sequentially update all 4 channels
## Example
| outdoorTemperature | Number:Temperature | R | Outdoor temperature from the external unit. Not always supported/reported.
| commCtrlVersion | String | R | Communication Controller Firmware Version
| remoteCtrlVersion | String | R | Remote Controller Firmware Version
-| operationMode | String | R/W | The operation mode of the AC unit. Currently supported values: HEAT, COOL.
+| operationMode | String | R/W | The operation mode of the AC unit. Currently supported values: HEAT, COOL.
| fanSpeed | Number | R/W | This is a "virtual channel" : its value is calculated depending on current operation mode. It is the channel to be used to change the fan speed, whatever the current mode is. Fan speed are from 1 to 5. On BRC1H, the device supports 3 speeds: LOW (1), MEDIUM (2-4), MAX (5). Some BRC1H also support an AUTO (0) mode - but not all of them support it (depending on internal unit).
| setpoint | Number:Temperature | R/W | This is a "virtual channel" : its value is calculated depending on current operation mode. It is the channel to be used to change the setpoint, whatever the current mode is.
| homekitCurrentHeatingCoolingMode | String | R | This channel is a "virtual channel" to be used with the HomeKit add-on to implement Thermostat thing. Values supported are the HomeKit addon ones: Off, CoolOn, HeatOn, Auto.
```java
Dimmer Light_LivingRoom { channel="milight:rgbLed:milight2:4:ledbrightness", channel="bluetooth:ptm215b:bluegiga0:rocker_livingroom:rocker1" [profile="rawrocker-to-on-off"], channel="bluetooth:ptm215b:bluegiga0:rocker_kitchen:rocker1" [profile="rawrocker-to-on-off"] } // We have a combined kitchen / livingroom, so we control the living room lights with switches from the living room and from the kitchen
-Switch Light_Kitchen { channel="hue:group:1:kitchen-bulbs:switch", channel="bluetooth:ptm215b:bluegiga0:rocker_kitchen:rocker2" [profile="rawrocker-to-on-off"] }
+Switch Light_Kitchen { channel="hue:group:1:kitchen-bulbs:switch", channel="bluetooth:ptm215b:bluegiga0:rocker_kitchen:rocker2" [profile="rawrocker-to-on-off"] }
```
# radoneye
-This extension adds support for [RadonEye](http://radonftlab.com/radon-sensor-product/radon-detector/rd200/) radon bluetooth detector.
+This extension adds support for [RadonEye](http://radonftlab.com/radon-sensor-product/radon-detector/rd200/) radon bluetooth detector.
## Supported Things
## Discovery
-As any other Bluetooth device, RadonEye devices are discovered automatically by the corresponding bridge.
+As any other Bluetooth device, RadonEye devices are discovered automatically by the corresponding bridge.
## Thing Configuration
| Channel Type ID | Item Type | Writable | Description |
|--------------------|-----------|:--------:|-------------------------------------------------------------------------|
-| scenario-triggered | String | ☐ | Name of the triggered scenario (e.g. by the Universal Switch Flex) |
+| scenario-triggered | String | ☐ | Name of the triggered scenario (e.g. by the Universal Switch Flex) |
| trigger-scenario | String | ☑ | Name of a scenario to be triggered on the Bosch Smart Home Controller. |
### In-Wall Switch
### User-defined States
-User-defined states enable automations to be better adapted to specific needs and everyday situations.
+User-defined states enable automations to be better adapted to specific needs and everyday situations.
Individual states can be activated/deactivated and can be used as triggers, conditions and actions in automations.
**Thing Type ID**: `user-defined-state`
Smart water leakage detector.
-**Thing Type ID**: `water-detector`
+**Thing Type ID**: `water-detector`
| Channel Type ID | Item Type | Writable | Description |
| -------------------------- | --------- | :------: | ------------------------------------------------- |
## Limitations
No major limitation known.
-Check list of [openhab issues with "boshshc"](https://github.com/openhab/openhab-addons/issues?q=is%3Aissue+boschshc+)
+Check list of [openhab issues with "boshshc"](https://github.com/openhab/openhab-addons/issues?q=is%3Aissue+boschshc+)
## Discovery
logWarn("actions", "Actions not found, check thing ID for the Zone")
return
}
-
+
actions.bypass()
end
```
The openHAB ChatGPT Binding allows openHAB to communicate with the ChatGPT language model provided by OpenAI.
-ChatGPT is a powerful natural language processing (NLP) tool that can be used to understand and respond to a wide range of text-based commands and questions.
+ChatGPT is a powerful natural language processing (NLP) tool that can be used to understand and respond to a wide range of text-based commands and questions.
With this binding, you can use ChatGPT to formulate proper sentences for any kind of information that you would like to output.
## Supported Things
```java
rule "Weather forecast update"
when
- Item Temperature_Forecast_High changed
+ Item Temperature_Forecast_High changed
then
Weather_Announcement.sendCommand("High: " + Temperature_Forecast_High.state + "°C, Low: " + Temperature_Forecast_Low.state + "°C")
end
## Hardware - cm11a
The cm11a is an older device that communicates over a serial interface.
-Most people connect it to a computer using a serial to USB adapter.
+Most people connect it to a computer using a serial to USB adapter.
This binding has been tested with serial port and a serial to USB adapter.
X10 (and thus the cm11a) supports two types of modules.
### Use of serial port
The binding opens the serial port when it starts and keeps it open until the binding is terminated.
-If the serial port is disconnected a reconnect will be attempted the next time it is needed.
+If the serial port is disconnected a reconnect will be attempted the next time it is needed.
Therefore, other applications should not attempt to use the port when OpneHAB is running.
However, another program could load macros into the cm11a before openHAB starts.
These are described further in the following subsections.
-##### query
+##### query
The query the items represents in the native language of your database:
{
correct : true,
data : [
- {
+ {
column1 : value,
column2 : value
},
And it returns an `ActionQueryResult` that has the following properties:
- correct (boolean) : True if the query was executed correctly, false otherwise
-- data (List<Map<String,Object>>): A list where each element is a row that is stored in a map with (columnName,value) entries
+- data (List<Map<String,Object>>): A list where each element is a row that is stored in a map with (columnName,value) entries
- isScalarResult: It returns if the result is scalar one (only one row with one column)
- resultAsScalar: It returns the result as a scalar if possible, if not returns null
Example (using Jython script):
```python
-from core.log import logging, LOG_PREFIX
+from core.log import logging, LOG_PREFIX
log = logging.getLogger("{}.action_example".format(LOG_PREFIX))
map = {"time" : "-2h"}
influxdb = actions.get("dbquery","dbquery:influxdb2:sampleQuery") //Get bridge thing
- **Then** executes the following script action (in that example Jython):
```text
-map = {"time" : "-2h"}
-dbquery = actions.get("dbquery","dbquery:query:myquery")
+map = {"time" : "-2h"}
+dbquery = actions.get("dbquery","dbquery:query:myquery")
dbquery.setQueryParameters(map)
```
Contact Livingroom_Thermostat_WindowOpen "Thermostat Window Open [%s]" { channel="deconz:thermostat:homeserver:livingroom-thermostat:windowopen" }
Switch Livingroom_Thermostat_Locked "Thermostat Locked [%s]" { channel="deconz:thermostat:homeserver:livingroom-thermostat:locked" }
String Livingroom_Thermostat_Mode "Thermostat Mode [%s]" { channel="deconz:thermostat:homeserver:livingroom-thermostat:mode" }
-Dimmer Livingroom_Ceiling "Livingroom Ceiling [%d]" <light> { channel="deconz:dimmablelight:homeserver:livingroom-ceiling:brightness" }
+Dimmer Livingroom_Ceiling "Livingroom Ceiling [%d]" <light> { channel="deconz:dimmablelight:homeserver:livingroom-ceiling:brightness" }
Color Livingroom "Livingroom Light Control" { channel="deconz:lightgroup:homeserver:livingroom:color" }
Switch Entrance_Door "Doorlock" { channel="deconz:doorlock:homeserver:entrance-door:lock" }
String Entrance_Siren "Siren [%s]" <alarm> { channel="deconz:warningdevice:homeserver:entrance-siren:alert" }
```java
Bridge digitalstrom:dssBridge:dSS [ dSSAddress="urlOfMyDss", userName="dssadmin", password="mySecretPassword", sensorDataUpdateInterval=180] {
- GE GE-KM-200 [ dSID="3504175fe000000000010db9", activePowerRefreshPriority="low", electricMeterRefreshPriority="medium", outputCurrentRefreshPriority="high"]
- SW SW-ZWS-200 [ dSID="3504175fe0000000000651c0"]
- SW SW-UMR-200 [ dSID="302ed89f43f00ec0000a1034"]
- dSiSens200 dS-iSens200 [ dSID="302ed89f43f026800003543d"]
+ GE GE-KM-200 [ dSID="3504175fe000000000010db9", activePowerRefreshPriority="low", electricMeterRefreshPriority="medium", outputCurrentRefreshPriority="high"]
+ SW SW-ZWS-200 [ dSID="3504175fe0000000000651c0"]
+ SW SW-UMR-200 [ dSID="302ed89f43f00ec0000a1034"]
+ dSiSens200 dS-iSens200 [ dSID="302ed89f43f026800003543d"]
zoneTemperatureControl zoneTemperatureControl [ zoneID="livingroom"]
- GR GR-KL220 [ dSID="3504175fe0000000000651c1" ]
- namedScene Scene1 [ zoneID="5", groupID="1", sceneID="5"]
+ GR GR-KL220 [ dSID="3504175fe0000000000651c1" ]
+ namedScene Scene1 [ zoneID="5", groupID="1", sceneID="5"]
circuit circuit1 [ dSID="3504175fe0000010000004e4" ]
GR GR-KL200 [ dSID="3504175fe0000000000651c1" ]
}
{
Frame label="System" {
Frame label="digitalSTROM-Server"{
- Text item=TotalActivePower
- Text item=TotalElectricMeter
+ Text item=TotalActivePower
+ Text item=TotalElectricMeter
}
-
+
Frame label="digitalSTROM-Meter"{
Text item=TotalActivePowerDsm
Text item=TotalElectricMeterDsm
}
}
-
+
Frame label="Climate" {
Frame label="heating/cooling"{
- Switch item=SensorSwitch
+ Switch item=SensorSwitch
}
-
+
Frame label="iSens200"{
Text item=TempIndoor
Text item=HumidityIndoor
}
-
+
Frame label="Target temperature"{
Slider item=Temperature
Text item=Temperature
}
}
-
+
Frame label="Shade"{
Frame label="Rollerschutter"{
- Slider item=Shade
+ Slider item=Shade
Text item=Shade
}
-
+
Frame label="Blind"{
- Slider item=BlindPosition
+ Slider item=BlindPosition
Slider item=BlindAngle
}
}
-
+
Frame label="Scenes"{
Frame label="TV scene"{
- Switch item=Scene
+ Switch item=Scene
}
}
-
+
Frame label="HiFi" {
Frame label="TV light"{
- Slider item=Brightness
+ Slider item=Brightness
Switch item=Brightness
- Text item=ActivePower
- Text item=OutputCurrent
- Text item=ElectricMeter
+ Text item=ActivePower
+ Text item=OutputCurrent
+ Text item=ElectricMeter
}
-
+
Frame label="TV"{
Switch item=DeviceSwitch
}
### DCH-S150 (WiFi motion sensor)
-The binding has been tested with hardware revisions A1 and A2 running firmware version 1.22.
+The binding has been tested with hardware revisions A1 and A2 running firmware version 1.22.
The mydlink Home service is now end of life and the device requires a daily reboot (performed by the binding) to keep it responsive.
## Discovery
Bridge dmx:sacn-bridge:mybridge [ mode="unicast", address="192.168.0.60", universe=2 ] {
color rgb [dmxid="5/3", fadetime=1000, dimtime=10000 ]
dimmer single [dmxid="50", fadetime=1000, turnonvalue="230", turnoffvalue="25" ]
- chaser ampel [dmxid="10,12,13", steps="100:255,0,0:1000|100:255,255,0:500|100:0,0,255:1000|100:0,255,0:500" ]
+ chaser ampel [dmxid="10,12,13", steps="100:255,0,0:1000|100:255,255,0:500|100:0,0,255:1000|100:0,255,0:500" ]
}
```
Frame {
// Color
Colorpicker item=MyColorItem
-
+
// Dimmer
Switch item=MyDimmerItem
Slider item=MyDimmerItem
-
+
// Chaser
Switch item=MyChaserItem
}
These channels can be used to retrieve the current device state and change the controls.
-The input mode can be either be controlled by the "input" string channel, or by writing an ON value to the dedicated switch channels, which represents the physical buttons on the CP750 device.
+The input mode can be either be controlled by the "input" string channel, or by writing an ON value to the dedicated switch channels, which represents the physical buttons on the CP750 device.
| Channel | Type | Read/Write | Description |
|------------|--------|------------|-----------------------------------------------------------------------------------------------------------------|
-| fader | Dimmer | RW | Fader value (0 to 100) |
+| fader | Dimmer | RW | Fader value (0 to 100) |
| mute | Switch | RW | Mute (ON or OFF) |
| input | String | RW | Input channel as string (one of "analog", "dig_1", "dig_2", "dig_3", "dig_4", "non-sync" or "mic") |
| analog | Switch | RW | Is ON if input mode is 'analog'. When an ON command is retrieved, input mode will be changed to this channel. |
## Full Example
-The following example is for a device connected at IP 192.168.1.135 on port 61408 with all channels linked to items.
+The following example is for a device connected at IP 192.168.1.135 on port 61408 with all channels linked to items.
demo.things:
```
The thing blind represents one blind on the eGate. Each blind is represented by an id set on your eGate.
-
+
```java
Thing blind officeBlind "Office" @ "1stFloor" [ id="1"]
```
```java
rule "OneSide up"
-when
- Item Azimuth changed
-then
+when
+ Item Azimuth changed
+then
val azimuth = Math::round((Azimuth.state as DecimalType).intValue)
if (azimuth == 110)
{
return
}
actions.sipHangup()
-
+
var String ringTimeLimit = actions.getRingTimeLimit()
```
Text item=PANEL_ZONE_FAULT label="Zone Fault"
Text item=PANEL_ZONE_TAMPER label="Zone Tamper"
Text item=PANEL_ZONE_LOW_BATTERY label="Zone Low Battery"
- Text item=PANEL_TIME_LOSS label="Panel Time Loss"
+ Text item=PANEL_TIME_LOSS label="Panel Time Loss"
}
}
```javascript
rule "SendKeystrokeStringCommand"
-when
+when
Item SwitchItemName received command ON
-then
+then
SEND_DSC_ALARM_COMMAND.sendCommand("071,1*101#")
end
rule "SendPollingCommand"
-when
+when
Item SwitchItemName received command ON
-then
+then
SEND_DSC_ALARM_COMMAND.sendCommand("000")
end
```
=="2"="#ff9900",
=="1-2"="#ff9900",
=="1"="#ffff00",
- =="0-1"="#00c83c"]
+ =="0-1"="#00c83c"]
Text item=pollenTomorrowEsche
valuecolor=[=="3"="#f00014",
Channel 'dwdunwetter:dwdwarnings:cologne:updated1' triggered NEW
then
// New Warning send a push notification to everyone
-end
+end
```
```\r
\r
transform/ekey_names.map [NO spaces allowed]\r
+\r
```text\r
-1=Unspecified\r
1=JohnDoe\r
```java
Rollershutter Rollershutter1 {channel="elerotransmitterstick:elerochannel:0a0a0a0a:1:control",autoupdate="false" }
-String Rollershutter1State {channel="elerotransmitterstick:elerochannel:0a0a0a0a:1:status" }
+String Rollershutter1State {channel="elerotransmitterstick:elerochannel:0a0a0a0a:1:status" }
```
A sitemap entry looks like this:
| Channel Type ID | Item Type | Description |
|------------------------------------|--------------------|------------------------------------------------------------|
| _Main zone_ | | |
-| main-zone#power | Switch (RW) | Main zone power on/off |
-| main-zone#volume | Dimmer (RW) | Main zone volume in percentage (0 to 100) |
-| main-zone#volume-db | Number (RW) | Main zone volume in dB (-96 to 15) |
-| main-zone#mute | Switch (RW) | Main zone mute |
-| main-zone#source | String (RW) | Main zone input (HDMI1, TUNER, ARC, ...) |
+| main-zone#power | Switch (RW) | Main zone power on/off |
+| main-zone#volume | Dimmer (RW) | Main zone volume in percentage (0 to 100) |
+| main-zone#volume-db | Number (RW) | Main zone volume in dB (-96 to 15) |
+| main-zone#mute | Switch (RW) | Main zone mute |
+| main-zone#source | String (RW) | Main zone input (HDMI1, TUNER, ARC, ...) |
| _Zone 2_ | | |
-| zone2#power | Switch (RW) | Zone 2 power on/off |
-| zone2#volume | Dimmer (RW) | Zone 2 volume in percentage (0 to 100) |
-| zone2#volume-db | Number (RW) | Zone 2 volume in dB (-80 offset) |
+| zone2#power | Switch (RW) | Zone 2 power on/off |
+| zone2#volume | Dimmer (RW) | Zone 2 volume in percentage (0 to 100) |
+| zone2#volume-db | Number (RW) | Zone 2 volume in dB (-80 offset) |
| zone2#mute | Switch (RW) | Zone 2 mute |
| zone2#input | String (RW) | Zone 2 input |
| _General_ | | |
```perl
Group item=emotiva-input label="Processor" icon="receiver" {
Default item=emotiva-power
- Default item=emotiva-mute
- Setpoint item=emotiva-volume
- Default item=emotiva-volume-db step=2 minValue=-96.0 maxValue=15.0
- Selection item=emotiva-source
- Text item=emotiva-mode-surround
+ Default item=emotiva-mute
+ Setpoint item=emotiva-volume
+ Default item=emotiva-volume-db step=2 minValue=-96.0 maxValue=15.0
+ Selection item=emotiva-source
+ Text item=emotiva-mode-surround
Setpoint item=emotiva-speakers-center step=0.5 minValue=-12.0 maxValue=12.0
Default item=emotiva-zone2power
}
Switch item=Socket2\r
Switch item=Socket3\r
Switch item=Socket4\r
- \r
+\r
// Power measurement\r
Number item=Voltage\r
Number item=Current\r
duration_phases = [
37.minutes,
8.minutes,
- 4.minutes,
+ 4.minutes,
2.minutes,
4.minutes,
36.minutes,
0 | "W"
],
-result = eds.calculate_cheapest_period(ZonedDateTime.now.to_instant,
+result = eds.calculate_cheapest_period(ZonedDateTime.now.to_instant,
24.hours.from_now.to_instant,
duration_phases,
consumption_phases)
# In this example we have to provide the total duration to make sure we fit the latest end. This is because there is no
# registered consumption in the last phase.
# Here we are using an alternative way of constructing an array of Durations.
-# The `#minutes` method on an Integer object returns a corresponding Duration object.
+# The `#minutes` method on an Integer object returns a corresponding Duration object.
duration_phases = [37, 8, 4, 2, 4, 36, 41].map { |i| i.minutes }
result = eds.calculate_cheapest_period(ZonedDateTime.now.to_instant,
```perl
sitemap demo label="Enigma2 Demo"
{
- Frame label="Enigma2" {
- Switch item=Enigma2_Power
+ Frame label="Enigma2" {
+ Switch item=Enigma2_Power
Slider item=Enigma2_Volume step=5 minValue=0 maxValue=100
Setpoint item=Enigma2_Volume step=5 minValue=0 maxValue=100
Switch item=Enigma2_Mute
Switch item=Enigma2_RemoteKeys mappings=[FAST_BACKWARD="<<", PLAY=">", PAUSE="||", FAST_FORWARD=">>"]
Switch item=Enigma2_RemoteKeys mappings=[TV="TV", RECORD="O", STOP="[]", RADIO="Radio"]
Switch item=Enigma2_RemoteKeys mappings=[INFO="INFO"]
- }
- Frame label="Enigma2 Messages" {
+ }
+ Frame label="Enigma2 Messages" {
Switch item=Enigma2_SendError mappings=[SEND="SEND"]
Switch item=Enigma2_SendWarning mappings=[SEND="SEND"]
Switch item=Enigma2_SendInfo mappings=[SEND="SEND"]
Âł Note that the soda handles potentially contain a wide range of different sensors and buttons.
However the amount of built-in sensors and buttons may vary between different models.
In case your particular device does not contain one of the potentially supported features the corresponding channel will never trigger an update.
-Please see the manual of your particular model to check which channels should be supported before opening an issue.
+Please see the manual of your particular model to check which channels should be supported before opening an issue.
Furthermore following supporting EEP family is available too: A5-11, types 0x03 (rollershutter position status), 0x04 (extended light status) and D0-06 (battery level indication).
Thing centralCommand cc02 "Dimmer" @ "Living room" [ enoceanId="aabbcc05", senderIdOffset=2, sendingEEPId="A5_38_08_02", receivingEEPId="A5_38_08_02", broadcastMessages=true, suppressRepeating=false ]
Thing rollershutter r01 "Rollershutter" @ "Kitchen" [ enoceanId="aabbcc06", senderIdOffset=3, sendingEEPId="A5_3F_7F_EltakoFSB", receivingEEPId="A5_3F_7F_EltakoFSB", broadcastMessages=true, suppressRepeating=false ] {Channels: Type rollershutter:rollershutter [shutTime=25]}
Thing measurementSwitch ms01 "TV Smart Plug" @ "Living room" [ enoceanId="aabbcc07", senderIdOffset=4, sendingEEPId="D2_01_09", broadcastMessages=false, receivingEEPId="D2_01_09","A5_12_01", suppressRepeating=false, pollingInterval=300]
- Thing classicDevice cd01 "Garage_Light" @ "Garage" [
- senderIdOffset=5,
- sendingEEPId="F6_02_01",
- broadcastMessages=true,
+ Thing classicDevice cd01 "Garage_Light" @ "Garage" [
+ senderIdOffset=5,
+ sendingEEPId="F6_02_01",
+ broadcastMessages=true,
receivingEEPId="F6_02_01",
- suppressRepeating=false
+ suppressRepeating=false
] {
Type virtualSwitchA : virtualSwitchA [duration=300, switchMode="rockerSwitch"]
Type rockerswitchListenerSwitch : Listener1 "Schalter links" [enoceanId="aabbcc08", channel="channelA", switchMode="toggleButtonDir1"]
Dimmer Kitchen_Hue "Hue" <light> {channel="enocean:rockerSwitch:gtwy:rs01:rockerswitchB" [profile="system:rawrocker-to-dimmer"], channel="hue:0220:0017884f6626:9:brightness"}
Rollershutter Kitchen_Rollershutter "Roller shutter" <blinds> (Kitchen) {channel="enocean:rollershutter:gtwy:r01:rollershutter", autoupdate="false"}
Switch Garage_Light "Switch" {
- channel="enocean:classicDevice:gtwy:cd01:virtualRockerswitchA",
- channel="enocean:classicDevice:gtwy:cd01:Listener1",
+ channel="enocean:classicDevice:gtwy:cd01:virtualRockerswitchA",
+ channel="enocean:classicDevice:gtwy:cd01:Listener1",
channel="enocean:classicDevice:gtwy:cd01:Listener2"
}
```
The binding handles the following Things:
-* default holiday data (`holiday`)
-* custom holiday file (`custom`)
-* daysets (`dayset`)
-* weekend (`weekend`)
+- default holiday data (`holiday`)
+- custom holiday file (`custom`)
+- daysets (`dayset`)
+- weekend (`weekend`)
## Discovery
## Thing Configuration
-
### `custom` Thing Configuration
| Name | Type | Description | Default | Required | Advanced |
|-----------------|---------|---------------------------|---------|----------|----------|
| name | text | Name of the dayset used | N/A | yes | no |
-
## Channels
### `weekend` Channels
## Full Example
-### Thing Configuration
+### Thing Example
```java
Thing ephemeris:holiday:local "Holidays"
Thing ephemeris:custom:events "Event" [fileName="events.xml"]
```
-### Item Configuration
+### Item Example
```java
String ToD_Event_Current "Event Today" <calendar> (gEvents) {channel="ephemeris:custom:events:title-today"}
String SprinklerCommandStatus "Command Status [%s]" (gMain) { channel="etherrain:etherrain:sprinkler0:commandstatus" }
String SprinklerOperatingStatus "Operating Status [%s]" (gMain) { channel="etherrain:etherrain:sprinkler0:operatingstatus" }
String SprinklerOperatingResult "Operating Result [%s]" (gMain) { channel="etherrain:etherrain:sprinkler0:operatingresult" }
-
-String SprinklerActiveZone "Active Zone [%s]" (gMain) { channel="etherrain:etherrain:sprinkler0:relayindex" }
+
+String SprinklerActiveZone "Active Zone [%s]" (gMain) { channel="etherrain:etherrain:sprinkler0:relayindex" }
Switch SprinklerRainSensor (gMain) { channel="etherrain:etherrain:sprinkler0:rainsensor" }
-
+
Switch SprinklerExecute (gMain) { channel="etherrain:etherrain:sprinkler0:execute" }
Switch SprinklerClear (gMain) { channel="etherrain:etherrain:sprinkler0:clear" }
```
Those channels exist:
-* 1 per configured loadpoint with `chargerFeatureHeating = false`:
- * These channels point to the heating device that is currently active/connected at/to the loadpoint
- * Please note that you have to replace _\<N\>_ with your loadpoint id/number
-* 1 per configured vehicle:
- * Please note that you have to replace _\<ID\>_ with your vehicle id/name
+- 1 per configured loadpoint with `chargerFeatureHeating = false`:
+ - These channels point to the heating device that is currently active/connected at/to the loadpoint
+ - Please note that you have to replace _\<N\>_ with your loadpoint id/number
+- 1 per configured vehicle:
+ - Please note that you have to replace _\<ID\>_ with your vehicle id/name
| Channel | Type | Read/Write | Description |
|----------------------------------------------------|----------------------|------------|--------------------------------------------------------------------------|
Those channels exist:
-* 1 per configured loadpoint with `chargerFeatureHeating = true`:
- * These channels point to the heating device that is currently active/connected at/to the loadpoint
- * Please note that you have to replace _\<N\>_ with your loadpoint id/number
-* 1 per configured heating device:
- * Please note that you have to replace _\<ID\>_ with your heating device id/name
+- 1 per configured loadpoint with `chargerFeatureHeating = true`:
+ - These channels point to the heating device that is currently active/connected at/to the loadpoint
+ - Please note that you have to replace _\<N\>_ with your loadpoint id/number
+- 1 per configured heating device:
+ - Please note that you have to replace _\<ID\>_ with your heating device id/name
| Channel | Type | Read/Write | Description |
|---------------------------------------------------------|--------------------|------------|-----------------------------------------------------------------------|
}
```
-### demo.items
+### demo.items
```java
// evohome Display
}
Frame label="evohome heating zone" {
- Text label="Temperature" item=DemoZoneTemperature
- Text label="Status" item=DemoZoneSetPointStatus
+ Text label="Temperature" item=DemoZoneTemperature
+ Text label="Status" item=DemoZoneSetPointStatus
Setpoint label="Zone set point" item=DemoZoneSetPoint minValue=5 maxValue=35 step=0.5
}
}
Switch yourcommand_Run {channel="exec:command:yourcommand:run", autoupdate="false"}
// Arguments to be placed for '%2$s' in command line
String yourcommand_Args {channel="exec:command:yourcommand:input"}
-// Output of command line execution
+// Output of command line execution
String yourcommand_Out {channel="exec:command:yourcommand:output"}
```
## Channels
-The FENECON binding currently only provides access to read out the values from the energy storage system.
+The FENECON binding currently only provides access to read out the values from the energy storage system.
| Channel | Type | Read/Write | Description |
|-------------------------------|----------------------|------------|-----------------------------------------------------------------------------|
when
Item EmergencyPowerMode changed to ON
then
- val msg = "🚨 Power blackout detected, emergency power mode running."
+ val msg = "🚨 Power blackout detected, emergency power mode running."
logInfo("PowerBlackout", msg)
sendBroadcastNotification(msg)
end
| sensor-co2-pm25-24-hour-average | Number:Density | R | PM2.5 Air Quality 24 Hour Average (CO2-Sensor) |
| sensor-co2-co2 | Number:Dimensionless | R | CO2 |
| sensor-co2-co2-24-hour-average | Number:Dimensionless | R | CO2 24 Hour Average |
-| leaf-wetness-channel-1 | Number:Dimensionless | R | Leaf Moisture Channel 1 |
+| leaf-wetness-channel-1 | Number:Dimensionless | R | Leaf Moisture Channel 1 |
| leaf-wetness-channel-2 | Number:Dimensionless | R | Leaf Moisture Channel 2 |
| leaf-wetness-channel-3 | Number:Dimensionless | R | Leaf Moisture Channel 3 |
| leaf-wetness-channel-4 | Number:Dimensionless | R | Leaf Moisture Channel 4 |
```java
Bridge fineoffsetweatherstation:gateway:3906700515 "Weather station" [
ip="192.168.1.42",
- port="45000",
+ port="45000",
discoverInterval="900",
pollingInterval="16",
protocol="DEFAULT"
| Battery Level | battery-level | Number:Dimensionless | R | Estimate of percent of remaining battery level |
| Low Battery | low-battery | Switch | R | Indicator of low battery level |
| Last Seen | last-seen | DateTime | R | Date/Time when meter was last seen on the network |
-| Usage Alert | usage-alert | Trigger | n/a | Trigger channel for usage alert notification |
+| Usage Alert | usage-alert | Trigger | n/a | Trigger channel for usage alert notification |
## Full Example
```
Bridge flume:cloud:cloudconnector [ username="xxx", password="xxx", clientId="xxx", clientSecret="xxx" ] {
-
+
meter-device meter [ id="xxx" ]
}
```
```
Number:VolumetricFlowRate InstantUsage "Instant Usage" { channel = "flume:meter-device:1:meter:instant-usage" }
Number:Volume CumulativeUsed "Cumulative Used" { channel = "flume:meter-device:1:meter:cumulative-usage" }
-Number:Dimensionless BatteryLevel "Battery Level" { channel = "flume:meter-device:1:meter:battery-level" }
+Number:Dimensionless BatteryLevel "Battery Level" { channel = "flume:meter-device:1:meter:battery-level" }
DateTime LastSeen "Last Seen" { channel = "flume:meter-device:1:meter:last-seen" }
-Switch LowPower "Battery Low Power" { channel = "flume:meter-device:1:meter:low-battery" }
+Switch LowPower "Battery Low Power" { channel = "flume:meter-device:1:meter:low-battery" }
```
`observation.items`:
-<!--
+<!--
# Generated mostly with following ugly python snippet.
# fmiweather:observation:station_Helsinki_Kumpula here is thing with all channels linked
observation = j['fmiweather:observation:station_Helsinki_Kumpula']
for channel in observation['value']['channels']:
channel_id = ':'.join(channel['uid']['segments'])
- label = channel['label']
+ label = channel['label']
item_type = channel['acceptedItemType']
if 'clouds' in channel_id:
unit = '%.0f %unit%'
for item_name_part in channel_name.split('-'):
item_name += item_name_part[0].upper()
item_name += item_name_part[1:]
-
+
print(('{item_type} {item_name} ' +
- '"{label} [{unit}]" {{ channel="{channel_id}" }}').format(**locals()))
+ '"{label} [{unit}]" {{ channel="{channel_id}" }}').format(**locals()))
-->
```java
`forecast.items`:
-<!--
+<!--
# Generated mostly with following ugly python snippet.
# fmiweather:forecast:forecast_Helsinki here is thing with channels linked in 'simple mode'
# on OH3, authentication can be disabled by running "bundle:stop org.openhab.core.io.rest.auth" in the Karaf console
break
else:
raise ValueError('thing not found!')
-
+
prev_group = 'None'
for channel in forecast['channels']:
- group_name, channel_name = channel['uid'].rsplit(':', 1)[-1].split('#')
+ group_name, channel_name = channel['uid'].rsplit(':', 1)[-1].split('#')
channel_id = channel['uid']
label = channel['label'] + group_name.replace('forecast', ' ').replace('Hours', 'hour ')
-
+
item_type = channel['itemType']
if 'cloud' in channel_id:
unit = '%.0f %unit%'
unit = '%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS'
else:
unit = '%.1f %unit%'
-
+
item_name = 'Helsinki'
item_name += group_name[0].upper() + group_name[1:]
for item_name_part in channel_name.split('-'):
item_name += item_name_part[0].upper()
- item_name += item_name_part[1:]
-
+ item_name += item_name_part[1:]
+
icon = ''
if icon == '': icon = '<wind>' if 'wind' in item_name.lower() else ''
if icon == '': icon = '<humidity>' if 'humidity' in item_name.lower() else ''
if icon == '': icon = '<time>' if 'time' in item_name.lower() else ''
if icon == '': icon = '<temperature>' if 'tempe' in item_name.lower() else ''
if icon == '': icon = '<rain>' if 'precipi' in item_name.lower() else ''
-
+
if prev_group != group_name:
print('')
prev_group = group_name
-
-
+
+
print(('{item_type} {item_name} ' +
- '"{label} [{unit}]" {icon} {{ channel="{channel_id}" }}').format(**locals()))
+ '"{label} [{unit}]" {icon} {{ channel="{channel_id}" }}').format(**locals()))
-->
```java
Text item=HelsinkiForecastNowTotalCloudCover
Text item=HelsinkiForecastNowWeatherId
}
-
+
Frame label="Forecast 01 hours" {
Text item=HelsinkiForecastHours01Time
Text item=HelsinkiForecastHours01Temperature
:::warning
Battery control uses the battery management's time-dependent battery control settings of the inverter settings and therefore overrides user-specified time of use settings.
-Please note that user-specified time of use plans cannot be used together with battery control, as battery control will override the user-specified time of use settings.
+Please note that user-specified time of use plans cannot be used together with battery control, as battery control will override the user-specified time of use settings.
:::
The `powerinverter` Thing provides actions to control the battery charging and discharging behaviour of hybrid inverters, such as Symo Gen24 Plus, if username and password are provided in the bridge configuration.
```java
val froniusInverterActions = getActions("fronius", "fronius:powerinverter:mybridge:myinverter")
```
+
:::
::: tab JS
Bridge fronius:bridge:mybridge [hostname="192.168.66.148", refreshInterval=5] {
Thing powerinverter myinverter [deviceId=1]
Thing meter mymeter [deviceId=0]
- Thing ohmpilot myohmpilot [deviceId=0]
+ Thing ohmpilot myohmpilot [deviceId=0]
}
```
Trigger String : my_image_trigger2 [
filename="test.jpg"
]
-}
+}
```
Items:
```java
rule "example trigger rule 1"
when
- Channel 'ftpupload:imagereceiver:images1:image-received' triggered IMAGE_RECEIVED
+ Channel 'ftpupload:imagereceiver:images1:image-received' triggered IMAGE_RECEIVED
then
logInfo("Test","Image received")
end
rule "example trigger rule 2"
when
- Channel 'ftpupload:imagereceiver:images2:my_image_trigger1' triggered IMAGE_RECEIVED
+ Channel 'ftpupload:imagereceiver:images2:my_image_trigger1' triggered IMAGE_RECEIVED
then
logInfo("Test","Image received")
end
```java
rule "example trigger rule"
when
- Channel 'ftpupload:imagereceiver:garagecamera:image-received' triggered IMAGE_RECEIVED
+ Channel 'ftpupload:imagereceiver:garagecamera:image-received' triggered IMAGE_RECEIVED
then
logInfo("Test","Garage motion detected")
end
debouncePeriod=2500
]
Type relay : relay#8 [ // Actionneur porte de garage
- pulse=true
+ pulse=true
]
}
```
Contact input1 "Porte garage ouverte [%s]" <contact> (gIPXInputs) {channel="gce:ipx800v3:ipx:contact#1"}
Contact input2 "Porte garage fermée [%s]" <contact> (gIPXInputs) {channel="gce:ipx800v3:ipx:contact#2"}
-Group gIPXOutputs "Outputs" <output>
+Group gIPXOutputs "Outputs" <output>
Switch output3 "Chaudière" <furnace> (gIPXOutputs) {channel="gce:ipx800v3:ipx:relay#3"}
Switch output4 "Lumière Porche" <light> (gIPXOutputs) {channel="gce:ipx800v3:ipx:relay#4"}
### Generator
-A Generator thing represents an individual generator linked to an account bridge. Multiple generators are supported.
+A Generator thing represents an individual generator linked to an account bridge. Multiple generators are supported.
ThingTypeUID: `generator`
## Discovery
-The MobileLink account bridge must be added manually. Once added, generator things will automatically be added to the inbox.
+The MobileLink account bridge must be added manually. Once added, generator things will automatically be added to the inbox.
## Thing Configuration
Thread.sleep(750)
ContactClosure1.sendCommand(OFF)
isRunning = false
- }
+ }
end
```
GoEChargerMaxCurrent.sendCommand(maxAmp3Phases.intValue)
// logInfo("eCharger", "Set charging limit 3 Phases: " + maxAmp3Phases.intValue + " A")
}
- } else {
+ } else {
if (maxAmp1Phase.intValue >= 6 ) {
// set force state to neutral (Neutral=0, Off=1, On=2)
if (GoEChargerForceState.state != 0) {
| Name | Type | Description | Default | Required | Advanced |
|-----------------|---------|---------------------------------------|---------|----------|----------|
| hostname | text | Hostname or IP address of the device | N/A | yes | no |
-| macAddress | text | MAC address of the device | N/A | yes | no |
+| macAddress | text | MAC address of the device | N/A | yes | no |
| refreshInterval | integer | Interval the device is polled in sec. | 5 | no | yes |
## Channels
```shell
sudo apt-get install pigpiod
-sudo raspi-config
+sudo raspi-config
```
-> Interfacing Options --> Remote GPIO --> YES --> OK --> Finish
Now that Remote GPIO is enabled, get the pigpiod daemon going (even if installed with apt-get):
```shell
-sudo systemctl enable pigpiod
+sudo systemctl enable pigpiod
sudo systemctl start pigpiod
```
Input Channel Reconnect Action determines what happens when the binding reconnects to pigpiod
after a disconnect. This action does not occur on the initial binding connect to pigpiod.
startup.
-
+
- **Do Nothing:** The default, do nothing. Input channels will retain their current value.
- **Refresh Channel:** Issues a refresh command on the input channels. This will refresh the channels from
pigpiod causing the gpio pin state to reflect on the channel state.
Output Channel Connect Action determines what happens when the binding initially connects to pigpiod.
This action only occurs once after binding startup.
-
+
- **Do Nothing:** The default, do nothing. Output channels will retain their default value (UNDEF).
- **All On:** Issues a ON command to all configured output channels.
- **All Off:** Issues a OFF command to all configured output channels.
### Output Channel Disconnect Connect Action
Output Channel Disconnect Connect Action determines what happens when the binding disconnects from pigpiod.
-
+
- **Do Nothing:** he default, do nothing. Input channels will retain their current value.
- **Set Undef:** Sets the output channel states to UNDEF to indicate that pigpiod has disconnected.
Output Channel Reconnect Action determines what happens when the binding reconnects to pigpiod
after a disconnect. This action does not occur on the initial binding connect to pigpiod.
-
+
- **Do Nothing:** The default, do nothing. Output channels will retain their current value.
- **Refresh Channel:** Issues a refresh command on the output channels. This will refresh the channels from
pigpiod causing the gpio pin state to reflect on the channel state. NOTE: This does
Type pigpio-digital-input : GPI6 [ gpioId=6, debouncingTime=50,pullupdown="UP",invert=true ]
Type pigpio-digital-input : GPI13 [ gpioId=13,debouncingTime=50,pullupdown="DOWN",invert=false ]
Type pigpio-digital-input : GPI26 [ gpioId=26,debouncingTime=50,pullupdown="OFF",invert=false ]
- }
+ }
```
demo.items:
rule "Mode changed"
when
Item GreeAirConditioner_Mode changed
-then
+then
if(GreeAirConditioner_Mode.state == "cool" ) {
logInfo("A/C", "Cooling has be turned on")
- }
+ }
end
```
The measured data (energy production, consumptions, etc.) cannot be accessed locally. However, thanks to the pioneer work in the [unl0ck/viessmann-gridbox-connector](https://github.com/unl0ck/viessmann-gridbox-connector) repository, we can retrieve the data from the gridX cloud service using Rest-API calls.
The API is documented [here](https://developer.gridx.ai/reference/).
-This binding polls the "live data" API endpoint to gather the available data from the GridBox.
+This binding polls the "live data" API endpoint to gather the available data from the GridBox.
It creates a GridBox thing with the channels representing the data points of the live data API call.
For connection to the cloud service, account E-Mail and password used to connect to the [GridBox web service](https://mygridbox.viessmann.com/login) are required.
A "system" is the representation of a GridBox together with its connected appliances (PV inverter, heat pump etc.).
The binding will use the first system ID retrieved by a call to the https://api.gridx.de/systems API.
-Also, only the live data API endpoint is supported by the binding as it is the most interesting for openHAB use cases.
+Also, only the live data API endpoint is supported by the binding as it is the most interesting for openHAB use cases.
There is another API endpoint for fetching aggregated measurement data which could be added in the future.
Only the Viessmann GridBox variant is supported, other variants would need adaptions to the OAuth mechanism.
-This binding is not endorsed or supported by Viessmann or gridX.
+This binding is not endorsed or supported by Viessmann or gridX.
Arbitrary breaking changes to the API can happen at any time, resulting in this binding failing to retrieve the data.
## Supported Things
-The following thing can be created with the binding:
+The following thing can be created with the binding:
- `gridbox`: A thing representing the GridBox, tied to an account of the Viessmann GridBox.
| self-sufficiency-rate | Number | R | Ratio of produced energy vs total consumed energy (0.0-1.0). |
| self-supply | Number | R | Power/energy consumed through storage and production. |
| total-consumption | Number | R | Adjusted power/energy of the system including heatpumps and EV charging stations. |
-
-## Full Example
-
-### Thing Configuration
-
-```java
-Thing gridbox:gridbox:901b4766e2 "GridBox" [email="abc@example.com",password="mypassword",refreshInterval=120]
-```
-
-### Item Configuration
+
+## Full Example
+
+### Thing Configuration
+
+```java
+Thing gridbox:gridbox:901b4766e2 "GridBox" [email="abc@example.com",password="mypassword",refreshInterval=120]
+```
+
+### Item Configuration
```java
Number GridBox_PhotovoltaicProduction "PV Production [%.0f W]" {channel="gridbox:gridbox:901b4766e2:photovoltaicProduction"}
Once the action instance has been retrieved, you can invoke the following method:
```php
-growattActions.setupBatteryProgram(int programMode, @Nullable Integer powerLevel, @Nullable Integer stopSOC, @Nullable Boolean enableAcCharging, @Nullable String startTime, @Nullable String stopTime, @Nullable Boolean enableProgram)
+growattActions.setupBatteryProgram(int programMode, @Nullable Integer powerLevel, @Nullable Integer stopSOC, @Nullable Boolean enableAcCharging, @Nullable String startTime, @Nullable String stopTime, @Nullable Boolean enableProgram)
```
The meaning of the method parameters is as follows:
var pauseStartDateTime = (pauseStartState as DateTimeType).getZonedDateTime()
if (pauseStartDateTime.getHour() < 8) {
logWarn("Rules", "Power Pause program shall not start before 08:00h => " + pauseStartDateTime)
- return
+ return
}
val programDuration = Duration.between(now, pauseStartDateTime)
| heaterEnable | Switch | Heater enable | R |
| heaterCurrentSetpoint | Number:Temperature | Heater Current Setpoint | R/W |
-**Item Types Number:Dimensionless should have the units (i.e. %, ppm) defined in the Unit metadata
+**Item Types Number:Dimensionless should have the units (i.e. %, ppm) defined in the Unit metadata
## Full Example
After installing the binding, you will need to manually add the Hayward Connection thing and enter your credentials.
-All pool items can be automatically discovered by scanning the bridge.
+All pool items can be automatically discovered by scanning the bridge.
Goto the inbox and add the things.
## Thing Configuration
-The thing supports one setting labelled `address` which is your street number and name as it appears on Google.
+The thing supports one setting labelled `address` which is your street number and name as it appears on Google.
_For Example:
1 Victoria Street_
```java
rule SomeRule
when
- Channel "helios:ipvario221:gate:keypressed" triggered
+ Channel "helios:ipvario221:gate:keypressed" triggered
then
var actionName = receivedEvent.getEvent()
logInfo("org.openhab","Rule trigger " + actionName)
#### 2. Create Home Connect developer account
1. Create an account at [https://developer.home-connect.com](https://developer.home-connect.com) and login.
-1. Please make sure you've added your associated Home Connect account email at <https://developer.home-connect.com/user/me/edit>. You should fill in your email address, which you use for the official Android or iOS app, at `Default Home Connect User Account for Testing`.
+1. Please make sure you've added your associated Home Connect account email at <https://developer.home-connect.com/user/me/edit>. You should fill in your email address, which you use for the official Android or iOS app, at `Default Home Connect User Account for Testing`.

1. Register / Create an application at [https://developer.home-connect.com/applications](https://developer.home-connect.com/applications)
- _Application ID_: e.g. `openhab-binding`
- _OAuth Flow_: Authorization Code Grant Flow
- - _Home Connect User Account for Testing_: the associated user account email from [Home Connect](https://www.home-connect.com/)
- > **WARNING**: Please don't use your developer account username
+ - _Home Connect User Account for Testing_: the associated user account email from [Home Connect](https://www.home-connect.com/)
+ > **WARNING**: Please don't use your developer account username
- - _Redirect URIs_: add your openHAB URL followed by `/homeconnect`
+ - _Redirect URIs_: add your openHAB URL followed by `/homeconnect`
for example: `http://192.168.178.34:8080/homeconnect` or `https://myhome.domain.com/homeconnect`
- _One Time Token Mode_: keep unchecked
- _Proof Key for Code Exchange_: keep unchecked
-
+
> **NOTE**: You might get an error (`403 - Forbidden`) in case you entered a bare IP of your local openHAB instance. In that case, use your instance's hostname instead (e.g. for openhabian `http://openhabian:8080/homeconnect`) and try again.
-
-1. After your application has been created, you should see the _Client ID_ and _Client Secret_ of the application. Please save these for later.
+
+1. After your application has been created, you should see the _Client ID_ and _Client Secret_ of the application. Please save these for later.

- **client secret:** your application client secret
- **simulator:** false
1. Now navigate to the URL (`Redirct URI`) you've added to your Home Connect application in the previous step (2.3). For example `http://192.168.178.80:8080/homeconnect`.
-1. Please follow the steps shown to authenticate your binding. You can redo this step every time. For example if you have authentication problems, just start wizard again.
-
-
-
-
+1. Please follow the steps shown to authenticate your binding. You can redo this step every time. For example if you have authentication problems, just start wizard again.
+
+
+
+
1. That's it! Now you can use autodiscovery to add devices. Your devices should show up if you start a device scan in the openHAB UI.
## Examples: File based configuration
### In case of error...
-Please check log UI (http(s)://[YOUROPENHAB]:[YOURPORT]/homeconnect) and ask for help in the community forum or on github. Please provide request and event exports.
+Please check log UI (http(s)://[YOUROPENHAB]:[YOURPORT]/homeconnect) and ask for help in the community forum or on github. Please provide request and event exports.

### Rate limit reached
Time in seconds that the controller will be in install mode when a device discovery is initiated (default = 60)
- **unpairOnDeletion**
-If set to true, devices are automatically unpaired from the gateway when their corresponding things are deleted.
+If set to true, devices are automatically unpaired from the gateway when their corresponding things are deleted.
**Warning:** The option "factoryResetOnDeletion" also unpairs a device, so in order to avoid unpairing on deletion completely, both options need to be set to false! (default = false)
- **factoryResetOnDeletion**
If a large number of devices are connected to the gateway, the default buffersize of 2048 kB may be too small for communication with the gateway.
In this case, e.g. the discovery fails.
With this setting the buffer size can be adjusted. The value is specified in kB.
-
+
- **useAuthentication**
Username and password are send to the gateway to authenticate the access to the gateway.
- **bridge** the type, fixed
- **name** the name of the bridge
-### Example
+### Bridge Configuration Example
#### Minimum configuration
**Note:** The HM-Dis-EP-WM55 has only a black and white display and therefore does not support datapoints for colored lines. In addition, only lines 1-3 can be set.
-#### Example
+#### Button Example
Display text at line 1,3 and 5 when the bottom button on the display is pressed
openHAB and the CCU are using different values for the same state of a rollershutter.
Examples: HmIP-BROLL, HmIP-FROLL, HmIP-BBL, HmIP-FBL and HmIP-DRBLI4
+
| | Open | Closed |
| ------- | ---- | ------ |
| openHAB | 0% | 100% |
Text item=hpprinter_printer_djprinter_ink_blackLevel label="Black [%.0f %unit%]"
```
-Black Marker displayed in millilitres - `21 ml`
+Black Marker displayed in millilitres - `21 ml`
_Default_
```perl
Almost all available Hue devices are supported by this binding.
This includes not only the "Friends of Hue", but also products like the LivingWhites adapter.
-Additionally, it is possible to use OSRAM Lightify devices as well as other Zigbee Light Link compatible products, including the IKEA TRĂ…DFRI lights (when updated).
+Additionally, it is possible to use OSRAM Lightify devices as well as other Zigbee Light Link compatible products, including the IKEA TRĂ…DFRI lights (when updated).
Beside bulbs and luminaires the Hue binding also supports some Zigbee sensors.
Currently only Hue specific sensors are tested successfully (Hue Motion Sensor and Hue Dimmer Switch).
Please note that the devices need to be registered with the Hue Bridge before it is possible for this binding to use them.
Controller Things are automatically discovered once an [Account Bridge](#account-bridge-thing) has be properly configured.
The Controller Thing type is the primary way most users will control and monitor their irrigation system.
-This allows full control over zones, sensors and weather forecasts.
+This allows full control over zones, sensors and weather forecasts.
Changes made through this Thing type will be reflected in the Hydrawise mobile and web applications as well as in their reporting modules.
Controller Things require a parent [Account Bridge](#account-bridge-thing)
### Local Thing
-The Local Thing type uses an undocumented API that allows direct HTTP access to an irrigation controller on the user's network.
-This provides a subset of features compared to the Cloud Thing type limited to basic zone control.
+The Local Thing type uses an undocumented API that allows direct HTTP access to an irrigation controller on the user's network.
+This provides a subset of features compared to the Cloud Thing type limited to basic zone control.
Controlling zones through the local API will not be reported back to the cloud service or the Hydrawise mobile/web applications, and reporting functionality will not reflect the locally controlled state.
Local control may not be available on later Hydrawise controller firmware versions.
Use Cases
-- The Local thing can be useful when testing zones, as there is no delay when starting/stopping zones as compared to the cloud API which can take anywhere between 5-15 seconds.
+- The Local thing can be useful when testing zones, as there is no delay when starting/stopping zones as compared to the cloud API which can take anywhere between 5-15 seconds.
- This is also useful if you wish to not use the cloud scheduling at all and use openHAB as the irrigation scheduling system.
#### Local Thing Supported Channel Groups
'X-Mas'='X-Mas'
]
Switch item=Clear mappings=[50="Clear"]
-
+
// only serverNG
Switch item=HyperionEnabled
Switch item=BlackBorderEnabled
Type number : my_test_number "My Test Number" [ resourceId=3988827, direction="ReadOnly" ]
Type rf-device-low-battery : my_low_battery "My Low Battery Warning" [ serialNumber=123456789 ]
Type push-button-trigger : my_test_trigger "My Test Trigger" [ resourceId=3988827, longPressTime=1000 ]
-
+
Type dimmer : inc_resource "Increase resource" [ resourceId=9000001, direction="WriteOnly", commandToReact="INCREASE", pulseWidth=300 ]
Type dimmer : dec_resource "Decrease resource" [ resourceId=9000002, direction="WriteOnly", commandToReact="DECREASE", pulseWidth=300 ]
```java
rule "My test trigger test rule"
when
- Channel 'ihc:controller:elko:my_test_trigger' triggered LONG_PRESS
+ Channel 'ihc:controller:elko:my_test_trigger' triggered LONG_PRESS
then
logInfo("Test","Long press detected")
end
rule "My test trigger test rule 2"
when
- Channel 'ihc:controller:elko:my_test_trigger' triggered
+ Channel 'ihc:controller:elko:my_test_trigger' triggered
then
val String e = receivedEvent.toString.split(' ').get(2).toString
switch e {
> NOTE: If the I/O Linc contact status appears delayed, or returns the wrong value when the sensor changes states, the contact was likely ON (status LED lit) when the modem was linked as a responder.
Examples of this behavior would include: The status remaining CLOSED for up to 3 minutes after the door is opened, or the status remains OPEN for up to three minutes after the garage is opened and immediately closed again.
-To resolve this behavior the I/O Linc will need to be unlinked and then re-linked to the modem with the contact OFF (stats LED off).
+To resolve this behavior the I/O Linc will need to be unlinked and then re-linked to the modem with the contact OFF (stats LED off).
That would be with the door open when using the Insteon garage kit.
### Keypads
Switch item=acVanesUpDown icon="movecontrol" mappings=[AUTO="Stop", 1="1", 2="2", 3="3", 4="4", 5="5", SWING="Swing"]
Switch item=acVanesLeftRight icon="movecontrol" mappings=[AUTO="Stop", 1="1", 2="2", 3="3", 4="4", 5="5", SWING="Swing"]
Setpoint item=acSetPoint icon="temperature" minValue=16 maxValue=28 step=1
- Text item=acAmbientTemp icon="temperature"
+ Text item=acAmbientTemp icon="temperature"
Text item=acOutdoorTemp icon="temperature"
Text item=acErrorStatus
Text item=acErrorCode
Text item=acWifiSignal icon="qualityofservice"
-
+
}
}
```
## Discovery
-The binding does not auto-discover the IoTaWatt device.
+The binding does not auto-discover the IoTaWatt device.
## Thing Configuration
- Absolute movements
- Relative movements
-- Continuous movements
+- Continuous movements
- Presets
To test your cameras compatibility and also to create some preset locations, use a free program called `ONVIF Device Manager` (ODM for short).
<video playsinline autoplay muted controls style="width: 100%; " src="http://openHAB:8080/ipcamera/{cameraUID}/ipcamera.m3u8" />
</div>
</body>
-</html>
+</html>
```
```java
Text label="BabyMonitor" icon="camera"{
- Switch item=BabyCam_GoToPreset icon=movecontrol label="Camera Direction" mappings=[1="Room", 2="Chair", 3="Cot"]
- Text label="Advanced Controls" icon="settings"{
+ Switch item=BabyCam_GoToPreset icon=movecontrol label="Camera Direction" mappings=[1="Room", 2="Chair", 3="Cot"]
+ Text label="Advanced Controls" icon="settings"{
Default item=BabyCam_AutoLED
Default item=BabyCam_AudioAlarmThreshold icon=recorder
Switch item=BabyCam_AudioAlarm
Default item=BabyCam_EnableMotionAlarm
- Default item=BabyCam_MotionAlarm
+ Default item=BabyCam_MotionAlarm
Slider item=BabyCam_Pan icon=movecontrol
Slider item=BabyCam_Tilt icon=movecontrol
Slider item=BabyCam_Zoom icon=zoom
Default item=BabyCam_StartHLSStream
Text label="Mjpeg Stream" icon="camera"{Video url="http://openHAB:8080/ipcamera/BabyCam/ipcamera.mjpeg" encoding="mjpeg"}
Text label="HLS Stream" icon="camera"{Webview url="http://openHAB:8080/ipcamera/BabyCam/ipcamera.m3u8" height=15}
- Video url="http://openHAB:8080/ipcamera/BabyCam/autofps.mjpeg" encoding="mjpeg"
- }
+ Video url="http://openHAB:8080/ipcamera/BabyCam/autofps.mjpeg" encoding="mjpeg"
+ }
```
```java
rule "Kitchen switch IR rule"
when
- Item KitchenIRReceiverTelenetPower received update
+ Item KitchenIRReceiverTelenetPower received update
then
createTimer(now.plusSeconds(5)) [|
KitchenIRBlasterSamsung.sendCommand("samsung,power")
{
Type switch-r : DpId001 "Störung Heizgerät" [id=1, type="1.001"]
Type number-r : DpId002 "Betriebsart" [id=2, type="20.105"]
- Type percentage-r : DpId003 "Brennerleistung" [id=3, type="5.001"]
- Type temperature-r : DpId004 "Kesseltemperatur" [id=4, type="9.001"]
- Type temperature-r : DpId006 "RĂĽcklauftemperatur" [id=6, type="9.001"]
- Type temperature-r : DpId007 "Warmwassertemperatur" [id=7, type="9.001"]
- Type temperature-r : DpId008 "AuĂźentemperatur" [id=8, type="9.001"]
- Type switch-r : DpId009 "Status Flamme" [id=9, type="1.001"]
- Type temperature-r : DpId013 "Anlagendruck" [id=13, type="9.006"]
- Type switch-r : DpId053 "Störung Systemmodul" [id=53, type="1.001"]
- Type temperature-r : DpId054 "AuĂźentemperatur Systemmodul" [id=54, type="9.001"]
- Type temperature-rw : DpId056 "Sollwert Warmwasser" [id=56, type="9.001"]
- Type mode-rw : DpId057 "Betriebsart Heizkreis" [id=57, type="20.102"]
- Type mode-rw : DpId058 "Betriebsart Warmwasser" [id=58, type="20.103"]
- Type temperature-rw : DpId065 "Sollwertverschiebung" [id=65, type="9.002"]
- Type switch-rw : DpId148 "CML Störung" [id=148, type="1.001"]
- Type mode-rw : DpId149 "CWL Betriebsart" [id=149, type="20.102"]
- Type percentage-r : DpId163 "CWL LĂĽftungsstufe" [id=163, type="5.001"]
- Type temperature-r : DpId164 "CWL Ablufttemperatur" [id=164, type="9.001"]
+ Type percentage-r : DpId003 "Brennerleistung" [id=3, type="5.001"]
+ Type temperature-r : DpId004 "Kesseltemperatur" [id=4, type="9.001"]
+ Type temperature-r : DpId006 "RĂĽcklauftemperatur" [id=6, type="9.001"]
+ Type temperature-r : DpId007 "Warmwassertemperatur" [id=7, type="9.001"]
+ Type temperature-r : DpId008 "AuĂźentemperatur" [id=8, type="9.001"]
+ Type switch-r : DpId009 "Status Flamme" [id=9, type="1.001"]
+ Type temperature-r : DpId013 "Anlagendruck" [id=13, type="9.006"]
+ Type switch-r : DpId053 "Störung Systemmodul" [id=53, type="1.001"]
+ Type temperature-r : DpId054 "AuĂźentemperatur Systemmodul" [id=54, type="9.001"]
+ Type temperature-rw : DpId056 "Sollwert Warmwasser" [id=56, type="9.001"]
+ Type mode-rw : DpId057 "Betriebsart Heizkreis" [id=57, type="20.102"]
+ Type mode-rw : DpId058 "Betriebsart Warmwasser" [id=58, type="20.103"]
+ Type temperature-rw : DpId065 "Sollwertverschiebung" [id=65, type="9.002"]
+ Type switch-rw : DpId148 "CML Störung" [id=148, type="1.001"]
+ Type mode-rw : DpId149 "CWL Betriebsart" [id=149, type="20.102"]
+ Type percentage-r : DpId163 "CWL LĂĽftungsstufe" [id=163, type="5.001"]
+ Type temperature-r : DpId164 "CWL Ablufttemperatur" [id=164, type="9.001"]
Type temperature-r : DpId165 "CWL Zulufttemperatur" [id=165, type="9.001"]
Type flowrate-r : DpId166 "CWL Luftdurchsatz Zuluft" [id=166, type="13.002"]
Type flowrate-r : DpId167 "CWL Luftdurchsatz Abluft" [id=167, type="13.002"]
- Type switch-r : DpId192 "CML Filterwarnung" [id=192, type="1.001"]
+ Type switch-r : DpId192 "CML Filterwarnung" [id=192, type="1.001"]
}
```
```perl
Frame label="Heizung"
-{
+{
Text item=ISM_HeizungSysStoerung icon="siren"
Text item=ISM_HeizungStoerung icon="siren"
Text item=ISM_HeizungAussentemperatur icon="temperature"
Setpoint item=ISM_HeizungSollwertverschiebung icon="radiator" minValue=-5 maxValue=5 step=1
}
Frame label="Wasser"
-{
+{
Text item=ISM_HeizungWarmwassertemperatur icon="temperature_hot"
Setpoint item=ISM_HeizungSollwertWarmwasser icon="temperature" minValue=40 maxValue=60 step=1
Selection item=ISM_HeizungBetriebsartWarmwasser icon="faucet" mappings=[0="Auto", 1="Legionellen Schutz", 2="Normal", 3="Eco", 4="Frost Schutz"]
}
Frame label="LĂĽftung"
-{
- Text item=ISM_LueftungStoerung icon="siren"
+{
+ Text item=ISM_LueftungStoerung icon="siren"
Selection item=ISM_LueftungBetriebsart icon="fan" mappings=[0="Auto", 1="Minimum", 2="Reduziert", 3="Normal", 4="Intensiv"]
Text item=ISM_LueftungLueftungsstufe icon="qualityofservice"
Text item=ISM_LueftungFilterwarnung icon="siren"
```java
rule "Alarm"
-when
- Item ArmSectionA changed or Item ArmSectionAB changed or Item ArmSectionABC changed or
+when
+ Item ArmSectionA changed or Item ArmSectionAB changed or Item ArmSectionABC changed or
System started
then
if( ArmSectionA.state == ON || ArmSectionAB.state == ON || ArmSectionABC.state == ON)
## Supported Things
All movie player components including the original K-Player series, M Class Players, Cinema One, Alto, and Strato are supported.
-It is important to choose the correct thing type to ensure the available channels are correct for the component being used.
+It is important to choose the correct thing type to ensure the available channels are correct for the component being used.
-The supported thing types are:
-`player` Any KPlayer, M Class [M300, M500, M700] or Cinema One 1st Gen player
-`cinemaone` Cinema One (2nd Gen)
-`alto`
-`strato` Includes Strato, Strato S, Strato C or Strato V
+The supported thing types are:
+`player` Any KPlayer, M Class [M300, M500, M700] or Cinema One 1st Gen player
+`cinemaone` Cinema One (2nd Gen)
+`alto`
+`strato` Includes Strato, Strato S, Strato C or Strato V
-The binding supports either a TCP/IP connection or direct serial port connection (19200-8-N-1) to the Kaleidescape component.
+The binding supports either a TCP/IP connection or direct serial port connection (19200-8-N-1) to the Kaleidescape component.
## Discovery
when
Item z1_Ui_MovieLocation changed from "Main content" to "End Credits"
then
- // fade the lights up slowly while the credits are rolling
+ // fade the lights up slowly while the credits are rolling
lightPercent = 0
while (lightPercent < 100) {
lightPercent = lightPercent + 5
logInfo("k rules", "lights at " + lightPercent.toString + " percent")
// myLightItem.sendCommand(lightPercent)
- Thread::sleep(5000)
+ Thread::sleep(5000)
}
end
```java
Number:Dimensionless KebaCurrentRange "Maximum supply current [%.1f %%]" {channel="keba:kecontact:1:maxpresetcurrentrange"}
Number:ElectricCurrent KebaCurrent "Maximum supply current [%.3f A]" {channel="keba:kecontact:1:maxpresetcurrent"}
-Number:ElectricCurrent KebaSystemCurrent "Maximum system supply current [%.3f A]" {channel="keba:kecontact:1:maxsystemcurrent"}
-Number:ElectricCurrent KebaFailSafeCurrent "Failsafe supply current [%.3f A]" {channel="keba:kecontact:1:failsafecurrent"}
+Number:ElectricCurrent KebaSystemCurrent "Maximum system supply current [%.3f A]" {channel="keba:kecontact:1:maxsystemcurrent"}
+Number:ElectricCurrent KebaFailSafeCurrent "Failsafe supply current [%.3f A]" {channel="keba:kecontact:1:failsafecurrent"}
Number KebaState "Operating State [%s]" {channel="keba:kecontact:1:state"}
Switch KebaEnabledSystem "Enabled (System)" {channel="keba:kecontact:1:enabledsystem"}
-Switch KebaEnabledUser "Enabled (User)" {channel="keba:kecontact:1:enableduser"}
+Switch KebaEnabledUser "Enabled (User)" {channel="keba:kecontact:1:enableduser"}
Switch KebaWallboxPlugged "Plugged into wallbox" {channel="keba:kecontact:1:wallbox"}
Switch KebaVehiclePlugged "Plugged into vehicle" {channel="keba:kecontact:1:vehicle"}
Switch KebaPlugLocked "Plug locked" {channel="keba:kecontact:1:locked"}
| position | Group address of the absolute position | 5.001 |
| increaseDecrease | Group address for relative movement | 3.007 |
-##### Channel Type `number`, `number-control`
+##### Channel Type `number`, `number-control`
| Parameter | Description | Default DPT |
|-----------|---------------|-------------|
|||
| 232.600 | HSBType (color) | RGB |
| 232.60000 | HSBType (color) | Non-Standard, DPT 232.600 with HSB instead of RGB data |
-|||
+|||
| 235.001 | QuantityType\<> (number) (Number:ActiveEnergy) | Composed DPT 235.001, first element ActiveEnergy (Wh), read only |
| 235.61001 | DecimalType (number) | Non-Standard, composed DPT 235.001, second element Tariff (plain number), read only |
|||
Thing device generic {
Type switch-control : controlSwitch "Control Switch" [ ga="3/3/10+<3/3/11" ] // '<' signs are allowed but will be ignored for control Channels
Type dimmer-control : controlDimmer "Control Dimmer" [ switch="3/3/50+3/3/48", position="3/3/46", increaseDecrease="3/3/49", frequency=300 ]
- Type color : controlColorLight "Color" [ hsb="6/0/10", switch="6/0/12", position="6/0/14",
+ Type color : controlColorLight "Color" [ hsb="6/0/10", switch="6/0/12", position="6/0/14",
Type rollershutter-control : controlRollershutter "Control Rollershutter" [ upDown="3/4/1+3/4/2", stopMove="3/4/3", position="3/4/4" ]
Type number-control : controlNumber "Control Number" [ ga="1/2/2" ]
Type string-control : controlString "Control String" [ ga="1/4/2" ]
It can also be used to blink lights.
A note about the Alarm Panel Pro.
-Zones 1-8 can be configured for any Channel-Types.
+Zones 1-8 can be configured for any Channel-Types.
Zones 9-12, out1, alarm1 and out2/alarm2 can only be configured as an actuator.
For more information, see: <https://help.konnected.io/support/solutions/articles/32000028978-alarm-panel-pro-inputs-and-outputs>
```java
Number:Power GridOutputPower "Grid Output Power" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridOutputPower" }
Number:Energy YieldDaySecondGen "PV Output Power Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:yieldDaySecondGen" }
-Number:Energy YieldTotalSecondGen "PV Output Power Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:yieldTotalSecondgen" }
+Number:Energy YieldTotalSecondGen "PV Output Power Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:yieldTotalSecondgen" }
Number:Dimensionless OperatingStatus "Operating Status" <energy> { channel="kostalinverter:piko1020:mypiko1020:operatingStatus" }
Number:ElectricPotential GridVoltageL1 "Grid Voltage L1" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridVoltageL1" }
Number:ElectricCurrent GridCurrentL1 "Grid Current L1" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridCurrentL1" }
Number:Power PhaseSelHomeConsumpL3 "Phase Sel Home Consump L3" <energy> { channel="kostalinverter:piko1020:mypiko1020:phaseSelHomeConsumpL3" }
Number:Frequency GridFreq "Grid Freq" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridFreq" }
Number:Angle GridCosPhi "Grid Cos Phi" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridCosPhi" }
-Number:Energy HomeConsumptionDay "Home Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionDay" }
-Number:Energy OwnConsumptionDay "Own Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionDay" }
-Number:Dimensionless OwnConsRateDay "Own Cons Rate Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateDay" }
+Number:Energy HomeConsumptionDay "Home Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionDay" }
+Number:Energy OwnConsumptionDay "Own Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionDay" }
+Number:Dimensionless OwnConsRateDay "Own Cons Rate Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateDay" }
Number:Dimensionless AutonomyDegreeDay "Autonomy Degree Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:autonomyDegreeDay" }
-Number:Energy HomeConsumptionTotal "Home Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionTotal" }
-Number:Energy OwnConsumptionTotal "Own Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionTotal" }
+Number:Energy HomeConsumptionTotal "Home Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionTotal" }
+Number:Energy OwnConsumptionTotal "Own Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionTotal" }
Number:Time OperatingTimeTotal "Operating Time Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:operatingTimeTotal" }
Number:ElectricCurrent Current "Current" <energy> { channel="kostalinverter:piko1020:mypiko1020:current" }
Number:Dimensionless CurrentDir "Current Dir" <energy> { channel="kostalinverter:piko1020:mypiko1020:currentDir" }
Number:Temperature BatteryTemperature "BatteryTemperature" <energy> { channel="kostalinverter:piko1020:mypiko1020:batteryTemperature" }
Number:Time Loginterval "Log Interval" <energy> { channel="kostalinverter:piko1020:mypiko1020:loginterval" }
Number:Dimensionless S0InPulseCnt "S0 InPulse Cnt" <energy> { channel="kostalinverter:piko1020:mypiko1020:s0InPulseCnt" }
-Number:Dimensionless OwnConsRateTotal "Own Cons Rate Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateTotal" }
-Number:Dimensionless AutonomyDegreeTotal "Autonomy Degree Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:autonomyDegreeTotal" }
+Number:Dimensionless OwnConsRateTotal "Own Cons Rate Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateTotal" }
+Number:Dimensionless AutonomyDegreeTotal "Autonomy Degree Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:autonomyDegreeTotal" }
Number:ElectricPotential BatteryVoltage "Battery Voltage" <energy> { channel="kostalinverter:piko1020:mypiko1020:batteryVoltage" }
Number:Dimensionless BatStateOfCharge "Bat State Of Charge" <energy> { channel="kostalinverter:piko1020:mypiko1020:batStateOfCharge" }
Number:Power SelfConsumption "Self Consumption" <energy> { channel="kostalinverter:piko1020:mypiko1020:selfConsumption" }
Switch SmartBatteryControl "Smart Battery Control" <energy> { channel="kostalinverter:piko1020:mypiko1020:smartBatteryControl" }
Number:Dimensionless MaxDepthOfDischarge "Max Depth Of Discharge" <energy> { channel="kostalinverter:piko1020:mypiko1020:maxDepthOfDischarge" }
Number:Dimensionless ShadowManagement "Shadow Management" <energy> { channel="kostalinverter:piko1020:mypiko1020:shadowManagement" }
-Number:Dimensionless ExternalModuleControl "External Module Control" <energy> { channel="kostalinverter:piko1020:mypiko1020:externalModuleControl" }
+Number:Dimensionless ExternalModuleControl "External Module Control" <energy> { channel="kostalinverter:piko1020:mypiko1020:externalModuleControl" }
```
Item NotifyInfo changed to ON
then
NotifyInfo.postUpdate(OFF)
-
+
logInfo("demo.rules", "Sending info notification")
DeviceNotifyInfo.sendCommand("INFO!")
end
Item NotifyWarning changed to ON
then
NotifyWarning.postUpdate(OFF)
-
+
logInfo("demo.rules", "Sending warning notification")
DeviceNotifyWarning.sendCommand("WARNING!")
end
Item NotifyAlert changed to ON
then
NotifyAlert.postUpdate(OFF)
-
+
logInfo("demo.rules", "Sending alert notification")
DeviceNotifyAlert.sendCommand("ALERT!")
end
Item SetAlarmIn1Min changed to ON
then
SetAlarmIn1Min.postUpdate(OFF)
-
+
logInfo("demo.rules", "Setting alarm for 1 minute from now")
-
+
val cal = Calendar.getInstance()
cal.add(Calendar.MINUTE, 1)
ClockSetAlarm.sendCommand(new DateTimeType(cal))
Item Set2MinTimer changed to ON
then
Set2MinTimer.postUpdate(OFF)
-
+
logInfo("demo.rules", "Configure timer for 2 minutes without starting")
TimerDuration.sendCommand(120)
end
```java
Switch DemoSwitch "Switch" { channel="leapmotion:controller:1:gesture" }
Color RGBLight "RGB Light" { channel="leapmotion:controller:1:gesture" }
-Dimmer DimmedLight "Dimmer [%d %%]" { channel="leapmotion:controller:1:gesture"[profile="leapmotion:dimmer", mode="fingers"] }
+Dimmer DimmedLight "Dimmer [%d %%]" { channel="leapmotion:controller:1:gesture"[profile="leapmotion:dimmer", mode="fingers"] }
```
logInfo("actions", "Actions not found, check thing ID")
return
}
-
+
switch receivedCommand{
case 0: actions.decreaseChannel()
case 1: actions.increaseChannel()
Sometimes a device does not send back a confirmation over the bus having set the correct state.
Some dimmers do the dimming, but do not send back the set brightness level.
To be able to use these devices, you can add the `doesNotReply=true` parameter so that the binding immediately sets the item's state and does not wait for confirmation.
-
+
#### Dimmers
Dimmers support the optional advanced parameters `onLevel`, `onToLast` and `stepPercentage`:
## Thing Configuration
-The thing has a few configuration parameters:
+The thing has a few configuration parameters:
| Parameter | Description |
|-----------------|-----------------------------------------------------------------------|
Text item=VoltageP2
Text item=VoltageP3
}
-
+
}
```
- `EU` : Europe and Rest of World
- `NA` : North America
- `AP` : Asia Pacific
-- `CN` : China
+- `CN` : China
Set `pin` to your Mercedes Me App PIN.
Parameter is *not required*.
Note `pin` is needed for some commands which are affecting **vehicle safety**.
-Commands like _unlock doors_ will result into an _unsafe state_: your vehicle is unlocked and is accessible to everybody.
+Commands like _unlock doors_ will result into an _unsafe state_: your vehicle is unlocked and is accessible to everybody.
Commands protected by PIN
- Open / Ventilate Windows
- Open / Lift Sunroof
-IP `callbackIP` and port `callbackPort` will be auto-detected.
+IP `callbackIP` and port `callbackPort` will be auto-detected.
If you're running on server with more than one network interface please select manually.
### Bridge Authorization
Three steps are needed
-1. Open the mentioned URL like 192.168.x.x:8090/mb-auth
+1. Open the mentioned URL like 192.168.x.x:8090/mb-auth
Opening this URL will request a PIN which will be send to your configured email.
Check your Mail Account if you received the PIN.
Click on _Continue_ to proceed with Step 2.
3. Confirmation shall be shown that authorization was successful.
-In case of non successful authorization check your log for errors.
+In case of non successful authorization check your log for errors.
Below screenshots are illustrating the authorization flow.
### After Bridge Setup
| command-capabilities | String | Command Capabilities | X | | X |
| proto-update | String | Last Vehicle Data Update | X | | X |
-Advanced channels are used to identify problems.
+Advanced channels are used to identify problems.
If you encounter problems with this binding follow the instructions from [Troubleshooting](#troubleshooting) section.
#### Lock Status Mapping
-State
+State
- 0 : Locked
- 1 : Unlocked
-Command
+Command
- 0 : Lock
- 1 : Unlock
Command
-- 0 : Ventilate
+- 0 : Ventilate
- 1 : Close
- 2 : Open
#### Ignition Mapping
-State
+State
- 0 : Off
- 2 : Ready
| sunroof | Number | Sun roof | X | X |
#### Rooftop Mapping
-
+
- 0 : Unlocked
- 1 : Open and locked
- 2 : Closed and locked
#### Rear Right Blind Channel Mapping
- not available yet
-
+
#### Rear Left Blind Channel Mapping
- not available yet
-
+
#### Rear Blind Channel Mapping
- not available yet
Pre-configure selected zone with desired temperature.
Minimum and maximum temperature depends on your local settings either Degree Celsius or Fahrenheit.
-Celsius
+Celsius
- Minimum : 16 °C
- Maximum : 28 °C
Triggers `TEMPERATURECONFIGURE` from [Command Name Mapping](#command-name-mapping)
-#### AC Precondition Control
+#### AC Precondition Control
Triggers `PRECONDSTART` and `PRECONDSTOP` from [Command Name Mapping](#command-name-mapping)
-
+
#### AC Precondition Status Mapping
- 0 : No Request
- 2 : Available after Restart Engine
- 3 : Not Possible, Charging not Finished
- 4 : General Error</option>
-
+
#### Auxiliary Heating Switch
Triggers `AUXHEATSTART` and `AUXHEATSTOP` from [Command Name Mapping](#command-name-mapping)
#### Average Consumption
You can configure different average consumption units like kWh per 100 kilometer or km per kWh.
-In your Mercedes Me App front page
+In your Mercedes Me App front page
-- Burger Menu top left
+- Burger Menu top left
- Last Entry `Settings`
- First Entry `Units`
#### Trip Duration
Shown as String in format `d days, HH:mm`.
-If duration is below 24 hours format is `HH:mm`.
+If duration is below 24 hours format is `HH:mm`.
### ECO Score
| pressure-front-right | Number:Pressure | Tire Pressure Front Right |
| pressure-rear-left | Number:Pressure | Tire Pressure Rear Left |
| pressure-rear-right | Number:Pressure | Tire Pressure Rear Right |
-| sensor-available | Number | Tire Sensor Available |
+| sensor-available | Number | Tire Sensor Available |
| marker-front-left | Number | Tire Marker Front Left |
-| marker-front-right | Number | Tire Marker Front Right |
-| marker-rear-left | Number | Tire Marker Rear Left |
+| marker-front-right | Number | Tire Marker Front Right |
+| marker-rear-left | Number | Tire Marker Rear Left |
| marker-rear-right | Number | Tire Marker Rear Right |
| last-update | DateTime | Timestamp of last Measurement |
## Vehicle Actions
-Actions for `vehicle` [thing}(#vehicle) are provided.
+Actions for `vehicle` [thing}(#vehicle) are provided.
### `sendPOI`
There's a big variety of vehicles with different features and different command capabilities.
During discovery the capabilities of your vehicle are identified.
They are stored in `Vehicle Properties` as shown below.
-You can check in beforehand if features like _Charge Program Configuration_ or _HVAC Configuration_ are supported or not.
+You can check in beforehand if features like _Charge Program Configuration_ or _HVAC Configuration_ are supported or not.
<img src="./doc/OH-capabilities.png" width="500" height="280"/>
-If you want to dive deeper see [Troubleshooting](#troubleshooting) `feature-capabilities` and `command-capabilities` to evaluate the exact capabilities.
+If you want to dive deeper see [Troubleshooting](#troubleshooting) `feature-capabilities` and `command-capabilities` to evaluate the exact capabilities.
## Troubleshooting
In order to be able to analyze problems 3 advanced channels are placed in the vehicle group.
-* `feature-capabilities` - showing which feature your vehicle is equipped with
-* `command-capabilities` - showing which commands can be sent to your vehicle
-* `proto-update` - latest update of your vehicle data
+- `feature-capabilities` - showing which feature your vehicle is equipped with
+- `command-capabilities` - showing which commands can be sent to your vehicle
+- `proto-update` - latest update of your vehicle data
In case you find problems regarding this binding add items to these 3 channels.
The items are reporting Strings in JSON format.
Number EQA_TripAvgConsumption {channel="mercedesme:bev:4711:eqa:trip#cons-ev" }
String EQA_AvgConsumptionUnit {channel="mercedesme:bev:4711:eqa:trip#cons-ev-unit" }
-Number:Angle EQA_Heading {channel="mercedesme:bev:4711:eqa:position#heading" }
+Number:Angle EQA_Heading {channel="mercedesme:bev:4711:eqa:position#heading" }
Location EQA_GPSLocation {channel="mercedesme:bev:4711:eqa:position#gps" }
Number EQA_Signal {channel="mercedesme:bev:4711:eqa:position#signal" }
// send POI from JSON String item
rule "Send POI"
when
- Item POIJsonString changed
+ Item POIJsonString changed
then
// decode JSON
- val json = POIJsonString.state.toString
+ val json = POIJsonString.state.toString
val title = transform("JSONPATH", "$.title", json)
val lat = transform("JSONPATH", "$.latitude", json)
val lon = transform("JSONPATH", "$.longitude", json)
# How to protoc
-- Check [mvn repository](https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util) which version to use
+- Check [mvn repository](https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util) which version to use
- Download correct protoc compiler from [maven central](https://repo1.maven.org/maven2/com/google/protobuf/protoc/) into `PROTOC_DIR`
- Call in mercedesme binding directory `PROTOC_DIR\protoc -I=proto --java_out=gen proto/*.proto`
- Move generated sources including subdirs from `gen` to `3rdparty\java`
# MfFan Binding
-This binding is used to enable communications between openHAB and "Modern Forms" or "WAC Lighting" WIFI connected, smart, ceiling fans.
+This binding is used to enable communications between openHAB and "Modern Forms" or "WAC Lighting" WIFI connected, smart, ceiling fans.
## Supported Things
## Discovery
-Auto discovery is not supported at this time.
+Auto discovery is not supported at this time.
## Thing Configuration
```java
// Replace <GwID> with itemId of gateway from Things file
// Replace <ID> with itemId of item from Things file
-// Gateway
+// Gateway
Switch Gateway_LightSwitch <light> { channel="mihome:gateway:<GwID>:<ID>:brightness" }
Dimmer Gateway_Brightness <dimmablelight> { channel="mihome:gateway:<GwID>:<ID>:brightness" }
Color Gateway_Color <rgb> { channel="mihome:gateway:<GwID>:<ID>:color" }
when
Channel "mihome:sensor_switch:<GwID>:<ID>:button" triggered
then
-
+
switch(receivedEvent) {
case "SHORT_PRESSED": {
<ACTION>
- List your network interfaces `ifconfig | grep MULTICAST` or `ip link | grep MULTICAST`
- Use `tcpdump -i <interface> port 9898` for each interface to verify if you receive traffic
-
+
If you already know the correct interface, or you found the correct one through tcpdump:
- Configure the `interface` property of the `Bridge` Thing with the correct name (for example `eth0`, etc)
Number statusArea "Cleaned Area [%1.0fm²]" <zoom> (gVac,gVacStat) {channel="miio:vacuum:034F0E45:status#clean_area" }
Number statusTime "Cleaning Time [%1.0f']" <clock> (gVac,gVacStat) {channel="miio:vacuum:034F0E45:status#clean_time" }
String statusError "Error [%s]" <error> (gVac,gVacStat) {channel="miio:vacuum:034F0E45:status#error_code" }
-Number statusFanPow "Fan Power [%1.0f%%]" <signal> (gVacStat) {channel="miio:vacuum:034F0E45:status#fan_power" }
+Number statusFanPow "Fan Power [%1.0f%%]" <signal> (gVacStat) {channel="miio:vacuum:034F0E45:status#fan_power" }
Number statusClean "In Cleaning Status [%1.0f]" <switch> (gVacStat) {channel="miio:vacuum:034F0E45:status#in_cleaning" }
Switch statusDND "DND Activated" (gVacStat) {channel="miio:vacuum:034F0E45:status#dnd_enabled" }
-Number statusStatus "Status [%1.0f]" <status> (gVacStat) {channel="miio:vacuum:034F0E45:status#state"}
+Number statusStatus "Status [%1.0f]" <status> (gVacStat) {channel="miio:vacuum:034F0E45:status#state"}
Switch isLocating "Locating" (gVacStat) {channel="miio:vacuum:034F0E45:status#is_locating" }
Number consumableMain "Main Brush [%1.0f]" (gVacCons) {channel="miio:vacuum:034F0E45:consumables#main_brush_time"}
### Heater
-- `macAddress` = network mac address of device in UPPERCASE.
+- `macAddress` = network mac address of device in UPPERCASE.
Can be found in the app by viewing devices. Or you can find it during discovery. Used for heaters connected to a room.
- `heaterId` = id of device/heater, type number (not string)
Use auto discovery to find this value. Used to identify independent heaters or heaters connected to a room.
-- `power` = number of watts this heater is consuming when active.
+- `power` = number of watts this heater is consuming when active.
Used to provide data for the currentPower channel.
Either `macAddres` or `heaterId` must be specified.
Thing home monaco "Penthouse Monaco" [ homeId=100000000000000 ] // Note: numeric value
Thing room office "Office room" [ roomId=200000000000000 ] Note: numeric value
Thing heater office "Office panel heater" [ macAddress="F0XXXXXXXXX", power=900, heaterId=12345 ] Note: heaterId is a numeric value, macAddress in UPPERCASE
-}
+}
```
millheat.items:
Integrates the Home Power Plants from E3/DC GmbH into openHAB.
See [E3DC Website](https://www.e3dc.com/) to find more informations about the device.
-The Power Plant handles all your Electrical Energy Resources like Photovoltaic Producers, Battery Storage, Wallbox Power Supply, Household Consumption and even more.
+The Power Plant handles all your Electrical Energy Resources like Photovoltaic Producers, Battery Storage, Wallbox Power Supply, Household Consumption and even more.
E3DC devices are integrated into the Modbus Binding.
See chapter [Thing Configuration](#thing-configuration) how to set them up or check the [full example Things](#things) for manual setup.
Text item=E3DC_Firmware label="Firmware [%s]"
Text item=E3DC_SerialNumber label="Serial Number[%s]"
}
-
+
Frame label="Power Producer" {
Text item=E3DC_PVPower label="PV Power [%d %unit%]"
Text item=E3DC_BatteryDischarge label="Battery Discharge [%d %unit%]"
Text item=E3DC_SelfConsumptionLevel label="Self Consumption [%d %%]"
Text item=E3DC_BatterySOC label="SOC [%d %%]"
}
-
+
Frame label="Wallbox" {
Switch item=E3DC_WB_Available label="Available [%s]"
Switch item=E3DC_WB_Sunmode label="Sunmode [%s]"
Switch item=E3DC_WB_Relay32A label="Relay 32A [%s]"
Switch item=E3DC_WB_1PhaseCharging label="1-Phase charging [%s]"
}
-
+
Frame label="String 1 Details" {
Text item=E3DC_String1V label="Volt [%d %unit%]"
Text item=E3DC_String1A label="Ampere [%.2f %unit%]"
Text item=E3DC_String3A label="Ampere [%.2f %unit%]"
Text item=E3DC_String3W label="Watt [%d %unit%]"
}
-
+
Frame label="EMS" {
Text item=E3DC_EMS_Status label="Status [%s]"
Switch item=E3DC_EMS_BatteryChargingLock label="Battery Charging Lock [%s]"
```perl
Text label="Heat pumpt" icon="temperature" {
Frame label="Optation Mode" {
- Default item=stiebel_eltron_mode_pump
+ Default item=stiebel_eltron_mode_pump
Default item=stiebel_eltron_mode_heating
- Default item=stiebel_eltron_mode_water
- Default item=stiebel_eltron_mode_cooling
+ Default item=stiebel_eltron_mode_water
+ Default item=stiebel_eltron_mode_cooling
Default item=stiebel_eltron_mode_summer
}
Frame label= "State" {
Text item=Studer_Xtender_Phase1_InputVoltage
Text item=Studer_Xtender_Phase1_InputCurrent
Text item=Studer_Xtender_Phase1_StateInverter
-
+
Chart item=Studer_Xtender_Phase1_InputVoltage period=D refresh=600000
Chart item=Studer_Xtender_Phase1_InputCurrent period=D refresh=30000
Advanced parameters
-| Parameter | Required | Type | Default if omitted | Description |
-| ------------------------------- | -------- | ------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `timeBetweenTransactionsMillis` | | integer | `60` | How long to delay we must have at minimum between two consecutive MODBUS transactions. In milliseconds. |
-| `timeBetweenReconnectMillis` | | integer | `0` | How long to wait to before trying to establish a new connection after the previous one has been disconnected. In milliseconds. |
-| `connectMaxTries` | | integer | `1` | How many times we try to establish the connection. Should be at least 1. |
-| `afterConnectionDelayMillis` | | integer | `0` | Connection warm-up time. Additional time which is spent on preparing connection which should be spent waiting while end device is getting ready to answer first modbus call. In milliseconds. |
-| `reconnectAfterMillis` | | integer | `0` | The connection is kept open at least the time specified here. Value of zero means that connection is disconnected after every MODBUS transaction. In milliseconds. |
-| `connectTimeoutMillis` | | integer | `10000` | The maximum time that is waited when establishing the connection. Value of zero means that system/OS default is respected. In milliseconds. |
-| `enableDiscovery` | | boolean | false | Enable auto-discovery feature. Effective only if a supporting extension has been installed. |
+| Parameter | Required | Type | Default if omitted | Description |
+|---------------------------------|----------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `timeBetweenTransactionsMillis` | | integer | `60` | How long to delay we must have at minimum between two consecutive MODBUS transactions. In milliseconds. |
+| `timeBetweenReconnectMillis` | | integer | `0` | How long to wait to before trying to establish a new connection after the previous one has been disconnected. In milliseconds. |
+| `connectMaxTries` | | integer | `1` | How many times we try to establish the connection. Should be at least 1. |
+| `afterConnectionDelayMillis` | | integer | `0` | Connection warm-up time. Additional time which is spent on preparing connection which should be spent waiting while end device is getting ready to answer first modbus call. In milliseconds. |
+| `reconnectAfterMillis` | | integer | `0` | The connection is kept open at least the time specified here. Value of zero means that connection is disconnected after every MODBUS transaction. In milliseconds. |
+| `connectTimeoutMillis` | | integer | `10000` | The maximum time that is waited when establishing the connection. Value of zero means that system/OS default is respected. In milliseconds. |
+| `enableDiscovery` | | boolean | false | Enable auto-discovery feature. Effective only if a supporting extension has been installed. |
**Note:** Advanced parameters must be equal for all `tcp` things sharing the same `host` and `port`.
Basic parameters
-| Parameter | Type | Required | Default if omitted | Description | |
-| --------- | ------- | -------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- |
-| port | text | âś“ | | Serial port to use, for example `"/dev/ttyS0"` or `"COM1"` | |
-| id | integer | | `1` | Slave id. Also known as station address or unit identifier. See [Wikipedia](https://en.wikipedia.org/wiki/Modbus) and [simplymodbus](https://www.simplymodbus.ca/index.html) articles for more information | |
-| baud | integer | âś“ | | Baud of the connection. Valid values are: `75`, `110`, `300`, `1200`, `2400`, `4800`, `9600`, `19200`, `38400`, `57600`, `115200`. | |
-| stopBits | text | âś“ | | Stop bits. Valid values are: `"1.0"`, `"1.5"`, `"2.0"`. | |
-| parity | text | âś“ | | Parity. Valid values are: `"none"`, `"even"`, `"odd"`. | |
-| dataBits | integer | âś“ | | Data bits. Valid values are: `5`, `6`, `7` and `8`. | |
-| encoding | text | | `"rtu"` | Encoding. Valid values are: `"ascii"`, `"rtu"`, `"bin"`. | |
-| echo | boolean | | `false` | Flag for setting the RS485 echo mode. This controls whether we should try to read back whatever we send on the line, before reading the response. Valid values are: `true`, `false`. | |
+| Parameter | Type | Required | Default if omitted | Description | |
+|-----------|---------|----------|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
+| port | text | âś“ | | Serial port to use, for example `"/dev/ttyS0"` or `"COM1"` | |
+| id | integer | | `1` | Slave id. Also known as station address or unit identifier. See [Wikipedia](https://en.wikipedia.org/wiki/Modbus) and [simplymodbus](https://www.simplymodbus.ca/index.html) articles for more information | |
+| baud | integer | âś“ | | Baud of the connection. Valid values are: `75`, `110`, `300`, `1200`, `2400`, `4800`, `9600`, `19200`, `38400`, `57600`, `115200`. | |
+| stopBits | text | âś“ | | Stop bits. Valid values are: `"1.0"`, `"1.5"`, `"2.0"`. | |
+| parity | text | âś“ | | Parity. Valid values are: `"none"`, `"even"`, `"odd"`. | |
+| dataBits | integer | âś“ | | Data bits. Valid values are: `5`, `6`, `7` and `8`. | |
+| encoding | text | | `"rtu"` | Encoding. Valid values are: `"ascii"`, `"rtu"`, `"bin"`. | |
+| echo | boolean | | `false` | Flag for setting the RS485 echo mode. This controls whether we should try to read back whatever we send on the line, before reading the response. Valid values are: `true`, `false`. | |
Advanced parameters
-| Parameter | Required | Type | Default if omitted | Description |
-| ------------------------------- | -------- | ------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| `receiveTimeoutMillis` | | integer | `1500` | Timeout for read operations. In milliseconds. |
-| `flowControlIn` | | text | `"none"` | Type of flow control for receiving. Valid values are: `"none"`, `"xon/xoff in"`, `"rts/cts in"`. |
-| `flowControlOut` | | text | `"none"` | Type of flow control for sending. Valid values are: `"none"`, `"xon/xoff out"`, `"rts/cts out"`. |
-| `timeBetweenTransactionsMillis` | | integer | `35` | How long to delay we must have at minimum between two consecutive MODBUS transactions. In milliseconds. |
-| `connectMaxTries` | | integer | `1` | How many times we try to establish the connection. Should be at least 1. |
-| `afterConnectionDelayMillis` | | integer | `0` | Connection warm-up time. Additional time which is spent on preparing connection which should be spent waiting while end device is getting ready to answer first modbus call. In milliseconds. |
-| `connectTimeoutMillis` | | integer | `10000` | The maximum time that is waited when establishing the connection. Value of zero means thatsystem/OS default is respected. In milliseconds. |
-| `enableDiscovery` | | boolean | false | Enable auto-discovery feature. Effective only if a supporting extension has been installed. |
+| Parameter | Required | Type | Default if omitted | Description |
+|---------------------------------|----------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `receiveTimeoutMillis` | | integer | `1500` | Timeout for read operations. In milliseconds. |
+| `flowControlIn` | | text | `"none"` | Type of flow control for receiving. Valid values are: `"none"`, `"xon/xoff in"`, `"rts/cts in"`. |
+| `flowControlOut` | | text | `"none"` | Type of flow control for sending. Valid values are: `"none"`, `"xon/xoff out"`, `"rts/cts out"`. |
+| `timeBetweenTransactionsMillis` | | integer | `35` | How long to delay we must have at minimum between two consecutive MODBUS transactions. In milliseconds. |
+| `connectMaxTries` | | integer | `1` | How many times we try to establish the connection. Should be at least 1. |
+| `afterConnectionDelayMillis` | | integer | `0` | Connection warm-up time. Additional time which is spent on preparing connection which should be spent waiting while end device is getting ready to answer first modbus call. In milliseconds. |
+| `connectTimeoutMillis` | | integer | `10000` | The maximum time that is waited when establishing the connection. Value of zero means thatsystem/OS default is respected. In milliseconds. |
+| `enableDiscovery` | | boolean | false | Enable auto-discovery feature. Effective only if a supporting extension has been installed. |
With the exception of `id` parameters should be equal for all `serial` things sharing the same `port`.
You must give each of your bridge Things a reference (thing ID) that is unique for this binding.
| Parameter | Type | Required | Default if omitted | Description |
-| ------------- | ------- | -------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|---------------|---------|----------|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `start` | integer | | `0` | Address of the first register, coil, or discrete input to poll. Input as zero-based index number. |
-| `length` | integer | âś“ | (-) | Number of registers, coils or discrete inputs to read. Note that protocol limits max length, depending on type |
+| `length` | integer | âś“ | (-) | Number of registers, coils or discrete inputs to read. Note that protocol limits max length, depending on type |
| `type` | text | âś“ | (-) | Type of modbus items to poll. This matches directly to Modbus request type or function code (FC). Valid values are: `"coil"` (FC01), `"discrete"` (FC02), `"holding"`(FC03), `"input"` (FC04). |
| `refresh` | integer | | `500` | Poll interval in milliseconds. Use zero to disable automatic polling. |
| `maxTries` | integer | | `3` | Maximum tries when reading. <br /><br />Number of tries when reading data, if some of the reading fail. For single try, enter 1. |
See [Full examples](#full-examples) section for practical examples.
-#### `bit`:
+#### `bit`
- a single bit is read from the registers
- address is given as `X.Y`, where `Y` is between 0...15 (inclusive), representing bit of the register `X`
- index `Y=0` refers to the least significant bit
- index `Y=1` refers to the second least significant bit, etc.
-#### `int8`:
+#### `int8`
- a byte (8 bits) from the registers is interpreted as signed integer
- address is given as `X.Y`, where `Y` is between 0...1 (inclusive), representing byte of the register `X`
- index `Y=1` refers to high byte
- it is assumed that each high and low byte is encoded in most significant bit first order
-#### `uint8`:
+#### `uint8`
- same as `int8` except value is interpreted as unsigned integer
-#### `int16`:
+#### `int16`
- register with index is interpreted as 16 bit signed integer.
- it is assumed that register is encoded in most significant bit first order
-#### `uint16`:
+#### `uint16`
- same as `int16` except value is interpreted as unsigned integer
-#### `int32`:
+#### `int32`
- registers `index` and `(index + 1)` are interpreted as signed 32bit integer
- it assumed that the first register contains the most significant 16 bits
- it is assumed that each register is encoded in most significant bit first order
-#### `uint32`:
+#### `uint32`
- same as `int32` except value is interpreted as unsigned integer
-#### `float32`:
+#### `float32`
- registers `index` and `(index + 1)` are interpreted as signed 32bit floating point number
- it assumed that the first register contains the most significant 16 bits
- it is assumed that each register is encoded in most significant bit first order
-#### `int64`:
+#### `int64`
- registers `index`, `(index + 1)`, `(index + 2)`, `(index + 3)` are interpreted as signed 64bit integer.
- it assumed that the first register contains the most significant 16 bits
- it is assumed that each register is encoded in most significant bit first order
-#### `uint64`:
+#### `uint64`
- same as `int64` except value is interpreted as unsigned integer
If you get strange values using the `int32`, `uint32`, `float32`, `int64`, or `uint64` valuetypes then just try the `int32_swap`, `uint32_swap`, `float32_swap`, `int64_swap`, or `uint64_swap` valuetype, depending upon what your data type is.
-#### `int32_swap`:
+#### `int32_swap`
- registers `index` and `(index + 1)` are interpreted as signed 32bit integer
- it assumed that the first register contains the least significant 16 bits
- it is assumed that each register is encoded in most significant bit first order (Big Endian)
-#### `uint32_swap`:
+#### `uint32_swap`
- same as `int32_swap` except value is interpreted as unsigned integer
-#### `float32_swap`:
+#### `float32_swap`
- registers `index` and `(index + 1)` are interpreted as signed 32bit floating point number
- it assumed that the first register contains the least significant 16 bits
- it is assumed that each register is encoded in most significant bit first order (Big Endian)
-#### `int64_swap`:
+#### `int64_swap`
- same as `int64` but registers swapped, that is, registers (index + 3), (index + 2), (index + 1), (index + 1) are interpreted as signed 64bit integer
-#### `uint64_swap`:
+#### `uint64_swap`
- same as `uint64` except value is interpreted as unsigned integer
## Supported Things
Monoprice 10761 & 39261 or Dayton Audio DAX66 amplifiers use the `amplifier` thing id. Up to 18 zones with 3 linked amps and 6 source inputs are supported.
-Note: Compatible clones from McLELLAND, Factor, Soundavo, etc. should work as well.
+Note: Compatible clones from McLELLAND, Factor, Soundavo, etc. should work as well.
-***The following thing types were implemented via available documentation only and have not been tested. Please open an issue for any bugs found when using these thing types.***
+***The following thing types were implemented via available documentation only and have not been tested. Please open an issue for any bugs found when using these thing types.***
-Monoprice 44519 4 zone variants use the `monoprice4` thing id. Up to 12 zones with 3 linked amps and 6 source inputs are supported.
+Monoprice 44519 4 zone variants use the `monoprice4` thing id. Up to 12 zones with 3 linked amps and 6 source inputs are supported.
-Monoprice 31028 or OSD Audio PAM1270 70 volt amplifiers use the `monoprice70` thing id. 6 zones per amp (not linkable) and 2 source inputs are supported.
+Monoprice 31028 or OSD Audio PAM1270 70 volt amplifiers use the `monoprice70` thing id. 6 zones per amp (not linkable) and 2 source inputs are supported.
-Dayton Audio DAX88 amplifiers use the `dax88` thing id. 8 zones (2 un-amplified) per amp (not linkable) and 8 source inputs are supported.
+Dayton Audio DAX88 amplifiers use the `dax88` thing id. 8 zones (2 un-amplified) per amp (not linkable) and 8 source inputs are supported.
Xantech MRC88, MX88, MRAUDIO8X8 or CM8X8 amplifiers use the `xantech` thing id. Up to 16 zones with 2 linked amps and 8 source inputs are supported.
-Some Xantech amps provide unsolicited zone updates for keypad actions and may work with the `disableKeypadPolling` option set to true which will prevent un-necessary polling of the amplifier.
-Note: MRC44 amps do not support serial control.
+Some Xantech amps provide unsolicited zone updates for keypad actions and may work with the `disableKeypadPolling` option set to true which will prevent un-necessary polling of the amplifier.
+Note: MRC44 amps do not support serial control.
## Discovery
Compared to Ruuvi Tag Bluetooth binding, this binding has the benefit of relying on strong and reliable antenna of Ruuvi Gateway, as opposed to e.g. usually much weaker antenna integrated onto computer motherboard.
Obvious downside compared to the bluetooth binding is the requirement of having Ruuvi Gateway device.
-Both RuuviTag and RuuviTag Pro are supported.
+Both RuuviTag and RuuviTag Pro are supported.
## Setup the Gateway
-Before using this binding, Ruuvi Gateway needs to configured to publish the sensor data via MQTT.
+Before using this binding, Ruuvi Gateway needs to configured to publish the sensor data via MQTT.
For further instructions, refer to relevant section in [Ruuvi Gateway documentation](https://ruuvi.com/gateway-config/).
For most convenient usage of this binding, please ensure that "Use 'ruuvi' on the prefix' MQTT setting is enabled on Ruuvi Gateway.
All other possibilities are attached as options.
The picture on the right shows the _Session Title_ item and 3 possible options.
Select the desired service and the corresponding Charge Session with _Energy Charged_, _Session Status_ and
-_Session Issues_ will be shown.
+_Session Issues_ will be shown.
### TroubleShooting
### Items File
```java
-Number:Length i3Mileage "Odometer [%d %unit%]" <line> (i3) {channel="mybmw:bev_rex:4711:i3:range#mileage" }
+Number:Length i3Mileage "Odometer [%d %unit%]" <line> (i3) {channel="mybmw:bev_rex:4711:i3:range#mileage" }
Number:Length i3Range "Range [%d %unit%]" <motion> (i3) {channel="mybmw:bev_rex:4711:i3:range#hybrid"}
-Number:Length i3RangeElectric "Electric Range [%d %unit%]" <motion> (i3,long) {channel="mybmw:bev_rex:4711:i3:range#electric"}
+Number:Length i3RangeElectric "Electric Range [%d %unit%]" <motion> (i3,long) {channel="mybmw:bev_rex:4711:i3:range#electric"}
Number:Length i3RangeFuel "Fuel Range [%d %unit%]" <motion> (i3) {channel="mybmw:bev_rex:4711:i3:range#fuel"}
Number:Dimensionless i3BatterySoc "Battery Charge [%.1f %%]" <battery> (i3,long) {channel="mybmw:bev_rex:4711:i3:range#soc"}
Number:Volume i3Fuel "Fuel [%.1f %unit%]" <oil> (i3) {channel="mybmw:bev_rex:4711:i3:range#remaining-fuel"}
DateTime i3NextServiceDate "Next Service Date [%1$tb %1$tY]" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:status#service-date" }
String i3NextServiceMileage "Next Service Mileage [%d %unit%]" <line> (i3) {channel="mybmw:bev_rex:4711:i3:status#service-mileage" }
String i3CheckControl "Check Control [%s]" <error> (i3) {channel="mybmw:bev_rex:4711:i3:status#check-control" }
-String i3PlugConnection "Plug [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#plug-connection" }
-String i3ChargingStatus "[%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#charge" }
-String i3ChargingInfo "[%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#charge-info" }
+String i3PlugConnection "Plug [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#plug-connection" }
+String i3ChargingStatus "[%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#charge" }
+String i3ChargingInfo "[%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:status#charge-info" }
DateTime i3LastUpdate "Update [%1$tA, %1$td.%1$tm. %1$tH:%1$tM]" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:status#last-update"}
-Location i3Location "Location [%s]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:location#gps" }
-Number:Angle i3Heading "Heading [%.1f %unit%]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:location#heading" }
+Location i3Location "Location [%s]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:location#gps" }
+Number:Angle i3Heading "Heading [%.1f %unit%]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:location#heading" }
-String i3RemoteCommand "Command [%s]" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:remote#command" }
-String i3RemoteState "Remote Execution State [%s]" <status> (i3) {channel="mybmw:bev_rex:4711:i3:remote#state" }
+String i3RemoteCommand "Command [%s]" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:remote#command" }
+String i3RemoteState "Remote Execution State [%s]" <status> (i3) {channel="mybmw:bev_rex:4711:i3:remote#state" }
String i3DriverDoor "Driver Door [%s]" <lock> (i3) {channel="mybmw:bev_rex:4711:i3:doors#driver-front" }
String i3DriverDoorRear "Driver Door Rear [%s]" <lock> (i3) {channel="mybmw:bev_rex:4711:i3:doors#driver-rear" }
String i3CCName "CheckControl Name [%s]" <text> (i3) {channel="mybmw:bev_rex:4711:i3:check#name" }
String i3CCDetails "CheckControl Details [%s]" <text> (i3) {channel="mybmw:bev_rex:4711:i3:check#details" }
String i3CCSeverity "CheckControl Severity [%s]" <line> (i3) {channel="mybmw:bev_rex:4711:i3:check#severity" }
-
-Switch i3ChargeProfileClimate "Charge Profile Climatization" <temperature> (i3) {channel="mybmw:bev_rex:4711:i3:profile#climate" }
-String i3ChargeProfileMode "Charge Profile Mode [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#mode" }
-String i3ChargeProfilePrefs "Charge Profile Preference [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#prefs" }
-String i3ChargeProfileCtrl "Charge Profile Control [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#control" }
-Number i3ChargeProfileTarget "Charge Profile SoC Target [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#target" }
-Switch i3ChargeProfileLimit "Charge Profile limited" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#limit" }
-DateTime i3ChargeWindowStart "Charge Window Start [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#window-start" }
-DateTime i3ChargeWindowEnd "Charge Window End [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#window-end" }
-DateTime i3Timer1Departure "Timer 1 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-departure" }
-String i3Timer1Days "Timer 1 Days [%s]" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-days" }
-Switch i3Timer1DayMon "Timer 1 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-mon" }
-Switch i3Timer1DayTue "Timer 1 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-tue" }
-Switch i3Timer1DayWed "Timer 1 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-wed" }
-Switch i3Timer1DayThu "Timer 1 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-thu" }
-Switch i3Timer1DayFri "Timer 1 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-fri" }
-Switch i3Timer1DaySat "Timer 1 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-sat" }
-Switch i3Timer1DaySun "Timer 1 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-sun" }
-Switch i3Timer1Enabled "Timer 1 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-enabled" }
-DateTime i3Timer2Departure "Timer 2 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-departure" }
-Switch i3Timer2DayMon "Timer 2 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-mon" }
-Switch i3Timer2DayTue "Timer 2 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-tue" }
-Switch i3Timer2DayWed "Timer 2 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-wed" }
-Switch i3Timer2DayThu "Timer 2 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-thu" }
-Switch i3Timer2DayFri "Timer 2 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-fri" }
-Switch i3Timer2DaySat "Timer 2 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-sat" }
-Switch i3Timer2DaySun "Timer 2 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-sun" }
-Switch i3Timer2Enabled "Timer 2 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-enabled" }
-DateTime i3Timer3Departure "Timer 3 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-departure" }
-Switch i3Timer3DayMon "Timer 3 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-mon" }
-Switch i3Timer3DayTue "Timer 3 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-tue" }
-Switch i3Timer3DayWed "Timer 3 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-wed" }
-Switch i3Timer3DayThu "Timer 3 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-thu" }
-Switch i3Timer3DayFri "Timer 3 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-fri" }
-Switch i3Timer3DaySat "Timer 3 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-sat" }
-Switch i3Timer3DaySun "Timer 3 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-sun" }
+
+Switch i3ChargeProfileClimate "Charge Profile Climatization" <temperature> (i3) {channel="mybmw:bev_rex:4711:i3:profile#climate" }
+String i3ChargeProfileMode "Charge Profile Mode [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#mode" }
+String i3ChargeProfilePrefs "Charge Profile Preference [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#prefs" }
+String i3ChargeProfileCtrl "Charge Profile Control [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#control" }
+Number i3ChargeProfileTarget "Charge Profile SoC Target [%s]" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#target" }
+Switch i3ChargeProfileLimit "Charge Profile limited" <energy> (i3) {channel="mybmw:bev_rex:4711:i3:profile#limit" }
+DateTime i3ChargeWindowStart "Charge Window Start [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#window-start" }
+DateTime i3ChargeWindowEnd "Charge Window End [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#window-end" }
+DateTime i3Timer1Departure "Timer 1 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-departure" }
+String i3Timer1Days "Timer 1 Days [%s]" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-days" }
+Switch i3Timer1DayMon "Timer 1 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-mon" }
+Switch i3Timer1DayTue "Timer 1 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-tue" }
+Switch i3Timer1DayWed "Timer 1 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-wed" }
+Switch i3Timer1DayThu "Timer 1 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-thu" }
+Switch i3Timer1DayFri "Timer 1 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-fri" }
+Switch i3Timer1DaySat "Timer 1 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-sat" }
+Switch i3Timer1DaySun "Timer 1 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-day-sun" }
+Switch i3Timer1Enabled "Timer 1 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer1-enabled" }
+DateTime i3Timer2Departure "Timer 2 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-departure" }
+Switch i3Timer2DayMon "Timer 2 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-mon" }
+Switch i3Timer2DayTue "Timer 2 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-tue" }
+Switch i3Timer2DayWed "Timer 2 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-wed" }
+Switch i3Timer2DayThu "Timer 2 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-thu" }
+Switch i3Timer2DayFri "Timer 2 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-fri" }
+Switch i3Timer2DaySat "Timer 2 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-sat" }
+Switch i3Timer2DaySun "Timer 2 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-day-sun" }
+Switch i3Timer2Enabled "Timer 2 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer2-enabled" }
+DateTime i3Timer3Departure "Timer 3 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-departure" }
+Switch i3Timer3DayMon "Timer 3 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-mon" }
+Switch i3Timer3DayTue "Timer 3 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-tue" }
+Switch i3Timer3DayWed "Timer 3 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-wed" }
+Switch i3Timer3DayThu "Timer 3 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-thu" }
+Switch i3Timer3DayFri "Timer 3 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-fri" }
+Switch i3Timer3DaySat "Timer 3 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-sat" }
+Switch i3Timer3DaySun "Timer 3 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-day-sun" }
Switch i3Timer3Enabled "Timer 3 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer3-enabled" }
-DateTime i3Timer4Departure "Timer 4 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-departure" }
-Switch i3Timer4DayMon "Timer 4 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-mon" }
-Switch i3Timer4DayTue "Timer 4 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-tue" }
-Switch i3Timer4DayWed "Timer 4 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-wed" }
-Switch i3Timer4DayThu "Timer 4 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-thu" }
-Switch i3Timer4DayFri "Timer 4 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-fri" }
-Switch i3Timer4DaySat "Timer 4 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-sat" }
-Switch i3Timer4DaySun "Timer 4 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-sun" }
+DateTime i3Timer4Departure "Timer 4 Departure [%1$tH:%1$tM]" <time> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-departure" }
+Switch i3Timer4DayMon "Timer 4 Monday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-mon" }
+Switch i3Timer4DayTue "Timer 4 Tuesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-tue" }
+Switch i3Timer4DayWed "Timer 4 Wednesday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-wed" }
+Switch i3Timer4DayThu "Timer 4 Thursday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-thu" }
+Switch i3Timer4DayFri "Timer 4 Friday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-fri" }
+Switch i3Timer4DaySat "Timer 4 Saturday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-sat" }
+Switch i3Timer4DaySun "Timer 4 Sunday" <calendar> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-day-sun" }
Switch i3Timer4Enabled "Timer 4 Enabled" <switch> (i3) {channel="mybmw:bev_rex:4711:i3:profile#timer4-enabled" }
String i3StatisticsTitle "[%s]" <text> (i3) {channel="mybmw:bev_rex:4711:i3:statistic#title" }
Number:Pressure i3TireRRCurrent "Tire Rear Right [%.1f %unit%]" <text> (i3) {channel="mybmw:bev_rex:4711:i3:tires#rr-current" }
Number:Pressure i3TireRRTarget "Tire Rear Right Target [%.1f %unit%]" <text> (i3) {channel="mybmw:bev_rex:4711:i3:tires#rr-target" }
-Image i3Image "Image" (i3) {channel="mybmw:bev_rex:4711:i3:image#png" }
-String i3ImageViewport "Image Viewport [%s]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:image#view" }
+Image i3Image "Image" (i3) {channel="mybmw:bev_rex:4711:i3:image#png" }
+String i3ImageViewport "Image Viewport [%s]" <zoom> (i3) {channel="mybmw:bev_rex:4711:i3:image#view" }
```
### Sitemap File
```perl
sitemap BMW label="BMW" {
Frame label="BMW i3" {
- Image item=i3Image
-
- }
+ Image item=i3Image
+
+ }
Frame label="Status" {
- Text item=i3DoorStatus
- Text item=i3WindowStatus
- Text item=i3LockStatus
- Text item=i3NextServiceDate
- Text item=i3NextServiceMileage
- Text item=i3CheckControl
- Text item=i3ChargingStatus
- Text item=i3LastUpdate
+ Text item=i3DoorStatus
+ Text item=i3WindowStatus
+ Text item=i3LockStatus
+ Text item=i3NextServiceDate
+ Text item=i3NextServiceMileage
+ Text item=i3CheckControl
+ Text item=i3ChargingStatus
+ Text item=i3LastUpdate
}
Frame label="Range" {
- Text item=i3Mileage
- Text item=i3Range
- Text item=i3RangeElectric
- Text item=i3RangeFuel
- Text item=i3BatterySoc
- Text item=i3Fuel
- Text item=i3RadiusElectric
- Text item=i3RadiusHybrid
+ Text item=i3Mileage
+ Text item=i3Range
+ Text item=i3RangeElectric
+ Text item=i3RangeFuel
+ Text item=i3BatterySoc
+ Text item=i3Fuel
+ Text item=i3RadiusElectric
+ Text item=i3RadiusHybrid
}
Frame label="Remote Services" {
- Selection item=i3RemoteCommand
- Text item=i3RemoteState
+ Selection item=i3RemoteCommand
+ Text item=i3RemoteState
}
Frame label="Services" {
- Selection item=i3ServiceName
- Text item=i3ServiceDetails
- Text item=i3ServiceMileage
- Text item=i3ServiceDate
+ Selection item=i3ServiceName
+ Text item=i3ServiceDetails
+ Text item=i3ServiceMileage
+ Text item=i3ServiceDate
}
Frame label="CheckControl" {
- Selection item=i3CCName
- Text item=i3CCDetails
- Text item=i3CCSeverity
+ Selection item=i3CCName
+ Text item=i3CCDetails
+ Text item=i3CCSeverity
}
Frame label="Door Details" {
Text item=i3DriverDoor visibility=[i3DriverDoor!="INVALID"]
- Text item=i3DriverDoorRear visibility=[i3DriverDoorRear!="INVALID"]
+ Text item=i3DriverDoorRear visibility=[i3DriverDoorRear!="INVALID"]
Text item=i3PassengerDoor visibility=[i3PassengerDoor!="INVALID"]
Text item=i3PassengerDoorRear visibility=[i3PassengerDoorRear!="INVALID"]
Text item=i3Hood visibility=[i3Hood!="INVALID"]
Text item=i3Sunroof visibility=[i3Sunroof!="INVALID"]
}
Frame label="Location" {
- Text item=i3Location
- Text item=i3Heading
+ Text item=i3Location
+ Text item=i3Heading
+ }
+ Frame label="Charge Profile" {
+ Switch item=i3ChargeProfileClimate
+ Selection item=i3ChargeProfileMode
+ Text item=i3ChargeWindowStart
+ Text item=i3ChargeWindowEnd
+ Text item=i3Timer1Departure
+ Switch item=i3Timer1DayMon
+ Switch item=i3Timer1DayTue
+ Switch item=i3Timer1DayWed
+ Switch item=i3Timer1DayThu
+ Switch item=i3Timer1DayFri
+ Switch item=i3Timer1DaySat
+ Switch item=i3Timer1DaySun
+ Switch item=i3Timer1Enabled
+ Text item=i3Timer2Departure
+ Switch item=i3Timer2DayMon
+ Switch item=i3Timer2DayTue
+ Switch item=i3Timer2DayWed
+ Switch item=i3Timer2DayThu
+ Switch item=i3Timer2DayFri
+ Switch item=i3Timer2DaySat
+ Switch item=i3Timer2DaySun
+ Switch item=i3Timer2Enabled
+ Text item=i3Timer3Departure
+ Switch item=i3Timer3DayMon
+ Switch item=i3Timer3DayTue
+ Switch item=i3Timer3DayWed
+ Switch item=i3Timer3DayThu
+ Switch item=i3Timer3DayFri
+ Switch item=i3Timer3DaySat
+ Switch item=i3Timer3DaySun
+ Switch item=i3Timer3Enabled
+ Text item=i3Timer4Departure
+ Switch item=i3Timer4DayMon
+ Switch item=i3Timer4DayTue
+ Switch item=i3Timer4DayWed
+ Switch item=i3Timer4DayThu
+ Switch item=i3Timer4DayFri
+ Switch item=i3Timer4DaySat
+ Switch item=i3Timer4DaySun
+ Switch item=i3Timer4Enabled
}
- Frame label="Charge Profile" {
- Switch item=i3ChargeProfileClimate
- Selection item=i3ChargeProfileMode
- Text item=i3ChargeWindowStart
- Text item=i3ChargeWindowEnd
- Text item=i3Timer1Departure
- Switch item=i3Timer1DayMon
- Switch item=i3Timer1DayTue
- Switch item=i3Timer1DayWed
- Switch item=i3Timer1DayThu
- Switch item=i3Timer1DayFri
- Switch item=i3Timer1DaySat
- Switch item=i3Timer1DaySun
- Switch item=i3Timer1Enabled
- Text item=i3Timer2Departure
- Switch item=i3Timer2DayMon
- Switch item=i3Timer2DayTue
- Switch item=i3Timer2DayWed
- Switch item=i3Timer2DayThu
- Switch item=i3Timer2DayFri
- Switch item=i3Timer2DaySat
- Switch item=i3Timer2DaySun
- Switch item=i3Timer2Enabled
- Text item=i3Timer3Departure
- Switch item=i3Timer3DayMon
- Switch item=i3Timer3DayTue
- Switch item=i3Timer3DayWed
- Switch item=i3Timer3DayThu
- Switch item=i3Timer3DayFri
- Switch item=i3Timer3DaySat
- Switch item=i3Timer3DaySun
- Switch item=i3Timer3Enabled
- Text item=i3Timer4Departure
- Switch item=i3Timer4DayMon
- Switch item=i3Timer4DayTue
- Switch item=i3Timer4DayWed
- Switch item=i3Timer4DayThu
- Switch item=i3Timer4DayFri
- Switch item=i3Timer4DaySat
- Switch item=i3Timer4DaySun
- Switch item=i3Timer4Enabled
- }
Frame label="Charge Statistics" {
- Text item=i3StatisticsTitle
- Text item=i3StatisticsEnergy
- Text item=i3StatisticsSessions
+ Text item=i3StatisticsTitle
+ Text item=i3StatisticsEnergy
+ Text item=i3StatisticsSessions
}
Frame label="Charge Sessions" {
- Selection item=i3SessionTitle
- Text item=i3SessionDetails
- Text item=i3SessionCharged
- Text item=i3SessionProblems
- Text item=i3SessionStatus
+ Selection item=i3SessionTitle
+ Text item=i3SessionDetails
+ Text item=i3SessionCharged
+ Text item=i3SessionProblems
+ Text item=i3SessionStatus
}
Frame label="Tires" {
- Text item=i3TireFLCurrent
- Text item=i3TireFLTarget
- Text item=i3TireFRCurrent
- Text item=i3TireFRTarget
- Text item=i3TireRLCurrent
- Text item=i3TireRLTarget
- Text item=i3TireRRCurrent
- Text item=i3TireRRTarget
+ Text item=i3TireFLCurrent
+ Text item=i3TireFLTarget
+ Text item=i3TireFRCurrent
+ Text item=i3TireFRTarget
+ Text item=i3TireRLCurrent
+ Text item=i3TireRLTarget
+ Text item=i3TireRRCurrent
+ Text item=i3TireRRTarget
}
Frame label="Image Properties" {
Selection item=i3ImageViewport
- }
+ }
}
```
A manual setup through a `things/mycroft.things` file could look like this:
```java
-Thing mycroft:mycroft:myMycroft "Mycroft A.I." @ "Living Room" [host="192.168.X.X", port=8181] {
+Thing mycroft:mycroft:myMycroft "Mycroft A.I." @ "Living Room" [host="192.168.X.X", port=8181] {
Channels:
Type full-message-channel : Text [
messageTypes="message.type.1,message.type.4"
(1) : Accepted commands are : STOP, MOVE
(2) : Valid status are : OPEN, CLOSED, OPENING, CLOSING, STOPPED
(3) : Accepted commands are : "stop","open","close"
-(4) : There is no way to retrieve the current status of the courtesy light. It is supposed to be ON when the gate is moving and turned OFF once done.
+(4) : There is no way to retrieve the current status of the courtesy light. It is supposed to be ON when the gate is moving and turned OFF once done.
The delay between the moving end and light being turned off is a configuration parameter of the `courtesy` channel.
### T4 Commands
```java
Switch PlugSwitch "Plug" {channel="mystrom:mystromplug:d6217a31:switch"}
-Number:Temperature PlugTemperature "Temperature: [%.1f °C]" {channel="mystrom:mystromplug:d6217a31:temperature"}
+Number:Temperature PlugTemperature "Temperature: [%.1f °C]" {channel="mystrom:mystromplug:d6217a31:temperature"}
Number:Power PlugPower "Power: [%.1f W]" {channel="mystrom:mystromplug:d6217a31:power"}
-Number:Energy PlugEnergyConsumedSinceLastCall "Ws: [%.1f Ws]" {channel="mystrom:mystromplug:d6217a31:energy-consumed-since-last-call"}
+Number:Energy PlugEnergyConsumedSinceLastCall "Ws: [%.1f Ws]" {channel="mystrom:mystromplug:d6217a31:energy-consumed-since-last-call"}
```
### Sitemap Configuration
```perl
-Frame label="myStrom Plug" {
+Frame label="myStrom Plug" {
Switch item=PlugSwitch
Text item=PlugTemperature
Text item=PlugPower
| Nanoleaf Name | Type | Description | supported | touch support |
| ---------------------- | ---- | ---------------------------------------------------------- | --------- | ------------- |
-| Light Panels | NL22 | Triangles 1st Generation | X | - |
+| Light Panels | NL22 | Triangles 1st Generation | X | - |
| Shapes Hexagon | NL42 | Hexagons | X | X |
| Shapes Triangles | NL47 | Triangles | X | X |
| Shapes Mini Triangles | NL48 | Mini Triangles | X | X |
Compare the following output with the right picture at the beginning of the article
```text
- 31413 9162 13276
+ 31413 9162 13276
55836 56093 48111 38724 17870 5164 64279
- 58086 8134 39755
+ 58086 8134 39755
- 41451
+ 41451
```
**Important note on the topic of IPV6 ip addresses:**
-With firmware version 8.5.2 or newer, panels may change between being OFFLINE and ONLINE.
+With firmware version 8.5.2 or newer, panels may change between being OFFLINE and ONLINE.
This is due to the fact that if they are discovered with IPv6 addresses, the binding is not able to correctly send API requests to the devices.
It is therefore recommended to disable IPv6 on the openHAB server.
Frame label="Controller" {
Switch item=NanoleafPower
Slider item=NanoleafBrightness
- Colorpicker item=NanoleafColor
+ Colorpicker item=NanoleafColor
Text item=NanoleafHue
Text item=NanoleafSaturation
- Slider item=NanoleafColorTemp
- Setpoint item=NanoleafColorTempAbs step=100 minValue=1200 maxValue=6500
+ Slider item=NanoleafColorTemp
+ Setpoint item=NanoleafColorTempAbs step=100 minValue=1200 maxValue=6500
Text item=NanoleafColorMode
Selection item=NanoleafEffect
Text item=NanoleafRhythmState
rule "UpdateHueAndSat"
when Item NanoleafColor changed
then
- val hsbValues = NanoleafColor.state as HSBType
+ val hsbValues = NanoleafColor.state as HSBType
NanoleafHue.postUpdate(hsbValues.hue.intValue)
NanoleafSaturation.postUpdate(hsbValues.saturation.intValue)
end
var hue = 0
var direction = 1
- while(NanoleafRainbowScene.state == ON) {
- Thread::sleep(pause)
+ while(NanoleafRainbowScene.state == ON) {
+ Thread::sleep(pause)
hue = hue + (5 * direction)
if(hue >= 359) {
hue = 359
- direction = direction * -1
+ direction = direction * -1
}
else if (hue < 0) {
hue = 0
- direction = direction * -1
- }
+ direction = direction * -1
+ }
// replace NanoleafColor with Panel1Color to run rainbow on a single panel
NanoleafColor.sendCommand(new HSBType(new DecimalType(hue), saturation, brightness))
}
/*
The idea behind that rule is to use one panel to switch on / off brightness control for a specific openHAB item.
-
- - In this case the panel with the id=36604 has been created as a thing.
+
+ - In this case the panel with the id=36604 has been created as a thing.
- The controller color item is named SZNanoCanvas_Color
- The controller effect item that holds the last chosen effect is SZNanoCanvas_Effect
- Also that thing has channel to control the color of the panel
-
+
We use that specific panel to toggle the brightness swipe mode on or off.
We indicate that mode by setting the canvas to red. When switching it
off we make sure we return the effect that was on before.
-Only if the brightness swipe mode is ON we then use this to control the brightness of
+Only if the brightness swipe mode is ON we then use this to control the brightness of
another thing which in this case is a lamp. Every swipe changes the brightness by 10.
-By extending it further this would also allow to select different items to control by
+By extending it further this would also allow to select different items to control by
tapping different panels before.
*/
} else {
brightnessMode = OFF
sendCommand("SZNanoCanvas_Effect", oldEffect)
- }
+ }
end
rule "Swipe Nano to control brightness"
when
- Channel "nanoleaf:controller:645E3A484FFF:swipe" triggered
+ Channel "nanoleaf:controller:645E3A484FFF:swipe" triggered
then
// Note: you can even control a rollershutter instead of a light dimmer
var dimItem = MyLampDimmerItem
-
+
// only process the swipe if brightness mode is active
if (brightnessMode == ON) {
var currentBrightness = dimItem.state as Number
- neatoaccount (bridge)
- vacuumcleaner
-A bridge is required to connect to your Neato Cloud account.
+A bridge is required to connect to your Neato Cloud account.
All "Connected" type vacuum cleaners should be supported by this binding since they are supported by the Neato API. As of todays date, it is only verified with Neato Connected and Neato D7 vacuum cleaners.
Channel 'neeo:Brain:d487672e:forwardActions' triggered
then
logInfo("neeo", "action received")
-
+
var data = receivedEvent.getEvent()
logInfo("neeo", "data: {}", data)
var String device = transform("JSONPATH", "$.device", data);
var String room = transform("JSONPATH", "$.room", data);
var String actionparameter = transform("JSONPATH", "$.actionparameter", data);
-
+
logInfo("neeo", "action: {}, recipe: {}, device: {}, room: {}, actionparameter: {}", action, recipe, device, room, actionparameter)
-end
+end
```
Since the NEEO Brain ONLY allows a single forward actions URL, the NEEO Brain Bridge can be configured to:
|--------------------|------------|--------------|--------------------------------------------------------------------------------------------|
| currentStep* | R | trigger | Displays the current step being executed |
-Current Step will ONLY be triggered if openHAB started the corresponding recipe (or scenario).
+Current Step will ONLY be triggered if openHAB started the corresponding recipe (or scenario).
If the NEEO Remote or NEEO App starts the recipe or scenario, the currentStep will never be triggered.
The current step is ONLY communicated from the Brain to the device that started the Recipe/Scenario.
The following Channels, and their associated channel types are shown below.
| Channel | Data Type | Description |
|----------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------|
-| meshNetworkQoS | Number:Dimensionless | RF mesh network Quality-of-Service; this is the percentage of configured devices that are currently connected online via the RF mesh network |
+| meshNetworkQoS | Number:Dimensionless | RF mesh network Quality-of-Service; this is the percentage of configured devices that are currently connected online via the RF mesh network |
## Channels for "NeoStat" Thermostat
sitemap neohub label="Heatmiser NeoHub"
{
Frame label="Thermostat" {
- Text item=Upstairs_RoomTemperature
+ Text item=Upstairs_RoomTemperature
Setpoint item=Upstairs_TargetTemperature minValue=15 maxValue=30 step=1
Text item=Upstairs_ThermostatOutputState
Switch item=Upstairs_OccupancyModePresent
- Text item=Upstairs_FloorTemperature
+ Text item=Upstairs_FloorTemperature
}
Frame label="Plug" {
- Switch item=Downstairs_PlugOutputState
+ Switch item=Downstairs_PlugOutputState
Switch item=Downstairs_PlugAutoMode
}
Depending on the way it is configured the behaviour will be adapted and available channels can vary.
**Home Configuration**
-
The Home thing has the following configuration elements:
| Parameter | Type | Required | Description |
| securityId | String | No | Id of a home holding security monitoring devices |
| refreshInterval | Integer | No | Refresh interval for refreshing the data in seconds. Default 180. |
-At least one of these parameter must be filled - at most two :
+At least one of these parameter must be filled - at most two :
-* id or securityId
-* id or energyId
-* securityId and energyId
+- id or securityId
+- id or energyId
+- securityId and energyId
(1) this parameter is kept for backward compatibility.
Text item=Indoor_TimeStamp
Text item=Indoor_LastSeen
}
- Frame label="Outdoor" {
+ Frame label="Outdoor" {
Text item=Outdoor_Temperature
Text item=Outdoor_TempTrend
Text item=Outdoor_Humidity
Text item=MyDevice label="Device [%s]"
Text item=MyDeviceResponseTime label="Device Response Time [%s]"
}
-
+
Frame label="SpeedTest" {
Text item=Speedtest_Start
Switch item=Speedtest_Running
Default item=Speedtest_Progress
Text item=Speedtest_Running label="Speedtest [%s]" visibility=[Speedtest_Running != "-"]
- }
+ }
Frame label="Down" {
Text item=Speedtest_ResultDown
Chart item=Speedtest_ResultUp period=D refresh=30000 service="influxdb" visibility=[sys_chart_period==0, sys_chart_period=="Non initialisé"]
Chart item=Speedtest_ResultUp period=W refresh=30000 service="influxdb" visibility=[sys_chart_period==1]
Chart item=Speedtest_ResultUp period=M refresh=30000 service="influxdb" visibility=[sys_chart_period==2]
- Chart item=Speedtest_ResultUp period=Y refresh=30000 service="influxdb" visibility=[sys_chart_period==3]
+ Chart item=Speedtest_ResultUp period=Y refresh=30000 service="influxdb" visibility=[sys_chart_period==3]
}
}
```
// Send via MAC address
actions.sendWakeOnLanPacketViaMac()
actions.sendWakeOnLanPacket() // deprecated
-
+
// Send via IP address
actions.sendWakeOnLanPacketViaIp()
}
# NibeGW Hardware and Compiling hints
-
## RS-485 Modules
-For settting up a NibeGW you need a RS485 module.
+For settting up a NibeGW you need a RS485 module.
While ProDiNo already have RS-485 support included, you need a separate module for Arduino Uno.
Most cheap modules out there are compatible with 5V voltage and therefore compatible with Arduino based hardware.
Mostly you will get one of two commonly used designs:
-* Modules based on Max1348 chip, which has 2 pins on the Arduino side (RXD, TXD) + VCC + GND
-* Modules based on Max485 chip, which has 4 pins on the Arduino side (RO, RE, DE, DI) + VCC + GND
+- Modules based on Max1348 chip, which has 2 pins on the Arduino side (RXD, TXD) + VCC + GND
+- Modules based on Max485 chip, which has 4 pins on the Arduino side (RO, RE, DE, DI) + VCC + GND
Both types of modules work fine with NibeGW.
The difference between the two is, that the Max485 chip needs to be switched between RX mode and TX mode manually while the Max1348 chip do this automatically.
ProDiNo already have Ethernet included, so there's no need for a separate Ethernet Shield.
Also the ProDiNo Ethernet is supported by NibeGW out of the box.
-
## Arduino Uno
-Arduino Uno has only one serial port which is shared with USB.
+Arduino Uno has only one serial port which is shared with USB.
So make sure to disconnect all hardware (ethernet shield, RS485 module, etc.) while uploading the compiled sketch to the Arduino.
Furthermore do not use the USB port while Arduino is communicating with the Nibe heatpump.
For compiling NibeGW, you have to make the following changes to the code:
-#### Config.h:
+### Config.h
Comment out support for all special boards:
Adjust the settings for your ethernet connection, target ip and ports and modbus module to simulate.
Leave the serial configuration untouched - it is fine for Arduino Uno.
-#### NibeGW.h:
+### NibeGW.h
Enable support for HARDWARE_SERIAL:
#define HARDWARE_SERIAL
```
-## ProDiNo ESP32 Ethernet v1
+## ProDiNo ESP32 Ethernet v1
NibeGW default settings are valid for ProDiNo ESP32 Ethernet v1 board.
Dynamic configuration is enabled by default.
-### Config.h:
+### Config.h
```c
//#define PRODINO_BOARD
//#define TRANSPORT_ETH_ENC28J6A0
```
-### NibeGW.h:
+### NibeGW.h
```c
#define HARDWARE_SERIAL_WITH_PINS
NibeGW code is compatible with ESP32 v2.0.x board library by Espressif Systems.
Install correct ESP32 library via Arduino IDE board manager.
-
## ProDiNo Ethernet V2
Todo
-
## Debugging
Debugging messages are available by connecting to port 23 to your NibeGW via telnet.
Also OTA firmware update is supported.
The following libraries are required:
- * Bleeper (tested with version 1.1.0)
- * ElegantOTA (tested with version 2.2.9)
+
+- Bleeper (tested with version 1.1.0)
+- ElegantOTA (tested with version 2.2.9)
Dynamic configuration mode is loaded if input 0 is ON during boot.
When dynamic configuration mode is activated, login to the 'Bleeper' Wi-Fi access point.
- `rollershutter-module` - Nikobus roller shutter module,
- `push-button` - Nikobus physical push button.
-## Warning : PC-Link software addresses writing convention
+## Warning : PC-Link software addresses writing convention
This binding and Niko's PC-Link software don't have the same address writing convention ! **You must invert the MSB & LSB**.
maps as
```text
- 3 1
+ 3 1
4 2
```
maps as
```text
- 7 5 3 1
+ 7 5 3 1
8 6 4 2
```
Frame label="Main Bedroom"{
Switch item=Zone_ActiveStatus
- Text item=Zone_ActiveWeekProfileName
- Text item=Zone_ActiveWeekProfile
- Selection item=Zone_ActiveWeekProfile
+ Text item=Zone_ActiveWeekProfileName
+ Text item=Zone_ActiveWeekProfile
+ Selection item=Zone_ActiveWeekProfile
Setpoint item=Zone_ComfortTemperatur minValue=7 maxValue=30 step=1 icon="temperature"
Setpoint item=Zone_EcoTemperatur minValue=7 maxValue=30 step=1 icon="temperature"
Text item=Zone_CurrentTemperatur
sitemap nobo label="Nobø " {
Frame label="Main Bedroom"{
- Selection item=MainBedroom_Zone_WeekProfile
+ Selection item=MainBedroom_Zone_WeekProfile
}
}
```
# Nuki Binding
-This is the binding for the [Nuki Smart Lock](https://nuki.io).
+This is the binding for the [Nuki Smart Lock](https://nuki.io).
This binding allows you to integrate, view, control and configure the Nuki Bridge, Nuki Smart Lock and Nuki Opener.
## Prerequisites
- [Nuki Combo](https://nuki.io/en/shop/nuki-combo/)
1. The Bridge HTTP-API has to be enabled during [Initial Bridge setup](https://nuki.io/en/support/bridge/bridge-setup/initial-bridge-setup/).
-It is absolutely recommended to configure static IP addresses for both, the openHAB server and the Nuki Bridge!
+It is absolutely recommended to configure static IP addresses for both, the openHAB server and the Nuki Bridge!
### Nuki Bridge Callback
The Nuki Binding will manage the required callback from the Nuki Bridge to the openHAB server if _manageCallbacks_ is set to `true`.
-If _manageCallbacks_ is not set it will default to `true`.
+If _manageCallbacks_ is not set it will default to `true`.
Make sure that you've selected the correct primary address in the [network settings](https://www.openhab.org/docs/settings/services_system.html#network-settings).
If you want to manage the callbacks from the Nuki Bridge to the openHAB server by yourself, you need to set _manageCallbacks_ to `false`.
-Then add the callback on the Nuki Bridge via Bridge API Endpoint _/callback/add_ in the format `http://<openHAB_IP>:<openHAB_PORT>/nuki/bcb`.
-The Sheet [NukiBridgeAPI](https://docs.google.com/spreadsheets/d/1SGKWhqwqRyOGbv4NEq-8PAPjBORRixvEjRuzO-nVabQ) is a helpfull tool for listing, adding and removing callbacks.
+Then add the callback on the Nuki Bridge via Bridge API Endpoint _/callback/add_ in the format `http://<openHAB_IP>:<openHAB_PORT>/nuki/bcb`.
+The Sheet [NukiBridgeAPI](https://docs.google.com/spreadsheets/d/1SGKWhqwqRyOGbv4NEq-8PAPjBORRixvEjRuzO-nVabQ) is a helpfull tool for listing, adding and removing callbacks.
## Supported Bridges
-This binding supports just one bridge type: The Nuki Bridge (`nuki:bridge`). Create one `bridge` per Nuki Bridge available in your home automation environment.
+This binding supports just one bridge type: The Nuki Bridge (`nuki:bridge`). Create one `bridge` per Nuki Bridge available in your home automation environment.
-The following configuration options are available:
+The following configuration options are available:
| Parameter | Description | Comment |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| 255 | Undefined |
##### Supported openerMode values
-
+
| Mode | Name |
| ---- | --------------- |
| 2 | Door mode |
// serial over IP connection
nuvo:amplifier:myamp "Nuvo WHA" [ host="192.168.0.10", port=4444, numZones=6, clockSync=false]
-// MPS4 server IP connection
+// MPS4 server IP connection
nuvo:amplifier:myamp "Nuvo WHA" [ host="192.168.0.10", port=5006, numZones=6, clockSync=false]
```
end
// In the below examples, a method for maintaing Metadata information
-// for a hypothetical non NuvoNet Source 3 is demonstrated
+// for a hypothetical non NuvoNet Source 3 is demonstrated
// Item_Containing_TrackLength should get a 'received update' when the track changes
// ('changed' is not sufficient if two consecutive tracks are the same length)
// '0' indicates the track is just starting (at position 0), '2' indicates to Nuvo that the track is playing
// The Nuvo keypad will now begin counting up the elapsed time displayed (starting from 0)
sendCommand(nuvo_system_sendcmd, "S3DISPINFO," + trackLength.toString() + ",0,2")
-
+
end
rule "Load track name for Source 3"
sendCommand(nuvo_s3_display_line4, trackName)
sendCommand(nuvo_s3_display_line1, "")
-
+
end
rule "Load album name for Source 3"
}
case "Playing": {
// when playback starts or resumes, '2' tells Nuvo to display 'playing' on the keypad
- // trackPosition does not need to be updated continuously, Nuvo will automatically count up the elapsed time displayed on the keypad
+ // trackPosition does not need to be updated continuously, Nuvo will automatically count up the elapsed time displayed on the keypad
sendCommand(nuvo_system_sendcmd, "S3DISPINFO," + trackLength.toString() + "," + trackPosition.toString() + ",2")
}
case "Paused": {
### Rule to trigger an action based on which keypad zone where a button was pressed or menu item selected
By using the `system#buttonpress` channel it is possible to trigger an action based on which keypad zone was used to send the action.
-This channel appends the zone number and a comma before the button action or menu item selection.
+This channel appends the zone number and a comma before the button action or menu item selection.
-For example if the Play/Pause button is pressed on Zone 7, the channel will display: `7,PLAYPAUSE`
-Also if a menu item from a custom menu was selected, ie: `Top menu 1` on Zone 5, the channel will display: `5,Top menu 1`
+For example if the Play/Pause button is pressed on Zone 7, the channel will display: `7,PLAYPAUSE`
+Also if a menu item from a custom menu was selected, ie: `Top menu 1` on Zone 5, the channel will display: `5,Top menu 1`
The functionality can be used to create very powerful rules as demontrated below. The following rule triggered from a menu item turns off all zones except for the zone that triggered the rule.
var trackName = ""
// supportedactions bitmask tells the keypad what buttons to display
-// detailed in SourceCommunicationProtocolForNNA_v1.0.pdf
+// detailed in SourceCommunicationProtocolForNNA_v1.0.pdf
// 0 : play/pause only
// 196615 : play/pause/skip
// 196639 : play/pause/skip/shuffle/repeat
rule "Music Source update song elapsed time"
when
Item music_Music_TrackPosition received update or
- Item music_Music_Random received update or
+ Item music_Music_Random received update or
Item music_Music_Repeat received update
then
var int trackLength = Integer::parseInt(music_Music_TrackLength.state.toString.replaceAll("[\\D]", "")) * 10
// track position should not update continuously to prevent excessive amounts of DISPINFOTWO messages from being sent
- // the keypad counts up the time on its own after a DISPINFOTWO message is received
+ // the keypad counts up the time on its own after a DISPINFOTWO message is received
var int trackPosition = Integer::parseInt(music_Music_TrackPosition.state.toString.replaceAll("[\\D]", "")) * 10
var playState = music_Music_PlayMode.state.toString()
var randomMode = music_Music_Random.state
// DISPINFOTWO sends track time, play state, album art id, source status, etc. all in one command message
//*SsDISPINFOTWOduration,position,deprecatedstatus,albumartid,sourcemode,sourcestatus,supportedactions
- // The binding will automatically substitute the 'albumartid' token with the id of the JPG processed by the `art_url` channel
+ // The binding will automatically substitute the 'albumartid' token with the id of the JPG processed by the `art_url` channel
if (playState == "Playing") {
// first '2' indicates deprecatedstatus = playing, second '2' is sourcemode = Music Server Mode
// The Nuvo keypad will now begin counting up the elapsed time displayed (starting from trackPosition)
1. Connect to the Oceanic softener over a serial port that is outside the scope of the Java Virtual Machine, setup a TCP "proxy" on the host that is connected to the softener, and make openHAB connect to that proxy over a plain TCP connection. This can be achieved with `socat`:
```shell
- /usr/bin/socat -v TCP-LISTEN:9000 /dev/ttyUSB0,raw,echo=0
+ /usr/bin/socat -v TCP-LISTEN:9000 /dev/ttyUSB0,raw,echo=0
```
In the above example, the name of the host running socat, and the TCP port number 9000, will be part of the **network** Thing configuration
1. Connect to the Oceanic softener over a serial port on the openHAB host and use `socat` to pipe the data from that serial port to a pseudo tty, which has to be manipulated in a CommPortIdentifier.PORT_RAW manner.
```shell
- /usr/bin/socat -v /dev/ttyUSB0,raw,echo=0 pty,link=/dev/ttyS1,raw,echo=0
+ /usr/bin/socat -v /dev/ttyUSB0,raw,echo=0 pty,link=/dev/ttyS1,raw,echo=0
```
Both workarounds can be implemented using a systemd system manager script, for example:
```text
[Install]
-WantedBy=multi-user.target
+WantedBy=multi-user.target
[Service]
#Type=forking
#PIDFile=/var/run/socat.pid
User=root
Restart=always
-RestartSec=10
+RestartSec=10
```
However, in order to fix permissions at the OS level, one has to issue following commands in order to make /dev/ttyS1 accessible by the 'openhab' system user (that is used to start up the openHAB runtime), and to make the tty both readable and writable.
```shell
sudo useradd -G dialout openhab
sudo chgrp dialout /dev/ttyS1
-sudo chmod 777 /dev/ttyS1
+sudo chmod 777 /dev/ttyS1
```
Alternatively, these commands can be executed through a script that is attached to the systemd system manager script.
It defaults to `4304`, which is the default of each OWFS installation.
Bridges of type `owserver` are extensible with channels of type `owfs-number` and `owfs-string`.
-
+
### Generic (`basic`)
The `basic` thing supports iButton-like chips (DS1420, DS2401/DS1990A), temperature sensors (DS18B20, DS18S20, DS1822), digital i/o chips (DS2405, DS2406, DS2408, DS2413) and counter chips (DS2423).
### demo.things:
```java
-Bridge onewire:owserver:mybridge [
- network-address="192.168.0.51"
+Bridge onewire:owserver:mybridge [
+ network-address="192.168.0.51"
] {
-
+
Thing basic mysensor [
- id="28.505AF0020000",
+ id="28.505AF0020000",
refresh=60
] {
Channels:
ignorepor=true,
resolution="11"
]
- }
-
+ }
+
Thing bms mybms [
id="26.CD497C010000",
- refresh=60,
- lightsensor=true,
- temperaturesensor="DS18B20"
+ refresh=60,
+ lightsensor=true,
+ temperaturesensor="DS18B20"
] {
Channels:
Type temperature-por-res : temperature [
ignorepor=false,
resolution="9"
]
- }
+ }
Thing basic mydio [
id="3A.67F113000000"
mode="output"
]
}
-
+
Channels:
Type owfs-number : crc8errors [
path="statistics/errors/CRC8_errors"
Text item=OpenGarage_StatusText label="Status"
Switch item=OpenGarage_Status icon="garagedoorclosed" mappings=[ON=Open] visibility=[OpenGarage_Status == OFF]
Switch item=OpenGarage_Status icon="garagedooropen" mappings=[OFF=Close] visibility=[OpenGarage_Status == ON]
-Switch item=OpenGarage_Status icon="garage"
-Contact item=OpenGarage_Status_Contact icon="garage"
-Rollershutter item=OpenGarage_Status_Rollershutter icon="garage"
+Switch item=OpenGarage_Status icon="garage"
+Contact item=OpenGarage_Status_Contact icon="garage"
+Rollershutter item=OpenGarage_Status_Rollershutter icon="garage"
Text item=OpenGarage_Distance label="OG distance"
Text item=OpenGarage_Vehicle label="Vehicle Presence"
This binding has its own IconProvider and makes available the following list of icons
-| Icon Name | Dynamic | Illustration |
-|--------------------|---------|--------------|
-| oh:openuv:ozone | No |  |
-| oh:openuv:uv-alarm | Yes |  |
-| oh:openuv:uv-index | Yes |  |
+| Icon Name | Dynamic | Illustration |
+|--------------------|---------|----------------------------|
+| oh:openuv:ozone | No |  |
+| oh:openuv:uv-alarm | Yes |  |
+| oh:openuv:uv-index | Yes |  |
## Examples
Bridge openuv:openuvapi:local "OpenUV Api" [ apikey="xxxxYYYxxxx" ] {
Thing uvreport city1 "UV In My City" [ location="52.5200066,13.4049540", refresh=20 ]{
Channels:
- Type SafeExposure : parents [
+ Type SafeExposure : parents [
index="III"
]
Type SafeExposure : childs [
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg viewBox="0 0 380.6 380.6" width="380.6" height="380.6" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css">
+ .st0{fill:#1A98D5;}
+</style>
+ </defs>
+ <path class="st0" d="M 236.072 302.465 C 239.076 304.128 246.015 306.704 253.334 306.704 C 266.873 306.704 271.062 299.249 270.956 293.659 C 270.829 284.249 261.013 280.211 250.817 280.211 L 244.936 280.211 L 244.936 273.378 L 250.817 273.378 C 258.496 273.378 268.185 269.961 268.185 261.995 C 268.185 256.606 264.229 251.855 254.519 251.855 C 248.278 251.855 242.291 254.23 238.949 256.313 L 236.199 249.681 C 240.261 247.105 248.172 244.51 256.571 244.51 C 271.908 244.51 278.868 252.367 278.868 260.552 C 278.868 267.477 274.066 273.378 264.483 276.393 L 264.483 276.594 C 274.066 278.256 281.851 284.45 281.851 293.878 C 281.851 304.639 272.141 314.067 253.461 314.067 C 244.724 314.067 237.045 311.692 233.216 309.518 L 236.072 302.465 Z" style=""/>
+ <g>
+ <path class="st0" d="M325.8,190.3c0-33.7-12.2-64.6-32.4-88.4c0,2.6,0,5.1,0,7.7c-0.2,0.6-0.5,1.2-0.6,1.9 c-2.2,12.2-8.7,21.5-19.4,27.8c-14.8,8.7-34.5,6.2-46.8-5.8c-0.5-0.4-1.6-0.7-2.2-0.4c-11.9,5.9-23.8,11.8-35.7,17.8 c-9.7,4.9-19.5,9.7-29.2,14.6c-13,6.5-26.1,13-39.1,19.6c-0.6,0.3-1,1.3-1.1,2c-0.1,3.2-0.1,6.4,0,9.7c0,0.7,0.5,1.6,1.1,2 c2.4,1.4,4.9,2.6,7.3,3.8c18.9,9.5,37.9,18.9,56.8,28.4c13.3,6.6,26.6,13.3,39.9,19.9c0.5,0.3,1.6,0.1,2-0.3 c7.6-7.3,16.6-10.9,27.1-11c18.1-0.2,33.9,11.8,38.4,29.4c0.5,1.8,0.9,3.6,1.4,5.4c0,1.5,0,3,0,4.5 C313.6,254.9,325.8,224,325.8,190.3z"/>
+ <path class="st0" d="M228.2,308.6c-10.4-9.2-14.8-20.9-13.4-34.6c0.1-1.1-0.1-1.7-1.2-2.2c-11.4-5.6-22.7-11.4-34.1-17 c-23.3-11.6-46.5-23.2-69.8-34.9c-0.9-0.5-1.5-0.4-2.3,0.3c-1.7,1.6-3.5,3.2-5.4,4.5c-8.8,5.6-18.3,7.7-28.7,6 c-6.5-1.1-12.6-3.9-17.7-7.9c14.6,60,68.6,104.5,133.1,104.5c19,0,37.1-3.9,53.5-10.8C237.1,314.9,232.4,312.3,228.2,308.6z"/>
+ <path class="st0" d="M62.7,156.6c15.3-7.6,32.3-4.7,44.8,7c0.8,0.7,1.3,0.8,2.2,0.3c14.4-7.2,28.9-14.4,43.3-21.6 c20.1-10,40.1-20.1,60.2-30.1c1.3-0.7,1.6-1.4,1.5-2.8c-2.2-20.4,11.1-38.1,29.6-42.6c0.8-0.2,1.6-0.4,2.4-0.6 c-17.6-8.2-37.3-12.9-58-12.9C123,53.4,68.1,99.7,54.9,161.6C57.2,159.7,59.8,158,62.7,156.6z"/>
+ </g>
+ <path class="st0" d="M 190.3 32.1 C 211.7 32.1 232.4 36.3 251.9 44.5 C 270.7 52.5 287.7 63.9 302.2 78.4 C 316.7 92.9 328.2 109.9 336.1 128.7 C 344.3 148.2 348.5 168.9 348.5 190.3 C 348.5 211.7 344.3 232.4 336.1 251.9 C 328.1 270.7 316.7 287.7 302.2 302.2 C 287.7 316.7 270.7 328.2 251.9 336.1 C 232.4 344.3 211.7 348.5 190.3 348.5 C 168.9 348.5 148.2 344.3 128.7 336.1 C 109.9 328.1 92.9 316.7 78.4 302.2 C 63.9 287.7 52.4 270.7 44.5 251.9 C 36.3 232.4 32.1 211.7 32.1 190.3 C 32.1 168.9 36.3 148.2 44.5 128.7 C 52.5 109.9 63.9 92.9 78.4 78.4 C 92.9 63.9 109.9 52.4 128.7 44.5 C 148.2 36.3 168.9 32.1 190.3 32.1 M 190.3 0 C 85.2 0 0 85.2 0 190.3 C 0 295.4 85.2 380.6 190.3 380.6 C 295.4 380.6 380.6 295.4 380.6 190.3 C 380.6 85.2 295.4 0 190.3 0 Z"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg enable-background="new 0 0 64 64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
+ <ellipse style="stroke-width: 0px; stroke: rgb(0, 0, 0); fill:#3d3c3c;" cx="32" cy="32" rx="30" ry="30"/>
+ <circle class="cls-1" cx="32.141" cy="31.8" r="17" style="fill: #b3b3b3;"/>
+ <line class="cls-2" x1="32.141" x2="32.141" y1="4.8" y2="10.8" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="32.141" x2="32.141" y1="52.8" y2="58.8" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="59.141" x2="53.141" y1="31.8" y2="31.8" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="11.141" x2="5.141" y1="31.8" y2="31.8" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="51.231" x2="46.991" y1="12.71" y2="16.95" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="17.291" x2="13.051" y1="46.65" y2="50.89" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="51.231" x2="46.991" y1="50.89" y2="46.65" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <line class="cls-2" x1="17.291" x2="13.051" y1="16.95" y2="12.71" style="fill: none; stroke: #b3b3b3; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 3px;"/>
+ <path class="cls-3" d="M 24.931 27.55 L 24.931 33.5 C 24.931 35.28 25.601 36.18 26.801 36.18 C 28.001 36.18 28.701 35.32 28.701 33.5 L 28.701 27.55 L 31.031 27.55 L 31.031 33.34 C 31.031 36.53 29.421 38.04 26.731 38.04 C 24.041 38.04 22.591 36.6 22.591 33.31 L 22.591 27.55 L 24.931 27.55 Z" style="fill: rgb(255, 255, 255);"/>
+ <path class="cls-3" d="M 35.491 37.88 L 32.141 27.55 L 34.741 27.55 L 36.001 31.92 C 36.351 33.15 36.671 34.33 36.921 35.61 C 37.181 34.37 37.501 33.14 37.851 31.96 L 39.171 27.55 L 41.651 27.55 L 38.211 37.88 L 35.491 37.88 Z" style="fill: rgb(255, 255, 255);"/>
+</svg>
--- /dev/null
+<svg version="1.2" width="52.876" height="26.86mm" viewBox="13400 10314 1399 2686" preserveAspectRatio="xMidYMid"
+ fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
+ <defs class="prefix__ClipPathGroup">
+ <clipPath id="prefix__a" clipPathUnits="userSpaceOnUse">
+ <path d="M13400 10314h1399v2686h-1399z" />
+ </clipPath>
+ </defs>
+ <g class="prefix__SlideGroup">
+ <g class="prefix__Slide" clip-path="url(#prefix__a)">
+ <g class="prefix__Page">
+ <g class="prefix__com_sun_star_drawing_ClosedBezierShape">
+ <path class="prefix__BoundingBox" fill="none" d="M13400 10314h1400v2687h-1400z" />
+ <path fill="#143A79"
+ d="M13607 10314h986c114 0 206 93 206 207v2272c0 114-92 207-206 207h-986c-114 0-207-93-207-207v-2272c0-114 93-207 207-207z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_ClosedBezierShape">
+ <path class="prefix__BoundingBox" fill="none" d="M13616 10459h459v551h-459z" />
+ <path fill="#FFF"
+ d="M13616 10820c0 113 101 189 228 189 129 0 230-76 230-189v-361h-98v352c0 75-58 115-132 115s-131-40-131-115v-352h-97v361z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_PolyPolygonShape">
+ <path class="prefix__BoundingBox" fill="none" d="M14118 10459h503v546h-503z" />
+ <path fill="#FFF" d="M14332 11004h76l212-545h-103l-146 415h-2l-146-415h-104l213 545z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_PolyPolygonShape">
+ <path class="prefix__BoundingBox" fill="none" d="M13630 11065h32v217h-32z" />
+ <path fill="#FFF" d="M13630 11281h31v-216h-31v216z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_PolyPolygonShape">
+ <path class="prefix__BoundingBox" fill="none" d="M13748 11065h154v217h-154z" />
+ <path fill="#FFF" d="M13748 11281h30v-153h1l93 153h29v-216h-31v154l-93-154h-29v216z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_ClosedBezierShape">
+ <path class="prefix__BoundingBox" fill="none" d="M13987 11065h146v217h-146z" />
+ <path fill="#FFF"
+ d="M13988 11281h69c30 0 51-16 63-36 9-15 12-23 12-72 0-45 0-53-11-72-14-24-36-36-62-36h-71v216zm30-186h37c17 0 27 5 36 20 9 11 10 21 10 59 0 40-1 46-8 57-8 13-20 19-38 19h-37v-155z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_PolyPolygonShape">
+ <path class="prefix__BoundingBox" fill="none" d="M14212 11065h132v217h-132z" />
+ <path fill="#FFF" d="M14212 11281h131v-31h-100v-63h85v-29h-85v-63h100v-30h-131v216z" />
+ </g>
+ <g class="prefix__com_sun_star_drawing_PolyPolygonShape">
+ <path class="prefix__BoundingBox" fill="none" d="M14391 11065h161v217h-161z" />
+ <path fill="#FFF"
+ d="M14515 11281h36l-63-111 59-105h-36l-41 75-40-75h-35l58 105-62 111h35l44-80 45 80z" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
- dry Contact or IR Interface `99`: add `3` before --> `where="399"`
- energy meter F520/F521 numbered `1`: add `5` before --> `where="51"`
- energy meter F522/F523 numbered `4`: add `7` before and `#0` after --> `where="74#0"`
- - energy meter F520/F521 the `energyRefreshPeriod` configuration parameter sets the number of minutes (the minimum value is 30, the maximum value is 1440) between refreshes for energy totalizers (default: 30 minutes) --> `energyRefreshPeriod` = 35
+ - energy meter F520/F521 the `energyRefreshPeriod` configuration parameter sets the number of minutes (the minimum value is 30, the maximum value is 1440) between refreshes for energy totalizers (default: 30 minutes) --> `energyRefreshPeriod` = 35
- alarm zone `2` --> `where="2"`
- example for Zigbee devices: `where=765432101#9`. The ID of the device (ADDR part) is usually written in hexadecimal on the device itself, for example `ID 0074CBB1`: convert to decimal (`7654321`) and add `01#9` at the end to obtain `where=765432101#9`. For 2-unit switch devices (`zb_on_off_switch2u`), last part should be `00#9`.
## Rule Actions
-The following Rule actions can be used to send arbitrary OpenWebNet messages on the MyHOME BUS.
+The following Rule actions can be used to send arbitrary OpenWebNet messages on the MyHOME BUS.
Actions can be used for example to send commands to the BUS for a WHOs not yet supported by the binding.
- `Boolean sendMessage(String message)` returns a `Boolean` = `true` if the `message` (OpenWebNet frame) was successfully sent via the gateway, `false` otherwise.
bus_thermo_sensor EXT_tempsensor "External Temperature" [ where="500"]
bus_scenario_control BR_scenario "Bedroom Scenario Module" [ where="95" ]
-
+
bus_cen_scenario_control LR_CEN_scenario "Living Room CEN" [ where="51", buttons="4,3,8"]
bus_cenplus_scenario_control LR_CENplus_scenario "Living Room CEN+" [ where="212", buttons="1,5,18" ]
bus_dry_contact_ir LR_IR_sensor "Living Room IR Sensor" [ where="399" ]
-
+
bus_aux Alarm_Control "Alarm control" [ where="4" ]
bus_alarm_system Alarm_Sys "Alarm System" [ where="0" ]
Frame label="Living Room Thermo"
{
- Default item=iLR_zone_temp label="Temperature" icon="fire" valuecolor=[<20="red"]
+ Default item=iLR_zone_temp label="Temperature" icon="fire" valuecolor=[<20="red"]
Setpoint item=iLR_zone_setTemp label="Setpoint [%.1f °C]" step=0.5 minValue=15 maxValue=30
Selection item=iLR_zone_fanSpeed label="Fan Speed" icon="fan" mappings=[AUTO="AUTO", SPEED_1="Low", SPEED_2="Medium", SPEED_3="High"]
Switch item=iLR_zone_mode label="Mode" icon="settings"
Default item=iLR_zone_hv label="Heating valves status"
Default item=iLR_zone_cv label="Conditioning valves status"
}
-
+
Frame label="CEN+ Scenario activation"
{
Switch item=iCENPlusProxyItem label="My CEN+ scenario" icon="movecontrol" mappings=[ON="Activate"]
}
-
+
Frame label="Alarm"
{
Switch item=iAlarm_System_State label="Alarm state"
when
Channel "openwebnet:bus_scenario_control:mybridge:BR_scenario:scenario" triggered SCENARIO_02
then
- sendCommand(iLR_switch, ON)
+ sendCommand(iLR_switch, ON)
end
rule "CEN+ virtual press from OH button"
/* This rule triggers when the proxy item iCENPlusProxyItem is activated, for example from a button on WebUI/sitemap.
-When activated it sends a "virtual short press" event (where=212, button=5) on the BUS
+When activated it sends a "virtual short press" event (where=212, button=5) on the BUS
*/
-when
+when
Item iCENPlusProxyItem received command
then
val actions = getActions("openwebnet","openwebnet:bus_cenplus_scenario_control:mybridge:212")
when
Channel "openwebnet:bus_cen_scenario_control:mybridge:51:button#4" triggered START_PRESS
then
- sendCommand(iLR_dimmer, INCREASE)
+ sendCommand(iLR_dimmer, INCREASE)
end
when
Channel "openwebnet:bus_cen_scenario_control:mybridge:51:button#4" triggered RELEASE_EXTENDED_PRESS
then
- sendCommand(iLR_dimmer, DECREASE)
+ sendCommand(iLR_dimmer, DECREASE)
end
```
## Discovery
-This binding supports the auto discovery of the sprinklers bound to your Orbit B-hyve account.
+This binding supports the auto discovery of the sprinklers bound to your Orbit B-hyve account.
To start the discovery you need to create a bridge thing and enter valid credentials to your Orbit B-hyve cloud account.
## Thing Configuration
-The bridge thing requires a manual configuration. You have to enter valid credentials to your Orbit B-hyve account, and you can also set the refresh time in seconds for polling data from the Orbit cloud.
+The bridge thing requires a manual configuration. You have to enter valid credentials to your Orbit B-hyve account, and you can also set the refresh time in seconds for polling data from the Orbit cloud.
There is no user configuration related to sprinkler things. Sprinklers do need a configuration property _id_ identifying the device, but the only way how to retrieve it is to let the bridge to auto discover sprinklers.
## Channels
### Things Example
```java
-Bridge orbitbhyve:bridge:mybridge "Orbit Bridge" [ email="your@ema.il", password="yourPass", refresh=30 ] {
- Thing sprinkler indoor_timer "Sprinkler" [ id="4cab55704e0d7ddf98c1cc37" ]
+Bridge orbitbhyve:bridge:mybridge "Orbit Bridge" [ email="your@ema.il", password="yourPass", refresh=30 ] {
+ Thing sprinkler indoor_timer "Sprinkler" [ id="4cab55704e0d7ddf98c1cc37" ]
}
```
### Items Example
```java
-Switch IrrigationControl "Irrigation active" <bhyve> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:control" }
-Switch IrrigationSmartWatering "Smart watering" <bhyve> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:smart_watering" }
-Switch Irrigation1 "Zone 1" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_1" }
-Switch Irrigation2 "Zone 2" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_2" }
-Switch Irrigation3 "Zone 3" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_3" }
-Switch Irrigation4 "Zone 4" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_4" }
-Switch IrrigationP1 "Run program A" <program> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:program_a" }
-Switch IrrigationP1Enable "Schedule program A" <program> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:enable_program_a" }
-String IrrigationMode "Irrigation mode [%s]" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:mode" }
-Number IrrigationTime "Irrigation time [%d min]" <clock> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:watering_time" }
-Number IrrigationRainDelay "Rain delay [%d h]" <hourglass> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:rain_delay" }
-DateTime IrrigationNextStart "Next start A [%1$td.%1$tm.%1$tY %1$tR]" <clock> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:next_start" }
+Switch IrrigationControl "Irrigation active" <bhyve> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:control" }
+Switch IrrigationSmartWatering "Smart watering" <bhyve> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:smart_watering" }
+Switch Irrigation1 "Zone 1" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_1" }
+Switch Irrigation2 "Zone 2" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_2" }
+Switch Irrigation3 "Zone 3" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_3" }
+Switch Irrigation4 "Zone 4" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:zone_4" }
+Switch IrrigationP1 "Run program A" <program> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:program_a" }
+Switch IrrigationP1Enable "Schedule program A" <program> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:enable_program_a" }
+String IrrigationMode "Irrigation mode [%s]" <water> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:mode" }
+Number IrrigationTime "Irrigation time [%d min]" <clock> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:watering_time" }
+Number IrrigationRainDelay "Rain delay [%d h]" <hourglass> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:rain_delay" }
+DateTime IrrigationNextStart "Next start A [%1$td.%1$tm.%1$tY %1$tR]" <clock> (Out_Irrigation) { channel="orbitbhyve:sprinkler:mybridge:indoor_timer:next_start" }
```
### Sitemap Example
```perl
-Switch item=IrrigationControl
-Switch item=IrrigationSmartWatering
-Switch item=Irrigation1
-Switch item=Irrigation2
-Switch item=Irrigation3
-Switch item=Irrigation4
-Setpoint item=IrrigationTime minValue=1 maxValue=240 step=1
-Switch item=IrrigationP1
-Switch item=IrrigationP1Enable
-Text item=IrrigationMode
-Text item=IrrigationRainDelay
-Switch item=IrrigationRainDelay mappings=[0="OFF", 24="24", 48="48", 72="72"]
-Text item=IrrigationNextStart visibility=[IrrigationP1Enable==ON]
+Switch item=IrrigationControl
+Switch item=IrrigationSmartWatering
+Switch item=Irrigation1
+Switch item=Irrigation2
+Switch item=Irrigation3
+Switch item=Irrigation4
+Setpoint item=IrrigationTime minValue=1 maxValue=240 step=1
+Switch item=IrrigationP1
+Switch item=IrrigationP1Enable
+Text item=IrrigationMode
+Text item=IrrigationRainDelay
+Switch item=IrrigationRainDelay mappings=[0="OFF", 24="24", 48="48", 72="72"]
+Text item=IrrigationNextStart visibility=[IrrigationP1Enable==ON]
```
# Panasonic Blu-ray Player Binding
-This binding connects Panasonic Blu-ray players from 2011/2012 and UHD Blu-ray players from 2018 to openHAB.
-**Supported Blu-ray models:** DMP-BDT110, DMP-BDT210, DMP-BDT310, DMP-BDT120, DMP-BDT220, DMP-BDT320, DMP-BBT01 & DMP-BDT500.
-**Supported UHD models:** DP-UB420/424, DP-UB820/824 & DP-UB9000/9004.
+This binding connects Panasonic Blu-ray players from 2011/2012 and UHD Blu-ray players from 2018 to openHAB.
+**Supported Blu-ray models:** DMP-BDT110, DMP-BDT210, DMP-BDT310, DMP-BDT120, DMP-BDT220, DMP-BDT320, DMP-BBT01 & DMP-BDT500.
+**Supported UHD models:** DP-UB420/424, DP-UB820/824 & DP-UB9000/9004.
**Please note:** The player must be on the same IP subnet as the openHAB server for this binding to function.
If the connection to the player originates from a different subnet, 404 response errors are sent in response to all requests.
-To enable network remote control of the Blu-ray model players, configure the following settings:
-**Player Settings/Network/Network Settings/Remote Device Settings**
-Then make sure you have the following values set:
-**Remote Device Operation: On**
-**Registration Type: Automatic**
+To enable network remote control of the Blu-ray model players, configure the following settings:
+**Player Settings/Network/Network Settings/Remote Device Settings**
+Then make sure you have the following values set:
+**Remote Device Operation: On**
+**Registration Type: Automatic**
For the UHD models, Voice Control must be enabled for the player's http interface to be active:
**Player Settings/Network/Voice Control: On**
-To enable the binding to control the player while off (network active while off), Quick Start mode must be On as follows:
-**Player Settings/System/Quick Start: On**
+To enable the binding to control the player while off (network active while off), Quick Start mode must be On as follows:
+**Player Settings/System/Quick Start: On**
-**UHD Model Command Authentication:**
+**UHD Model Command Authentication:**
The UHD models require authentication to use the control API.
A player key must be specified in the thing configuration in order for the `power`, `button` and `control` channels to work.
UHD model players that are patched do not require a player key.
Some notes:
-* The control protocol of these players is undocumented and may not work consistently in all situations
-* The UHD models only support playback elapsed time (not title total time or chapter information) reporting
-* The time and chapter information is only available when playing a Blu-ray disc (not DVD or CD)
-* There are reports in forum postings that not all commands work on all of the older models (i.e.: Power does not work on DMP-BDT110)
-* Not all status information is available from all BD models (i.e.: playback elapsed time not reported by some models)
+- The control protocol of these players is undocumented and may not work consistently in all situations
+- The UHD models only support playback elapsed time (not title total time or chapter information) reporting
+- The time and chapter information is only available when playing a Blu-ray disc (not DVD or CD)
+- There are reports in forum postings that not all commands work on all of the older models (i.e.: Power does not work on DMP-BDT110)
+- Not all status information is available from all BD models (i.e.: playback elapsed time not reported by some models)
## Channels
### Appendix A - 'button' channel command codes:
-**List of available button commands for BD players:**
+**List of available button commands for BD players:**
| Function | Command |
|--------------------------|----------|
| OSD (DISPLAY) | OSDONOFF |
| Shuttle(BD) View (buttons not in other views)||
| Swipe in CW circle | SHFWD2 |
-| Swipe in CCW circle | SHREV2 |
+| Swipe in CCW circle | SHREV2 |
-**List of available button commands for UHD players:**
+**List of available button commands for UHD players:**
| Function | Command |
|------------------|------------------|
Currently binding supports the following panels: EVO192, EVO48(not tested), EVO96(not tested)
-## Supported things
+## Supported Things
-| Thing | Thing Type | Description |
-|------------|------------|----------------------------------------------------------------|
-| ip150 | Bridge | The bridge is used to communicate with IP150 ethernet module attached to Paradox security system.|
-| panel | Thing | This is representation of Paradox panel. Has the general information about the main panel module, i.e. serial number, firmware/hardware/software versions, panel type, etc...|
-| partition | Thing | The partition is grouped aggregation of multiple zones. It's also referred in Paradox Babyware as "Area". |
-| zone | Thing | Paradox zone. Can be anything - magnetic, motion or any other opened/closed sensor. State channel is contact, "low battery" and "is tampered" channels are switch, label is String |
+| Thing | Thing Type | Description |
+|-----------|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ip150 | Bridge | The bridge is used to communicate with IP150 ethernet module attached to Paradox security system. |
+| panel | Thing | This is representation of Paradox panel. Has the general information about the main panel module, i.e. serial number, firmware/hardware/software versions, panel type, etc... |
+| partition | Thing | The partition is grouped aggregation of multiple zones. It's also referred in Paradox Babyware as "Area". |
+| zone | Thing | Paradox zone. Can be anything - magnetic, motion or any other opened/closed sensor. State channel is contact, "low battery" and "is tampered" channels are switch, label is String |
## Things configuration
-### IP150 bridge parameters
+### IP150 Bridge Parameters
-| Parameter | Description |
-|-------------------|----------------------------------------|
-| refresh | Value is in seconds. Defines the refresh interval when the binding polls from paradox system. Optional parameter. Default 5 seconds.|
-| ip150Password | The password to your IP150 (not your panel PIN). Mandatory parameter. |
-| pcPassword | The panel programming code 3012 setting. Optional parameter. Default value is 0000.|
-| ipAddress | IP address or hostname of your IP150. If hostname is used must be resolvable by OpenHAB. Mandatory parameter. |
-| port | The port used for data communication. Optional parameter. Default value is 10000.|
+| Parameter | Description |
+|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
+| refresh | Value is in seconds. Defines the refresh interval when the binding polls from paradox system. Optional parameter. Default 5 seconds. |
+| ip150Password | The password to your IP150 (not your panel PIN). Mandatory parameter. |
+| pcPassword | The panel programming code 3012 setting. Optional parameter. Default value is 0000. |
+| ipAddress | IP address or hostname of your IP150. If hostname is used must be resolvable by OpenHAB. Mandatory parameter. |
+| port | The port used for data communication. Optional parameter. Default value is 10000. |
| panelType | If parameter is passed, auto-discovery of panel type will be skipped. Provide string - EVO48, EVO96, EVO192, etc... Optional parameter. |
-| reconnectWaitTime | Value is in seconds. The time to wait before a reconnect occurs after socket timeout. Optional parameter. Default value is 30 seconds.|
-| maxPartitions | Sets maximum partitions to use during refresh. If not set, maximum allowed amount from panelType will be used. Optional parameter. |
-| maxZones | Sets maximum zones to use during refresh. If not set, maximum allowed amount from panelType will be used. Optional parameter.|
-| encrypt | Sets if encryption has to be used. Optional parameter. Default value is false |
+| reconnectWaitTime | Value is in seconds. The time to wait before a reconnect occurs after socket timeout. Optional parameter. Default value is 30 seconds. |
+| maxPartitions | Sets maximum partitions to use during refresh. If not set, maximum allowed amount from panelType will be used. Optional parameter. |
+| maxZones | Sets maximum zones to use during refresh. If not set, maximum allowed amount from panelType will be used. Optional parameter. |
+| encrypt | Sets if encryption has to be used. Optional parameter. Default value is false |
-### IP150 bridge channels
+### IP150 Bridge Channels
| Channel | Description |
|---------------------|------------------------------------------------|
|communicationCommand | Possible values [LOGOUT, LOGIN, RESET] |
|communicationState | Shows the communication status to Paradox. Different from Bridge status. Bridge may be online and able to receive commands but communication may be offline due to various reasons. Possible values [Offline, Online] |
-#### Communication command channel allowed values
+#### Communication Command Values
| Value | Description |
|--------|------------------------------------------------------------------------------------|
| LOGIN | Creates socket if necessary, connects to paradox system and uses the logon data from the thing parameters to connect.|
| RESET | Does logout and then login with recreation of communicator objects inside the code.|
-### Entities (zones, partitions) configuration parameters:
+### Entities (zones, partitions) Configuration
| Value | Description |
|-------------------|------------------------------------------------------------------------------------|
| id | The numeric ID of the zone/partition |
| disarmEnabled | Optional boolean flag. Valid for partitions. When set to true the command DISARM will be allowed for the partition where the flag is enabled. CAUTION: Enabling DISARM command can be dangerous. If attacker can gain access to your openHAB (via API or UI), this command can be used to disarm your armed partition (area) |
-### Panel channels:
+### Panel Channels
| Channel | Type | Description |
|--------------------------|----------------------------|-------------------------------------------------------------------------------------------|
| batteryVoltage | Number:ElectricPotential | Battery Voltage |
| panelTime | DateTime | Panel internal time (Timezone is set to default zone of the Java virtual machine) |
-### Partition channels:
+### Partition Channels
| Channel | Type | Description |
|--------------------------|---------|-----------------------------------------------------------------------------------------------|
| allZonesClosed | Contact | All zones in partition are currently closed |
| command | String | Command to be send to partition. Can be (ARM, DISARM, FORCE_ARM, INSTANT_ARM, STAY_ARM, BEEP) |
-### Partition detailed state possible values:
+### Partition Detailed State Values
+
| Overall state value | Detailed state value (depending on the sub-state) |
|--------------------------|----------------------------------------------------------------------------------------------|
| InAlarm | Silent Alarm, Audible Alarm, Fire Alarm, In Alarm (if none of the first three) |
| Armed | Away Armed, Stay Armed, NoEntry Armed, Armed (if none of the first three) |
| Disarmed | Disarmed |
-### Zone channels:
+### Zone Channels
| Channel | Type | Description |
|------------------------------------|---------|--------------------------------------------------------------------------------|
| generatedAlarm | Switch | Zone has generated an alarm |
| command | String | Command for zone. Can be (BYPASS, CLEAR_BYPASS) |
-
-## Example things configuration
+## Example Things Configuration
```java
Bridge paradoxalarm:ip150:ip150 [refresh=5, panelType="EVO192", ip150Password="********", pcPassword="0000", ipAddress=XXX.XXX.XXX.XXX", port=10000, reconnectWaitTime=10, maxPartitions=4, maxZones=50, encrypt=true ] {
}
```
-## Example items configuration
+## Example Items Configuration
```java
//Groups
Contact CorridorFl1_MUC_state "Corridor Fl1 window: [%s]" (Floor1MUC) { channel = "paradoxalarm:zone:ip150:MagneticSensorWindow1:opened" }
```
-## Example sitemap configuration
+## Example Sitemap Configuration
```java
Text label="Security" icon="lock" {
# PegelOnline Binding
-Binding to observe water level from german rivers.
+Binding to observe water level from german rivers.
Data is provided by german **Water-Route and Shipping Agency** [WSV](https://www.pegelonline.wsv.de/).
-Goal is to monitor actual water levels from rivers nearby your home.
+Goal is to monitor actual water levels from rivers nearby your home.
In case of changing water levels the corresponding warning level is lowered or raised.
## Supported Things
|---------------------|---------------------------------------------------------------------------------|---------|
| Measurement Station | Station providing water level measurements | station |
-
## Discovery
In case your home location coordinates are set the discovery will recognize all measurement stations within a radius of 50 km.
Found Things are added in your Inbox.
-
## Thing Configuration
Thing configuration contains 3 sections
-* [Station selection](station_selection)
-* [Warning Levels of selected station](warning_levels)
-* [Refresh rate](configuration_parameters)
+- [Station selection](station_selection)
+- [Warning Levels of selected station](warning_levels)
+- [Refresh rate](configuration_parameters)
### Station selection
-Stations can be selected with an Universally Unique Identifier (uuid).
-It's automatically added by the Discovery.
+Stations can be selected with an Universally Unique Identifier (uuid).
+It's automatically added by the Discovery.
Configure a station manually using [list of all available stations](https://pegelonline.wsv.de/gast/pegeltabelle) or [stations.json](https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json) and choose the uuid of your desired measurement station.
### Warning Levels
Each station has specific warning levels
-* Warning Levels 1 (*lowest*) to 3 (*highest*)
-* Flooding Levels
+- Warning Levels 1 (*lowest*) to 3 (*highest*)
+- Flooding Levels
-Unfortunately these levels cannot be queried automatically.
+Unfortunately these levels cannot be queried automatically.
Please select your [federal state](https://www.hochwasserzentralen.de/) and check if which levels they provide.
The picture shows the levels of [measurement station Marburg of federal state Hesse](https://www.hlnug.de/static/pegel/wiskiweb2/stations/25830056/station.html?v=20210802152952)
### Configuration parameters
-| configuration | content | unit | description | required | default |
+| configuration | content | unit | description | required | default |
|------------------|-----------|------|---------------------------|----------|---------|
| uuid | text | - | Unique Station Identifier | X | N/A |
| warningLevel1 | integer | cm | Warning Level 1 | | N/A |
## Channels
-
| channel id | type | description |
|----------------------|----------------------|--------------------------------|
| timestamp | DateTime | Last Measurement |
Possible values:
-* 1 : Rising
-* 0 : Steady
-* -1 : Lowering
+- 1 : Rising
+- 0 : Steady
+- -1 : Lowering
### Warning
Current warning according to configuration
-* 0 : No Warning
-* 1 : Warning level 1
-* 2 : Warning Level 2
-* 3 : Warning Level 3
-* 4 : Decade Flooding
-* 5 : Century Flooding
-* 6 : Extreme Flooding
+- 0 : No Warning
+- 1 : Warning level 1
+- 2 : Warning Level 2
+- 3 : Warning Level 3
+- 4 : Decade Flooding
+- 5 : Century Flooding
+- 6 : Extreme Flooding
## Full Example
```java
Thing pegelonline:station:giessen "Measurement Station Giessen" [
- uuid="4b386a6a-996e-4a4a-a440-15d6b40226d4",
- refreshInterval=15,
- warningLevel1=550,
- warningLevel2=600,
- warningLevel3=650,
- hq10=732,
+ uuid="4b386a6a-996e-4a4a-a440-15d6b40226d4",
+ refreshInterval=15,
+ warningLevel1=550,
+ warningLevel2=600,
+ warningLevel3=650,
+ hq10=732,
hq100=786
]
```
### Items
```java
-DateTime Lahn_Giessen_Timestamp "Measurement timestamp Lahn Giessen" {channel="pegelonline:station:giessen:timestamp" }
-Number:Length Lahn_Giessen_Level "Water Level Lahn Giessen]" {channel="pegelonline:station:giessen:level" }
+DateTime Lahn_Giessen_Timestamp "Measurement timestamp Lahn Giessen" {channel="pegelonline:station:giessen:timestamp" }
+Number:Length Lahn_Giessen_Level "Water Level Lahn Giessen]" {channel="pegelonline:station:giessen:level" }
Number Lahn_Giessen_Trend "Water Level Trend Lahn Giessen" {channel="pegelonline:station:giessen:trend"}
-Number Lahn_Giessen_Warning "Warning Level Lahn Giessen" {channel="pegelonline:station:giessen:warning"}
+Number Lahn_Giessen_Warning "Warning Level Lahn Giessen" {channel="pegelonline:station:giessen:warning"}
```
-
## Links
[PegelOnline API Documentation](https://www.pegelonline.wsv.de/webservice/dokuRestapi#caching)
-
| Channel Group | Channel | Type | | Description |
| :------------------------------: | :-------: | :----: | :-: | :--------------: |
-| pool, spa, aux[1-8], feature[1-8] | switch | Switch | RW | Indicates the particulcar circuit or feature is on or off. |
+| pool, spa, aux[1-8], feature[1-8] | switch | Switch | RW | Indicates the particulcar circuit or feature is on or off. |
| " | name | String | R | Name of circuit |
| " | feature | String | R | Feature of ciruit |
| poolheat, spaheat | setpoint | Number:Temperature | RW | Temperature setpoint |
Number Pump_RPM "Pump RPM [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:rpm" }
Number Pump_GPM "Pump GPM [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:gpm" }
Number Pump_Power "Pump Power [%d W]" (gPool) { channel = "pentair:intelliflo:1:pump1:power" }
-Number Pump_Error "Pump Error [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:error" }
+Number Pump_Error "Pump Error [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:error" }
Number Pump_Status1 "Pump Status 1 [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:status1" }
Number Pump_Status2 "Pump Status 2 [%d]" (gPool) { channel = "pentair:intelliflo:1:pump1:status2" }
Number Schedule1_Type "Schedule 1 type" (gPool) { channel = "pentair:controller:1:main:schedule1#type" }
String Schedule1_String "Schedule 1 string" (gPool) { channel = "pentair:controller:1:main:schedule1#schedule" }
Number Schedule1_Circuit "Schedule 1 circuit" (gPool) { channel = "pentair:controller:1:main:schedule1#circuit" }
-String Schedule1_Days "Schedule 1 days" (gPool) { channel = "pentair:controller:1:main:schedule1#days" }
+String Schedule1_Days "Schedule 1 days" (gPool) { channel = "pentair:controller:1:main:schedule1#days" }
```
### sitemap
# PHC Binding
-This binding allows you to integrate modules(at the Moment AM, EM, JRM and DIM) of PHC, without the PHC control (STM), in openHAB.
+This binding allows you to integrate modules(at the Moment AM, EM, JRM and DIM) of PHC, without the PHC control (STM), in openHAB.
The serial protocol is mainly extracted, with thanks to the developers from the projects [PHCtoUDP](https://sourceforge.net/projects/phctoudp/) and [OpenHC](https://sourceforge.net/projects/openhc/?source=directory).
## Serial Communication
-The binding was tested with QinHeng Electronics HL-340 USB-Serial adapter (RS485) and the Digitus DA-70157 (FTDI/FT323RL) on Raspbian Ubilinux (Up Board) and Windows 10:
+The binding was tested with QinHeng Electronics HL-340 USB-Serial adapter (RS485) and the Digitus DA-70157 (FTDI/FT323RL) on Raspbian Ubilinux (Up Board) and Windows 10:
| Device/OS | adaptor | result |
|--------------------------|---------------|--------------|
Sometimes after initialization, you might have to switch two times or the reaction could be a bit slow, but after you used a channel it should all work fine.
For all devices running with Linux that use the ch341 driver (HL-340), the new version (ch34x) is needed.
-A guide how to install this can be found here: [CH340/341 UART Driver for Raspberry Pi](https://github.com/aperepel/raspberrypi-ch340-driver).
+A guide how to install this can be found here: [CH340/341 UART Driver for Raspberry Pi](https://github.com/aperepel/raspberrypi-ch340-driver).
If you don´t have the same kernel as used in the guide you have to compile the module yourself. In the guide is described a specific way for the Raspberry Pi. With another Linux version you can go the normal way with linux-headers.
```java
import java.util.concurrent.TimeUnit
-
+
rule "test"
when
/* when */
if (actions !== null) {
// disable blocking for 5 * 60 seconds (5 minutes)
actions.disableBlocking(5 * 60)
-
+
// disable blocking for 5 minutes
actions.disableBlocking(5, TimeUnit.MINUTES)
-
+
// disable blocking for infinity
actions.disableBlocking(0)
actions.disableBlocking()
-
+
// enable blocking
actions.enableBlocking()
- }
+ }
end
```
It can be used for multiple scenarios:
-* Drive light changes based on player status. For instances turn off the lights when movie starts playing and turn them back on when movie is stopped/paused
-* Create a page that displays currently played media of one or more player connected to the server.
-* Send social media messages when player plays new media
-* Inform what the end time of the currently played media is
+- Drive light changes based on player status. For instances turn off the lights when movie starts playing and turn them back on when movie is stopped/paused
+- Create a page that displays currently played media of one or more player connected to the server.
+- Send social media messages when player plays new media
+- Inform what the end time of the currently played media is
The binding can also control `PLAY/PAUSE/NEXT/PREVIOUS` the players which can be used for:
-* Start playing some music when someone enters a room
-* Pause the movie when motion is detected
+- Start playing some music when someone enters a room
+- Pause the movie when motion is detected
## Supported Things
The PLEX Server needs to be configured first. The hostname of the PLEX server is mandatory and the either the PLEX token (recommended) or the username/password of the PLEX server (not recommended).
-Then find the PLEX token please follow the instructions from the PLEX support forum:
+Then find the PLEX token please follow the instructions from the PLEX support forum:
1. Sign in to your Plex account in Plex Web App
2. Browse to a library item and view the XML for it
#### Autodiscovery
Turn on the player you want to add and *play* some media on it. Navigate to `/settings/things/add/plex` and start the auto discover.
-The player will be found and you can add it.
+The player will be found and you can add it.
#### Manual adding a player Thing
# Prowl Binding
-This is the binding for the [Prowl](https://www.prowlapp.com) iOS push service.
-It has been written from scratch and therefore it is not based on the original 1.x Prowl binding.
+This is the binding for the [Prowl](https://www.prowlapp.com) iOS push service.
+It has been written from scratch and therefore it is not based on the original 1.x Prowl binding.
It has no other purpose than sending push messages to iOS devices.
## Binding Configuration
## Thing Configuration
-This binding has only one thing called _Broker_. If you want to use this binding, just add a broker instance and configure the API key, which you can generate on the Prowl website.
-You can also modify the _application_ property, which identifies the originator of these push messages.
+This binding has only one thing called _Broker_. If you want to use this binding, just add a broker instance and configure the API key, which you can generate on the Prowl website.
+You can also modify the _application_ property, which identifies the originator of these push messages.
If you want to have specific refresh time for the remaining free push messages channel, you can edit the _refresh_ property.
Anyway beware - every check consumes one free push message you can send in an hour.
### Rules
-Once you have created the broker thing with a valid API key, you can use the Prowl service in your rules.
+Once you have created the broker thing with a valid API key, you can use the Prowl service in your rules.
First you need to create an instance of the broker just before any call or on the top rules level. (replace the _mybroker_ with the right name of your instance).
Then you can call method _pushNotification_, which requires two parameters - _event_ and _description_.
There is also an optional third parameter _priority_ which represents the message priority (very low) -2,-1,0,1,2 (emergency). The default priority is 0.
```java
-val prowl = getActions("prowl","prowl:broker:mybroker")
+val prowl = getActions("prowl","prowl:broker:mybroker")
prowl.pushNotification("Event", "This is the description of the event")
prowl.pushNotification("Emergency Event", "This is the description of the event", 2)
```
#### UI based Configuration
-`station` is the station name for which to display departures.
-The name has to be one that is used by the swiss federal railways.
+`station` is the station name for which to display departures.
+The name has to be one that is used by the swiss federal railways.
Please consult their [website](https://sbb.ch/en).
#### Textual configuration
## Thing Configuration
-The Pulseaudio bridge requires the host (ip address or a hostname) and a port (default: 4712) as a configuration value in order for the binding to know where to access it.
+The Pulseaudio bridge requires the host (ip address or a hostname) and a port (default: 4712) as a configuration value in order for the binding to know where to access it.
A Pulseaudio device requires at least an identifier. For sinks and sources, you can use the name or the description. For sink inputs and source outputs, you can use the name or the application name.
-To know without hesitation the correct value to use, you should use the command line utility `pactl`. For example, to find the name of a sink:
-`pactl -s <ip-address|hostname> list sinks | grep "name:"`
+To know without hesitation the correct value to use, you should use the command line utility `pactl`. For example, to find the name of a sink:
+`pactl -s <ip-address|hostname> list sinks | grep "name:"`
If you need to narrow the identification of a device (in case name or description are not consistent and sufficient), you can use the `additionalFilters` parameter (optional/advanced parameter), in the form of one or several (separator '###') regular expression(s), each one matching a property value of the pulseaudio device. You can use every properties listed with `pactl`.
## Channels
| `title` | text | The default title of a message (default: `openHAB`). |
| `format` | text | The default format (`none`, `html` or `monospace`) of a message (default: `none`). |
| `sound` | text | The notification sound on target device (default: `default`) (see [supported notification sounds](https://pushover.net/api#sounds)). This list will be populated dynamically during runtime with 21 different sounds plus user-defined [custom sounds](https://blog.pushover.net/posts/2021/3/custom-sounds). |
-| `retry` | integer | The retry parameter specifies how often (in seconds) the Pushover servers will send the same emergency-priority notification to the user (default: `300`). **advanced** |
-| `expire` | integer | The expire parameter specifies how long (in seconds) your emergency-priority notification will continue to be retried (default: `3600`). **advanced** |
+| `retry` | integer | The retry parameter specifies how often (in seconds) the Pushover servers will send the same emergency-priority notification to the user (default: `300`). **advanced** |
+| `expire` | integer | The expire parameter specifies how long (in seconds) your emergency-priority notification will continue to be retried (default: `3600`). **advanced** |
| `timeout` | integer | The timeout parameter specifies maximum number of seconds a request to Pushover can take. **advanced** |
## Channels
For other priorities, the action always returns an empty `String`.
- `cancelPriorityMessage(String receipt)` - This method is used to cancel an emergency priority message.
+
The action returns a `Boolean` value to indicate if the message was cancelled successfully or not.
## Full Example
`Settings` --> `Advanced Settings` --> `Installation` --> `Devices` --> `Wi-Fi Devices` --> `Reveal Secure Token` (copy token to use in panel configuration)
-At this point you may add the panel thing in openHAB using the secure token along with the IP or host name of the panel.
+At this point you may add the panel thing in openHAB using the secure token along with the IP or host name of the panel.
### Partition (Bridge)
Group ZoneMotionDetector1 "Motion Detector 1" ["Equipment"]
Number ZoneMotionDetector_ZoneState1 "Motion Detector 1 Zone State" (ZoneMotionDetector1) ["Point"] {channel="qolsysiq:zone:home:0:2:state"}
-String ZoneMotionDetector_ZoneStatus1 "Motion Detector 1 Zone Status" (ZoneMotionDetector1) ["Point"] {channel="qolsysiq:zone:home:0:2:status"}
+String ZoneMotionDetector_ZoneStatus1 "Motion Detector 1 Zone Status" (ZoneMotionDetector1) ["Point"] {channel="qolsysiq:zone:home:0:2:status"}
```
The binding will auto select your country based on openHAB's settings that you made when setting up openHAB.
It makes sense to do this for languages if the built in way of `languageCount` does not work for your use case.
Genres are a good example for using the metadata, only show the styles of music and other tags that you like.
-If in doubt you can use the [Event Monitor in the Developer Sidebar](https://www.openhab.org/docs/tutorial/tips-and-tricks.html#event-monitor) to watch what commands are sent to the bindings channels.
+If in doubt you can use the [Event Monitor in the Developer Sidebar](https://www.openhab.org/docs/tutorial/tips-and-tricks.html#event-monitor) to watch what commands are sent to the bindings channels.
## Channels
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:
+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
-3 - TxD
-4 - +5V
+2 - RxD
+3 - TxD
+4 - +5V
5 - GND
Serial communication is using 19200 bps, 8 bit, no parity, 1 stop bit.
The "hvactargettemperature" is used by the hvacstatus ON command for pre-conditioning the car.
This seams to only allow values 19, 20 and 21 or else the pre-conditioning command will not work.
-The 'pause' and 'chargingmode' may not work on some cars.
+The 'pause' and 'chargingmode' may not work on some cars.
As an example, 'chargingmode' does not work on Dacia Spring cars.
The Kamereon API Key changes periodically, which causes a communication error.
There are a number of ways to detect the commandId values for your device.
- You can turn on DEBUG messages for the rfxcom binding by adding the line `<Logger level="DEBUG" name="org.openhab.binding.rfxcom"/>` to your `log4j2.xml`.
-You will then be able to see the commandId in the log file when you trigger the device.
-- You can link a Number Item to the commandId channel. The item will be updated with the detected commandId when you trigger the device.
+You will then be able to see the commandId in the log file when you trigger the device.
+- You can link a Number Item to the commandId channel. The item will be updated with the detected commandId when you trigger the device.
- You can use RFXmngr to look at the data from the device. Use the last letter/number of the hexadecimal "Code", and convert it from hexadecimal to decimal.
#### Examples
- The values for `activeApp`, `activeAppName`, `playMode`, `timeElapsed`, `timeTotal`, `activeChannel`, `signalMode`, `signalQuality`, `channelName`, `programTitle`, `programDescription`, `programRating`, `power` & `powerState` refresh automatically per the configured `refresh` interval.
-**List of available button commands for Roku streaming devices:**
-Home
-Rev
-Fwd
-Play
-Select
-Left
-Right
-Up
-Down
-Back
-InstantReplay
-Info
-Backspace
-Search
-Enter
-FindRemote
-
-**List of additional button commands for Roku TVs:**
-ChannelUp
-ChannelDown
-VolumeUp
-VolumeDown
-VolumeMute
-InputTuner
-InputHDMI1
-InputHDMI2
-InputHDMI3
-InputHDMI4
-InputAV1
-PowerOff
+**List of available button commands for Roku streaming devices:**
+Home
+Rev
+Fwd
+Play
+Select
+Left
+Right
+Up
+Down
+Back
+InstantReplay
+Info
+Backspace
+Search
+Enter
+FindRemote
+
+**List of additional button commands for Roku TVs:**
+ChannelUp
+ChannelDown
+VolumeUp
+VolumeDown
+VolumeMute
+InputTuner
+InputHDMI1
+InputHDMI2
+InputHDMI3
+InputHDMI4
+InputAV1
+PowerOff
POWERON _(NOTE: POWERON needs to be completely capitalized due to a bug with older Roku devices)_
## Full Example
String SWC_forecast "Weather Forecast" (gSager) {channel="sagercaster:sagercaster:triel:output#forecast"}
String SWC_velocity "Wind Velocity" (gSager) {channel="sagercaster:sagercaster:triel:output#velocity"}
String SWC_windfrom "Wind from" (gSager) {channel="sagercaster:sagercaster:triel:output#wind-from"}
-
+
DateTime SWC_ObservationTime "Timestamp [%1$tH:%1$tM]" <time> (gSager, gTrackAge) {channel="sagercaster:sagercaster:triel:output#timestamp" }
```
OpenHAB binding to the SAIC-API used by MG cars (MG4, MG5 EV, MG ZSV...)
-It enables iSMART users to get battery status and other data from their cars.
+It enables iSMART users to get battery status and other data from their cars.
They can also pre-heat their cars by turning ON the AC.
Based on the work done here: https://github.com/SAIC-iSmart-API
## Discovery
-Vehicle discovery is implemented.
+Vehicle discovery is implemented.
Once an account has been configured it can be scanned for vehicles.
## Thing Configuration
```java
Number MG5_Total_Distance_Driven "MG5 Total Distance Driven" ["Length"] {channel="saicismart:vehicle:myaccount:mymg5:odometer"}
Number MG5_Electric_Range "MG5 Electric Range" ["Length"] {channel="saicismart:vehicle:myaccount:mymg5:range-electric"}
-Number MG5_Battery_Level "MG5 Battery Level" ["Energy"] {channel="saicismart:vehicle:myaccount:mymg5:soc"}
+Number MG5_Battery_Level "MG5 Battery Level" ["Energy"] {channel="saicismart:vehicle:myaccount:mymg5:soc"}
Number MG5_Power_Usage "MG5 Power Usage" ["Power"] {channel="saicismart:vehicle:myaccount:mymg5:power"}
Switch MG5_Charging "MG5 Charging" {channel="saicismart:vehicle:myaccount:mymg5:charging"}
Switch MG5_Engine_State "MG5 Engine State" {channel="saicismart:vehicle:myaccount:mymg5:engine"}
## Binding Configuration
-Basic operation does not require any special configuration.
+Basic operation does not require any special configuration.
The binding has the following configuration options, which can be set for "binding:samsungtv":
The Samsung TV Thing requires the host name and port address as a configuration value in order for the binding to know how to access it.
Samsung TV's publish several UPnP devices and the hostname is used to recognize those UPnP devices.
Port address is used for remote control emulation protocol.
-Additionally, a refresh interval can be configured in milliseconds to specify how often TV resources are polled. Default is 1000 ms.
+Additionally, a refresh interval can be configured in milliseconds to specify how often TV resources are polled. Default is 1000 ms.
E.g.
Different ports are used on different models. It may be 55000, 8001 or 8002.
-If you have a <2016 TV, the interface will be *Legacy*, and the port is likely 55000.
-If you have a >2016 TV, the interface will be either *websocket* on port 8001, or *websocketsecure* on port 8002.
+If you have a <2016 TV, the interface will be *Legacy*, and the port is likely 55000.
+If you have a >2016 TV, the interface will be either *websocket* on port 8001, or *websocketsecure* on port 8002.
If your TV supports *websocketsecure*, you **MUST** use it, otherwise the `keyCode` and all dependent channels will not work.
-In order for the binding to control your TV, you will be asked to accept the remote connection (from openHAB) on your TV. You have 30 seconds to accept the connection. If you fail to accept it, then most channels will not work.
-Once you have accepted the connection, the returned token is stored in the binding, so you don't have to repeat this every time openHAB is restarted.
+In order for the binding to control your TV, you will be asked to accept the remote connection (from openHAB) on your TV. You have 30 seconds to accept the connection. If you fail to accept it, then most channels will not work.
+Once you have accepted the connection, the returned token is stored in the binding, so you don't have to repeat this every time openHAB is restarted.
-If the connection has been refused, or you don't have your TV configured to allow remote connections, the binding will not work. If you are having problems, check the settings on your TV, sometimes a family member denies the popup (because they don't know what it is), and after that nothing will work.
+If the connection has been refused, or you don't have your TV configured to allow remote connections, the binding will not work. If you are having problems, check the settings on your TV, sometimes a family member denies the popup (because they don't know what it is), and after that nothing will work.
You can set the connection to `Allow` on the TV, or delete the openHAB entry, and try the connection again.
The binding will try to automatically discover the correct protocol for your TV, so **don't change it** unless you know it is wrong.
-Under `advanced`, you can enter a Smartthings PAT, and Device Id. This enables more channels via the Smartthings cloud. This is only for TV's that support Smartthings. No hub is required. The binding will attempt to discover the device ID for your TV automatically, you can enter it manually if automatic detection fails.
+Under `advanced`, you can enter a Smartthings PAT, and Device Id. This enables more channels via the Smartthings cloud. This is only for TV's that support Smartthings. No hub is required. The binding will attempt to discover the device ID for your TV automatically, you can enter it manually if automatic detection fails.
Also under `advanced`, you have the ability to turn on *"Subscribe to UPnP events"*. This is off by default. This option reduces (but does not eliminate) the polling of UPnP services. You can enable it if you want to test it out. If you disable this setting (after testing), you should power cycle your TV to remove the old subscriptions.
For >2019 TV's, there is an app workaround, see [App Discovery](#app-discovery) for details.
| artColorTemperature | Number | RW | ArtMode Color temperature Minnimum value is -5 and maximum 5 |
| artOrientation | Switch | RW | TV orientation, Landscape (OFF) or Portrait (ON) |
-**NOTE:** channels: brightness, contrast, sharpness, colorTemperature don't work on newer TV's.
-**NOTE:** channels: sourceName, sourceId, programTitle, channelName and stopBrowser may need additional configuration.
+**NOTE:** channels: brightness, contrast, sharpness, colorTemperature don't work on newer TV's.
+**NOTE:** channels: sourceName, sourceId, programTitle, channelName and stopBrowser may need additional configuration.
Some channels do not work on some TV's. It depends on the age of your TV, and what kind of interface it has. Only link channels that work on your TV, polling channels that your TV doesn't have may cause errors, and other problems. see [Tested TV Models](#tested-tv-models).
`keyCode` is a String channel, that emulates a remote control. it allows you to send keys to the TV, as if they were from the remote control, hence it is send only.
This is one of the more useful channels, and several new features have been added in this binding.
-Now all keyCode channel sends are queued, so they don’t overlap each other. You can also now use in line delays, and keypresses (in mS). for example:
+Now all keyCode channel sends are queued, so they don’t overlap each other. You can also now use in line delays, and keypresses (in mS). for example:
sending:
`"KEY_MENU, 1000, KEY_DOWN, KEY_DOWN, KEY_ENTER, 2000, KEY_EXIT"`
Spaces are ignored. The supported keys can be listed in the Thing `keyCode` channel
-Mouse events and text entry are now supported. Send `{"x":0, "y":0}` to move the mouse to 0,0, send `LeftClick` or `RightClick` to click the mouse.
+Mouse events and text entry are now supported. Send `{"x":0, "y":0}` to move the mouse to 0,0, send `LeftClick` or `RightClick` to click the mouse.
Send `"text"` to send the word text to the TV. Any text that you want to send has to be enclosed in `"` to be recognized as a text entry.
Here is an example to fill in the URL if you launch the browser:
### artMode:
-`artMode` is a Switch channel. When `power` is ON, `artMode` will be OFF. If the `artMode` channel is commanded `OFF`, then the TV will power down to standby/off mode (this takes 4 seconds).
-Commanding ON to `artMode` will try to power up the TV in art mode, and commanding ON to `power` will try to power the TV up in ON mode, but see WOL limitations.
+`artMode` is a Switch channel. When `power` is ON, `artMode` will be OFF. If the `artMode` channel is commanded `OFF`, then the TV will power down to standby/off mode (this takes 4 seconds).
+Commanding ON to `artMode` will try to power up the TV in art mode, and commanding ON to `power` will try to power the TV up in ON mode, but see WOL limitations.
To determine the ON/ART/OFF state of your TV, you have to read both `power` and `artMode`.
**NOTE** Samsung added back the art API in Firmware 1622 to >2021 Frame TV's. If you have this version of firmware or higher, don't use the `setArtMode` channel, as it is not neccessary.
-`setArtMode` is a Switch channel. Since Samsung removed the art api in 2022, the TV has no way of knowing if it is in art mode or playing a TV source. This switch is to allow you to manually tell the TV what mode it is in.
+`setArtMode` is a Switch channel. Since Samsung removed the art api in 2022, the TV has no way of knowing if it is in art mode or playing a TV source. This switch is to allow you to manually tell the TV what mode it is in.
-If you only use the binding to turn the TV on and off or to Standby, the binding will keep track of the TV state. If, however you use the remote to turn the TV on or off from art mode, the binding cannot detect this, and the power state will become invalid.
+If you only use the binding to turn the TV on and off or to Standby, the binding will keep track of the TV state. If, however you use the remote to turn the TV on or off from art mode, the binding cannot detect this, and the power state will become invalid.
This input allows you to set the internal art mode state from an external source (say by monitoring the power usage of the TV, or by querying the ex-link port) - thus keeping the power state consistent.
**NOTE:** If you don't have a >2021 Frame TV, don't use the `setArtMode` channel, it will confuse the power handling logic.
### artLabel:
-`artlabel` is a String channel that receives the *intenal* lable of the artwork displayed. This will be something like `MY_0010` or `SAM-0123`. `MY` means it's art you uploaded, `SAM` means its from the Samsung art gallery.
-You have to figure out what the label actually represents.
+`artlabel` is a String channel that receives the *intenal* lable of the artwork displayed. This will be something like `MY_0010` or `SAM-0123`. `MY` means it's art you uploaded, `SAM` means its from the Samsung art gallery.
+You have to figure out what the label actually represents.
-You can send commands to the channel. It accepts, Strings, string representations of a `Rawtype` image and `RawType` Images. If you send a String, such as `MY-0013`, it will display that art on the TV. If the TV is ON, playing live TV, then the Tv will switch to artMode.
-If you send a `RawType` image, then the image (jpg or png or some other common image format) will be uploaded to the TV, and stored in it's internal storage - if you have space.
+You can send commands to the channel. It accepts, Strings, string representations of a `Rawtype` image and `RawType` Images. If you send a String, such as `MY-0013`, it will display that art on the TV. If the TV is ON, playing live TV, then the Tv will switch to artMode.
+If you send a `RawType` image, then the image (jpg or png or some other common image format) will be uploaded to the TV, and stored in it's internal storage - if you have space.
The string representation of a `Rawtype` image is of the form `"data:image/png;base64,iVBORw0KGgoAAA........AAElFTkSuQmCC"` where the data is the base64 encoded binary data. the command would look like this:
here is an example `sitemap` entry:
```java
-Selection item=TV_ArtLabel mappings=["MY_F0061"="Large Bauble","MY_F0063"="Small Bauble","MY_F0062"="Presents","MY_F0060"="Single Bauble","MY_F0055"="Gold Bauble","MY_F0057"="Snowflake","MY_F0054"="Stag","MY_F0056"="Pine","MY_F0059"="Cabin","SAM-S4632"="Snowy Trees","SAM-S2607"="Icy Trees","SAM-S0109"="Whale"]
+Selection item=TV_ArtLabel mappings=["MY_F0061"="Large Bauble","MY_F0063"="Small Bauble","MY_F0062"="Presents","MY_F0060"="Single Bauble","MY_F0055"="Gold Bauble","MY_F0057"="Snowflake","MY_F0054"="Stag","MY_F0056"="Pine","MY_F0059"="Cabin","SAM-S4632"="Snowy Trees","SAM-S2607"="Icy Trees","SAM-S0109"="Whale"]
```
### artJson:
### artbrightness:
-`artBrightness` is a dimmer channel that sets the brightness of the art in ArtMode. It does not affect the TV brightness. Normally the brightness of the artwork is controlled automatically, and the current value is polled and reported via this channel.
+`artBrightness` is a dimmer channel that sets the brightness of the art in ArtMode. It does not affect the TV brightness. Normally the brightness of the artwork is controlled automatically, and the current value is polled and reported via this channel.
You can change the brightness of the artwork (but automatic control is still enabled, unless you turn it off).
There are only 10 levels of brighness, so you could use a `Setpoint` control for this channel in your `sitemap` - eg:
### artColorTemperature:
-`artColorTemperature` is a Number channel, it reports the "warmth" of the artwork from -5 to 5 (default 0). It's not polled, but is updated when artmode status is updated.
+`artColorTemperature` is a Number channel, it reports the "warmth" of the artwork from -5 to 5 (default 0). It's not polled, but is updated when artmode status is updated.
You can use a `Setpoint` contol for this item in your `sitemap` eg:
```java
## WOL
-Wake on Lan is supported by Samsung TV’s after 2016. The binding will attempt to use WOL to turn on a TV, if `power` (or `artMode`) is commanded ON.
+Wake on Lan is supported by Samsung TV’s after 2016. The binding will attempt to use WOL to turn on a TV, if `power` (or `artMode`) is commanded ON.
This only works on TV's after 2016, and has some quirks.
-
-* Does not work on TV's <2016
-* Does not work on hardwired ethernet connected TV's **if you have a soundbar connected via ARC/eARC**
-* Works on WiFi connected TV's (with or without soundbar)
-* May need to enable this function on the TV
-* May have to wait up to 1 minute before turning TV back on, as TV does not power down immediately (and so doesn't respond to WOL)
+
+- Does not work on TV's <2016
+- Does not work on hardwired ethernet connected TV's **if you have a soundbar connected via ARC/eARC**
+- Works on WiFi connected TV's (with or without soundbar)
+- May need to enable this function on the TV
+- May have to wait up to 1 minute before turning TV back on, as TV does not power down immediately (and so doesn't respond to WOL)
You will have to experiment to see if it works for you. If not, you can power on the TV using IR (if you have a Harmony Hub, or GC iTach or similar).
## Apps
-The `sourceApp` channel is a string channel, it displays the name of the current app, `artMode` or `slideshow` if the TV is in artMode, or blank for regular TV.
+The `sourceApp` channel is a string channel, it displays the name of the current app, `artMode` or `slideshow` if the TV is in artMode, or blank for regular TV.
You can launch an app, by sending its name or appID to the channel. if you send `""` to the channel, it closes the current app.
Here is an example `sitemap` entry:
Apps are automatically discovered on TV's >2015 and <2020 (or 2019 it's not clear when the API was removed).
-**NOTE:** This is an old Apps list, on later TV's the app ID's have changed.
+**NOTE:** This is an old Apps list, on later TV's the app ID's have changed.
List of known apps and the respective name that can be passed on to the `sourceApp` channel.
Values are confirmed to work on UE50MU6179.
| YouTube | `YouTube` | YouTube App |
| ZDF Mediathek | `ZDF mediathek` | German public TV broadcasting app |
-To discover all installed apps names, you can enable the DEBUG log output from the binding to see a list of apps that have been discovered as installed. This list is displayed once, shortly after the TV is turned On.
+To discover all installed apps names, you can enable the DEBUG log output from the binding to see a list of apps that have been discovered as installed. This list is displayed once, shortly after the TV is turned On.
-If you have a TV >2019, then the list of apps will not be discovered. Instead, a default list of known appID's is built into the binding, these cover most common apps. The binding will attempt to discover these apps, and, if you are lucky, your app will be found and you have nothing further to do. It is possible that new apps have been added, or are specific to your country that are not in the built in list, in which case you can add these apps manually.
+If you have a TV >2019, then the list of apps will not be discovered. Instead, a default list of known appID's is built into the binding, these cover most common apps. The binding will attempt to discover these apps, and, if you are lucky, your app will be found and you have nothing further to do. It is possible that new apps have been added, or are specific to your country that are not in the built in list, in which case you can add these apps manually.
#### Adding apps manually
-If the app you need is not discovered, a file `samsungtv.cfg` will need to be be created in the openHAB config services directory (`/etc/openhab/services/` for Linux systems).
+If the app you need is not discovered, a file `samsungtv.cfg` will need to be be created in the openHAB config services directory (`/etc/openhab/services/` for Linux systems).
You need to edit the file `samsungtv.cfg`, and add in the name, appID, and type of the apps you have installed on your TV. Here is a sample for the contents of the `samsungtv.cfg` file:
{ "name":"Viafree" , "appId":"hs9ONwyP2U.ViafreeBigscreen" , "type":2 }
```
-Enter this into the `samsungtv.cfg` file and save it. The file contents are read automatically every time the file is updated. The binding will check to see if the app is installed, and start polling the status every 10 seconds (or more if your refresh interval is set higher).
-Apps that are not installed are deleted from the list (internally, the file is not updated). If you install an app on the TV, which is not in the built in list, you have to update the file with it's appID, or at least touch the file for the new app to be registered with the binding.
+Enter this into the `samsungtv.cfg` file and save it. The file contents are read automatically every time the file is updated. The binding will check to see if the app is installed, and start polling the status every 10 seconds (or more if your refresh interval is set higher).
+Apps that are not installed are deleted from the list (internally, the file is not updated). If you install an app on the TV, which is not in the built in list, you have to update the file with it's appID, or at least touch the file for the new app to be registered with the binding.
The entry for `Internet` is important, as this is the TV web browser App. on older TV's it's `org.tizen.browser`, but this is not correct on later TV's (>2019). This is the app used for the `url` channel, so it needs to be set correctly if you use this channel.
`org.tizen.browser` is the internal default, and does launch the browser on all TV's, but on later TV's this is just an alias for the actual app, so the `sourceApp` channel will not be updated correctly unless the correct appID is entered here. The built in list has the correct current appID for the browser, but if it changes or is incorrect for your TV, you can update it here.
## Smartthings
-In order to be able to control the TV input (HDMI1, HDMI2 etc), you have to link the binding to the smartthngs API, as there is no local control capable of switching the TV input.
+In order to be able to control the TV input (HDMI1, HDMI2 etc), you have to link the binding to the smartthngs API, as there is no local control capable of switching the TV input.
There are several steps required to enable this feature, and no hub is needed.
In order to connect to the Smartthings cloud, there are a few steps to take.
4. Go to https://account.smartthings.com/tokens and create a Personal Access Token (PAT). check off all the features you want (I would add them all).
5. Go to the openHAB Samsung TV Thing, and update the configuration with your PAT (click on advanced). You will fill in Device ID later if necessary.
6. Save the Thing, and watch the logs.
-
+
The binding will attempt to find the Device ID for your TV. If you have several TV’s of the same type, you will have to manually identify the Device ID for the current Thing from the logs. The device ID should look something like 996ff19f-d12b-4c5d-1989-6768a7ad6271. If you have only one TV of each type, Device ID should get filled in for you.
You can now link the `sourceName`, `sourceId`, `channel` and `channelName` channels, and should see the values updating. You can change the TV input source by sending `"HDMI1"`, or `"HDMI2"` to the `sourceName` channel, the exact string will depend on your TV, and how many inputs you have. You can also send a number to the `sourceId` channel.
Even if the remote control channels are not supported, the UPnP channels may still work.
Art channels on all Frame TV's are supported.
-
+
Because Samsung does not publish any documentation about the TV's UPnP interface, there could be differences between different TV models, which could lead to mismatch problems.
Tested TV models (but this table may be out of date):
2021-12-08 12:19:50.262 [DEBUG] [port.upnp.internal.UpnpIOServiceImpl] - Error reading SOAP response message. Can't transform message payload: org.jupnp.model.action.ActionException: The argument value is invalid. Invalid number of input or output arguments in XML message, expected 2 but found 1.
```
-This is not an actual error, but is what is returned when a value is polled that does not yet exist, such as the URL for the TV browser, when the browser isn’t running. These messages are not new, and can be ignored. Enabling `subscription` will eliminate them.
+This is not an actual error, but is what is returned when a value is polled that does not yet exist, such as the URL for the TV browser, when the browser isn’t running. These messages are not new, and can be ignored. Enabling `subscription` will eliminate them.
-The `getSupportedChannelNames` messages are not UPnP services, they are not actually services that are supported *by your TV* at all. They are the internal capabilities of whatever method is being used for communication (which could be direct port connection, UPnP or websocket).
+The `getSupportedChannelNames` messages are not UPnP services, they are not actually services that are supported *by your TV* at all. They are the internal capabilities of whatever method is being used for communication (which could be direct port connection, UPnP or websocket).
They also do not reflect the actual capabilities of your TV, just what that method supports, on your TV, they may do nothing.
You should get `volume` and `mute` channels working at the minnimum. Other channels may or may not work, depending on your TV and the binding configuration.
If you see errors that say `no route to host` or similar things, it means your TV is off. The binding cannot discover, control or poll a TV that is off.
-For the binding to function properly it is very important that your network config allows the machine running openHAB to receive UPnP multicast traffic.
-Multicast traffic is not propogated between different subnets, or VLANS, unless you specifically configure your router to do this. Many switches have IGMP Snooping enabled by default, which filters out multicast traffic.
+For the binding to function properly it is very important that your network config allows the machine running openHAB to receive UPnP multicast traffic.
+Multicast traffic is not propogated between different subnets, or VLANS, unless you specifically configure your router to do this. Many switches have IGMP Snooping enabled by default, which filters out multicast traffic.
If you want to check the communication between the machine and the TV is working, you can try the following:
### Check if your Linux machine receives multicast traffic
If you now turn your TV off, you will see similar messages, but with `NTS: ssdp:byebye`. This is how the binding detects that your TV has turned OFF.
-Try this several times over a period of 30 minutes after you have discovered the TV and added the binding. This is because when you discover the binding, a UPnP `M-SEARCH` packet is broadcast, which will enable mulicast traffic, but your network (router or switches) can eventually start filtering out multicast traffic, leading to unrealiable behaviour.
+Try this several times over a period of 30 minutes after you have discovered the TV and added the binding. This is because when you discover the binding, a UPnP `M-SEARCH` packet is broadcast, which will enable mulicast traffic, but your network (router or switches) can eventually start filtering out multicast traffic, leading to unrealiable behaviour.
If you see these messages, then basic communications is working, and you should be able to turn your TV Off (and on later TV's) ON, and have the status reported correctly.
### Multiple network interfaces
## Discovery
The binding discovers all devices (partitions, zones) defined in the system, but bridge things must be configured manually.
-
+
## Thing Configuration
### ethm-1 bridge
```perl
Switch item=AC_Office_Heater_MasterSwitch
-Selection item=AC_Office_Room_Mode
+Selection item=AC_Office_Room_Mode
Setpoint item=AC_Office_Room_Target_Temperature
Selection item=AC_Office_Heater_Fan_Level
Selection item=AC_Office_Room_Swing_Mode
-Text item=AC_Office_Room_Current_Temperature
+Text item=AC_Office_Room_Current_Temperature
Text item=AC_Office_Room_Current_Humidity
```
sensorcommunity.items
```java
-Number:Density PM_25 "PM2.5" { channel="sensorcommunity:particulate:pm_sensor:pm25" }
-Number:Density PM_100 "PM10" { channel="sensorcommunity:particulate:pm_sensor:pm100" }
+Number:Density PM_25 "PM2.5" { channel="sensorcommunity:particulate:pm_sensor:pm25" }
+Number:Density PM_100 "PM10" { channel="sensorcommunity:particulate:pm_sensor:pm100" }
-Number:Temperature LDI_Temperature "Temperature" { channel="sensorcommunity:conditions:cond_sensor:temperature" }
-Number:Dimensionless LDI_Humidity "Humidity" { channel="sensorcommunity:conditions:cond_sensor:humidity" }
-Number:Pressure LDI_Pressure "Atmospheric Pressure" { channel="sensorcommunity:conditions:cond_sensor:pressure" }
-Number:Pressure LDI_PressureSea "Pressure sea level" { channel="sensorcommunity:conditions:cond_sensor:pressure-sea" }
+Number:Temperature LDI_Temperature "Temperature" { channel="sensorcommunity:conditions:cond_sensor:temperature" }
+Number:Dimensionless LDI_Humidity "Humidity" { channel="sensorcommunity:conditions:cond_sensor:humidity" }
+Number:Pressure LDI_Pressure "Atmospheric Pressure" { channel="sensorcommunity:conditions:cond_sensor:pressure" }
+Number:Pressure LDI_PressureSea "Pressure sea level" { channel="sensorcommunity:conditions:cond_sensor:pressure-sea" }
-Number:Dimensionless LDI_NoiseEQ "Noise EQ" { channel="sensorcommunity:noise:noise_sensor:noise-eq" }
-Number:Dimensionless LDI_NoiseMin "Noise min" { channel="sensorcommunity:noise:noise_sensor:noise-min" }
-Number:Dimensionless LDI_NoiseMax "Noise max" { channel="sensorcommunity:noise:noise_sensor:noise-max" }
+Number:Dimensionless LDI_NoiseEQ "Noise EQ" { channel="sensorcommunity:noise:noise_sensor:noise-eq" }
+Number:Dimensionless LDI_NoiseMin "Noise min" { channel="sensorcommunity:noise:noise_sensor:noise-min" }
+Number:Dimensionless LDI_NoiseMax "Noise max" { channel="sensorcommunity:noise:noise_sensor:noise-max" }
```
### Sitemap
```perl
sitemap SensorCommunity label="SensorCommunity" {
- Text item=PM_25 label="Particulate Matter 2.5 [%.1f %unit%]"
- Text item=PM_100 label="Particulate Matter 10 [%.1f %unit%]"
-
- Text item=LDI_Temperature label="Temperature [%d %unit%]"
- Text item=LDI_Humidity label="Humidity [%d %unit%]"
- Text item=LDI_Pressure label="Atmospheric Pressure [%d %unit%]"
- Text item=LDI_PressureSea label="Atmospheric Pressure sea [%d %unit%]"
-
- Text item=LDI_NoiseEQ label="Noise avg [%.1f %unit%]"
- Text item=LDI_NoiseMin label="Noise min [%.1f %unit%]"
- Text item=LDI_NoiseMax label="Noise max [%.1f %unit%]"
+ Text item=PM_25 label="Particulate Matter 2.5 [%.1f %unit%]"
+ Text item=PM_100 label="Particulate Matter 10 [%.1f %unit%]"
+
+ Text item=LDI_Temperature label="Temperature [%d %unit%]"
+ Text item=LDI_Humidity label="Humidity [%d %unit%]"
+ Text item=LDI_Pressure label="Atmospheric Pressure [%d %unit%]"
+ Text item=LDI_PressureSea label="Atmospheric Pressure sea [%d %unit%]"
+
+ Text item=LDI_NoiseEQ label="Noise avg [%.1f %unit%]"
+ Text item=LDI_NoiseMin label="Noise min [%.1f %unit%]"
+ Text item=LDI_NoiseMax label="Noise max [%.1f %unit%]"
}
```
### Range Extender Mode
-The Plus/Pro devices support the so-called Range Extender Mode (not available for Gen1).
+The Plus/Pro devices support the so-called Range Extender Mode (not available for Gen1).
This allows connect Shellys, which are normally no reachable, because of a lack of WiFi signal.
Once enabled the Shelly acts as a hub to the linked devices, like a WiFi repeater.
The hub device enables the access point, which can be seen by the linked device.
## Channels
-Depending on the device type and firmware release channels might be not available or stay with value NaN.
+Depending on the device type and firmware release channels might be not available or stay with value NaN.
### Shelly 1 (thing-type: shelly1)
if (! gBattery.allMembers.filter([state < lowBatteryThreshold]).empty) {
message = "Battery levels:\n"
- var report = gBattery.allMembers.filter([ state instanceof DecimalType ]).sortBy([ state instanceof DecimalType ]).map[
+ var report = gBattery.allMembers.filter([ state instanceof DecimalType ]).sortBy([ state instanceof DecimalType ]).map[
name + ": " + state.format("%d%%\n") ]
message = message + report
eventSource = triggeredChannel
eventType = receivedEvent
...
- }
+ }
end
-rule "Color changed"
+rule "Color changed"
when
Item ShellyColor changed
then
This binding provides support for the Siemens HVAC controller ecosystem, and the Web Gateway interface OZW672.
A typical system is composed of:
-
-
-
+
+
+
There's a lot of different HVAC controllers depending on model in lot of different PAC constructors.
Siemens RVS41.813/327 inside a Atlantic Hybrid Duo was used for the development, and is fully supported and tested.

-You will find some information about the OZW672.01 gateway on the Siemens web site:
+You will find some information about the OZW672.01 gateway on the Siemens web site:
[OZW 672 Page](https://hit.sbt.siemens.com/RWD/app.aspx?rc=FR&lang=fr&module=Catalog&action=ShowProduct&key=BPZ:OZW672.01)
- Modify the functioning mode of your device: temperature set point, heating mode, and others.
The OZW672 gateway supports many different languages (about 16).
-The binding should work with all language choices, but is currently tested more thoroughly with French and English as configured language.
+The binding should work with all language choices, but is currently tested more thoroughly with French and English as configured language.
If you use another language, and find some issues, you can report them on the openHAB forum.
## Discovery
They are organized the same way as the LCD screen of your PAC device, by top level menu functionality, and sub-functionalities.
Each channel is strongly typed, so for example, for heating mode, openHAB will provide you with a list of choices supported by the device.
-Channel | Description | Type | Unit | Security Access Level | ReadOnly | Advanced
+Channel | Description | Type | Unit | Security Access Level | ReadOnly | Advanced
--------------------------------|---------------------------------------------------------------------------------------------------|-------------------------------|----------|-------------------------|-----------|----------
1724#1725-optgmode-hc1 | Set Operating mode heat circuit 1 (`Automatic`, `Comfort`, `Reduced`, `Protection`) | operating-mode-hc | | | R/W | true
1724#1726-roomtemp-comfsetp-hc1 | Romm temperature comfort setpoint HC1 | room-temp-comfort-setpoint-hc | | | R/W | true
-
+
## Full Example
Things file `.things`
```java
-Bridge siemenshvac:ozw:ozw672_FF00F445 "Ozw672" [ baseUrl="https://192.168.254.42/", userName="Administrator", userPassword="mypass" ]
+Bridge siemenshvac:ozw:ozw672_FF00F445 "Ozw672" [ baseUrl="https://192.168.254.42/", userName="Administrator", userPassword="mypass" ]
{
Thing rvs41-813-327 00770000756A "RVS41.813/327" [ ]
{
Type room-temp-comfort-setpoint-hc : testChannelTemperature "TestChannelTemperature" [ id="1726" ]
- Type operating-mode-hc : testChannelCC1 "TestChannelCC1" [ id="1725" ]
+ Type operating-mode-hc : testChannelCC1 "TestChannelCC1" [ id="1725" ]
}
-}
+}
```
Items file `.items`
```java
-Contact Boiler_State_Pump_HWSb "HWS Pump State [%s]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2259-ppechargeecs" }
+Contact Boiler_State_Pump_HWSb "HWS Pump State [%s]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2259-ppechargeecs" }
Number Boiler_State_HWS "HWS State [%s]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2032#2035-etat-ecs" }
-Number:Temperature Flow_Temperature_Real "Flow Temparature Real [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2248-valreelletempdep-cc1" }
-Number:Temperature Flow_Temperature_Setpoint "Flow Temperature Setpoint [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2249-constdepresultcc1" }
-Number Hour_fct_HWS "HWS Hour function" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2263-heuresfoncpompeecs" }
+Number:Temperature Flow_Temperature_Real "Flow Temparature Real [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2248-valreelletempdep-cc1" }
+Number:Temperature Flow_Temperature_Setpoint "Flow Temperature Setpoint [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2249-constdepresultcc1" }
+Number Hour_fct_HWS "HWS Hour function" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2263-heuresfoncpompeecs" }
Number Nb_Start_HWS "HWS Number of start [%.1f]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2266-comptdemarresel-ecs" }
Number:Temperature Thermostat_Temperature "Thermostat tempeature [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:2237#2246-tambact-cc1" }
Number:Temperature Thermostat_Setpoint "Thermostat setpoint [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:1724#1726-consconfort-ta-cc1" }
Number Heat_Mode "Heat mode [%s]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:1724#1725-regime-cc1" }
-Number:Temperature Thermostat_Setpoint_bis "Temperature [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:testChannelTemperature " }
+Number:Temperature Thermostat_Setpoint_bis "Temperature [%.1f °C]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:testChannelTemperature " }
Number Heat_Mode_bis "Heat mode [%s]" { channel = "siemenshvac:rvs41-813-327:ozw672_FF00F445:00770000756A:testChannelCC1" }
-```
+```
```perl
sitemap demo label="Main Menu"
-{
+{
Frame label="Sinope" {
- Text item=Room_In
+ Text item=Room_In
Text item=Room_Out
Setpoint item=Room_SetPoint label="Set Point [%.1f °C]" step=0.5 minValue=5 maxValue=35
Switch item=Room_SetPointMode mappings=[2=Manual, 3=Auto, 5=Away]
- `target` for SNMP v1/v2c agents
- `target3` for SNMP v3 agents
-Both represent a single network device.
+Both represent a single network device.
Things can be extended with `number`, `string` and `switch` channels.
## Binding Configuration
### Common parameters for all thing-types
-The `hostname` is mandatory and can be set as FQDN or IP address.
+The `hostname` is mandatory and can be set as FQDN or IP address.
An optional configuration parameter is `refresh`.
By using the `refresh` parameter the time between two subsequent GET requests to the target can be set.
The `securityModel` can be set to
- `NO_AUTH_NO_PRIV` (default) - no encryption on authentication data, no encryption on transmitted data
-- `AUTH_NO_PRIV` - encryption on authentication data, no encryption on transmitted data
+- `AUTH_NO_PRIV` - encryption on authentication data, no encryption on transmitted data
- `AUTH_PRIV` - encryption on authentication data, encryption on transmitted data
Depending on the `securityModel` some of the other parameters are also mandatory.
`number`-type channels have a `unit` parameter.
The unit is added to the received value before it is passed to the channel.
-For commands (i.e. sending), the value is first converted to the configured unit.
+For commands (i.e. sending), the value is first converted to the configured unit.
| type | item | description |
|----------|--------|---------------------------------|
When using this token, see also `usePrivateApi` and `meterInstalled`.
E.g. for Firefox, use the built-in [Storage Inspector](https://developer.mozilla.org/en-US/docs/Tools/Storage_Inspector) to retrieve the token.
-- **solarId** (required)
+- **solarId** (required)
Id of your inverter at SolarEdge (can be found in the URL after successful login: <https://monitoring.solaredge.com/solaredge-web/p/site/> **<solarId>** /#/dashboard)
-- **usePrivateApi** (optional)
+- **usePrivateApi** (optional)
can be set to true to use the private API.
Private API has no limit regarding query frequency but is less stable.
Private API will only gather live data if a meter is available.
Set this to true when using token retrieved from browser in `tokenOrApiKey`.
See also `meterInstalled`. (default = false)
-- **meterInstalled** (optional)
+- **meterInstalled** (optional)
can be set to true for setups that contain a meter which is connected to the inverter.
A meter allows more detailed data retrieval.
This must be set to true when using token retrieved from browser in `tokenOrApiKey`.
This can be set either to true or false when using the API key. (default = false)
-- **liveDataPollingInterval** (optional)
+- **liveDataPollingInterval** (optional)
interval (minutes) in which live data values are retrieved from Solaredge.
Setting less than 10 minutes is only allowed when using private API. (default = 10)
-- **aggregateDataPollingInterval** (optional)
+- **aggregateDataPollingInterval** (optional)
interval (minutes) in which aggregate data values are retrieved from Solaredge.
Setting less than 60 is only allowed when using private API. (default = 60)
# SolarForecast Binding
-This binding provides data from Solar Forecast services.
+This binding provides data from Solar Forecast services.
Use it to estimate your daily production, plan electric consumers like Electric Vehicle charging, heating or HVAC.
Look ahead the next days in order to identify surplus / shortages in your energy planning.
- [Solcast](https://solcast.com/)
- Free [Hobbyist Plan](https://toolkit.solcast.com.au/register/hobbyist) with registration
- [Forecast.Solar](https://forecast.solar/)
- - Public, Personal and Professional [plans](https://forecast.solar/#accounts) available
+ - Public, Personal and Professional [plans](https://forecast.solar/#accounts) available
Display Power values of Forecast and PV Inverter items
## Supported Things
-Each service needs one `xx-site` for your location and at least one photovoltaic `xx-plane`.
+Each service needs one `xx-site` for your location and at least one photovoltaic `xx-plane`.
| Name | Thing Type ID |
|-----------------------------------|---------------|
The `resourceId` for each PV plane is provided afterwards.
In order to receive proper timestamps double check your time zone in *openHAB - Settings - Regional Settings*.
-Correct time zone is necessary to show correct forecast times in UI.
+Correct time zone is necessary to show correct forecast times in UI.
### Solcast Bridge Configuration
`apiKey` can be obtained in your [Account Settings](https://toolkit.solcast.com.au/account)
-`timeZone` can be left empty to evaluate Regional Settings of your openHAB installation.
+`timeZone` can be left empty to evaluate Regional Settings of your openHAB installation.
See [DateTime](#date-time) section for more information.
### Solcast Plane Configuration
`resourceId` for each plane can be obtained in your [Rooftop Sites](https://toolkit.solcast.com.au/rooftop-sites)
-`refreshInterval` of forecast data needs to respect the throttling of the Solcast service.
+`refreshInterval` of forecast data needs to respect the throttling of the Solcast service.
If you have 25 free calls per day, each plane needs 2 calls per update a refresh interval of 120 minutes will result in 24 calls per day.
With `refreshInterval = 0` the forecast data will not be updated by binding.
This gives the user the possibility to define an own update strategy in rules.
-See [manual update rule example](#solcast-manual-update) to update Solcast forecast data
+See [manual update rule example](#solcast-manual-update) to update Solcast forecast data
- after startup
-- every 2 hours only during daytime using [Astro Binding](https://www.openhab.org/addons/bindings/astro/)
+- every 2 hours only during daytime using [Astro Binding](https://www.openhab.org/addons/bindings/astro/)
## Solcast Channels
Each `sc-plane` reports its own values including a `json` channel holding JSON content.
-The `sc-site` bridge sums up all attached `sc-plane` values and provides total forecast for your home location.
+The `sc-site` bridge sums up all attached `sc-plane` values and provides total forecast for your home location.
Channels are covering today's actual data with current, remaining and today's total prediction.
Forecasts are delivered up to 6 days in advance.
-Scenarios are clustered in groups:
+Scenarios are clustered in groups:
- `average` scenario
-- `pessimistic` scenario: 10th percentile
+- `pessimistic` scenario: 10th percentile
- `optimistic` scenario: 90th percentile
| Channel | Type | Unit | Description | Advanced |
| dampPM | decimal | Damping factor of evening hours | 0 | no | true |
| horizon | text | Horizon definition as comma separated integer values | N/A | no | true |
-`refreshInterval` of forecast data needs to respect the throttling of the ForecastSolar service.
+`refreshInterval` of forecast data needs to respect the throttling of the ForecastSolar service.
12 calls per hour allowed from your caller IP address so for 2 planes lowest possible refresh rate is 10 minutes.
#### Advanced Configuration
## ForecastSolar Channels
Each `fs-plane` reports its own values including a `json` channel holding JSON content.
-The `fs-site` bridge sums up all attached `fs-plane` values and provides the total forecast for your home location.
+The `fs-site` bridge sums up all attached `fs-plane` values and provides the total forecast for your home location.
Channels are covering today's actual data with current, remaining and total prediction.
Forecasts are delivered up to 3 days for paid personal plans.
Each forecast is bound to a certain location which automatically defines the time zone.
Most common use case is forecast and your location are matching the same time zone.
Action interface is using `Instant` as timestamps which enables you translating to any time zone.
-This allows you with an easy conversion to query also foreign forecast locations.
+This allows you with an easy conversion to query also foreign forecast locations.
Examples are showing
```java
// channel items
-Number:Power ForecastSolarHome_Actual_Power "Power prediction for this moment" { channel="solarforecast:fs-site:homeSite:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
-Number:Energy ForecastSolarHome_Actual "Today's forecast till now" { channel="solarforecast:fs-site:homeSite:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Remaining "Today's remaining forecast till sunset" { channel="solarforecast:fs-site:homeSite:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Today "Today's total energy forecast" { channel="solarforecast:fs-site:homeSite:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
-// calculated by rule
-Number:Energy ForecastSolarHome_Tomorrow "Tomorrow's total energy forecast" { stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
-
-Number:Power ForecastSolarHome_Actual_Power_NE "NE Power prediction for this moment" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
-Number:Energy ForecastSolarHome_Actual_NE "NE Today's forecast till now" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Remaining_NE "NE Today's remaining forecast till sunset" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Today_NE "NE Today's total energy forecast" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
-
-Number:Power ForecastSolarHome_Actual_Power_SW "SW Power prediction for this moment" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
-Number:Energy ForecastSolarHome_Actual_SW "SW Today's forecast till now" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Remaining_SW "SW Today's remaining forecast till sunset" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Energy ForecastSolarHome_Today_SW "SW Today's total energy forecast" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
+Number:Power ForecastSolarHome_Actual_Power "Power prediction for this moment" { channel="solarforecast:fs-site:homeSite:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
+Number:Energy ForecastSolarHome_Actual "Today's forecast till now" { channel="solarforecast:fs-site:homeSite:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Remaining "Today's remaining forecast till sunset" { channel="solarforecast:fs-site:homeSite:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Today "Today's total energy forecast" { channel="solarforecast:fs-site:homeSite:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
+// calculated by rule
+Number:Energy ForecastSolarHome_Tomorrow "Tomorrow's total energy forecast" { stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
+
+Number:Power ForecastSolarHome_Actual_Power_NE "NE Power prediction for this moment" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
+Number:Energy ForecastSolarHome_Actual_NE "NE Today's forecast till now" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Remaining_NE "NE Today's remaining forecast till sunset" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Today_NE "NE Today's total energy forecast" { channel="solarforecast:fs-plane:homeSite:homeNorthEast:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
+
+Number:Power ForecastSolarHome_Actual_Power_SW "SW Power prediction for this moment" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:power-actual", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
+Number:Energy ForecastSolarHome_Actual_SW "SW Today's forecast till now" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-actual", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Remaining_SW "SW Today's remaining forecast till sunset" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-remain", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Energy ForecastSolarHome_Today_SW "SW Today's total energy forecast" { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-today", stateDescription=" "[ pattern="%.1f %unit%" ], unit="kWh" }
// estimation items
Group influxdb
-Number:Power ForecastSolarHome_Power_Estimate "Power estimations" (influxdb) { channel="solarforecast:fs-site:homeSite:power-estimate", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
-Number:Energy ForecastSolarHome_Energy_Estimate "Energy estimations" (influxdb) { channel="solarforecast:fs-site:homeSite:energy-estimate", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
-Number:Power ForecastSolarHome_Power_Estimate_SW "SW Power estimations" (influxdb) { channel="solarforecast:fs-plane:homeSite:homeSouthWest:power-estimate", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
-Number:Energy ForecastSolarHome_Energy_Estimate_SW "SW Energy estimations" (influxdb) { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-estimate", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Power ForecastSolarHome_Power_Estimate "Power estimations" (influxdb) { channel="solarforecast:fs-site:homeSite:power-estimate", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
+Number:Energy ForecastSolarHome_Energy_Estimate "Energy estimations" (influxdb) { channel="solarforecast:fs-site:homeSite:energy-estimate", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
+Number:Power ForecastSolarHome_Power_Estimate_SW "SW Power estimations" (influxdb) { channel="solarforecast:fs-plane:homeSite:homeSouthWest:power-estimate", stateDescription=" "[ pattern="%.0f %unit%" ], unit="W" }
+Number:Energy ForecastSolarHome_Energy_Estimate_SW "SW Energy estimations" (influxdb) { channel="solarforecast:fs-plane:homeSite:homeSouthWest:energy-estimate", stateDescription=" "[ pattern="%.3f %unit%" ], unit="kWh" }
```
### Persistence file
rule "Tomorrow Forecast Calculation"
when
Item ForecastSolarHome_Today received update
- then
+ then
val solarforecastActions = getActions("solarforecast","solarforecast:fs-site:homeSite")
val energyState = solarforecastActions.getDay(LocalDate.now.plusDays(1))
logInfo("SF Tests","{}",energyState)
- ForecastSolarHome_Tomorrow.postUpdate(energyState)
+ ForecastSolarHome_Tomorrow.postUpdate(energyState)
end
```
rule "Exception Handling"
when
System started
- then
+ then
val solcastActions = getActions("solarforecast","solarforecast:sc-site:3cadcde4dc")
try {
val forecast = solcastActions.getPower(solcastActions.getForecastEnd.plus(30,ChronoUnit.MINUTES))
rule "Solcast Actions"
when
Time cron "0 0 23 * * ?" // trigger whatever you like
- then
+ then
// Query forecast via Actions
val solarforecastActions = getActions("solarforecast","solarforecast:sc-site:homeSite")
val startTimestamp = Instant.now
when
Channel "astro:sun:local:daylight#event" triggered END
then
- PV_Daytime.postUpdate(OFF) // switch item holding daytime state
+ PV_Daytime.postUpdate(OFF) // switch item holding daytime state
end
rule "Daylight Start"
when
Channel "astro:sun:local:daylight#event" triggered START
then
- PV_Daytime.postUpdate(ON)
+ PV_Daytime.postUpdate(ON)
end
rule "Solacast Updates"
- when
+ when
Thing "solarforecast:sc-plane:homeSouthWest" changed to INITIALIZING or // Thing status changed to INITIALIZING
- Time cron "0 30 0/2 ? * * *" // every 2 hours at minute 30
+ Time cron "0 30 0/2 ? * * *" // every 2 hours at minute 30
then
if(PV_Daytime.state == ON) {
val solarforecastActions = getActions("solarforecast","solarforecast:sc-plane:homeSouthWest")
}
```
-**Please note** As of this writing inverter types besides the `deye_sg04lp3` were not tested to work.
+**Please note** As of this writing inverter types besides the `deye_sg04lp3` were not tested to work.
If you have one of those inverters and it works, please drop me a message, if it doesn't work, please open an issue and I'll try to fix it.
## Channels
Text item=Current_L3 icon="line"
Text item=Inverter_Frequency icon="line"
}
-
+
Frame label="Battery"{
Text item=Battery_SOC icon="battery"
Text item=Battery_Current icon="current"
Text item=Battery_Max_A_Charge icon="battery"
Text item=Battery_Max_A_Discharge icon="battery"
}
-
+
Frame label="Solar"{
Text item=Total_Solar_Production icon="solar"
Text item=Daily_Production icon="solar"
Text item=PV2_Power icon="solar"
Text item=PV2_Voltage icon="solar"
}
-
+
Frame label="Grid"{
Text item=Total_Grid_Production icon="power"
Text item=Total_Grid_Power icon="power"
Text item=Daily_Energy_Bought icon="power"
Text item=Total_Energy_Bought icon="power"
}
-
+
Frame label="Load"{
Text item=Daily_Load_Consumption icon="power"
Text item=Total_Load_Consumption icon="power"
## Supported devices
-* Solarwatt Energymanager; ie. the DIN rail mounted device in your house distribution.
+- Solarwatt Energymanager; ie. the DIN rail mounted device in your house distribution.
## Not supported by this binding
-* Solarwatt Manager/Manager Flex; ie. the black square device that is wall mounted.
-
+- Solarwatt Manager/Manager Flex; ie. the black square device that is wall mounted.
+
The Solarwatt Manager already contains an OpenHAB installation which can be connected to
other installations via [Remote openHAB Binding](https://www.openhab.org/addons/bindings/remoteopenhab/).
-
## Supported Things
| Thing Type ID | Devices |
| local-connect-charger | Thing | An electric vehicle charger representation with all the data available as a channels (directly retrieved from the wi-fi module) |
| cloud-connect-inverter | Thing | An inverter representation with all the data available as a channels (retrieved from the Solax cloud API) |
-Note: Channels may vary depending on the inverter type and the availability of information for parsing the raw data.
+Note: Channels may vary depending on the inverter type and the availability of information for parsing the raw data.
If you're missing a channel this means that it's not supported for your inverter type.
## Thing Configuration
### Thing Configuration
```java
-// The local connect inverter thing
-Thing solax:local-connect-inverter:localInverter [ refreshInterval=10, password="<SERIAL NUMBER OF THE WIFI MODULE>", hostname="<local IP/hostname in the network>" ]
-Thing solax:cloud-connect-inverter:cloudInverter [ refresh=30, password="<REG_NUMBER>", token="<TOKEN>" ]
+// The local connect inverter thing
+Thing solax:local-connect-inverter:localInverter [ refreshInterval=10, password="<SERIAL NUMBER OF THE WIFI MODULE>", hostname="<local IP/hostname in the network>" ]
+Thing solax:cloud-connect-inverter:cloudInverter [ refresh=30, password="<REG_NUMBER>", token="<TOKEN>" ]
```
### Item Configuration
Number solaxFeedInPower "Feed-in power (CEZ) [%.0f W]" <energy> (gsolax_inverter,EveryChangePersist) { channel="solax:local-connect-inverter:localInverter:feed-in-power" }
Number solaxCalculatedTotalFeedInPower "Calculated feed-in total power (CEZ) [%.0f KWh]" <energy> (gsolax_inverter,EveryChangePersist)
-Number solaxCalculatedTotalFeedInPowerThisMonth "Calculated feed-in total power this month (CEZ) [%.0f KWh]" <energy> (gsolax_inverter,EveryChangePersist)
+Number solaxCalculatedTotalFeedInPowerThisMonth "Calculated feed-in total power this month (CEZ) [%.0f KWh]" <energy> (gsolax_inverter,EveryChangePersist)
Number solaxAcPower "Invertor output power [%.0f W]" <energy> (gsolax_inverter,EveryChangePersist){ channel="solax:local-connect-inverter:localInverter:inverter-output-power" }
Number solaxFrequency "Invertor frequency [%.2f Hz]" <energy> (gsolax_inverter,EveryChangePersist){ channel="solax:local-connect-inverter:localInverter:inverter-frequency" }
Number solaxVoltage "Invertor voltage [%.1f V]" <energy> (gsolax_inverter,EveryChangePersist){ channel="solax:local-connect-inverter:localInverter:inverter-voltage" }
String solaxCloudRawData "Cloud raw data [%s]" <data> (gsolax_inverter) { channel="solax:cloud-connect-inverter:cloudInverter:raw-data" }
// Cloud
-Number solaxYieldToday "Yield today [%.0f kWh]" <energy> (gsolax_inverter){ channel="solax:cloud-connect-inverter:cloudInverter:today-energy" }
+Number solaxYieldToday "Yield today [%.0f kWh]" <energy> (gsolax_inverter){ channel="solax:cloud-connect-inverter:cloudInverter:today-energy" }
Number solaxYieldTotal "Yield total [%.0f kWh]" <energy> (gsolax_inverter) { channel="solax:cloud-connect-inverter:cloudInverter:total-energy" }
Number solaxFeedInEnergy "Total Feed-in (CEZ) Power [%.0f kWh]" <energy> (gsolax_inverter,EveryChangePersist) { channel="solax:cloud-connect-inverter:cloudInverter:total-feed-in-energy" }
String solaxInverterStatus "Inverter Status [%s]" <energy> (gsolax_inverter,EveryChangePersist) { channel="solax:cloud-connect-inverter:cloudInverter:inverter-status" }
Switch item=Chart_Period label="Chart Period" mappings=[0="H", 1="D", 2="W", 3="M", 4="Y"]
Text item=solaxBatteryCurrent icon="energy" valuecolor=[<-800="red", <0="orange", ==0="gray", >=0="green"]
Chart item=solaxBatteryCurrent period=h refresh=600 visibility=[Chart_Period==0]
- Chart item=solaxBatteryCurrent period=D refresh=3600 visibility=[Chart_Period==1]
+ Chart item=solaxBatteryCurrent period=D refresh=3600 visibility=[Chart_Period==1]
Chart item=solaxBatteryCurrent period=W refresh=3600 visibility=[Chart_Period==2, Chart_Period==Uninitialized]
Chart item=solaxBatteryCurrent period=M refresh=3600 visibility=[Chart_Period==3]
Chart item=solaxBatteryCurrent period=Y refresh=3600 visibility=[Chart_Period==4]
```
transform/somneorepeatday.js
+
```javascript
(function(i) {
if (i == 254) {
Default item=PhilipsSomneo_Alarm15Configured
Default item=PhilipsSomneo_Alarm16Configured
}
- }
+ }
Frame label="Alarm [1]" {
Default item=PhilipsSomneo_Alarm1Switch
Default item=PhilipsSomneo_Alarm1Time
Slider item=PhilipsSomneo_Alarm1RepeatDay minValue=0 maxValue=254 step=2
Text label="Settings" icon="settings" {
Default item=PhilipsSomneo_Alarm1SunriseDuration
- Slider item=PhilipsSomneo_Alarm1SunriseBrightness
+ Slider item=PhilipsSomneo_Alarm1SunriseBrightness
Selection item=PhilipsSomneo_Alarm1SunriseSchema
Default item=PhilipsSomneo_Alarm1Sound
Default item=PhilipsSomneo_Alarm1Volume
[Souliss](http://www.souliss.net/) is a networking framework for Arduino and compatibles boards, and is designed to let you easily build a smart home that is distributed over multiple boards via Ethernet, WiFi, wireless point-to-point and RS485 bus.
-Souliss is an open-source and community driven project, you can use the [wiki](https://github.com/souliss/souliss/wiki) and [Community](https://github.com/souliss/souliss/wiki/Community) to get help and share your results.
+Souliss is an open-source and community driven project, you can use the [wiki](https://github.com/souliss/souliss/wiki) and [Community](https://github.com/souliss/souliss/wiki/Community) to get help and share your results.
## Prerequisites
```java
Bridge souliss:gateway:105 "Souliss Gateway - 105" [gatewayLanAddress="192.168.1.105", gatewayPortNumber=230, pingInterval=30, subscriptionInterval=2, healthyInterval=38, userIndex=72, nodeIndex=38, timeoutToRequeue=5000, timeoutToRemovePacket=20000]
-{
+{
Thing t14 1-6 "Portoncino"@"Rientro" [node=1,slot=6] //thing UID is named as node-slot only as mnemonic convention, but you are free to assign other values
Thing t14 1-7 "Cancello"@"Rientro" [node=1,slot=7]
Thing t57 1-4 "Consumo"@"Soggiorno" [node=1,slot=4]
Thing t11 5-0 "Tettoia"@"Giardino" [node=5,slot=0]
-Thing t11 12-0 "Divano"@"Soggiorno" [node=12,slot=0,sleep=10, secureSend=false]
+Thing t11 12-0 "Divano"@"Soggiorno" [node=12,slot=0,sleep=10, secureSend=false]
Thing t16 8-0 "LYT1" [node=8,slot=0]
Number Fotovoltaico "Fotovoltaico [%.1f W]" <energy> (FamilyRoom, Elettricita) {channel="souliss:t57:105:4-0:value"}
String AggiornamentoNodo1 "Agg.Consumi [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]" <keyring> (FamilyRoom, Elettricita, Diagnostic) {channel="souliss:t57:105:1-4:lastStatusStored"}
String AggiornamentoNodo4 "Agg.Fotovoltaico [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]" <keyring> (FamilyRoom, Elettricita, Diagnostic) {channel="souliss:t57:105:4-0:lastStatusStored"}
-
+
Switch divano "Divano" <light> (FamilyRoom, Divano ) ["Switchable"] {autoupdate="false", channel="souliss:t11:105:12-0:onOff"}
String divano_aggiornamento "Agg. [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]" <keyring> (FamilyRoom, Divano, Diagnostic) {channel="souliss:t57:105:12-0:lastStatusStored"}
String divano_healthy "Salute" <keyring> (FamilyRoom, Divano, Diagnostic) {channel="souliss:t57:105:12-0:healthy"}
Switch item=portoncino mappings=[ON="Apri"]
Switch item=cancello mappings=[ON="Apri"]
}
- }
-
+ }
+
Frame {
Group item=Outside
}
Group item=Elettricita label="ElettricitĂ " icon="energy"
}
-Frame {
+Frame {
Group item=Divano icon="light"
}
Default item=FamilyRoom_Temperature label="Temperatura"
Default item=FamilyRoom_Humidity label="UmiditĂ "
Default item=AggiornamentoNodo6 icon="icon16x16"
-
+
}
Text label="Termostato soggiorno" icon="temperature" {
Default item=termostatosoggiorno_temperatura
Default item=termostatosoggiorno_umidita
Switch item=termostatosoggiorno_setasmeasured mappings=[ON="Set"]
- Switch item=termostatosoggiorno_modo label="Heating Mode" mappings=[HEATING_MODE="Set"]
+ Switch item=termostatosoggiorno_modo label="Heating Mode" mappings=[HEATING_MODE="Set"]
Switch item=termostatosoggiorno_power label="Power On/Off"
Default item=termostatosoggiorno_fire label="Fire"
Text item=termostatoSoggiorno_aggiornamento label="Aggiornato: [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]" icon="icon16x16"
/* *****************************************
* Bridge
* *****************************************/
-Group dgPet
+Group dgPet
Switch UR_1a_Online "Bridge Online [%s]" (dgPet) {channel="surepetcare:bridge:bridge1:online"}
Switch UR_1a_Refresh "Bridge Data Refresh [%s]" (dgPet) {channel="surepetcare:bridge:bridge1:refresh"}
String UR_1c_LEDMode "Hub LED Mode [%s]" (dgPet) {channel="surepetcare:hubDevice:bridge1:123456:ledMode"}
String UR_1c_PairingMode "Hub Pairing Mode [%s]" (dgPet) {channel="surepetcare:hubDevice:bridge1:123456:pairingMode"}
Switch UR_1c_Online "Hub Online [%s]" (dgPet) {channel="surepetcare:hubDevice:bridge1:123456:online"}
-
+
/* *****************************************
* Cat/Pet Flap
* *****************************************/
If you have problems with udp-discovery, try to set the advanced setting 'broadcastAddress' to your local subnet ('e.g. 192.168.0.255').
Default is '255.255.255.255'
-You can combine both discovery methods to get any informations from local devices.
+You can combine both discovery methods to get any informations from local devices.
If you enable setting 'onlyLocalOnlineDevices' results will only generated for local online devices but with the combined data of cloud discovery.
RF-Devices will be discovered by the hub they are connected to.
-You can discover them manually or use ´backgroundDiscovery´
+You can discover them manually or use ´backgroundDiscovery´
-RF-Devices will be discovered by the hub they are connected to. You can discover them manually or use ´backgroundDiscovery´
+RF-Devices will be discovered by the hub they are connected to. You can discover them manually or use ´backgroundDiscovery´
## Bridge Configuration
# TasmotaPlug Binding
-This binding connects Tasmota flashed smart plugs with 1, 2, 3 or 4 relay channels to openHAB.
-The plug must report the status of the relay via the url `http://$PLUG_IP/cm?cmnd=Power` in order for the binding to work.
-The energy monitoring channels can be used if the plug reports energy status via the url `http://$PLUG_IP/cm?cmnd=Status%2010`.
+This binding connects Tasmota flashed smart plugs with 1, 2, 3 or 4 relay channels to openHAB.
+The plug must report the status of the relay via the url `http://$PLUG_IP/cm?cmnd=Power` in order for the binding to work.
+The energy monitoring channels can be used if the plug reports energy status via the url `http://$PLUG_IP/cm?cmnd=Status%2010`.
See the [Tasmota Supported Devices Repository](https://templates.blakadder.com/plug.html) for a list of supported plugs.
## Supported Things
{
Text item=TeslaUsableBatteryLevel label="Car" icon="tesla" valuecolor=[<=20="red",>60="green"]
{
- Frame
+ Frame
{
Text item=TeslaEventstamp icon="time"
Text item=TeslaState label="State [%s]" icon=""
Text item=TeslaDistance
Text item=TeslaSpeed label="Speed [%.1f]"
Text item=TeslaShiftState label="Shift State [%s]" icon=""
- Text item=nTeslaShiftState
+ Text item=nTeslaShiftState
Text item=TeslaOdometer label="Odometer [%.1f %unit%]"
- Text item=TeslaRange
+ Text item=TeslaRange
}
Frame
{
Frame
{
Switch item=TeslaDoorLock label="Doorlock"
- Switch item=TeslaHorn label="Horn"
+ Switch item=TeslaHorn label="Horn"
Switch item=TeslaLights label="Lights"
Switch item=TeslaStart label="Remote Start"
Switch item=TeslaValet label="Valet Mode"
Switch item=TeslaSentry label="Sentry Mode"
- Switch item=TeslaBatteryHeater label="Battery Heater"
- Switch item=TeslaFrontDefrost label="Defrost Front"
- Switch item=TeslaRearDefrost label="Defrost Rear"
- Switch item=TeslaLeftSeatHeater label="Seat Heat Left"
- Switch item=TeslaRightSeatHeater label="Seat Heat Right"
+ Switch item=TeslaBatteryHeater label="Battery Heater"
+ Switch item=TeslaFrontDefrost label="Defrost Front"
+ Switch item=TeslaRearDefrost label="Defrost Rear"
+ Switch item=TeslaLeftSeatHeater label="Seat Heat Left"
+ Switch item=TeslaRightSeatHeater label="Seat Heat Right"
}
Frame
{
As a minimum, the hostname is needed:
-* hostname - The hostname of the Tesla Powerwall 2. Defaults to powerwall to avoid SSL certificate issues
-* email - the email of the local account on the Powerwall that the installer provided
-* password - the password of the local account on the Powerwall that the installer provided
-* refresh - The frequency with which to refresh information from the Tesla Powerwall2 specified in seconds. Defaults to 10 seconds.
+- hostname - The hostname of the Tesla Powerwall 2. Defaults to powerwall to avoid SSL certificate issues
+- email - the email of the local account on the Powerwall that the installer provided
+- password - the password of the local account on the Powerwall that the installer provided
+- refresh - The frequency with which to refresh information from the Tesla Powerwall2 specified in seconds. Defaults to 10 seconds.
## Channels
{
Text item=TeslaUsableBatteryLevel label="Car" icon="tesla" valuecolor=[<=20="red",>60="green"]
{
- Frame
+ Frame
{
Text item=TeslaState label="State [%s]" icon=""
Text item=TeslaHomelink label="Homelink Available[%s]" icon=""
Text item=TeslaSpeed label="Speed [%.1f]"
Text item=TeslaShiftState label="Shift State [%s]" icon=""
- Text item=TeslaShiftState
+ Text item=TeslaShiftState
Text item=TeslaOdometer label="Odometer [%.1f miles]"
- Text item=TeslaRange
+ Text item=TeslaRange
}
Frame
{
Frame
{
Switch item=TeslaDoorLock label="Doorlock"
- Switch item=TeslaHorn label="Horn"
+ Switch item=TeslaHorn label="Horn"
Switch item=TeslaLights label="Lights"
Switch item=TeslaValet label="Valet Mode"
Switch item=TeslaSentry label="Sentry Mode"
- Switch item=TeslaFrontDefrost label="Defrost Front"
- Switch item=TeslaRearDefrost label="Defrost Rear"
- Switch item=TeslaLeftSeatHeater label="Seat Heat Left"
- Switch item=TeslaRightSeatHeater label="Seat Heat Right"
+ Switch item=TeslaFrontDefrost label="Defrost Front"
+ Switch item=TeslaRearDefrost label="Defrost Rear"
+ Switch item=TeslaLeftSeatHeater label="Seat Heat Left"
+ Switch item=TeslaRightSeatHeater label="Seat Heat Right"
}
Frame
{
The Tibber Binding connects to the [Tibber API](https://developer.tibber.com), and enables users to retrieve electricity data:
- Default: Frequent polls are performed to retrieve electricity price and cost/consumption information
-- Optional: For users having Tibber Pulse, a websocket connection is established to retrieve live measurements
+- Optional: For users having Tibber Pulse, a websocket connection is established to retrieve live measurements
Refresh time (poll frequency) is set manually as part of setup, minimum 1 minute.
- To send multiple copies of the same keyboard command, append an asterisk with the number of repeats required e.g. NUM2*4 would send the number 2 four times. This is useful for performing searches where the number characters can only be accessed by pressing the keys multiple times in rapid succession i.e. each key press cycles through characters A, B, C, 2.
- Special characters must also be changed to the appropriate command e.g. the comma symbol(`,`) must not be sent it should be replaced by 'COMMA'.
-Available IR Commands to use with `irCommand` channel:
-UP
-DOWN
-LEFT
-RIGHT
-SELECT
-TIVO
-LIVETV
-GUIDE
-BACK
-INFO
-EXIT
-THUMBSUP
-THUMBSDOWN
-CHANNELUP
-CHANNELDOWN
-PLAY
-FORWARD
-REVERSE
-PAUSE
-SLOW
-REPLAY
-ADVANCE
-RECORD
-NUM0
-NUM1
-NUM2
-NUM3
-NUM4
-NUM5
-NUM6
-NUM7
-NUM8
-NUM9
-ENTER
-CLEAR
-ACTION_A
-ACTION_B
-ACTION_C
-ACTION_D
-CC_ON
-CC_OFF
-FIND_REMOTE
-STANDBY
-ASPECT_CORRECTION_FULL
-ASPECT_CORRECTION_PANEL
-ASPECT_CORRECTION_ZOOM
-ASPECT_CORRECTION_WIDE_ZOOM
-VIDEO_MODE_FIXED_480i
-VIDEO_MODE_FIXED_480p
-VIDEO_MODE_FIXED_720p
-VIDEO_MODE_FIXED_1080i
-VIDEO_MODE_HYBRID
-VIDEO_MODE_HYBRID_720p
-VIDEO_MODE_HYBRID_1080i
-VIDEO_MODE_NATIVE
+Available IR Commands to use with `irCommand` channel:
+UP
+DOWN
+LEFT
+RIGHT
+SELECT
+TIVO
+LIVETV
+GUIDE
+BACK
+INFO
+EXIT
+THUMBSUP
+THUMBSDOWN
+CHANNELUP
+CHANNELDOWN
+PLAY
+FORWARD
+REVERSE
+PAUSE
+SLOW
+REPLAY
+ADVANCE
+RECORD
+NUM0
+NUM1
+NUM2
+NUM3
+NUM4
+NUM5
+NUM6
+NUM7
+NUM8
+NUM9
+ENTER
+CLEAR
+ACTION_A
+ACTION_B
+ACTION_C
+ACTION_D
+CC_ON
+CC_OFF
+FIND_REMOTE
+STANDBY
+ASPECT_CORRECTION_FULL
+ASPECT_CORRECTION_PANEL
+ASPECT_CORRECTION_ZOOM
+ASPECT_CORRECTION_WIDE_ZOOM
+VIDEO_MODE_FIXED_480i
+VIDEO_MODE_FIXED_480p
+VIDEO_MODE_FIXED_720p
+VIDEO_MODE_FIXED_1080i
+VIDEO_MODE_HYBRID
+VIDEO_MODE_HYBRID_720p
+VIDEO_MODE_HYBRID_1080i
+VIDEO_MODE_NATIVE
## Full Example
| `wanPhysicalLinkStatus` | `String` | x | Link Status |
| `wanTotalBytesReceived` | `Number:DataAmount` | x | Total Bytes Received |
| `wanTotalBytesSent` | `Number:DataAmount` | x | Total Bytes Sent |
-
+
**Note:** AVM FritzBox devices use 4-byte-unsigned-integers for `wanTotalBytesReceived` and `wanTotalBytesSent`, because of that the counters are reset after around 4GB data.
## `PHONEBOOK` Profile
Bridge tr064:fritzbox:rootuid "Root label" @ "location" [ host="192.168.1.1", user="user", password="passwd",
phonebookInterval="0"]{
Thing subdeviceLan LAN "label LAN" [ uuid="uuid:xxxxxxxx-xxxx-xxxx-yyyy-xxxxxxxxxxxx",
- macOnline="XX:XX:XX:XX:XX:XX",
- "YY:YY:YY:YY:YY:YY"]
+ macOnline="XX:XX:XX:XX:XX:XX",
+ "YY:YY:YY:YY:YY:YY"]
Thing subdevice WAN "label WAN" [ uuid="uuid:xxxxxxxx-xxxx-xxxx-zzzz-xxxxxxxxxxxx"]
Thing subdevice WANCon "label WANConnection" [ uuid="uuid:xxxxxxxx-xxxx-xxxx-wwww-xxxxxxxxxxxx"]
}
A blind or curtain supports, beside `battery_level` and `battery_low` channels, a `positon` channel.
An air purifier supports:
-* `fan_mode` and `fan_speed` channels, which allows for control of the fan and reading of the current speed.
-* `disable_led` and `lock_button` channels, to respectively disable the LED's and lock the button on the physical device.
-* `air_quality_pm25` and `air_quality_rating` channels, which reads the particulate matter 2.5ÎĽm and corresponding indication of air quality (similar to Tradfri app rating).
-* `filter_check_next` and `filter_check_alarm` channels, which represents the remaining number of minutes until the next filter check and whether it is time to do the filter check now. Filter check must be completed through the TRĂ…DFRI app (or on the hardware buttons in case of replacement).
-* a `filter_uptime` channel, which represents the current time since last filter change.
+
+- `fan_mode` and `fan_speed` channels, which allows for control of the fan and reading of the current speed.
+- `disable_led` and `lock_button` channels, to respectively disable the LED's and lock the button on the physical device.
+- `air_quality_pm25` and `air_quality_rating` channels, which reads the particulate matter 2.5ÎĽm and corresponding indication of air quality (similar to Tradfri app rating).
+- `filter_check_next` and `filter_check_alarm` channels, which represents the remaining number of minutes until the next filter check and whether it is time to do the filter check now. Filter check must be completed through the TRĂ…DFRI app (or on the hardware buttons in case of replacement).
+- a `filter_uptime` channel, which represents the current time since last filter change.
Refer to the matrixes above.
```java
Bridge tradfri:gateway:mygateway [ host="192.168.0.177", code="EHPW5rIJKyXFgjH3" ] {
- 0100 myDimmableBulb "My Dimmable Bulb" [ id=65537 ]
+ 0100 myDimmableBulb "My Dimmable Bulb" [ id=65537 ]
0220 myColorTempBulb "My Color Temp Bulb" [ id=65538 ]
0210 myColorBulb "My Color Bulb" [ id=65539 ]
0830 myRemoteControl "My Remote Control" [ id=65545 ]
The `upnpserver` has the following channels (item type and access mode indicated in brackets):
- `upnprenderer` (String, RW): The renderer to receive media content for playback.
-
+
The channel allows selecting from all discovered media renderers.
This list is dynamically adjusted as media renderers are being added/removed.
The browsing will start at the top of the content directory tree and allows you to go down and up (represented by ..) in the tree.
The list of containers (directories) and media entries for selection in the content hierarchy is updated dynamically when selecting a container or entry.
-
+
This channel can also be used to skip to a specific container or entry in the content directory.
Setting it to 0 will reposition to the top of the content hierarchy.
-
+
All media in the selection list, playable on the currently selected `upnprenderer` channel, are automatically queued to the renderer as next media for playback.
-
+
The `browseDown` configuration parameter influences the result in such a way that, for `browseDown = true`, if the result only contains exactly one container entry, the result will be the content of the container and not the container itself.
- `search` (String, W): Search for media content on the server.
Search criteria are defined in UPnP search criteria format.
Examples: `dc:title contains "song"`, `dc:creator contains "SpringSteen"`, `unp:class = "object.item.audioItem"`, `upnp:album contains "Born in"`.
-
+
The search, by default, starts at the value of the `currentid` and searches down from there unless the `searchfromroot` thing configuration parameter is set to `true`.
The result (media and containers) will be available in the `browse` command option list.
The `currentid` channel will be put to the id of the top container where the search started.
-
+
All media in the search result list, playable on the current selected `upnprenderer` channel, are automatically queued to the renderer as next media for playback.
-
+
The `browseDown` configuration parameter influences the result in such a way that, for `browseDown = true`, if the result only contains exactly one container entry, the result will be the content of the container and not the container itself.
- `playlistselect` (String, W): Select a playlist from the available playlists currently saved on disk.
Playback does not start automatically if not yet playing.
When already playing a queue, the first entry of the new queue will be playing as the next entry.
When playing an URI or media provided through an action, playback will immediately switch to the new queue.
-
+
The `upnprenderer` will use that queue until it is replaced by another queue from the same or another `upnpserver`.
Note that querying the content hierarchy on the `upnpserver` will update the `upnpserver browse` option list each time, and therefore the queue on the `upnprenderer` will be updated each time as long as `upnprenderer` is selected on `upnpserver`.
-
+
- Selecting a favorite or playlist on the renderer.
Playback of the favorite or playlist will start immediately.
Adding Velbus modules to your openHAB configuration follows the conventions of your preferred configuration method.
-* **UI-based configuration:** Invoke a manual scan from the Things menu in order to start the [discovery process](#discovery).
+- **UI-based configuration:** Invoke a manual scan from the Things menu in order to start the [discovery process](#discovery).
Discovered modules can be found in the inbox.
-* **Textual `.thing` configuration** can declare Velbus modules either in a standalone fashion (a bridge is still required):
+- **Textual `.thing` configuration** can declare Velbus modules either in a standalone fashion (a bridge is still required):
```java
Thing velbus:<thingType>:<bridgeId>:<thingId> "Label" @ "Location" [ CH1="Kitchen Light", CH2="Living Light" ]
| `dimspeed` | `vmb1dm`, `vmb1led`, `vmb4dc`, `vmbdme`, `vmbdmi`, `vmbdmir` | The time (in seconds) needed for dimming from 0 to 100%. |
| `refresh` | `vmb1ts`, `vmb4an`, `vmb7in`, `vmbel1`, `vmbel2`, `vmbel4`, `vmbelpir`, `vmbgp1`, `vmbgp1-2`, `vmbgp2`, `vmbgp2-2`, `vmbgp4`, `vmbgp4-2`, `vmbgp4pir`, `vmbgp4pir-2`, `vmbmeteo`, `vmbpirc`, `vmbpirm`, `vmbpiro` | Refresh interval for sensors or counters (in seconds), default 300. If set to 0 or left empty, no refresh will be scheduled. |
-The `vmbdali` and `vmbdali-20` things have 16 virtual light channels.
+The `vmbdali` and `vmbdali-20` things have 16 virtual light channels.
A virtual light combines 3 or 4 VMBDALI module channels into an openHAB channel to control RGB or RGBW lights.
This is because an RGBW DALI light is configured on the VMBDALI module with 4 channels (Red channel, Green channel, Blue channel, White channel).
The channels of the virtual light can be identified by a module channel `CH1` ... `CH64` or a DALI address `A0` ... `A63`.
Text item=Guest_aux1RuntimeDay0
Text item=Guest_aux2RuntimeDay0
Text item=Guest_freeCoolRuntimeDay0
-
+
}
}
```
Switch item=LoungeAPPower label="Power"
Text item=LoungeAPFilterRemainingUse label="Filter Remaining"
Switch item=LoungeAPDisplay label="Display"
- Text item=LoungeAPAirQuality label="Air Quality [%.0f (PM2.5)]"
+ Text item=LoungeAPAirQuality label="Air Quality [%.0f (PM2.5)]"
Switch item=LoungeAPControlsLock label="Controls Locked"
Text item=LoungeAPTimerExpiry label="Timer Shutdown @" icon="clock"
Switch item=LoungeAPMode label="Mode" mappings=[auto="Auto", manual="Manual Fan Control", sleep="Sleeping"] icon="settings"
Text item=LoungeAPErrorCode label="Error Code [%.0f]"
- Switch item=LoungeAPManualFanSpeed label="Manual Fan Speed [%.0f]" mappings=[1="1", 2="2", 3="3", 4="4"] icon="settings"
+ Switch item=LoungeAPManualFanSpeed label="Manual Fan Speed [%.0f]" mappings=[1="1", 2="2", 3="3", 4="4"] icon="settings"
}
```
Text item=LoungeAPFilterRemainingUse label="Filter Remaining"
Switch item=LoungeAPDisplay label="Display"
Switch item=LoungeAPNightLightMode label="Night Light Mode" mappings=[on="On", dim="Dimmed", off="Off"] icon="settings"
- Text item=LoungeAPAirQuality label="Air Quality [%.0f]"
+ Text item=LoungeAPAirQuality label="Air Quality [%.0f]"
Switch item=LoungeAPControlsLock label="Controls Locked"
Text item=LoungeAPTimerExpiry label="Timer Shutdown @" icon="clock"
Switch item=LoungeAPMode label="Mode" mappings=[manual="Manual Fan Control", sleep="Sleeping"] icon="settings"
Text item=LoungeAPErrorCode label="Error Code [%.0f]"
- Switch item=LoungeAPManualFanSpeed label="Manual Fan Speed [%.0f]" mappings=[1="1", 2="2", 3="3"] icon="settings"
+ Switch item=LoungeAPManualFanSpeed label="Manual Fan Speed [%.0f]" mappings=[1="1", 2="2", 3="3"] icon="settings"
}
```
> Visual Crossing Weather is the easiest-to-use and lowest-cost source for historical and forecast weather data.
> Our [Weather API](https://www.visualcrossing.com/weather-api) is designed to integrate easily into any app or code, and
> our prices are lower than any other provider in the industry.
- >
+ >
> Our data is used daily by a diverse customer-base including business analysts, data scientists, insurance professionals,
> energy producers, construction planners, and academics.
- >
+ >
> We have the [Weather Data](https://www.visualcrossing.com/weather-data) and expertise needed to serve any individual or
> organization from an independent event planner to a global enterprise.
| Channel | Type | Read/Write | Description |
|------------------------|-----------------------------|------------|-------------|
-| hourXX-datetime | time-channel | R | |
-| hourXX-timestamp | timestamp-channel | R | |
-| hourXX-temperature | system.outdoor-temperature | R | |
-| hourXX-feels-like | temperature-channel | R | |
-| hourXX-humidity | system.atmospheric-humidity | R | |
-| hourXX-dew | temperature-channel | R | |
-| hourXX-precip | precip-channel | R | |
-| hourXX-precip-prob | precip-prob-channel | R | |
-| hourXX-precip-type | precip-type-channel | R | |
-| hourXX-snow | snow-channel | R | |
-| hourXX-snow-depth | snow-channel | R | |
-| hourXX-wind-gust | system.wind-speed | R | |
-| hourXX-wind-speed | system.wind-speed | R | |
-| hourXX-wind-dir | system.wind-direction | R | |
-| hourXX-pressure | system.barometric-pressure | R | |
-| hourXX-visibility | visibility-channel | R | |
-| hourXX-cloud-cover | cloud-cover-channel | R | |
-| hourXX-solar-radiation | solar-radiation-channel | R | |
-| hourXX-solar-energy | solar-energy-channel | R | |
-| hourXX-uv-index | uv-index-channel | R | |
-| hourXX-severe-risk | severe-risk-channel | R | |
-| hourXX-conditions | conditions-channel | R | |
-| hourXX-icon | icon-channel | R | |
-| hourXX-stations | stations-channel | R | |
-| hourXX-source | source-channel | R | |
+| hourXX-datetime | time-channel | R | |
+| hourXX-timestamp | timestamp-channel | R | |
+| hourXX-temperature | system.outdoor-temperature | R | |
+| hourXX-feels-like | temperature-channel | R | |
+| hourXX-humidity | system.atmospheric-humidity | R | |
+| hourXX-dew | temperature-channel | R | |
+| hourXX-precip | precip-channel | R | |
+| hourXX-precip-prob | precip-prob-channel | R | |
+| hourXX-precip-type | precip-type-channel | R | |
+| hourXX-snow | snow-channel | R | |
+| hourXX-snow-depth | snow-channel | R | |
+| hourXX-wind-gust | system.wind-speed | R | |
+| hourXX-wind-speed | system.wind-speed | R | |
+| hourXX-wind-dir | system.wind-direction | R | |
+| hourXX-pressure | system.barometric-pressure | R | |
+| hourXX-visibility | visibility-channel | R | |
+| hourXX-cloud-cover | cloud-cover-channel | R | |
+| hourXX-solar-radiation | solar-radiation-channel | R | |
+| hourXX-solar-energy | solar-energy-channel | R | |
+| hourXX-uv-index | uv-index-channel | R | |
+| hourXX-severe-risk | severe-risk-channel | R | |
+| hourXX-conditions | conditions-channel | R | |
+| hourXX-icon | icon-channel | R | |
+| hourXX-stations | stations-channel | R | |
+| hourXX-source | source-channel | R | |
### `current-conditions-channel-group`
**Note 2: Use `docs/only_days.items` to have forecast for days but without hours or join items from `docs/Day_XX` to get hourly forecast for each day**
```java
-Group Total_Weather_Data "Total Weather Data" [ "Equipment" ]
+Group Total_Weather_Data "Total Weather Data" [ "Equipment" ]
// basic group
-Group Total_Weather_Data_Basic "Basic" (Total_Weather_Data) [ "Equipment" ]
+Group Total_Weather_Data_Basic "Basic" (Total_Weather_Data) [ "Equipment" ]
Number Total_Weather_Data_Basic_Cost "Cost" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#cost"}
String Total_Weather_Data_Basic_Description "Description" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#description"}
// current conditions
-Group Total_Weather_Data_Current_Conditions "Current Conditions" (Total_Weather_Data) [ "Equipment" ]
+Group Total_Weather_Data_Current_Conditions "Current Conditions" (Total_Weather_Data) [ "Equipment" ]
String Total_Weather_Data_Basic_Datetime "Datetime" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#datetime"}
DateTime Total_Weather_Data_Basic_Timestamp "Timestamp" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#timestamp"}
Number:Temperature Total_Weather_Data_Basic_Temperature "Temperature" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#temperature"}
// lang - https://www.visualcrossing.com/resources/documentation/weather-api/how-to-create-or-modify-language-files/
// dateFrom, dateTo - https://www.visualcrossing.com/resources/documentation/weather-api/using-the-time-period-parameter-to-specify-dynamic-dates-for-weather-api-requests/
val weatherResponse2 = actions.timeline("wrocław,poland", METRIC, "pl", "last7days", "next5days")
- }
+ }
end
```
# Vizio Binding
-This binding connects Vizio TVs to openHAB.
+This binding connects Vizio TVs to openHAB.
The TV must support the Vizio SmartCast API that is found on 2016 and later models.
## Supported Things
openhab:vizio <thingUID> start_pairing <deviceName>
```
-Substitute `<thingUID>` with thing's id, ie: `vizio_tv:00bc3e711660`
-Substitute `<deviceName>` the desired device name that will appear in the TV's settings, under Mobile Devices, ie: `Vizio-openHAB`
+Substitute `<thingUID>` with thing's id, ie: `vizio_tv:00bc3e711660`
+Substitute `<deviceName>` the desired device name that will appear in the TV's settings, under Mobile Devices, ie: `Vizio-openHAB`
Submit Pairing Code:
openhab:vizio <thingUID> submit_code <pairingCode>
```
-Substitute `<thingUID>` with the same thing id used above
-Substitute `<pairingCode>` with the 4-digit pairing code displayed on the TV, ie: `1234`
+Substitute `<thingUID>` with the same thing id used above
+Substitute `<pairingCode>` with the 4-digit pairing code displayed on the TV, ie: `1234`
The console should then indicate that pairing was successful (token will be displayed) and that the token was saved to the thing configuration.
If using file-based provisioning of the thing, the authorization token must be added to the thing configuration manually.
-With an authorization token in place, the binding can now control the TV.
+With an authorization token in place, the binding can now control the TV.
The authorization token text can be re-used in the event that it becomes necessary to setup the binding again.
By simply adding the token that is already recognized by the TV to the thing configuration, the pairing process can be bypassed.
### List of available button commands for Vizio TVs:
-PowerOn
-PowerOff
-PowerToggle
-VolumeUp
-VolumeDown
-MuteOn **(may only work as a toggle)**
-MuteOff **(may only work as a toggle)**
-MuteToggle
-ChannelUp
-ChannelDown
-PreviousCh
-InputToggle
-SeekFwd
-SeekBack
-Play
-Pause
-Up
-Down
-Left
-Right
-Ok
-Back
-Info
-Menu
-Home
-Exit
-Smartcast
-ccToggle
-PictureMode
-WideMode
+PowerOn
+PowerOff
+PowerToggle
+VolumeUp
+VolumeDown
+MuteOn **(may only work as a toggle)**
+MuteOff **(may only work as a toggle)**
+MuteToggle
+ChannelUp
+ChannelDown
+PreviousCh
+InputToggle
+SeekFwd
+SeekBack
+Play
+Pause
+Up
+Down
+Left
+Right
+Ok
+Back
+Info
+Menu
+Home
+Exit
+Smartcast
+ccToggle
+PictureMode
+WideMode
WideToggle
### App List Configuration:
The Vizio API to launch and identify currently running apps on the TV is very complex.
-To handle this, the binding maintains a JSON database of applications and their associated metadata in order to populate the `activeApp` dropdown with available apps.
+To handle this, the binding maintains a JSON database of applications and their associated metadata in order to populate the `activeApp` dropdown with available apps.
When the thing is started for the first time, this JSON database is saved into the `appListJson` configuration parameter.
This list of apps can be edited via the script editor on the thing configuration.
| track-type | String | R | Track type of the currently played track. |
| play-radiostream | String | RW | Play the given radio stream. |
| play-playlist | String | RW | Play a playlist identified by its name. |
-| clear-queue | Switch | RW | Clear the current queue. |
+| clear-queue | Switch | RW | Clear the current queue. |
| play-uri | String | RW | Play the stream at given uri. |
| play-file | String | RW | Play a file, located on your Volumio device at the given absolute path, e.g."mnt/INTERNAL/song.mp3" |
| random | Switch | RW | Activate random mode. |
demo.items:
```java
-Group gVoc "Volvo On Call"
+Group gVoc "Volvo On Call"
Group:Contact:OR(OPEN,CLOSED) gDoorsOpening "Portes" (gVoc)
Contact Voc_DoorsTailgate "Tailgate" (gDoorsOpening) {channel="volvooncall:vehicle:glh:XC60:doors#tailgate"}
```perl
sitemap voc label="Volvo On Call" {
-
+
Frame label="Etat Véhicule" {
Switch item=Voc_DoorsCarLocked
Switch item=Voc_Location_LUD mappings=[REFRESH='MAJ !']
Frame label="" {
Mapview item=Voc_Location label="" height=10
}
-
+
Frame label="Opening Status" {
Group item=gDoorsOpening
Group item=gWindowsOpening
Devices known to work with the binding:
-* [Warmup 4iE](https://www.warmup.co.uk/thermostats/smart/4ie-underfloor-heating)
-* [Warmup Element](https://www.warmup.co.uk/thermostats/smart/element-wifi-thermostat)
+- [Warmup 4iE](https://www.warmup.co.uk/thermostats/smart/4ie-underfloor-heating)
+- [Warmup Element](https://www.warmup.co.uk/thermostats/smart/element-wifi-thermostat)
Device expected to work with the binding:
-* [Warmup 6iE](https://www.warmup.co.uk/thermostats/smart/6ie-underfloor-heating)
+- [Warmup 6iE](https://www.warmup.co.uk/thermostats/smart/6ie-underfloor-heating)
Devices which might work with the binding:
-* Other similar looking devices marketed under different brands, mentioned in the API
- * [Laticrete](https://laticrete.com/)
- * [Rointe](https://rointe.com/)
- * [Porcelanosa](https://www.porcelanosa.com/)
- * Equus
- * [Savant](https://www.savant.com/)
+- Other similar looking devices marketed under different brands, mentioned in the API
+ - [Laticrete](https://laticrete.com/)
+ - [Rointe](https://rointe.com/)
+ - [Porcelanosa](https://www.porcelanosa.com/)
+ - Equus
+ - [Savant](https://www.savant.com/)
Any Warmup device must be registered at <https://my.warmup.com/> prior to usage, or connected through the [MyHeating app](https://www.warmup.co.uk/thermostats/smart/myheating-app).
This API is not known to be documented publicly.
The binding api implementation has been derived from the implementations at <https://github.com/alyc100/SmartThingsPublic/blob/master/devicetypes/alyc100/warmup-4ie.src/warmup-4ie.groovy> and <https://github.com/alex-0103/warmup4IE/blob/master/warmup4ie/warmup4ie.py>, and enhanced by inspecting the [GraphQL endpoint](https://apil.warmup.com/graphql).
-
## Supported Things
The Warmup binding supports the following thing types:
|----------|-------|------------------------------------------------------------------------------------------------|
| `room` | Room | A room containing an individual Warmup WiFi connected device which controls a heating circuit. |
-### Room
-
+**Room**
The device is optimised for controlling underfloor heating (electric or hydronic), although it can also control central heating circuits.
The device reports the temperature from one of two thermostats, either a floor temperature probe or the air temperature at the device.
It appears to be possible to configure two devices in a primary / secondary configuration, but it is not clear how this might be represented by the API and hasn't been implemented.
## Thing Configuration
-### My Warmup Account
+### `my-warmup` Bridge Configuration
| config parameter | type | description | required | default |
|------------------|---------|-------------------------------------------------|----------|---------|
| password | String | Password for my.warmup.com | true | |
| refreshInterval | Integer | Interval in seconds between automatic refreshes | true | 300 |
-### Room
+### `room` Thing Configuration
Rooms are configured automatically with a Serial Number on discovery, or can be added manually using the "Device Number" from the device, excluding the last 3 characters. Changing the target temperature results in a temporary override to that temperature, for the duration configured on the thing. This defaults to 60 minutes.
### Run Mode Statuses
-These run mode statuses are defined for the API.
-The descriptions are based on inspection of the device behaviour and are not sourced from documentation.
-Only the value `schedule` is writeable, this reverts the device to the program/schedule configured on the device.
-The value `fixed` can be set by commanding the `fixedTemperature` channel. The value `override` can be set by commanding the `targetTemperature` channel.
+These run mode statuses are defined for the API.
+The descriptions are based on inspection of the device behaviour and are not sourced from documentation.
+Only the value `schedule` is writeable, this reverts the device to the program/schedule configured on the device.
+The value `fixed` can be set by commanding the `fixedTemperature` channel. The value `override` can be set by commanding the `targetTemperature` channel.
| api value | ui name | description |
|------------|------------------|---------------------------------------------------------------------------------|
```javascript
actions.get("warmup", "warmup:room:my_warmup:my_room").setOverride(Quantity("18 °C"), Quantity("10 min"));
```
+
:::
::::
- `var success = botActions.sendPersonMessage(String personEmail, String markdown, String attach)` - Send a direct message to a person, with attachment.
Sending messages for bot or person accounts works exactly the same.
-Attachments must be URLs.
+Attachments must be URLs.
Sending local files is not supported at this moment.
In the example below WebThings provided by the [Internet Monitor Service](https://pypi.org/project/internet-monitor-webthing/) will be connected.
This service does not require specific hardware or devices. To connect the WebThings, the service has to be installed inside your local network.
-### Thing
+### Thing
After installing the WebThing binding you should find the WebThings of your network in the things section of your openHAB administration interface as shown below.

-Alternatively, you may add the WebThing as an openHAB Thing by using a webthing.thing file that has to be located inside the things folder.
+Alternatively, you may add the WebThing as an openHAB Thing by using a webthing.thing file that has to be located inside the things folder.
```java
Thing webthing:generic:speedmonitor [ webThingURI="http://192.168.1.27:9496/0" ]
```perl
sitemap internetmonitor label="Internet Speed Monitor" {
- Text item=uploadSpeed
- Text item=downloadSpeed
+ Text item=uploadSpeed
+ Text item=downloadSpeed
}
```
Frame {
// Switch
Switch item=DemoSwitch
-
+
// LightSwitch
Switch item=LightSwitch
-
+
// Motion
Switch item=MotionSensor
Text item=MotionSensorLastChanged icon="clock"
-
+
// Insight
Switch item=InsightSwitch
Number item=InsightPower
Number item=InsightLastOn
Number item=InsightToday
Number item=InsightTotal
-
+
// LED Bulb
Switch item=LED1
Slider item=dLED1
Switch item=LED2
Slider item=dLED2
-
+
//DimmerSwitch
Switch item=DimmerSwitch
Slider item=dDimmerSwitch
Slider item=NightModeBrightness
Text item=NightModeStart
Text item=NightModeEnd
-
+
// CoffeMaker
Switch item=CoffeSwitch
Text item=CoffeMode
# WiFi LED Binding
This binding is used to control LED strips connected by WiFi.
-These devices are sold with different names, i.e. Magic Home LED, UFO LED, LED NET controller, etc.
+These devices are sold with different names, i.e. Magic Home LED, UFO LED, LED NET controller, etc.
## Supported Things
wifiled.sitemap
```perl
-sitemap wifiled label="LED Sitemap"
-{
+sitemap wifiled label="LED Sitemap"
+{
Frame {
Switch item=MyWiFiLight_power
Slider item=MyWiFiLight_speed visibility=[MyWiFiLight_power==ON]
Selection item=LED_1_program visibility=[MyWiFiLight_power==ON]
-
+
Switch item=LED_1_preset_0 visibility=[MyWiFiLight_power==ON]
Switch item=LED_1_preset_1 visibility=[MyWiFiLight_power==ON]
Switch item=LED_1_preset_2 visibility=[MyWiFiLight_power==ON]
Switch item=LED_1_preset_20 visibility=[MyWiFiLight_power==ON]
Switch item=LED_1_preset_21 visibility=[MyWiFiLight_power==ON]
Switch item=LED_1_preset_22 visibility=[MyWiFiLight_power==ON]
- Switch item=LED_1_preset_23 visibility=[MyWiFiLight_power==ON]
+ Switch item=LED_1_preset_23 visibility=[MyWiFiLight_power==ON]
}
}
```
# WlanThermo Binding
-This binding add support for the WlanThermo BBQ Thermometer.
+This binding add support for the WlanThermo BBQ Thermometer.
| Nano | Mini |
|--------------------------------------|-------------------------------------|
|  |  |
- Mini V1 (untested, but should be working)
- Mini V2
- Pitmaster support is currently only enabled for Mini V1/V2.
+ Pitmaster support is currently only enabled for Mini V1/V2.
If you have a WlanThermo Nano with Pitmaster, please contact the author of this binding to include the support in future releases.
## Discovery
If username/password is given in the thing, most channels are writeable.
-#### The device itself provides the following channels:
+#### The device itself provides the following channels:
| channel | type | description |
|---------------------|----------------------|------------------------------------------|
| rssi_signalstrength | Number | Signal Strength in range [0 ... 4] |
| rssi | Number | Signal Strength in dBm |
-#### The following channels apply for all 8 probes of the WlanThermo Nano:
+#### The following channels apply for all 8 probes of the WlanThermo Nano:
| channel | type | description |
|--------------------|--------------------|----------------------------------------------------------------------|
Default item=nano_rssi icon="qualityofservice"
Default item=nano_soc icon="batterylevel"
Default item=nano_charging icon="energy"
-
+
Text item=nano_name_1 icon="fire" {
Frame {
Default item=nano_typ_1 icon="settings"
Default item=nano_color_1
-
+
Default item=nano_temp_1 icon="temperature"
Text icon=""
Setpoint item=nano_min_1 icon="temperature_cold"
Setpoint item=nano_max_1 icon="temperature_hot"
-
+
Default item=nano_alarm_device_1 icon="switch"
Default item=nano_alarm_push_1 icon="switch"
Default item=nano_alarm_low_1 icon="siren"
Default item=nano_alarm_high_1 icon="siren"
}
}
-
+
Text item=nano_name_2 icon="fire" {
Frame {
Default item=nano_typ_2 icon="settings"
Default item=nano_color_2
-
+
Default item=nano_temp_2 icon="temperature"
Text icon=""
Setpoint item=nano_min_2 icon="temperature_cold"
Setpoint item=nano_max_2 icon="temperature_hot"
-
+
Default item=nano_alarm_device_2 icon="switch"
Default item=nano_alarm_push_2 icon="switch"
Default item=nano_alarm_low_2 icon="siren"
Default item=nano_alarm_high_2 icon="siren"
}
}
-
+
Text item=nano_name_3 icon="fire" {
Frame {
Default item=nano_typ_3 icon="settings"
Default item=nano_color_3
-
+
Default item=nano_temp_3 icon="temperature"
Text icon=""
Setpoint item=nano_min_3 icon="temperature_cold"
Setpoint item=nano_max_3 icon="temperature_hot"
-
+
Default item=nano_alarm_device_3 icon="switch"
Default item=nano_alarm_push_3 icon="switch"
Default item=nano_alarm_low_3 icon="siren"
Default item=nano_alarm_high_3 icon="siren"
}
}
-
+
Text item=nano_name_4 icon="fire" {
Frame {
Default item=nano_typ_4 icon="settings"
Default item=nano_color_4
-
+
Default item=nano_temp_4 icon="temperature"
Text icon=""
Setpoint item=nano_min_4 icon="temperature_cold"
Setpoint item=nano_max_4 icon="temperature_hot"
-
+
Default item=nano_alarm_device_4 icon="switch"
Default item=nano_alarm_push_4 icon="switch"
Default item=nano_alarm_low_4 icon="siren"
Default item=nano_alarm_high_4 icon="siren"
}
}
-
+
Text item=nano_name_5 icon="fire" {
Frame {
Default item=nano_typ_5 icon="settings"
Default item=nano_color_5
-
+
Default item=nano_temp_5 icon="temperature"
Text icon=""
Setpoint item=nano_min_5 icon="temperature_cold"
Setpoint item=nano_max_5 icon="temperature_hot"
-
+
Default item=nano_alarm_device_5 icon="switch"
Default item=nano_alarm_push_5 icon="switch"
Default item=nano_alarm_low_5 icon="siren"
Default item=nano_alarm_high_5 icon="siren"
}
}
-
+
Text item=nano_name_6 icon="fire" {
Frame {
Default item=nano_typ_6 icon="settings"
Default item=nano_color_6
-
+
Default item=nano_temp_6 icon="temperature"
Text icon=""
Setpoint item=nano_min_6 icon="temperature_cold"
Setpoint item=nano_max_6 icon="temperature_hot"
-
+
Default item=nano_alarm_device_6 icon="switch"
Default item=nano_alarm_push_6 icon="switch"
Default item=nano_alarm_low_6 icon="siren"
Default item=nano_alarm_high_6 icon="siren"
}
}
-
+
Text item=nano_name_7 icon="fire" {
Frame {
Default item=nano_typ_7 icon="settings"
Default item=nano_color_7
-
+
Default item=nano_temp_7 icon="temperature"
Text icon=""
Setpoint item=nano_min_7 icon="temperature_cold"
Setpoint item=nano_max_7 icon="temperature_hot"
-
+
Default item=nano_alarm_device_7 icon="switch"
Default item=nano_alarm_push_7 icon="switch"
Default item=nano_alarm_low_7 icon="siren"
Default item=nano_alarm_high_7 icon="siren"
}
}
-
+
Text item=nano_name_8 icon="fire" {
Frame {
Default item=nano_typ_8 icon="settings"
Default item=nano_color_8
-
+
Default item=nano_temp_8 icon="temperature"
Text icon=""
Setpoint item=nano_min_8 icon="temperature_cold"
Setpoint item=nano_max_8 icon="temperature_hot"
-
+
Default item=nano_alarm_device_8 icon="switch"
Default item=nano_alarm_push_8 icon="switch"
Default item=nano_alarm_low_8 icon="siren"
Selection item=XmasTree_Palettes
Selection item=XmasTree_Presets
Default item=XmasTree_FXSpeed
- Default item=XmasTree_FXIntensity
+ Default item=XmasTree_FXIntensity
Selection item=XmasTree_TransformTime mappings=[0='0 seconds', 2 ='2 seconds', 10='10 seconds', 30='30 seconds', 60='60 seconds']
}
-
+
```
You can also define a transformation to fx. get a cardinal direction (N, S, W, E):
```javascript
-(function(s){
+(function(s){
if ( (s == "NULL") || (s == "UNDEF") )
{
return undefined;
var winddiroffset = (wind + (360.0/32.0)) % 360.0;
var winddiridx = Math.floor(winddiroffset / (360.0/16.0));
var winddir = dir[winddiridx];
-
+
return winddir + ' ('+ wind +'°)';
}
})(input)
rule "Yamaha_Input_Ex"
when
Item Yamaha_Input changed or
- Item Yamaha_Tuner_Band changed
+ Item Yamaha_Tuner_Band changed
then
var String input = "" + Yamaha_Input.state
if (Yamaha_Input.state == "TUNER" && Yamaha_Tuner_Band.state !== NULL) {
For example, if your AVR returns `HDMI_1` for command `HDMI1` you can create such mapping list:
`HDMI_1=HDMI1,HDMI 1=HDMI1,HDMI_2=HDMI2,HDMI 2=HDMI2`
-
+
If you unsure what mapping to apply, enable trace logging (see section earlier) and you should see what is going on:
```text
The http port 80 on the receiver is used with http POST requests for retrieving and changing the device state. The actual url is http://HOST/YamahaRemoteControl/ctrl.
An example for retrieving data:
+
```xml
<?xml version="1.0" encoding="utf-8"?>
<YAMAHA_AV cmd="GET">
<ZONE><Basic_Status>GetParam</Basic_Status><ZONE>
</YAMAHA_AV>
```
+
where ZONE is Main_Zone, Zone_2, Zone_3 or Zone_4.
An example for changing the state of the receiver:
+
```xml
<YAMAHA_AV cmd="PUT">
<ZONE><Power_Control><Power>On</Power></Power_Control><ZONE>
</YAMAHA_AV>
```
+
### XML Structure
- System
+
+ System
Config
Model_Name
- System_ID
- Version
- Feature_Existence
+ System_ID
+ Version
+ Feature_Existence
Main_Zone
Zone_2
Zone_3
Destination
Freq_Step
- Main Zone
+ Main Zone
Config
Feature_Availability
Name -> Zone/Scene
Play_Control
List_Control
- Zone2,3
+ Zone2,3
Config
Basic_Status
Power_Control
Play_Control
List_Control
- Zone4
+ Zone4
Config
Basic_Status
Power_Control
Play_Control
List_Control
- USB
+ USB
Config
Play_Control
Play_Info
List_Control
List_Info
- Tuner
+ Tuner
Config
Play_Control
Play_Info
List_Control
List_Info
-
### XML Descriptor
The AVR provides an XML file that describes features and commands available using this URL:
+
```
http://<Your_Yamaha_ID>/YamahaRemoteControl/desc.xml
```
+
Or this URL:
+
```
http://<Your_Yamaha_ID>/YamahaRemoteControl/UnitDesc.xml
```
As Yamaha introduces new models there may be variations between XML structure.
In an attempt to improve the add-on maintenance and troubleshooting selected model's `desc.xml`' has been collected from community users:
-* [HTR-4069](desc_HTR-4069.xml)
-* [RX-A2000](desc_RX-A2000.xml)
-* [RX-A3070](desc_RX-A3070.xml)
-* [RX-S601D](desc_RX-S601D.xml)
-* [RX-V479](desc_RX-V479.xml)
-* [RX-V583](desc_RX-V583.xml)
-* [RX-V675](desc_RX-V675.xml)
-* [RX-V3900](desc_RX-V3900.xml)
+- [HTR-4069](desc_HTR-4069.xml)
+- [RX-A2000](desc_RX-A2000.xml)
+- [RX-A3070](desc_RX-A3070.xml)
+- [RX-S601D](desc_RX-S601D.xml)
+- [RX-V479](desc_RX-V479.xml)
+- [RX-V583](desc_RX-V583.xml)
+- [RX-V675](desc_RX-V675.xml)
+- [RX-V3900](desc_RX-V3900.xml)
### Key differences between models
Image item=ZmServer_ImageUrl
Selection item=ZmServer_VideoMonitorId
Video item=ZmServer_VideoUrl url="" encoding="mjpeg"
-
+
Selection item=ZM_Monitor1_Function
Selection item=ZM_Monitor1_Enable
Image item=ZM_Monitor1_Image
- install homekit addon via UI
-- add metadata to an existing item (see [UI based configuration](#UI-based-Configuration))
+- add metadata to an existing item (see [UI based configuration](#ui-based-configuration))
- scan QR code from UI->Settings->HomeKit Integration
Add metadata to more items or fine-tune your configuration using further settings
-
## Global Configuration
You can define HomeKit settings either via mainUI or via `$OPENHAB_CONF/services/homekit.cfg`.
- click on "Save"
-
### Textual configuration
```java
Rollershutter door "Door" {homekit = "Door" [inverted=false]}
```
-HomeKit home app never sends "STOP" but only the target position.
+HomeKit home app never sends "STOP" but only the target position.
If you add configuration parameter "stop=true", openHAB will emulate stop and send "STOP" command to rollershutter item if you click on the blind icon in the iOS home app while the blind is moving.
```java
In addition, thermostat can have thresholds for cooling and heating modes.
When a thermostat is configured with all three of TargetTemperature, HeatingThresholdTemperature, and CoolingThresholdTemperature, Home will set the characteristics as follows:
- * TargetTemperature is used when the thermostat is in HEAT or COOL TargetHeatingCoolingMode.
- * CoolingThresholdThemperature and HeatingThresholdTemperature are _only_ used in AUTO TargetHeatingCoolingMode.
- * In AUTO TargetHeatingCoolingMode, TargetTemperature will be set to the average of CoolingThresholdThemperature and HeatingThresholdTemperature.
+
+- TargetTemperature is used when the thermostat is in HEAT or COOL TargetHeatingCoolingMode.
+- CoolingThresholdThemperature and HeatingThresholdTemperature are *only* used in AUTO TargetHeatingCoolingMode.
+- In AUTO TargetHeatingCoolingMode, TargetTemperature will be set to the average of CoolingThresholdThemperature and HeatingThresholdTemperature.
+
Example with thresholds:
```java
or using UI

-
+
### Stateless Programmable Switch Groups
To expose multiple Stateless Programmable Switches as a single accessory with multiple buttons (aka a scene controller), you need to configure ServiceLabel on the accessory group and ServiceIndex on each switch.
These must be an array, not a comma separated string.
If the characteristic can be set by HomeKit, the first value will be used when sending the command to the linked item.
Such a mapping can be configured manually in MainUI on HomeKit metadata in the Code editor:
+
```yaml
value: "Lock"
config:
- UNLOCK
- UNLOCKED
```
+
Or in a `.items` file:
+
```java
String MyLock "My Lock" { homekit="Lock"[SECURE="LOCK","LOCKED", UNSECURE="UNLOCK","UNLOCKED"] }
```
All accessories support the following characteristics that can be set via metadata or linked to a String item:
- * Name (defaults to item's label)
- * Manufacturer (defaults to "none")
- * Model (defaults to "none")
- * SerialNumber (defaults to item's name)
- * FirmwareRevision (defaults to "none")
- * HardwareRevision (defaults to not present)
+
+- Name (defaults to item's label)
+- Manufacturer (defaults to "none")
+- Model (defaults to "none")
+- SerialNumber (defaults to item's name)
+- FirmwareRevision (defaults to "none")
+- HardwareRevision (defaults to not present)
Note that even though these characteristics can be linked to an item, they are not dynamic and cannot be updated once the Home app reads their initial values.
All accessories also support the following optional characteristic that can be linked to a Switch item:
- * Identify (receives `ON` command when the user wishes to identify the accessory)
+
+- Identify (receives `ON` command when the user wishes to identify the accessory)
| Accessory Tag | Mandatory Characteristics | Optional Characteristics | Supported openHAB item types | Description | Configuration Options | Valid Enum Values |
|-----------------------------|-----------------------------|-----------------------------|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
You will need to manually add each additional bridge in the Home app, since the QR Code in settings will only be for the primary bridge; however the same PIN is still used.
In order to assign a particular accessory to a different bridge, set the `instance` metadata parameter:
-```
+```java
Switch kitchen_light {homekit="Lighting" [instance=2]}
```
For complex items, only the root group needs to be tagged for the specific instance:
-```
+```java
Group gSecuritySystem "Security System Group" {homekit="SecuritySystem" [instance=2]}
String security_current_state "Security Current State" (gSecuritySystem) {homekit="SecuritySystem.CurrentSecuritySystemState"}
String security_target_state "Security Target State" (gSecuritySystem) {homekit="SecuritySystem.TargetSecuritySystemState"}
If you encounter any issues with the add-on and need support, it may be important to get detailed logs of your device's communication with openHAB.
In order to get logs from the underlying library used to implement the HomeKit protocol, enable trace logging using the following commands at [the console](https://www.openhab.org/docs/administration/console.html):
-```
+```shell
openhab> log:set TRACE io.github.hapjava
openhab> log:tail io.github.hapjava
```
In order to enable detailed logs of openHAB HomeKit binding
-```
+```shell
openhab> log:set TRACE org.openhab.io.homekit.internal
openhab> log:tail org.openhab.io.homekit.internal
```
There are various reasons this may happen.
Try the following:
-* In [openhab-cli](https://www.openhab.org/docs/administration/console.html), run `openhab:homekit clearPairings`.
+- In [openhab-cli](https://www.openhab.org/docs/administration/console.html), run `openhab:homekit clearPairings`.
Try again.
-* In the HomeKit settings, change the port, setupId, and pin.
+- In the HomeKit settings, change the port, setupId, and pin.
Save the settings, then re-open the settings so as to refresh the QR code.
Re-add the device.
-* Remove HomeKit state in `${OPENHAB_USERDATA}/jsondb/homekit.json`, and HomeKit config in `${OPENHAB_USERDATA}/config/org/openhab/homekit.config`.
+- Remove HomeKit state in `${OPENHAB_USERDATA}/jsondb/homekit.json`, and HomeKit config in `${OPENHAB_USERDATA}/config/org/openhab/homekit.config`.
Restart openHAB.
Reboot iPhone.
Try again.
Currently the following Hue functionality is supported:
-* Lights: Maps to items
-* Groups: Maps to group items
-* Rooms: Maps to group items with a specific tag
-* Scenes: Maps to rules (new rule engine) that are tagged with "scene"
-* Rules: Maps to rules (new rule engine) that are tagged with "hueemulation_rule"
-* Schedule: Maps to rules (new rule engine) that are tagged with "hueemulation_schedule"
+- Lights: Maps to items
+- Groups: Maps to group items
+- Rooms: Maps to group items with a specific tag
+- Scenes: Maps to rules (new rule engine) that are tagged with "scene"
+- Rules: Maps to rules (new rule engine) that are tagged with "hueemulation_rule"
+- Schedule: Maps to rules (new rule engine) that are tagged with "hueemulation_schedule"
You can create / modify and remove groups, rooms, scenes, rules and schedules from within Hue compatible devices and apps.
-## Discovery:
+## Discovery
As soon as the service is enabled, it will announce the presence of an (emulated) HUE bridge of the second generation (square bridge).
Hue bridges are using the Universal Plug and Play (UPnP) protocol for discovery.

-Like the real HUE bridge the service must be put into pairing mode before other applications can access it.
+Like the real HUE bridge the service must be put into pairing mode before other applications can access it.
By default the pairing mode disables itself after 1 minute (can be configured).
## Exposed lights
This service can emulate 3 different devices:
-* An OSRAM SMART+ Plug,
-* a dimmable white color Philips A19 bulb and
-* an a Philips Gen 3 LCT010 extended color bulb.
+- An OSRAM SMART+ Plug,
+- a dimmable white color Philips A19 bulb and
+- an a Philips Gen 3 LCT010 extended color bulb.
The exposed Hue-type depends on some criteria:
-* If the item has the category "ColorLight": It will be exposed as a color bulb
-* If the item has the category "Light": It will be exposed as a switch.
+- If the item has the category "ColorLight": It will be exposed as a color bulb
+- If the item has the category "Light": It will be exposed as a switch.
This initial type determination is overridden if the item is tagged.
The following default tags are setup:
-* "Switchable": Item will be exposed as an OSRAM SMART+ Plug
-* "Lighting": Item will be exposed as a dimmable white bulb
-* "ColorLighting": Item will be exposed as a color bulb
+- "Switchable": Item will be exposed as an OSRAM SMART+ Plug
+- "Lighting": Item will be exposed as a dimmable white bulb
+- "ColorLighting": Item will be exposed as a color bulb
It is the responsibility of binding developers to categories and default tag their available *Channels*, so that linked Items are automatically exposed with this service.
Pairing can be turned on and off:
-```
+```ini
org.openhab.hueemulation:pairingEnabled=false
```
You can define a pairing timeout in seconds.
After that timeout, the `pairingEnabled` is automatically set to `false`.
-```
+```ini
org.openhab.hueemulation:pairingTimeout=60
```
Necessary for Amazon Echos and other devices where the API key cannot be reset.
After a new installation of openHAB or a configuration pruning the old API keys are gone but Amazon Echos will keep trying with their old, invalid keys.
-```
+```ini
org.openhab.hueemulation:createNewUserOnEveryEndpoint=false
```
This option resets automatically after pairing mode has been switched off by the timeout.
-```
+```ini
org.openhab.hueemulation:temporarilyEmulateV1bridge=false
```
Permanent V1 bridge emulation (no obvious reason to enable that):
-```
+```ini
org.openhab.hueemulation:permanentV1bridge=false
```
This option allows you to override what addresses are used for the announcement.
You can have multiple comma separated entries.
-```
+```ini
org.openhab.hueemulation:discoveryIp=192.168.1.100,::FFFF:A9DB:0D85
```
One of the comma separated tags must match for the item to be exposed.
Can be empty to match an item based on other criteria.
-```
+```ini
org.openhab.hueemulation:restrictToTagsSwitches=Switchable
org.openhab.hueemulation:restrictToTagsWhiteLights=Lighting
org.openhab.hueemulation:restrictToTagsColorLights=ColorLighting
The above default assignment means that every item that has the tag "Switchable" will be emulated as a Zigbee Switch.
If you want your switches to be exposed as lights instead (because your Amazon Echo does not support switches for example), you want to have:
-```
+```ini
org.openhab.hueemulation:restrictToTagsSwitches=NONE
org.openhab.hueemulation:restrictToTagsWhiteLights=Lighting,Switchable
org.openhab.hueemulation:restrictToTagsColorLights=ColorLighting
The service tries to expose as much items as possible (greedy), based on some criteria as explained in the section above.
If you want to exclude items, you need to tag them. Define the tags with the following option:
-```
+```ini
org.openhab.hueemulation:ignoreItemsWithTags=internal
```
Some devices like Amazon Echo, Google Home and all Philips devices (TVs, Apps) expect a Hue bridge to run on port 80.
You must either
-* port forward your openHAB installation to port 80,
+- port forward your openHAB installation to port 80,
(`iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080`)
-* install a reverse proxy on port 80, for example nginx with the following configuration:
+- install a reverse proxy on port 80, for example nginx with the following configuration:
```
server {
}
```
-* or let openHAB run on port 80 (the entire java process requires elevated privileges).
+- or let openHAB run on port 80 (the entire java process requires elevated privileges).
-* For Amazon Echo the pairing process may fail due to a 302 response from openHAB, this can be resolved by using a reverse proxy to change the request url from `/api` to `/api/`, for example nginx with the following configuration:
+- For Amazon Echo the pairing process may fail due to a 302 response from openHAB, this can be resolved by using a reverse proxy to change the request url from `/api` to `/api/`, for example nginx with the following configuration:
```
server {
Also note that Amazon Echos are stubborn as.
You might need to remove all former recognized devices multiple times and perform the search via different Echos and also the web or mobile application.
-It might help to (temporarly) lower the emulated bridge version in the configuration as described above,
+It might help to (temporarly) lower the emulated bridge version in the configuration as described above.
## Text configuration example
The item label will be used as the Hue device name. Please be aware that textual defined items are generally a bad idea.
-In this case renaming items in Hue compatible Apps will fail.
+In this case renaming items in Hue compatible Apps will fail.
-```
+```java
Switch TestSwitch "Kitchen Switch" [ "Switchable" ] {channel="..."}
Color TestColorBulb "Bathroom" [ "ColorLighting" ] {channel="..."}
Dimmer TestDimmer "Hallway" [ "Lighting" ] {channel="..."}
The metrics service provides:
-* an additional REST endpoint to retrieve openHAB core metrics from. This can be used as scrape target for pull-based monitoring systems like [Prometheus](https://prometheus.io/).
-* optionally configurable services to export openHAB core metrics to push-based monitoring systems like [InfluxDB](https://www.influxdata.com/).
+- an additional REST endpoint to retrieve openHAB core metrics from. This can be used as scrape target for pull-based monitoring systems like [Prometheus](https://prometheus.io/).
+- optionally configurable services to export openHAB core metrics to push-based monitoring systems like [InfluxDB](https://www.influxdata.com/).
## Provided metrics
-Currently the following metrics are provided:
+Currently the following metrics are provided:
- openHAB events counts (per topic)
- openHAB bundle states
- openHAB rule runs (per rule)
- openHAB threadpool stats (per scheduler)
- JVM stats including metrics of
- - class loader
- - memory
- - GarbageCollector
- - OS (system load, CPU)
- - thread metrics
+ - class loader
+ - memory
+ - GarbageCollector
+ - OS (system load, CPU)
+ - thread metrics
## Configuration
The configuration for the metrics service is available in the openHAB UI under Settings | Other Services | Metrics service.
Support for pull-based monitoring systems (e. g. Prometheus) is always enabled, since it doesn't imply any significant overhead when not used.
-Support for push-based monitoring systems (e. g. InfluxDB) have to be enabled separately.
+Support for push-based monitoring systems (e. g. InfluxDB) have to be enabled separately.
The following configuration parameters can be set:
### Prometheus
Once the IO addon is installed, the Prometheus endpoint will be available under:
-_<openhab_host>:8080/rest/metrics/prometheus_
+_<openhab_host>:8080/rest/metrics/prometheus_
Refer to the [Prometheus](https://prometheus.io/) documentation on how to setup a Prometheus instance and add a scrape configuration. A typical scrape config could look like this (excerpt from `/etc/prometheus/prometheus.yml`):
- 'openhab.local:8080'
````
-Replace `openhab.local` by the openhab host.
+Replace `openhab.local` by the openhab host.
#### Available configuration parameters
## Additional metric formats
-The metrics service was implemented using [Micrometer](https://micrometer.io), which supports a number of [monitoring systems](https://micrometer.io/docs)
+The metrics service was implemented using [Micrometer](https://micrometer.io), which supports a number of [monitoring systems](https://micrometer.io/docs)
It should be possible to add any of these, especially the ones using a pull mechanism ("scraping") like Prometheus does.
## Grafana
-You can now visualize the results in Grafana. Micrometer provides a public [Grafana dashboard here](https://grafana.com/grafana/dashboards/4701).
+You can now visualize the results in Grafana. Micrometer provides a public [Grafana dashboard here](https://grafana.com/grafana/dashboards/4701).
I adapted it a little bit to include the openHAB metrics.
You can download it here [Dashboard](doc/dashboard.json).
This has been tested with Prometheus - for other monitoring systems adaptions to the dashboard might be necessary.
-Here are some screenshots:
+Here are some screenshots:


The openHAB NEEO Integration will provide the following:
-* Automatic discovery of NEEO brains on the network and automatic registering of the openHAB as an SDK.
-* A NEEO dashboard tile that will show the status of NEEO Brain connections and provide the ability to customize the mapping between openHAB things/item and NEEO device/capabilities.
-* Discovery of openHAB things on the NEEO app.
-* Full two-way communcation between openHAB and brain.
+- Automatic discovery of NEEO brains on the network and automatic registering of the openHAB as an SDK.
+- A NEEO dashboard tile that will show the status of NEEO Brain connections and provide the ability to customize the mapping between openHAB things/item and NEEO device/capabilities.
+- Discovery of openHAB things on the NEEO app.
+- Full two-way communcation between openHAB and brain.
Item changes in openHAB will appear in NEEO and vice-versa.
If searching for openHAB devices on the NEEO Brain is always returning nothing, here are a few tips to solve the issue:
-1. Read sections IP Address and openHAB Primary Address below.
-2. Make sure the openHAB primary address is set to an address that is reachable from the NEEO Brain (see openHAB Primary Address section below).
-3. Make sure your firewall is not blocking access to the openHAB server
-4. Your search criteria has included too many openHAB devices (especially if "Expose ALL" setting has been turned on).
+1. Read sections IP Address and openHAB Primary Address below.
+2. Make sure the openHAB primary address is set to an address that is reachable from the NEEO Brain (see openHAB Primary Address section below).
+3. Make sure your firewall is not blocking access to the openHAB server
+4. Your search criteria has included too many openHAB devices (especially if "Expose ALL" setting has been turned on).
The NEEO brain has an (unknown) size limit to the amount of items that can be returned for a search and you may be going beyond that limit.
Narrow your search to a specific item to see if you were hitting that search limit.
1. SKIP BACKWARD should be changed to PREVIOUS.
2. SKIP FORWARD should be changed to NEXT.
-3. ENTER should be changed to CURSOR ENTER.
+3. ENTER should be changed to CURSOR ENTER.
4. Added support for 'specificname' (allowing you to override the name shown in NEEO).
5. Added support for HSBType channels (creates 4 channels: overall, hue, brightness and saturation).
6. Added NEEO Brain name to the Brain tab.
# Default is 'true'
#exposeNeeoBinding=true|false
-# The maximum number of search results to return to the brain for any given
-# search request.
-# Default is 10
+# The maximum number of search results to return to the brain for any given
+# search request.
+# Default is 10
#searchLimit=10
# The interval (in seconds) to check the status of the brain to determine if the
# brain is reachable or not
-# Default is 10
+# Default is 10
#checkStatusInterval=10
```
The openHAB Cloud service (and thus the connector to it) is useful for different use cases:
-* It allows remote access to local openHAB instances without having to expose ports to the Internet or to require a complex VPN setup.
-* It serves as a connector to Firebase Cloud Messaging (FCM) for pushing notifications to mobile phone apps.
-* It provides integrations with 3rd party services that require OAuth2 authentication, such as Amazon Alexa or Google Home applications.
+- It allows remote access to local openHAB instances without having to expose ports to the Internet or to require a complex VPN setup.
+- It serves as a connector to Firebase Cloud Messaging (FCM) for pushing notifications to mobile phone apps.
+- It provides integrations with 3rd party services that require OAuth2 authentication, such as Amazon Alexa or Google Home applications.
## Installation via UI
-* Open the openHAB web UI and login as an administrator.
-* Click on Add-on Store, followed by System Integrations.
-* Use the Install button to install the openHAB Cloud Connector.
-* Register your session (https://myopenhab.org/) using UUID and Secret.
+- Open the openHAB web UI and login as an administrator.
+- Click on Add-on Store, followed by System Integrations.
+- Use the Install button to install the openHAB Cloud Connector.
+- Register your session (https://myopenhab.org/) using UUID and Secret.
## UUID and Secret

-By default, both remote access and push notifications are enabled.
+By default, both remote access and push notifications are enabled.
### Advanced Configuration
Alternatively, you can configure the settings in the file `conf/services/openhabcloud.cfg`:
-```
+```ini
############################## openHAB Cloud Connector #############################
# The URL of the openHAB Cloud service to connect to.
# Optional, default is 'remote'.
#mode=
-# A comma-separated list of items to be exposed to external services like IFTTT.
+# A comma-separated list of items to be exposed to external services like IFTTT.
# Events of those items are pushed to the openHAB Cloud and commands received for
# these items from the openHAB Cloud service are accepted and sent to the local bus.
# Optional, default is an empty list.
- `sendNotification(emailAddress, message, icon, tag, title, referenceId, onClickAction, mediaAttachmentUrl, actionButton1, actionButton2, actionButton3)`
- `sendBroadcastNotification(message, icon, tag, title, referenceId, onClickAction, mediaAttachmentUrl, actionButton1, actionButton2, actionButton3)`
-
The additional parameter for these variants have the following meaning:
-- `tag` : A user supplied tag to group messages for removing using the `hideNotificationByTag` action or grouping messages when displayed in the app. This renames the `severity` parameter, both are functionally identical.
+
+- `tag` : A user supplied tag to group messages for removing using the `hideNotificationByTag` action or grouping messages when displayed in the app. This renames the `severity` parameter, both are functionally identical.
- `title`: The title of the notification. Defaults to "openHAB" inside the Android and iOS apps.
- `referenceId`: A user supplied id to both replace existing messages when pushed, and later remove messages with the `hideNotificationByReferenceId` actions.
- `onClickAction`: The action to be performed when the user clicks on the notification. Specified using the [action syntax](#action-syntax).
sendNotification("me@email.com", "Front door was opened!")
end
```
+
:::
::: tab JS
.withTitle('Motion Detected')
.withReferenceId('motion-id-1234')
.withMediaAttachment('https://apartment.my/camera-snapshot.jpg')
- .addActionButton('Turn on the light', 'command:Apartment_Light:ON')
+ .addActionButton('Turn on the light', 'command:Apartment_Light:ON')
.send();
}).build('Motion Detected Notification');
```
Features:
-* Writing/reading information to relational database systems
-* Configurable database table names
-* Automatic table creation
+- Writing/reading information to relational database systems
+- Configurable database table names
+- Automatic table creation
## Disclaimer
<!-- markdownlint-disable-next-line no-emphasis-as-heading -->
**Login to AWS web console**
-* [Sign up](https://aws.amazon.com/) for Amazon AWS.
-* Select the AWS region in the [AWS console](https://console.aws.amazon.com/) using [these instructions](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/getting-started.html#select-region). Note the region identifier in the URL (e.g. `https://eu-west-1.console.aws.amazon.com/console/home?region=eu-west-1` means that region id is `eu-west-1`).
+- [Sign up](https://aws.amazon.com/) for Amazon AWS.
+- Select the AWS region in the [AWS console](https://console.aws.amazon.com/) using [these instructions](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/getting-started.html#select-region). Note the region identifier in the URL (e.g. `https://eu-west-1.console.aws.amazon.com/console/home?region=eu-west-1` means that region id is `eu-west-1`).
<!-- markdownlint-disable-next-line no-emphasis-as-heading -->
**Create policy controlling permissions for AWS user**
5. Open _JSON_ tab and input the below policy code.
6. Make the below the changes to the policy JSON `Resource` section
-* Modify the AWS account id from `055251986555` to to the one you have on clipboard (see step 2 above)
-* If you are on some other region than `eu-west-1`, change the entry accordingly
-
+- Modify the AWS account id from `055251986555` to to the one you have on clipboard (see step 2 above)
+- If you are on some other region than `eu-west-1`, change the entry accordingly
```json
{
```
The `--add-opens` parameter is necessary also with the local temporary DynamoDB server, otherwise the mockito will fail at runtime with (`java.base does not "opens java.lang" to unnamed module`).
-
### For Developers
-* Clearly separated source files for the database-specific part of openHAB logic.
-* Code duplication by similar services is prevented.
-* Integrating a new SQL and JDBC enabled database is fairly simple.
+- Clearly separated source files for the database-specific part of openHAB logic.
+- Code duplication by similar services is prevented.
+- Integrating a new SQL and JDBC enabled database is fairly simple.
### Performance Tests
| postgresql | 8.147 | 7.072 | 6.895 | - | ext. Server VM |
| sqlite | 2.406 | 1.249 | 1.137 | 0.28 MB | local embedded |
-* Each test ran about 20 Times every 30 seconds.
-* openHAB 1.x has ready started for about a Minute.
-* the data in seconds for the evaluation are from the console output.
+- Each test ran about 20 Times every 30 seconds.
+- openHAB 1.x has ready started for about a Minute.
+- the data in seconds for the evaluation are from the console output.
Used a script like this:
-```
+```java
var count = 0;
rule "DB STRESS TEST"
when
- Time cron "30 * * * * ?"
+ Time cron "30 * * * * ?"
then
- if( count = 24) count = 0
- count = count+1
- if( count > 3 && count < 23){
- for( var i=500; i>1; i=i-1){
- postUpdate( NUMBERITEM, i)
- SWITCHITEM.previousState().state
- postUpdate( DIMMERITEM, OFF)
- NUMBERITEM.changedSince( now().minusMinutes(1))
- postUpdate( DIMMERITEM, ON)
- }
- }
+ if( count = 24) count = 0
+ count = count+1
+ if( count > 3 && count < 23){
+ for( var i=500; i>1; i=i-1){
+ postUpdate( NUMBERITEM, i)
+ SWITCHITEM.previousState().state
+ postUpdate( DIMMERITEM, OFF)
+ NUMBERITEM.changedSince( now().minusMinutes(1))
+ postUpdate( DIMMERITEM, ON)
+ }
+ }
end
```
The [rrd4j](https://github.com/rrd4j/rrd4j) persistence service is based on a round-robin database.
In contrast to a "normal" database such as db4o, a round-robin database does not grow in size - it has a fixed allocated size.
-This is accomplished by saving a fixed amount of datapoints and by doing data compression, which means that the older the data is, the less values are available.
+This is accomplished by saving a fixed amount of datapoints and by doing data compression, which means that the older the data is, the less values are available.
The data is kept in several "archives", each holding the data for its set timeframe at a defined level of granularity.
The starting point for all archives is the actually saved data sample (Item value).
So while you might store a sample value every minute for the last 8 hours, you might store the average per day for the last year.
It must be a positive integer value.
-Relation between the sample intervall and openHABs persistence strategy.
+Relation between the sample intervall and openHABs persistence strategy.
The persistence strategy determines on which events (time, change, startUp) a new value is provided to the persistence service, the sample intervall determines at which time steps the actually provided value is being read (i.e an everyMinute strategy provides a new value at every full minute, a sample intervall of 10 seconds would use such a provided value 6 times).
### `<consolidationFunction>` (Consolidation Function)
#### default_numeric
-This datasource is used for plain `Number` items.
+This datasource is used for plain `Number` items.
It does not build averages over values, so that it is ensured that discrete values are kept when being read (e.g. an Item which has only states 0 and 1 will not be set to 0.5).
```
```
**IMPORTANT:**
-When creating a custom datasource in the `rrd4j.cfg` file the used [sample interval](#sampleinterval-sample-interval) should be 20 seconds or less in order to keep the granularity. The selection of the used strategy has no effect on the granularity.
+When creating a custom datasource in the `rrd4j.cfg` file the used [sample interval](#sampleinterval-sample-interval) should be 20 seconds or less in order to keep the granularity. The selection of the used strategy has no effect on the granularity.
## Troubleshooting
# Binary To JSON Transformation Service
-Transforms the input by Java Binary Block Parser syntax.
+Transforms the input by Java Binary Block Parser syntax.
See details about syntax from [JBBP homepage](https://github.com/raydac/java-binary-block-parser)
-
+
## Example
Let's assume we have received string containing bytes in hexa string format `03FAFF` and we want to convert binary data to JSON format. Binary data contains 3 bytes and strict data format is following `byte a; byte b; ubyte c;`.
#### Item
This will replace the visible label in the UI with the transformation you apply with the command <TransformProgram>.
-
+
```java
String yourItem "Some info [EXEC(/absolute/path/to/your/<TransformProgram> %s):%s]"
```
Item YourTriggeringItem changed
then
var formatted = transform("EXEC","/absolute/path/to/your/<TransformProgram>", YourTriggeringItem.state.toString)
- yourFormattedItem.sendCommand(formatted.toString)
+ yourFormattedItem.sendCommand(formatted.toString)
end
```
## Further Reading
-* [Manual](http://man7.org/linux/man-pages/man1/date.1.html) and [tutorial](https://linode.com/docs/tools-reference/tools/use-the-date-command-in-linux/) for date.
-* [Manual](http://man7.org/linux/man-pages/man1/numfmt.1.html) and [tutorial](https://www.pixelbeat.org/docs/numfmt.html) for numfmt.
+- [Manual](http://man7.org/linux/man-pages/man1/date.1.html) and [tutorial](https://linode.com/docs/tools-reference/tools/use-the-date-command-in-linux/) for date.
+- [Manual](http://man7.org/linux/man-pages/man1/numfmt.1.html) and [tutorial](https://www.pixelbeat.org/docs/numfmt.html) for numfmt.
# Jinja Transformation Service
-Transforms a value using a jinja template.
+Transforms a value using a jinja template.
The main purpose of this transformer is the use in the home assistant discovery. Therfore not all features of the home assistant templating are supported.
Basically on [Processing incoming data](https://www.home-assistant.io/docs/configuration/templating/#processing-incoming-data)
## Further Reading
-* Wikipedia on [Jinja](https://en.wikipedia.org/wiki/Jinja_(template_engine).
-* Home assistant [discovery](https://www.home-assistant.io/docs/mqtt/discovery/).
-* Home assistant [templating](https://www.home-assistant.io/docs/configuration/templating/).
+- Wikipedia on [Jinja](https://en.wikipedia.org/wiki/Jinja_(template_engine).
+- Home assistant [discovery](https://www.home-assistant.io/docs/mqtt/discovery/).
+- Home assistant [templating](https://www.home-assistant.io/docs/configuration/templating/).
## Further Reading
-* An extended [introduction](https://www.w3schools.com/js/js_json_intro.asp) can be found at W3School.
-* As JsonPath transformation is based on [Jayway](https://github.com/json-path/JsonPath), using an [online validator](https://jsonpath.herokuapp.com/) which also uses Jayway will give the most similar results.
+- An extended [introduction](https://www.w3schools.com/js/js_json_intro.asp) can be found at W3School.
+- As JsonPath transformation is based on [Jayway](https://github.com/json-path/JsonPath), using an [online validator](https://jsonpath.herokuapp.com/) which also uses Jayway will give the most similar results.
### Not A Number
-Scale transform is designed to work with numeric or quantity states. When the value presented to scale transform does not match this (most of the time with NULL or UNDEF states) it will not be handled and a warning is raised in the openhab.log . This case can be smoothly avoided with a
+Scale transform is designed to work with numeric or quantity states. When the value presented to scale transform does not match this (most of the time with NULL or UNDEF states) it will not be handled and a warning is raised in the openhab.log . This case can be smoothly avoided with a
`NaN=Non Numeric State presented`
`format=%label% (%value%) !`
-Where :
+Where :
-- `%label%` will be replaced by transformed value and
+- `%label%` will be replaced by transformed value and
- `%value%` is the numeric value presen
## Example
### Basic Example
-Given a retrieved XML
+Given a retrieved XML
**Input XML**
There are two ways to address the namespace.
-* Simple path which may not work in complex XML.
-* With full qualified path.
+- Simple path which may not work in complex XML.
+- With full qualified path.
The XPath
-* `[name()='PTZStatus']/*[name()='AbsoluteHigh']/*[name()='azimuth']/`
-* `/*[local-name()='PTZStatus' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']/*[local-name()='AbsoluteHigh' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']/*[local-name()='azimuth' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']`
+- `[name()='PTZStatus']/*[name()='AbsoluteHigh']/*[name()='azimuth']/`
+- `/*[local-name()='PTZStatus' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']/*[local-name()='AbsoluteHigh' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']/*[local-name()='azimuth' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']`
-returns
+returns
```
<azimuth>450</azimuth>
### In Setup
-**.items**
+#### .items
-```csv
+```java
String Temperature_xml "Temperature [XPATH(/*[name()='PTZStatus']/*[name()='AbsoluteHigh']/*[name()='azimuth']/):%s °C]" {...}
Number Temperature "Temperature [%.1f °C]"
```
-**.rules**
+### .rules
```php
rule "Convert XML to Item Type Number"
val mytest = transform("XPATH", "/*[name()='PTZStatus']
/*[name()='AbsoluteHigh']
/*[name()='azimuth']
- /text()",
- Temperature_xml.state.toString )
+ /text()",
+ Temperature_xml.state.toString )
// Fully qualified
val mytest = transform("XPATH", "/*[local-name()='PTZStatus' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']
/*[local-name()='AbsoluteHigh' and namespace-uri()='http://www.hikvision.com/ver20/XMLSchema']
## Further Reading
-* An [introduction](https://www.w3schools.com/xml/xpath_intro.asp) to XPath at W3School
-* An 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.
+- An [introduction](https://www.w3schools.com/xml/xpath_intro.asp) to XPath at W3School
+- An 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.
XSLT is a standard method to transform an XML structure from one document into a new document with a different structure.
-The transformation expects the rule to be read from a file which is stored under the `transform` folder.
+The transformation expects the rule to be read from a file which is stored under the `transform` folder.
To organize the various transformations one should use subfolders.
General transformation rule summary:
-* The directive `xsl:output` defines how the output document should be structured.
-* The directive `xsl:template` specifies matching attributes for the XML node to find.
-* The `xsl:template` tag contains the rule which specifies what should be done.
+- The directive `xsl:output` defines how the output document should be structured.
+- The directive `xsl:template` specifies matching attributes for the XML node to find.
+- The `xsl:template` tag contains the rule which specifies what should be done.
The Rule uses XPath to gather the XML node information.
For more information have a look at the [XPath transformation](https://docs.openhab.org/addons/transformations/xpath/readme.html) .
**transform/helloworld.xsl**
-* `xsl:output`: transform incoming document into another XML-like document, without indentation.
-* `xsl:template`: `match="/"` "any type of node", so the whole document.
-* The `xsl` rule does `select` the node `/root/node` and extracts the `value-of` attribute `val`.
+- `xsl:output`: transform incoming document into another XML-like document, without indentation.
+- `xsl:template`: `match="/"` "any type of node", so the whole document.
+- The `xsl` rule does `select` the node `/root/node` and extracts the `value-of` attribute `val`.
```xml
<?xml version='1.0' encoding='UTF-8'?>
**input XML**
-* The tag `<PTZStatus>` contains an attribute `xmlns=` which defines the namespace `http://www.hikvision.com/ver20/XMLSchema`.
+- The tag `<PTZStatus>` contains an attribute `xmlns=` which defines the namespace `http://www.hikvision.com/ver20/XMLSchema`.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<PTZStatus version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
- <AbsoluteHigh>
- <elevation>0</elevation>
- <azimuth date="Fri, 18 Dec 2009 9:38 am PST" >450</azimuth>
- <absoluteZoom>10</absoluteZoom>
- </AbsoluteHigh>
+ <AbsoluteHigh>
+ <elevation>0</elevation>
+ <azimuth date="Fri, 18 Dec 2009 9:38 am PST" >450</azimuth>
+ <absoluteZoom>10</absoluteZoom>
+ </AbsoluteHigh>
</PTZStatus>
```
**transform/azimut.xsl**
-In the rule, the tag `<xsl:stylesheet>` has to have an attribute `xmlns:xsl="http://www.w3.org/1999/XSL/Transform"` and a second attribute `xmlns:`.
+In the rule, the tag `<xsl:stylesheet>` has to have an attribute `xmlns:xsl="http://www.w3.org/1999/XSL/Transform"` and a second attribute `xmlns:`.
This attribute has to be the same as the namespace for the input document.
In the rule each step traversed along the path to the next tag has to be prepended with the `xmlns` namespace, here defined as `h`.
-* `xsl:output` transform incoming document into another XML-like document, no indentation, **without XML**.
-* `xsl:template`: `match="/"` whole document.
-* Full path to node `azimuth` reading out `date` attribute.
-* Add a linebreak by setting ` ` as text.
-* Search for node `azimuth` by prepending `//` and get the `text`.
+- `xsl:output` transform incoming document into another XML-like document, no indentation, **without XML**.
+- `xsl:template`: `match="/"` whole document.
+- Full path to node `azimuth` reading out `date` attribute.
+- Add a linebreak by setting ` ` as text.
+- Search for node `azimuth` by prepending `//` and get the `text`.
```xml
<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="2.0"
+<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.hikvision.com/ver20/XMLSchema">
<xsl:output method="xml" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />
## Further Reading
-* Extended introduction and more [examples](https://en.wikipedia.org/wiki/XSLT#XSLT_examples) at Wikipedia.
-* A good [introduction](https://www.w3schools.com/xml/xsl_intro.asp) and [tutorial](https://www.w3schools.com/xml/xsl_transformation.asp) at W3School.
-* An informative [tutorial](https://www.ibm.com/developerworks/library/x-xsltmistakes/) of common mistakes.
-* Online XSL transformer tools like [this](https://www.freeformatter.com/xsl-transformer.html) to check the syntax.
+- Extended introduction and more [examples](https://en.wikipedia.org/wiki/XSLT#XSLT_examples) at Wikipedia.
+- A good [introduction](https://www.w3schools.com/xml/xsl_intro.asp) and [tutorial](https://www.w3schools.com/xml/xsl_transformation.asp) at W3School.
+- An informative [tutorial](https://www.ibm.com/developerworks/library/x-xsltmistakes/) of common mistakes.
+- Online XSL transformer tools like [this](https://www.freeformatter.com/xsl-transformer.html) to check the syntax.
# Google Cloud Speech-to-Text
-Google Cloud STT Service uses the non-free Google Cloud Speech-to-Text API to transcript audio data to text.
+Google Cloud STT Service uses the non-free Google Cloud Speech-to-Text API to transcript audio data to text.
Be aware, that using this service may incur cost on your Google Cloud account.
You can find pricing information on the [documentation page](https://cloud.google.com/speech-to-text#section-12).
Before you can integrate this service with your Google Cloud Speech-to-Text, you must have a Google API Console project:
-* Select or create a GCP project. [link](https://console.cloud.google.com/cloud-resource-manager)
-* Make sure that billing is enabled for your project. [link](https://cloud.google.com/billing/docs/how-to/modify-project)
-* Enable the Cloud Speech-to-Text API. [link](https://console.cloud.google.com/apis/dashboard)
-* Set up authentication:
- * Go to the "APIs & Services" -> "Credentials" page in the GCP Console and your project. [link](https://console.cloud.google.com/apis/credentials)
- * From the "Create credentials" drop-down list, select "OAuth client ID".
- * Select application type "Web application" and enter a name into the "Name" field.
- * Add "https://www.google.com" to the "Authorized redirect URIs".
- * Click Create. A pop-up appears, showing your "client ID" and "client secret".
+- Select or create a GCP project. [link](https://console.cloud.google.com/cloud-resource-manager)
+- Make sure that billing is enabled for your project. [link](https://cloud.google.com/billing/docs/how-to/modify-project)
+- Enable the Cloud Speech-to-Text API. [link](https://console.cloud.google.com/apis/dashboard)
+- Set up authentication:
+ - Go to the "APIs & Services" -> "Credentials" page in the GCP Console and your project. [link](https://console.cloud.google.com/apis/credentials)
+ - From the "Create credentials" drop-down list, select "OAuth client ID".
+ - Select application type "Web application" and enter a name into the "Name" field.
+ - Add "https://www.google.com" to the "Authorized redirect URIs".
+ - Click Create. A pop-up appears, showing your "client ID" and "client secret".
## Configuration
Using your favorite configuration UI to edit **Settings / Other Services - Google Cloud Speech-to-Text** and set:
-* **Client Id** - Google Cloud Platform OAuth 2.0-Client Id.
-* **Client Secret** - Google Cloud Platform OAuth 2.0-Client Secret.
-* **Authorization Code** - This code is used once for retrieving the Google Cloud Platform access and refresh tokens.
+- **Client Id** - Google Cloud Platform OAuth 2.0-Client Id.
+- **Client Secret** - Google Cloud Platform OAuth 2.0-Client Secret.
+- **Authorization Code** - This code is used once for retrieving the Google Cloud Platform access and refresh tokens.
**Please go to your browser ...**
[https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/cloud-platform&access_type=offline&prompt=consent&include_granted_scopes=true&response_type=code&redirect_uri=https://www.google.com&client_id=<clientId>](https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/cloud-platform&access_type=offline&prompt=consent&include_granted_scopes=true&response_type=code&redirect_uri=https://www.google.com&client_id=<clientId>) (replace `<clientId>` by your Client Id)
**... to generate an authorization code and paste it here**.
Using your favorite configuration UI to edit **Settings / Other Services - Google Cloud Speech-to-Text**:
-* **Single Utterance Mode** - When enabled Google Cloud Platform is responsible for detecting when to stop listening after a single utterance. (Recommended)
-* **Max Transcription Seconds** - Max seconds to wait to force stop the transcription.
-* **Max Silence Seconds** - Only works when singleUtteranceMode is disabled, max seconds without getting new transcriptions to stop listening.
-* **Refresh Supported Locales** - Try loading supported locales from the documentation page.
+- **Single Utterance Mode** - When enabled Google Cloud Platform is responsible for detecting when to stop listening after a single utterance. (Recommended)
+- **Max Transcription Seconds** - Max seconds to wait to force stop the transcription.
+- **Max Silence Seconds** - Only works when singleUtteranceMode is disabled, max seconds without getting new transcriptions to stop listening.
+- **Refresh Supported Locales** - Try loading supported locales from the documentation page.
### Messages Configuration
Using your favorite configuration UI to edit **Settings / Other Services - Google Cloud Speech-to-Text**:
-* **No Results Message** - Message to be told when no results. (Empty for disabled)
-* **Error Message** - Message to be told when an error has happened. (Empty for disabled)
+- **No Results Message** - Message to be told when no results. (Empty for disabled)
+- **Error Message** - Message to be told when an error has happened. (Empty for disabled)
### Configuration via a text file
Its contents should look similar to:
-```
+```ini
org.openhab.voice.googlestt:clientId=ID
org.openhab.voice.googlestt:clientSecret=SECRET
org.openhab.voice.googlestt:authcode=XXXXX
You can setup your preferred default Speech-to-Text in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Google Cloud** as **Speech-to-Text**.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Google Cloud** as **Speech-to-Text**.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultSTT=googlestt
```
# Google Cloud Text-to-Speech
-Google Cloud TTS Service uses the non-free Google Cloud Text-to-Speech API to convert text or Speech Synthesis Markup Language (SSML) input into audio data of natural human speech.
-It provides multiple voices, available in different languages and variants and applies DeepMind’s groundbreaking research in WaveNet and Google’s powerful neural networks.
+Google Cloud TTS Service uses the non-free Google Cloud Text-to-Speech API to convert text or Speech Synthesis Markup Language (SSML) input into audio data of natural human speech.
+It provides multiple voices, available in different languages and variants and applies DeepMind’s groundbreaking research in WaveNet and Google’s powerful neural networks.
The Google Cloud TTS service uses the openHAB TTS cache to cache audio files produced from the most recent queries in order to reduce traffic, improve performance and reduce number of requests.
Be aware, that using this service may incur cost on your Google Cloud account.
You can find pricing information on the [documentation page](https://cloud.google.com/text-to-speech/#pricing-summary).
<!-- MarkdownTOC -->
-* [Obtaining Credentials](#obtaining-credentials)
-* [Configuration](#configuration)
-* [Voice Configuration](#default-text-to-speech-and-voice-configuration)
+- [Obtaining Credentials](#obtaining-credentials)
+- [Configuration](#configuration)
+- [Voice Configuration](#default-text-to-speech-and-voice-configuration)
<!-- /MarkdownTOC -->
Using your favorite configuration UI to edit **Settings / Other Services - Google Cloud Text-to-Speech** and set:
-* **Client Id** - Google Cloud Platform OAuth 2.0-Client Id.
-* **Client Secret** - Google Cloud Platform OAuth 2.0-Client Secret.
-* **Authorization Code** - This code is used once for retrieving the Google Cloud Platform access and refresh tokens.
+- **Client Id** - Google Cloud Platform OAuth 2.0-Client Id.
+- **Client Secret** - Google Cloud Platform OAuth 2.0-Client Secret.
+- **Authorization Code** - This code is used once for retrieving the Google Cloud Platform access and refresh tokens.
1. Go to `OAuth consent screen` ([link](https://console.cloud.google.com/apis/credentials/consent)) and set the `publishing status` to `production` to activate the created project.
2. Wait a few minutes. The step before takes some time to go live. Sometimes it is necessary to wait a few hours, so you can try after some minutes, if it doesn't work, try again the next day.
3. Go to your browser and access the following URL to generate an authorization code
[https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/cloud-platform&access_type=offline&prompt=consent&include_granted_scopes=true&response_type=code&redirect_uri=https://www.google.com&client_id=<clientId>](https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/cloud-platform&access_type=offline&prompt=consent&include_granted_scopes=true&response_type=code&redirect_uri=https://www.google.com&client_id=CLIENTID) (replace `CLIENTID` at the end by your Client Id)
4. After your browser has been redirected to https://www.google.com, the authorization code will be set in the browser URL as value of the "code" URL query parameter (e.g. `https://www.google.com/?code=XXXXXXXXXX&scope=https://www.googleapis.com/auth/cloud-platform` --> `XXXXXXXXXX`)
5. After initial authorization, this code is not needed anymore. It is recommended to clear this configuration parameter afterwards.
-* **Pitch** - The pitch of selected voice, up to 20 semitones.
-* **Volume Gain** - The volume of the output between 16dB and -96dB.
-* **Speaking Rate** - The speaking rate can be 4x faster or slower than the normal rate.
+- **Pitch** - The pitch of selected voice, up to 20 semitones.
+- **Volume Gain** - The volume of the output between 16dB and -96dB.
+- **Speaking Rate** - The speaking rate can be 4x faster or slower than the normal rate.
In case you would like to setup the service via a text file, create a new file in `$OPENHAB_ROOT/conf/services` named `googletts.cfg`
Its contents should look similar to:
-```
+```ini
org.openhab.voice.googletts:clientId=ID
org.openhab.voice.googletts:clientSecret=SECRET
org.openhab.voice.googletts:authcode=XXXXX
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Google Cloud** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Google Cloud** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=googletts
org.openhab.voice:defaultVoice=googletts:XXX
```
+
You can see the available voices by entering `voice voices` in the karaf console
+
```shell
openhab> voice voices
...
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **macOS TTS** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **macOS TTS** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=mactts
org.openhab.voice:defaultVoice=mactts:Alex
```
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **MaryTTS** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **MaryTTS** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=marytts
org.openhab.voice:defaultVoice=marytts:cmuslthsmm
```
## Caching
The MaryTTS service uses the openHAB TTS cache to cache audio files produced from the most recent queries in order to reduce traffic, improve performance and reduce number of requests.
-
Using your favorite configuration UI to edit **Settings / Other Services - Mimic Text-to-Speech** and set:
-* **url** - Mimic URL. Default to `http://localhost:59125`
-* **speakingRate** - Controls how fast the voice speaks the text. A value of 1 is the speed of the training dataset. Less than 1 is faster, and more than 1 is slower.
-* **audioVolatility** - The amount of noise added to the generated audio (0-1). Can help mask audio artifacts from the voice model. Multi-speaker models tend to sound better with a lower amount of noise than single speaker models.
-* **phonemeVolatility** - The amount of noise used to generate phoneme durations (0-1). Allows for variable speaking cadance, with a value closer to 1 being more variable. Multi-speaker models tend to sound better with a lower amount of phoneme variability than single speaker models.
+- **url** - Mimic URL. Default to `http://localhost:59125`
+- **speakingRate** - Controls how fast the voice speaks the text. A value of 1 is the speed of the training dataset. Less than 1 is faster, and more than 1 is slower.
+- **audioVolatility** - The amount of noise added to the generated audio (0-1). Can help mask audio artifacts from the voice model. Multi-speaker models tend to sound better with a lower amount of noise than single speaker models.
+- **phonemeVolatility** - The amount of noise used to generate phoneme durations (0-1). Allows for variable speaking cadance, with a value closer to 1 being more variable. Multi-speaker models tend to sound better with a lower amount of phoneme variability than single speaker models.
In case you would like to setup the service via a text file, create a new file in `$OPENHAB_ROOT/conf/services` named `mimictts.cfg`
Its contents should look similar to:
-```
+```ini
org.openhab.voice.mimictts:url=http://localhost:59125
org.openhab.voice.mimictts:speakingRate=1
org.openhab.voice.mimictts:audioVolatility=0.667
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Mimic** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Mimic** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=mimictts
org.openhab.voice:defaultVoice=mimictts:fr_FR_siwis_low
```
You manually need to install the pico2wave binary in order for this service to work correctly. You can,
e.g., install it with apt-get on an Ubuntu system:
-```
+```bash
sudo apt-get install libttspico-utils
```
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **PicoTTS** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **PicoTTS** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=picotts
org.openhab.voice:defaultVoice=picotts:frFR
```
The add-on is compatible with the following platforms:
-* linux (armv7l, aarch64, x86_64, min GLIBC version 2.31)
-* macOS (x86_64 min version 11.0, aarch64 min version 13.0)
-* win64 (x86_64 min version Windows 10).
+- linux (armv7l, aarch64, x86_64, min GLIBC version 2.31)
+- macOS (x86_64 min version 11.0, aarch64 min version 13.0)
+- win64 (x86_64 min version Windows 10).
## Configuration
Use your favorite configuration UI to edit **Settings / Other Services - Piper Text-to-Speech**:
-* **Preload model** - Keep last voice model used loaded in memory, these way it can be reused on next execution if the voice option matches.
+- **Preload model** - Keep last voice model used loaded in memory, these way it can be reused on next execution if the voice option matches.
### Configuration via a text file
You can setup your preferred default Speech-to-Text in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Piper** as **Text-to-Speech**.
-* Set your **Default Voice**.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Piper** as **Text-to-Speech**.
+- Set your **Default Voice**.
In case you would like to set up these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
## Obtaining Credentials
-* Sign up for Amazon Web Services (AWS). [link](https://portal.aws.amazon.com/billing/signup)
+- Sign up for Amazon Web Services (AWS). [link](https://portal.aws.amazon.com/billing/signup)
-When you sign up for AWS, your account is automatically signed up for all services in AWS, including Amazon Polly.
+When you sign up for AWS, your account is automatically signed up for all services in AWS, including Amazon Polly.
-* Create an IAM User. [link](https://docs.aws.amazon.com/polly/latest/dg/setting-up.html)
+- Create an IAM User. [link](https://docs.aws.amazon.com/polly/latest/dg/setting-up.html)
Services in AWS, such as Amazon Polly, require that you provide credentials when you access them so that the service can determine whether you have permissions to access the resources owned by that service.
Within the AWS console, you can create access keys for your AWS account to access the Polly API.
The following settings can be edited in UI (**Settings / Other Services - Polly Text-to-Speech**):
-* **Access Key** - The AWS credentials access key (required).
-* **Secret Key** - The AWS credentials secret key (required).
-* **Service Region** - The service region used for accessing Polly (required). To reduce latency select the region closest to you. E.g. "eu-west-1" (see [regions](https://docs.aws.amazon.com/general/latest/gr/rande.html#pol_region))
-* **Audio Format** - Allows for overriding the system default audio format.
-
+- **Access Key** - The AWS credentials access key (required).
+- **Secret Key** - The AWS credentials secret key (required).
+- **Service Region** - The service region used for accessing Polly (required). To reduce latency select the region closest to you. E.g. "eu-west-1" (see [regions](https://docs.aws.amazon.com/general/latest/gr/rande.html#pol_region))
+- **Audio Format** - Allows for overriding the system default audio format.
+
Use "default" to select the system default audio format.
The default audio format can be overriden with the value "mp3" or "ogg".
Its contents should look similar to:
-```
+```ini
org.openhab.voice.pollytts:accessKey=ACCESS_KEY
org.openhab.voice.pollytts:secretKey=SECRET_KEY
org.openhab.voice.pollytts:serviceRegion=eu-west-1
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **PollyTTS** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **PollyTTS** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultTTS=pollytts
org.openhab.voice:defaultVoice=pollytts:Joanne
```
## Rule Examples
-```
-say("Hello there")
-say("Hello there", "pollytts:Joanne", "enhancedjavasound")
-say("" + item.state, "pollytts:Joey", "enhancedjavasound")
-say("<speak>Children, come to dinner <prosody volume='x-loud'>Right now!</prosody></speak>")
+```java
+say("Hello there")
+say("Hello there", "pollytts:Joanne", "enhancedjavasound")
+say("" + item.state, "pollytts:Joey", "enhancedjavasound")
+say("<speak>Children, come to dinner <prosody volume='x-loud'>Right now!</prosody></speak>")
```
## Magic Word Configuration
-The magic word to spot is gathered from your 'Voice' configuration.
+The magic word to spot is gathered from your 'Voice' configuration.
You can generate your own wakeword files using the [command line utility](https://github.com/GiviMAD/rustpotter-cli).
The following settings can be edited in UI (**Settings / Other Services - VoiceRSS Text-to-Speech**):
-* **VoiceRSS API Key** - The API Key to get access to https://www.voicerss.org.
+- **VoiceRSS API Key** - The API Key to get access to https://www.voicerss.org.
In case you would like to setup the service via a text file, create a new file in `$OPENHAB_ROOT/conf/services` named `voicerss.cfg`
Its contents should look similar to:
-```
+```ini
org.openhab.voice.voicerss:apiKey=1234567890
```
It supports the following voices (depending on language):
-* Oda (Arabic - Egypt)
-* Salim (Arabic - Saudi Arabia)
-* Dimo (Bulgarian)
-* Rut (Catalan)
-* Luli (Chinese - China)
-* Shu (Chinese - China)
-* Chow (Chinese - China)
-* Wang (Chinese - China)
-* Jia (Chinese - Hong Kong)
-* Xia (Chinese - Hong Kong)
-* Chen (Chinese - Hong Kong)
-* Akemi (Chinese - Taiwan)
-* Lin (Chinese - Taiwan)
-* Lee (Chinese - Taiwan)
-* Nikola (Croatian)
-* Josef (Czech)
-* Freja (Danish)
-* Daan (Dutch - Belgium)
-* Lotte (Dutch - Netherlands)
-* Bram (Dutch - Netherlands)
-* Zoe (English - Australia)
-* Isla (English - Australia)
-* Evie (English - Australia)
-* Jack (English - Australia)
-* Rose (English - Canada)
-* Clara (English - Canada)
-* Emma (English - Canada)
-* Mason (English - Canada)
-* Alice (English - Great Britain)
-* Nancy (English - Great Britain)
-* Lily (English - Great Britain)
-* Harry (English - Great Britain)
-* Eka (English - India)
-* Jai (English - India)
-* Ajit (English - India)
-* Oran (English - Ireland)
-* Linda (English - United States)
-* Amy (English - United States)
-* Mary (English - United States)
-* John (English - United States)
-* Mike (English - United States)
-* Aada (Finnish)
-* Emile (French - Canada)
-* Olivia (French - Canada)
-* Logan (French - Canada)
-* Felix (French - Canada)
-* Bette (French - France)
-* Iva (French - France)
-* Zola (French - France)
-* Axel (French - France)
-* Theo (French - Switzerland)
-* Lukas (German - Austria)
-* Hanna (German - Germany)
-* Lina (German - Germany)
-* Jonas (German - Germany)
-* Tim (German - Switzerland)
-* Neo (Greek)
-* Rami (Hebrew)
-* Puja (Hindi)
-* Kabir (Hindi)
-* Mate (Hungarian)
-* Intan (Indonesian)
-* Bria (Italian)
-* Mia (Italian)
-* Pietro (Italian)
-* Hina (Japanese)
-* Airi (Japanese)
-* Fumi (Japanese)
-* Akira (Japanese)
-* Nari (Korean)
-* Aqil (Malay)
-* Marte (Norwegian)
-* Erik (Norwegian)
-* Julia (Polish)
-* Jan (Polish)
-* Marcia (Portuguese - Brazil)
-* Ligia (Portuguese - Brazil)
-* Yara (Portuguese - Brazil)
-* Dinis (Portuguese - Brazil)
-* Leonor (Portuguese - Portugal)
-* Doru (Romanian)
-* Olga (Russian)
-* Marina (Russian)
-* Peter (Russian)
-* Beda (Slovak)
-* Vid (Slovenian)
-* Juana (Spanish - Mexico)
-* Silvia (Spanish - Mexico)
-* Teresa (Spanish - Mexico)
-* Jose (Spanish - Mexico)
-* Camila (Spanish - Spain)
-* Sofia (Spanish - Spain)
-* Luna (Spanish - Spain)
-* Diego (Spanish - Spain)
-* Molly (Swedish)
-* Hugo (Swedish)
-* Sai (Tamil)
-* Ukrit (Thai)
-* Omer (Turkish)
-* Chi (Vietnamese)
+- Oda (Arabic - Egypt)
+- Salim (Arabic - Saudi Arabia)
+- Dimo (Bulgarian)
+- Rut (Catalan)
+- Luli (Chinese - China)
+- Shu (Chinese - China)
+- Chow (Chinese - China)
+- Wang (Chinese - China)
+- Jia (Chinese - Hong Kong)
+- Xia (Chinese - Hong Kong)
+- Chen (Chinese - Hong Kong)
+- Akemi (Chinese - Taiwan)
+- Lin (Chinese - Taiwan)
+- Lee (Chinese - Taiwan)
+- Nikola (Croatian)
+- Josef (Czech)
+- Freja (Danish)
+- Daan (Dutch - Belgium)
+- Lotte (Dutch - Netherlands)
+- Bram (Dutch - Netherlands)
+- Zoe (English - Australia)
+- Isla (English - Australia)
+- Evie (English - Australia)
+- Jack (English - Australia)
+- Rose (English - Canada)
+- Clara (English - Canada)
+- Emma (English - Canada)
+- Mason (English - Canada)
+- Alice (English - Great Britain)
+- Nancy (English - Great Britain)
+- Lily (English - Great Britain)
+- Harry (English - Great Britain)
+- Eka (English - India)
+- Jai (English - India)
+- Ajit (English - India)
+- Oran (English - Ireland)
+- Linda (English - United States)
+- Amy (English - United States)
+- Mary (English - United States)
+- John (English - United States)
+- Mike (English - United States)
+- Aada (Finnish)
+- Emile (French - Canada)
+- Olivia (French - Canada)
+- Logan (French - Canada)
+- Felix (French - Canada)
+- Bette (French - France)
+- Iva (French - France)
+- Zola (French - France)
+- Axel (French - France)
+- Theo (French - Switzerland)
+- Lukas (German - Austria)
+- Hanna (German - Germany)
+- Lina (German - Germany)
+- Jonas (German - Germany)
+- Tim (German - Switzerland)
+- Neo (Greek)
+- Rami (Hebrew)
+- Puja (Hindi)
+- Kabir (Hindi)
+- Mate (Hungarian)
+- Intan (Indonesian)
+- Bria (Italian)
+- Mia (Italian)
+- Pietro (Italian)
+- Hina (Japanese)
+- Airi (Japanese)
+- Fumi (Japanese)
+- Akira (Japanese)
+- Nari (Korean)
+- Aqil (Malay)
+- Marte (Norwegian)
+- Erik (Norwegian)
+- Julia (Polish)
+- Jan (Polish)
+- Marcia (Portuguese - Brazil)
+- Ligia (Portuguese - Brazil)
+- Yara (Portuguese - Brazil)
+- Dinis (Portuguese - Brazil)
+- Leonor (Portuguese - Portugal)
+- Doru (Romanian)
+- Olga (Russian)
+- Marina (Russian)
+- Peter (Russian)
+- Beda (Slovak)
+- Vid (Slovenian)
+- Juana (Spanish - Mexico)
+- Silvia (Spanish - Mexico)
+- Teresa (Spanish - Mexico)
+- Jose (Spanish - Mexico)
+- Camila (Spanish - Spain)
+- Sofia (Spanish - Spain)
+- Luna (Spanish - Spain)
+- Diego (Spanish - Spain)
+- Molly (Swedish)
+- Hugo (Swedish)
+- Sai (Tamil)
+- Ukrit (Thai)
+- Omer (Turkish)
+- Chi (Vietnamese)
### Default Text-to-Speech and Voice Configuration
You can setup your preferred default Text-to-Speech and default voice in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **VoiceRSS** as **Default Text-to-Speech**.
-* Choose your preferred **Default Voice** for your setup.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **VoiceRSS** as **Default Text-to-Speech**.
+- Choose your preferred **Default Voice** for your setup.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
This add-on uses an underling binary to work.
The following platforms are supported:
-* linux-aarch64
-* linux-armv7l
-* linux-x86_64
-* osx
-* win64
+- linux-aarch64
+- linux-armv7l
+- linux-x86_64
+- osx
+- win64
**On Linux this binary requires the package libatomic to be installed (apt install libatomic1).**
Use your favorite configuration UI to edit **Settings / Other Services - Vosk Speech-to-Text**:
-* **Preload Model** - Keep language model loaded.
-* **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
-* **Max Transcription Seconds** - Max seconds to wait to force stop the transcription.
-* **Max Silence Seconds** - Only works when singleUtteranceMode is disabled, max seconds without getting new transcriptions to stop listening.
+- **Preload Model** - Keep language model loaded.
+- **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
+- **Max Transcription Seconds** - Max seconds to wait to force stop the transcription.
+- **Max Silence Seconds** - Only works when singleUtteranceMode is disabled, max seconds without getting new transcriptions to stop listening.
### Messages Configuration
Use your favorite configuration UI to edit **Settings / Other Services - Vosk Speech-to-Text**:
-* **No Results Message** - Message to be told when no results.
-* **Error Message** - Message to be told when an error has happened.
+- **No Results Message** - Message to be told when no results.
+- **Error Message** - Message to be told when an error has happened.
### Configuration via a text file
You can setup your preferred default Speech-to-Text in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Vosk** as **Speech-to-Text**.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Vosk** as **Speech-to-Text**.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultSTT=voskstt
```
# IBM Watson Speech-to-Text
-Watson STT Service uses the non-free IBM Watson Speech-to-Text API to transcript audio data to text.
+Watson STT Service uses the non-free IBM Watson Speech-to-Text API to transcript audio data to text.
Be aware that using this service may incur cost on your IBM account.
You can find pricing information on [this page](https://www.ibm.com/cloud/watson-speech-to-text/pricing).
## Obtaining Credentials
-Before you can use this add-on, you should create a Speech-to-Text instance in the IBM Cloud service.
+Before you can use this add-on, you should create a Speech-to-Text instance in the IBM Cloud service.
-* Go to the following [link](https://cloud.ibm.com/catalog/services/speech-to-text) and create the instance in your desired region.
-* After the instance is created you should be able to view its url and api key.
+- Go to the following [link](https://cloud.ibm.com/catalog/services/speech-to-text) and create the instance in your desired region.
+- After the instance is created you should be able to view its url and api key.
## Configuration
Use your favorite configuration UI to edit **Settings / Other Services - IBM Watson Speech-to-Text** and set:
-* **Api Key** - Api key for Speech-to-Text instance created on IBM Cloud.
-* **Instance Url** - Url for Speech-to-Text instance created on IBM Cloud.
+- **Api Key** - Api key for Speech-to-Text instance created on IBM Cloud.
+- **Instance Url** - Url for Speech-to-Text instance created on IBM Cloud.
### Speech to Text Configuration
Use your favorite configuration UI to edit **Settings / Other Services - IBM Watson Speech-to-Text**:
-* **Prefer Multimedia Model** - Prefer multimedia to telephony [models](https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-ng). Multimedia models are intended for audio that has a minimum sampling rate of 16 kHz, while telephony models are intended for audio that has a minimum sampling rate of 8 kHz.
-* **Background Audio Suppression** - Use the parameter to suppress side conversations or background noise.
-* **Speech Detector Sensitivity** - Use the parameter to suppress word insertions from music, coughing, and other non-speech events.
-* **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
-* **Max Silence Seconds** - The time in seconds after which, if only silence (no speech) is detected in the audio, the connection is closed.
-* **Opt Out Logging** - By default, all IBM Watson™ services log requests and their results. Logging is done only to improve the services for future users. The logged data is not shared or made public.
-* **No Results Message** - Message to be told when no results.
-* **Smart Formatting** - If true, the service converts dates, times, series of digits and numbers, phone numbers, currency values, and internet addresses into more readable. (Not available for all locales)
-* **Redaction** - If true, the service redacts, or masks, numeric data from final transcripts. (Not available for all locales)
+- **Prefer Multimedia Model** - Prefer multimedia to telephony [models](https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-ng). Multimedia models are intended for audio that has a minimum sampling rate of 16 kHz, while telephony models are intended for audio that has a minimum sampling rate of 8 kHz.
+- **Background Audio Suppression** - Use the parameter to suppress side conversations or background noise.
+- **Speech Detector Sensitivity** - Use the parameter to suppress word insertions from music, coughing, and other non-speech events.
+- **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
+- **Max Silence Seconds** - The time in seconds after which, if only silence (no speech) is detected in the audio, the connection is closed.
+- **Opt Out Logging** - By default, all IBM Watson™ services log requests and their results. Logging is done only to improve the services for future users. The logged data is not shared or made public.
+- **No Results Message** - Message to be told when no results.
+- **Smart Formatting** - If true, the service converts dates, times, series of digits and numbers, phone numbers, currency values, and internet addresses into more readable. (Not available for all locales)
+- **Redaction** - If true, the service redacts, or masks, numeric data from final transcripts. (Not available for all locales)
### Configuration via a text file
Its contents should look similar to:
-```
+```ini
org.openhab.voice.watsonstt:apiKey=******
org.openhab.voice.watsonstt:instanceUrl=https://api.***.speech-to-text.watson.cloud.ibm.com/instances/*****
org.openhab.voice.watsonstt:backgroundAudioSuppression=0.5
You can setup your preferred default Speech-to-Text in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Watson** as **Speech-to-Text**.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Watson** as **Speech-to-Text**.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultSTT=watsonstt
```
Whisper enables speech recognition for multiple languages and dialects:
-english, chinese, german, spanish, russian, korean, french, japanese, portuguese, turkish, polish, catalan, dutch, arabic, swedish,
-italian, indonesian, hindi, finnish, vietnamese, hebrew, ukrainian, greek, malay, czech, romanian, danish, hungarian, tamil, norwegian,
-thai, urdu, croatian, bulgarian, lithuanian, latin, maori, malayalam, welsh, slovak, telugu, persian, latvian, bengali, serbian, azerbaijani,
-slovenian, kannada, estonian, macedonian, breton, basque, icelandic, armenian, nepali, mongolian, bosnian, kazakh, albanian, swahili, galician,
-marathi, punjabi, sinhala, khmer, shona, yoruba, somali, afrikaans, occitan, georgian, belarusian, tajik, sindhi, gujarati, amharic, yiddish, lao,
-uzbek, faroese, haitian, pashto, turkmen, nynorsk, maltese, sanskrit, luxembourgish, myanmar, tibetan, tagalog, malagasy, assamese, tatar, lingala,
+english, chinese, german, spanish, russian, korean, french, japanese, portuguese, turkish, polish, catalan, dutch, arabic, swedish,
+italian, indonesian, hindi, finnish, vietnamese, hebrew, ukrainian, greek, malay, czech, romanian, danish, hungarian, tamil, norwegian,
+thai, urdu, croatian, bulgarian, lithuanian, latin, maori, malayalam, welsh, slovak, telugu, persian, latvian, bengali, serbian, azerbaijani,
+slovenian, kannada, estonian, macedonian, breton, basque, icelandic, armenian, nepali, mongolian, bosnian, kazakh, albanian, swahili, galician,
+marathi, punjabi, sinhala, khmer, shona, yoruba, somali, afrikaans, occitan, georgian, belarusian, tajik, sindhi, gujarati, amharic, yiddish, lao,
+uzbek, faroese, haitian, pashto, turkmen, nynorsk, maltese, sanskrit, luxembourgish, myanmar, tibetan, tagalog, malagasy, assamese, tatar, lingala,
hausa, bashkir, javanese and sundanese.
## Supported platforms
The following platforms are supported:
-* Windows10 x86_64
-* Debian GLIBC x86_64/arm64 (min GLIBC version 2.31 / min Debian version Focal)
-* macOS x86_64/arm64 (min version v11.0)
+- Windows10 x86_64
+- Debian GLIBC x86_64/arm64 (min GLIBC version 2.31 / min Debian version Focal)
+- macOS x86_64/arm64 (min version v11.0)
The native binaries for those platforms are included in this add-on provided with the openHAB distribution.
You can download them from the sources provided by the [whisper.cpp](https://github.com/ggerganov/whisper.cpp) author:
-* https://huggingface.co/ggerganov/whisper.cpp
-* https://ggml.ggerganov.com
+- https://huggingface.co/ggerganov/whisper.cpp
+- https://ggml.ggerganov.com
You should place the downloaded .bin model in '\<openHAB userdata\>/whisper/' so the add-ons can find them.
General options.
-* **Model Name** - Model name. The 'ggml-' prefix and '.bin' extension are optional here but required on the filename. (ex: tiny.en -> ggml-tiny.en.bin)
-* **Preload Model** - Keep whisper model loaded.
-* **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
-* **Min Transcription Seconds** - Forces min audio duration passed to whisper, in seconds.
-* **Max Transcription Seconds** - Max seconds for force trigger the transcription, without wait for detect silence.
-* **Initial Silence Seconds** - Max seconds without any voice activity to abort the transcription.
-* **Max Silence Seconds** - Max consecutive silence seconds to trigger the transcription.
-* **Remove Silence** - Remove start and end silence from the audio to transcribe.
+- **Model Name** - Model name. The 'ggml-' prefix and '.bin' extension are optional here but required on the filename. (ex: tiny.en -> ggml-tiny.en.bin)
+- **Preload Model** - Keep whisper model loaded.
+- **Single Utterance Mode** - When enabled recognition stops listening after a single utterance.
+- **Min Transcription Seconds** - Forces min audio duration passed to whisper, in seconds.
+- **Max Transcription Seconds** - Max seconds for force trigger the transcription, without wait for detect silence.
+- **Initial Silence Seconds** - Max seconds without any voice activity to abort the transcription.
+- **Max Silence Seconds** - Max consecutive silence seconds to trigger the transcription.
+- **Remove Silence** - Remove start and end silence from the audio to transcribe.
### Voice Activity Detection Configuration
Configure VAD options.
-* **Audio Step** - Audio processing step in seconds for the voice activity detection.
-* **Voice Activity Detection Mode** - Selected VAD Mode.
-* **Voice Activity Detection Sensitivity** - Percentage in range 0-1 of voice activity in one second to consider it as voice.
-* **Voice Activity Detection Step** - VAD detector internal step in ms (only allows 10, 20 or 30). (Audio Step / Voice Activity Detection Step = number of vad executions per audio step).
+- **Audio Step** - Audio processing step in seconds for the voice activity detection.
+- **Voice Activity Detection Mode** - Selected VAD Mode.
+- **Voice Activity Detection Sensitivity** - Percentage in range 0-1 of voice activity in one second to consider it as voice.
+- **Voice Activity Detection Step** - VAD detector internal step in ms (only allows 10, 20 or 30). (Audio Step / Voice Activity Detection Step = number of vad executions per audio step).
### Whisper Configuration
Configure whisper options.
-* **Threads** - Number of threads used by whisper. (0 to use host max threads)
-* **Sampling Strategy** - Sampling strategy used.
-* **Beam Size** - Beam Size configuration for sampling strategy Bean Search.
-* **Greedy Best Of** - Best Of configuration for sampling strategy Greedy.
-* **Speed Up** - Speed up audio by x2. (Reduced accuracy)
-* **Audio Context** - Overwrite the audio context size. (0 to use whisper default context size)
-* **Temperature** - Temperature threshold.
-* **Initial Prompt** - Initial prompt for whisper.
-* **OpenVINO Device** - Initialize OpenVINO encoder. (built-in binaries do not support OpenVINO, this has no effect)
-* **Use GPU** - Enables GPU usage. (built-in binaries do not support GPU usage, this has no effect)
+- **Threads** - Number of threads used by whisper. (0 to use host max threads)
+- **Sampling Strategy** - Sampling strategy used.
+- **Beam Size** - Beam Size configuration for sampling strategy Bean Search.
+- **Greedy Best Of** - Best Of configuration for sampling strategy Greedy.
+- **Speed Up** - Speed up audio by x2. (Reduced accuracy)
+- **Audio Context** - Overwrite the audio context size. (0 to use whisper default context size)
+- **Temperature** - Temperature threshold.
+- **Initial Prompt** - Initial prompt for whisper.
+- **OpenVINO Device** - Initialize OpenVINO encoder. (built-in binaries do not support OpenVINO, this has no effect)
+- **Use GPU** - Enables GPU usage. (built-in binaries do not support GPU usage, this has no effect)
### Grammar Configuration
Configure the grammar options.
-* **Grammar** - Grammar to use in GBNF format (whisper.cpp BNF variant).
-* **Use Grammar** - Enable grammar usage.
-* **Grammar penalty** - Penalty for non grammar tokens.
-
-#### Grammar Example:
+- **Grammar** - Grammar to use in GBNF format (whisper.cpp BNF variant).
+- **Use Grammar** - Enable grammar usage.
+- **Grammar penalty** - Penalty for non grammar tokens.
+#### Grammar Example
```gbnf
# Grammar should define a root expression that should end with a dot.
### Messages Configuration
-* **No Results Message** - Message to be told on no results.
-* **Error Message** - Message to be told on exception.
+- **No Results Message** - Message to be told on no results.
+- **Error Message** - Message to be told on exception.
### Developer Configuration
-* **Create WAV Record** - Create wav audio file on each whisper execution, also creates a '.prop' file containing the transcription.
-* **Record Sample Format** - Change the record sample format. (allows i16 or f32)
-* **Enable Whisper Log** - Emit whisper.cpp library logs as add-on debug logs.
+- **Create WAV Record** - Create wav audio file on each whisper execution, also creates a '.prop' file containing the transcription.
+- **Record Sample Format** - Change the record sample format. (allows i16 or f32)
+- **Enable Whisper Log** - Emit whisper.cpp library logs as add-on debug logs.
You can find [here](https://github.com/givimad/whisper-finetune-oh) information on how to fine-tune a model using the generated records.
Its contents should look similar to:
-```
+```ini
org.openhab.voice.whisperstt:modelName=tiny
org.openhab.voice.whisperstt:initSilenceSeconds=0.3
-org.openhab.voice.whisperstt:removeSilence=true
+org.openhab.voice.whisperstt:removeSilence=true
org.openhab.voice.whisperstt:stepSeconds=0.3
org.openhab.voice.whisperstt:vadStep=0.5
org.openhab.voice.whisperstt:singleUtteranceMode=true
You can select your preferred default Speech-to-Text in the UI:
-* Go to **Settings**.
-* Edit **System Services - Voice**.
-* Set **Whisper** as **Speech-to-Text**.
+- Go to **Settings**.
+- Edit **System Services - Voice**.
+- Set **Whisper** as **Speech-to-Text**.
In case you would like to set up these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:
-```
+```ini
org.openhab.voice:defaultSTT=whisperstt
```