mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 15:11:59 +01:00
[openwebnet] add sendMessage rule actions to send generic OWN messages on the BUS (#16691)
* [openwebnet] Added OpenWebNetBridgeActions class and sendMessage action Signed-off-by: Massimo Valla <mvcode00@gmail.com>
This commit is contained in:
parent
dbe970981c
commit
1fff7eb028
@ -57,9 +57,9 @@ The following Things and OpenWebNet `WHOs` are supported:
|
|||||||
|
|
||||||
| Category | WHO | Thing Type IDs | Description | Status |
|
| Category | WHO | Thing Type IDs | Description | Status |
|
||||||
| -------------------- | :----: | :---------------------------------------------------: | :-------------------------------------------------------------------: | ------------------------------------ |
|
| -------------------- | :----: | :---------------------------------------------------: | :-------------------------------------------------------------------: | ------------------------------------ |
|
||||||
| Gateway Management | `13` | `zb_gateway` | MyHOME Radio - Zigbee USB Gateway (models: BTI-3578 / LG 088328) | Tested: BTI-3578 and LG 088328 |
|
| Gateway Management | `13` | `zb_gateway` | MyHOME Radio - Zigbee USB Gateway (models: BTI-3578 / LG 088328) | Tested: BTI-3578 and LG 088328 |
|
||||||
| Lighting | `1` | `zb_dimmer`, `zb_on_off_switch`, `zb_on_off_switch2u` | Radio Zigbee dimmers, switches and 2-unit switches | Tested: BTI-4591, BTI-3584, BTI-4585 |
|
| Lighting | `1` | `zb_dimmer`, `zb_on_off_switch`, `zb_on_off_switch2u` | Radio Zigbee dimmers, switches and 2-unit switches | Tested: BTI-4591, BTI-3584, BTI-4585 |
|
||||||
| Automation | `2` | `zb_automation` | Radio Zigbee roller shutters | |
|
| Automation | `2` | `zb_automation` | Radio Zigbee roller shutters | |
|
||||||
|
|
||||||
## Discovery
|
## Discovery
|
||||||
|
|
||||||
@ -214,29 +214,29 @@ OPEN command to execute: *5*8#134##
|
|||||||
|
|
||||||
### Lighting, Automation, Basic/CEN/CEN+ Scenario Events, Dry Contact / IR Interfaces, Power and AUX channels
|
### Lighting, Automation, Basic/CEN/CEN+ Scenario Events, Dry Contact / IR Interfaces, Power and AUX channels
|
||||||
|
|
||||||
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write |
|
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write |
|
||||||
|-----------------------------------------|---------------------------------------------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------|:-----------:|
|
|-----------------------------------------|---------------------------------------------------------------|---------------|---------------------------------------------------------------------------------------------------------------|:-----------:|
|
||||||
| `switch` or `switch_01`/`02` for Zigbee | `bus_on_off_switch`, `zb_on_off_switch`, `zb_on_off_switch2u` | Switch | To switch the device `ON` and `OFF` | R/W |
|
| `switch` or `switch_01`/`02` for Zigbee | `bus_on_off_switch`, `zb_on_off_switch`, `zb_on_off_switch2u` | Switch | To switch the device `ON` and `OFF` | R/W |
|
||||||
| `brightness` | `bus_dimmer`, `zb_dimmer` | Dimmer | To adjust the brightness value (Percent, `ON`, `OFF`) | R/W |
|
| `brightness` | `bus_dimmer`, `zb_dimmer` | Dimmer | To adjust the brightness value (Percent, `ON`, `OFF`) | R/W |
|
||||||
| `shutter` | `bus_automation` | Rollershutter | To activate roller shutters (`UP`, `DOWN`, `STOP`, Percent - [see Shutter position](#shutter-position)) | R/W |
|
| `shutter` | `bus_automation` | Rollershutter | To activate roller shutters (`UP`, `DOWN`, `STOP`, Percent - [see Shutter position](#shutter-position)) | R/W |
|
||||||
| `scenario` | `bus_scenario_control` | String | Trigger channel for Basic scenario events [see possible values](#scenario-channels) | R (TRIGGER) |
|
| `scenario` | `bus_scenario_control` | String | Trigger channel for Basic scenario events [see possible values](#scenario-channels) | R (TRIGGER) |
|
||||||
| `button#X` | `bus_cen_scenario_control`, `bus_cenplus_scenario_control` | String | Trigger channel for CEN/CEN+ scenario events [see possible values](#scenario-channels) | R (TRIGGER) |
|
| `button#X` | `bus_cen_scenario_control`, `bus_cenplus_scenario_control` | String | Trigger channel for CEN/CEN+ scenario events [see possible values](#scenario-channels) | R (TRIGGER) |
|
||||||
| `sensor` | `bus_dry_contact_ir` | Switch | Indicates if a Dry Contact Interface is `ON`/`OFF`, or if an IR Sensor is detecting movement (`ON`), or not (`OFF`) | R |
|
| `sensor` | `bus_dry_contact_ir` | Switch | If a Dry Contact Interface is `ON`/`OFF`, or if an IR Sensor is detecting movement (`ON`), or not (`OFF`) | R |
|
||||||
| `power` | `bus_energy_meter` | Number:Power | The current active power usage from Energy Meter | R |
|
| `power` | `bus_energy_meter` | Number:Power | The current active power usage from Energy Meter | R |
|
||||||
| `energyToday` | `bus_energy_meter` | Number:Energy | Current day energy | R |
|
| `energyToday` | `bus_energy_meter` | Number:Energy | Current day energy | R |
|
||||||
| `energyThisMonth` | `bus_energy_meter` | Number:Energy | Current month energy | R |
|
| `energyThisMonth` | `bus_energy_meter` | Number:Energy | Current month energy | R |
|
||||||
| `aux` | `bus_aux` | String | Possible commands: `ON`, `OFF`, `TOGGLE`, `STOP`, `UP`, `DOWN`, `ENABLED`, `DISABLED`, `RESET_GEN`, `RESET_BI`, `RESET_TRI`. Only `ON` and `OFF` are supported for now | R/W |
|
| `aux` | `bus_aux` | String | Possible commands: `ON`, `OFF`, `TOGGLE`, `STOP`, `UP`, `DOWN`, `ENABLED`, `DISABLED`, `RESET_GEN`, `RESET_BI`, `RESET_TRI`. Only `ON` and `OFF` are supported for now | R/W |
|
||||||
|
|
||||||
### Alarm channels
|
### Alarm channels
|
||||||
|
|
||||||
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write |
|
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write |
|
||||||
|------------------------------|----------------------------------------|-------------|-----------------------------------------------------------------------|:-----------:|
|
|------------------------------|----------------------------------------|-------------|--------------------------------------------------------------------------------|:-----------:|
|
||||||
| `state` | `bus_alarm_system`, `bus_alarm_zone` | Switch | Alarm system or zone is active (`ON`) or inactive (`OFF`) | R |
|
| `state` | `bus_alarm_system`, `bus_alarm_zone` | Switch | Alarm system or zone is active (`ON`) or inactive (`OFF`) | R |
|
||||||
| `network` | `bus_alarm_system` | Switch | Alarm system network state (`ON` = network ok, `OFF` = no network) | R |
|
| `network` | `bus_alarm_system` | Switch | Alarm system network state (`ON` = network ok, `OFF` = no network) | R |
|
||||||
| `battery` | `bus_alarm_system` | String | Alarm system battery state (`OK`, `FAULT`, `UNLOADED`) | R |
|
| `battery` | `bus_alarm_system` | String | Alarm system battery state (`OK`, `FAULT`, `UNLOADED`) | R |
|
||||||
| `armed` | `bus_alarm_system` | Switch | Alarm system is armed (`ON`) or disarmed (`OFF`) | R |
|
| `armed` | `bus_alarm_system` | Switch | Alarm system is armed (`ON`) or disarmed (`OFF`) | R |
|
||||||
| `alarm` | `bus_alarm_zone` | String | Current alarm for the zone (`SILENT`, `INTRUSION`, `TAMPERING`, `ANTI_PANIC`) | R |
|
| `alarm` | `bus_alarm_zone` | String | Current alarm for the zone (`SILENT`, `INTRUSION`, `TAMPERING`, `ANTI_PANIC`) | R |
|
||||||
| `timestamp` | `bus_alarm_zone` | DateTime | Current date and time of the zone's alarm event (YY/MM/DD hh:mm:ss) | R |
|
| `timestamp` | `bus_alarm_zone` | DateTime | Current date and time of the zone's alarm event (YY/MM/DD hh:mm:ss) | R |
|
||||||
|
|
||||||
### Thermo channels
|
### Thermo channels
|
||||||
|
|
||||||
@ -244,27 +244,27 @@ OPEN command to execute: *5*8#134##
|
|||||||
|
|
||||||
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write | Advanced |
|
| Channel Type ID (channel ID) | Applies to Thing Type IDs | Item Type | Description | Read/Write | Advanced |
|
||||||
| ---------------------------- | -------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | :--------: | :------: |
|
| ---------------------------- | -------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | :--------: | :------: |
|
||||||
| `temperature` | `bus_thermo_zone`, `bus_thermo_sensor` | Number:Temperature | Currently sensed temperature for zone or sensor | R | N |
|
| `temperature` | `bus_thermo_zone`, `bus_thermo_sensor` | Number:Temperature | Currently sensed temperature for zone or sensor | R | N |
|
||||||
| `setpointTemperature` | `bus_thermo_zone`, `bus_thermo_cu` | Number:Temperature | The zone or Central Unit manual setpoint temperature | R/W | N |
|
| `setpointTemperature` | `bus_thermo_zone`, `bus_thermo_cu` | Number:Temperature | The zone or Central Unit manual setpoint temperature | R/W | N |
|
||||||
| `targetTemperature` | `bus_thermo_zone` | Number:Temperature | The current zone target temperature according to `mode`, `setpointTemperature` and `localOffset` | R | Y
|
| `targetTemperature` | `bus_thermo_zone` | Number:Temperature | The current zone target temperature according to `mode`, `setpointTemperature` and `localOffset` | R | Y
|
||||||
|`function` | `bus_thermo_zone`, `bus_thermo_cu` | String | The zone set thermo function (`COOLING`, `HEATING`, `GENERIC`) or the Central Unit thermo function (`COOLING`, `HEATING`) | R/W | N |
|
|`function` | `bus_thermo_zone`, `bus_thermo_cu` | String | The zone set thermo function (`COOLING`, `HEATING`, `GENERIC`) or the Central Unit thermo function (`COOLING`, `HEATING`) | R/W | N |
|
||||||
| `mode` | `bus_thermo_zone`, `bus_thermo_cu` | String | The zone set mode (`AUTO`, `MANUAL`, `OFF`, `PROTECTION`) or the Central Unit set mode (`WEEKLY`, `MANUAL`, `SCENARIO`, `HOLIDAY`, `VACATION`, `OFF`, `PROTECTION`) | R/W | N |
|
| `mode` | `bus_thermo_zone`, `bus_thermo_cu` | String | The zone set mode (`AUTO`, `MANUAL`, `OFF`, `PROTECTION`) or the Central Unit set mode (`WEEKLY`, `MANUAL`, `SCENARIO`, `HOLIDAY`, `VACATION`, `OFF`, `PROTECTION`) | R/W | N |
|
||||||
| `speedFanCoil` | `bus_thermo_zone` | String | The zone fancoil speed: `AUTO`, `SPEED_1`, `SPEED_2`, `SPEED_3` | R/W | N |
|
| `speedFanCoil` | `bus_thermo_zone` | String | The zone fancoil speed: `AUTO`, `SPEED_1`, `SPEED_2`, `SPEED_3` | R/W | N |
|
||||||
| `actuators` | `bus_thermo_zone` | String | The zone actuator(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
| `actuators` | `bus_thermo_zone` | String | The zone actuator(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
||||||
| `heatingValves` | `bus_thermo_zone` | String | The zone heating valve(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
| `heatingValves` | `bus_thermo_zone` | String | The zone heating valve(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
||||||
| `conditioningValves` | `bus_thermo_zone` | String | The zone conditioning valve(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
| `conditioningValves` | `bus_thermo_zone` | String | The zone conditioning valve(s) status: `OFF`, `ON`, `OPENED`, `CLOSED` , `STOP`, `OFF_FAN_COIL`, `ON_SPEED_1`, `ON_SPEED_2`, `ON_SPEED_3`, `OFF_SPEED_1`, `OFF_SPEED_2`, `OFF_SPEED_3` | R | Y |
|
||||||
| `heating` | `bus_thermo_zone` | Switch | `ON` if the zone heating valve is currently active (meaning heating is On) | R | Y |
|
| `heating` | `bus_thermo_zone` | Switch | `ON` if the zone heating valve is currently active (meaning heating is On) | R | Y |
|
||||||
| `cooling` | `bus_thermo_zone` | Switch | `ON` if the zone conditioning valve is currently active (meaning conditioning is On) | R | Y |
|
| `cooling` | `bus_thermo_zone` | Switch | `ON` if the zone conditioning valve is currently active (meaning conditioning is On) | R | Y |
|
||||||
| `localOffset` | `bus_thermo_zone` | String | The zone local offset status: `OFF`, `PROTECTION`, `MINUS_3`, `MINUS_2` , `MINUS_1`, `NORMAL`, `PLUS_1`, `PLUS_2`, `PLUS_3`, as set on the room thermostat physical knob | R | Y |
|
| `localOffset` | `bus_thermo_zone` | String | The zone local offset status: `OFF`, `PROTECTION`, `MINUS_3`, `MINUS_2` , `MINUS_1`, `NORMAL`, `PLUS_1`, `PLUS_2`, `PLUS_3`, as set on the room thermostat physical knob | R | Y |
|
||||||
| `remoteControl` | `bus_thermo_cu` | String | The Central Unit Remote Control status: `ENABLED`, `DISABLED` | R | Y |
|
| `remoteControl` | `bus_thermo_cu` | String | The Central Unit Remote Control status: `ENABLED`, `DISABLED` | R | Y |
|
||||||
| `batteryStatus` | `bus_thermo_cu` | String | The Central Unit Battery status: `OK`, `KO` | R | Y |
|
| `batteryStatus` | `bus_thermo_cu` | String | The Central Unit Battery status: `OK`, `KO` | R | Y |
|
||||||
| `weeklyProgram` | `bus_thermo_cu` | Number | The weekly program number (`1`, `2`, `3`) when Central Unit mode is `WEEKLY` | R/W | N |
|
| `weeklyProgram` | `bus_thermo_cu` | Number | The weekly program number (`1`, `2`, `3`) when Central Unit mode is `WEEKLY` | R/W | N |
|
||||||
| `scenarioProgram` | `bus_thermo_cu` | Number | The scenario program number (`1`, `2`, ... , `16`) when Central Unit mode is `SCENARIO` | R/W | N |
|
| `scenarioProgram` | `bus_thermo_cu` | Number | The scenario program number (`1`, `2`, ... , `16`) when Central Unit mode is `SCENARIO` | R/W | N |
|
||||||
| `vacationDays` | `bus_thermo_cu` | Number | Number of days `1-255` the Central Unit will be set to Anti-freeze / Heat Protection temperature before returning to mode `WEEKLY` | R/W | N |
|
| `vacationDays` | `bus_thermo_cu` | Number | Number of days `1-255` the Central Unit will be set to Anti-freeze / Heat Protection temperature before returning to mode `WEEKLY` | R/W | N |
|
||||||
| `failureDiscovered` | `bus_thermo_cu` | Switch | Indicates if a Failure was discovered by the Central Unit (`ON`), or not (`OFF`) | R | Y |
|
| `failureDiscovered` | `bus_thermo_cu` | Switch | Indicates if a Failure was discovered by the Central Unit (`ON`), or not (`OFF`) | R | Y |
|
||||||
| `atLeastOneProbeOff` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in OFF mode (`ON`) or not (`OFF`) | R | Y |
|
| `atLeastOneProbeOff` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in OFF mode (`ON`) or not (`OFF`) | R | Y |
|
||||||
| `atLeastOneProbeProtection` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in PROTECTION mode (`ON`) or not (`OFF`) | R | Y |
|
| `atLeastOneProbeProtection` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in PROTECTION mode (`ON`) or not (`OFF`) | R | Y |
|
||||||
| `atLeastOneProbeManual` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in MANUAL mode (`ON`) or not (`OFF`) | R | Y |
|
| `atLeastOneProbeManual` | `bus_thermo_cu` | Switch | Indicates if at least one probe is in MANUAL mode (`ON`) or not (`OFF`) | R | Y |
|
||||||
|
|
||||||
### Notes on channels
|
### Notes on channels
|
||||||
|
|
||||||
@ -323,6 +323,50 @@ In order to activate one specific weekly or scenario program two different chann
|
|||||||
|
|
||||||
Example: to activate SCENARIO number 9 on the thermo Central Unit then set channel `mode` = `SCENARIO` and channel `scenarioProgram` = `9`.
|
Example: to activate SCENARIO number 9 on the thermo Central Unit then set channel `mode` = `SCENARIO` and channel `scenarioProgram` = `9`.
|
||||||
|
|
||||||
|
## Rule Actions
|
||||||
|
|
||||||
|
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.
|
||||||
|
- `Map<String, Object> sendMessageWithResponse(String message)` same as previous one, but returns a `Map<String, Object>` with following keys:
|
||||||
|
- `success`: a `Boolean` = `true` if the `message` was sent successfully
|
||||||
|
- `responseMessages`: a `List<String>` object containing all returned frames as response to command sent
|
||||||
|
|
||||||
|
Usage example:
|
||||||
|
|
||||||
|
:::: tabs
|
||||||
|
|
||||||
|
::: tab DSL
|
||||||
|
|
||||||
|
```java
|
||||||
|
val actions = getActions("openwebnet", "openwebnet:bus_gateway:mybridge")
|
||||||
|
var success = actions.sendMessage("*22*22#4#9*2#1##")
|
||||||
|
logInfo("EventLog", "Success: " + success)
|
||||||
|
|
||||||
|
var result = actions.sendMessageWithResponse("*22*22#4#9*2#1##")
|
||||||
|
logInfo("EventLog", "Success: " + result.get("success"))
|
||||||
|
logInfo("EventLog", "Response: " + result.get("responseMessages"))
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tab JavaScript
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var actions = getActions("openwebnet", "openwebnet:bus_gateway:mybridge");
|
||||||
|
var success = actions.sendMessage("*22*22#4#9*2#1##");
|
||||||
|
logInfo("EventLog", "Success: " + success);
|
||||||
|
|
||||||
|
var result = actions.sendMessageWithResponse("*22*22#4#9*2#1##");
|
||||||
|
logInfo("EventLog", "Success: " + result.success);
|
||||||
|
logInfo("EventLog", "Response: " + result.responseMessages);
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::::
|
||||||
|
|
||||||
## Full Example
|
## Full Example
|
||||||
|
|
||||||
### openwebnet.things:
|
### openwebnet.things:
|
||||||
@ -450,29 +494,29 @@ sitemap openwebnet label="OpenWebNet Binding Example Sitemap"
|
|||||||
|
|
||||||
Frame label="Energy Meters" icon="energy"
|
Frame label="Energy Meters" icon="energy"
|
||||||
{
|
{
|
||||||
Default item=iCENTRAL_Ta label="General" icon="energy" valuecolor=[>3000="red"]
|
Default item=iCENTRAL_Ta label="General" icon="energy" valuecolor=[>3000="red"]
|
||||||
Default item=iCENTRAL_Tb label="Ground Floor" icon="energy" valuecolor=[>3000="red"]
|
Default item=iCENTRAL_Tb label="Ground Floor" icon="energy" valuecolor=[>3000="red"]
|
||||||
Default item=CENTRAL_Ta_day label="General Energy Today" icon="energy" valuecolor=[>3000="blue"]
|
Default item=CENTRAL_Ta_day label="General Energy Today" icon="energy" valuecolor=[>3000="blue"]
|
||||||
Default item=CENTRAL_Tb_day label="Ground Floor Energy Today" icon="energy" valuecolor=[>3000="blue"]
|
Default item=CENTRAL_Tb_day label="Ground Floor Energy Today" icon="energy" valuecolor=[>3000="blue"]
|
||||||
Default item=CENTRAL_Ta_month label="General Energy This Month" icon="energy" valuecolor=[>3000="yellow"]
|
Default item=CENTRAL_Ta_month label="General Energy This Month" icon="energy" valuecolor=[>3000="yellow"]
|
||||||
Default item=CENTRAL_Tb_month label="Ground Floor Energy This Month" icon="energy" valuecolor=[>3000="yellow"]
|
Default item=CENTRAL_Tb_month label="Ground Floor Energy This Month" icon="energy" valuecolor=[>3000="yellow"]
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame label="Living Room Thermo"
|
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
|
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"]
|
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"
|
Switch item=iLR_zone_mode label="Mode" icon="settings"
|
||||||
Selection item=iLR_zone_func label="Function" icon="heating" mappings=[HEATING="Heating", COOLING="Cooling", GENERIC="Heating/Cooling"]
|
Selection item=iLR_zone_func label="Function" icon="heating" mappings=[HEATING="Heating", COOLING="Cooling", GENERIC="Heating/Cooling"]
|
||||||
Default item=iLR_zone_actuators label="Actuators status"
|
Default item=iLR_zone_actuators label="Actuators status"
|
||||||
Default item=iLR_zone_hv label="Heating valves status"
|
Default item=iLR_zone_hv label="Heating valves status"
|
||||||
Default item=iLR_zone_cv label="Conditioning valves status"
|
Default item=iLR_zone_cv label="Conditioning valves status"
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame label="CEN+ Scenario activation"
|
Frame label="CEN+ Scenario activation"
|
||||||
{
|
{
|
||||||
Switch item=iCENPlusProxyItem label="My CEN+ scenario" icon="movecontrol" mappings=[ON="Activate"]
|
Switch item=iCENPlusProxyItem label="My CEN+ scenario" icon="movecontrol" mappings=[ON="Activate"]
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame label="Alarm"
|
Frame label="Alarm"
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.openwebnet4j</groupId>
|
<groupId>io.github.openwebnet4j</groupId>
|
||||||
<artifactId>openwebnet4j</artifactId>
|
<artifactId>openwebnet4j</artifactId>
|
||||||
<version>0.13.0</version>
|
<version>0.14.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -0,0 +1,140 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2024 Contributors to the openHAB project
|
||||||
|
*
|
||||||
|
* See the NOTICE file(s) distributed with this work for additional
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available under the
|
||||||
|
* terms of the Eclipse Public License 2.0 which is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-2.0
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*/
|
||||||
|
package org.openhab.binding.openwebnet.internal.actions;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
|
import org.openhab.binding.openwebnet.internal.handler.OpenWebNetBridgeHandler;
|
||||||
|
import org.openhab.core.automation.annotation.ActionInput;
|
||||||
|
import org.openhab.core.automation.annotation.ActionOutput;
|
||||||
|
import org.openhab.core.automation.annotation.RuleAction;
|
||||||
|
import org.openhab.core.thing.binding.ThingActions;
|
||||||
|
import org.openhab.core.thing.binding.ThingActionsScope;
|
||||||
|
import org.openhab.core.thing.binding.ThingHandler;
|
||||||
|
import org.openwebnet4j.OpenGateway;
|
||||||
|
import org.openwebnet4j.communication.OWNException;
|
||||||
|
import org.openwebnet4j.communication.Response;
|
||||||
|
import org.openwebnet4j.message.BaseOpenMessage;
|
||||||
|
import org.openwebnet4j.message.FrameException;
|
||||||
|
import org.openwebnet4j.message.OpenMessage;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link OpenWebNetBridgeActions} defines the Bridge actions for the
|
||||||
|
* openwebnet binding.
|
||||||
|
*
|
||||||
|
* @author Massimo Valla - Initial contribution
|
||||||
|
*/
|
||||||
|
|
||||||
|
@ThingActionsScope(name = "openwebnet")
|
||||||
|
@NonNullByDefault
|
||||||
|
public class OpenWebNetBridgeActions implements ThingActions {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(OpenWebNetBridgeActions.class);
|
||||||
|
private @Nullable OpenWebNetBridgeHandler bridgeHandler;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setThingHandler(@Nullable ThingHandler handler) {
|
||||||
|
this.bridgeHandler = (OpenWebNetBridgeHandler) handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable ThingHandler getThingHandler() {
|
||||||
|
return bridgeHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RuleAction(label = "sendMessage", description = "@text/action.sendMessage.desc")
|
||||||
|
public @ActionOutput(name = "success", type = "java.lang.Boolean") Boolean sendMessage(
|
||||||
|
@ActionInput(name = "message", label = "message", description = "@text/action.sendMessage.input.message.desc") @Nullable String message) {
|
||||||
|
@Nullable
|
||||||
|
Boolean s = (Boolean) sendMessageInternal(message).get("success");
|
||||||
|
if (s != null) {
|
||||||
|
return s;
|
||||||
|
} else {
|
||||||
|
return Boolean.FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RuleAction(label = "sendMessageWithResponse", description = "@text/action.sendMessageWithResponse.desc")
|
||||||
|
public @ActionOutput(name = "success", type = "java.lang.Boolean") @ActionOutput(name = "responseMessages", type = "java.util.List<String>") Map<String, Object> sendMessageWithResponse(
|
||||||
|
@ActionInput(name = "message", label = "message", description = "@text/action.sendMessage.input.message.desc") @Nullable String message) {
|
||||||
|
return sendMessageInternal(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Object> sendMessageInternal(@Nullable String message) {
|
||||||
|
Map<String, Object> responseMap = new HashMap<>();
|
||||||
|
responseMap.put("success", Boolean.FALSE);
|
||||||
|
responseMap.put("responseMessages", Collections.emptyList());
|
||||||
|
|
||||||
|
if (message == null || message.isBlank()) {
|
||||||
|
logger.warn("openwebnet sendMessage: cannot send message, message is null or empty");
|
||||||
|
return responseMap;
|
||||||
|
}
|
||||||
|
OpenWebNetBridgeHandler handler = bridgeHandler;
|
||||||
|
if (handler == null) {
|
||||||
|
logger.warn("openwebnet sendMessage: cannot send message, bridgeHandler is null.");
|
||||||
|
return responseMap;
|
||||||
|
}
|
||||||
|
OpenMessage msg;
|
||||||
|
try {
|
||||||
|
msg = BaseOpenMessage.parse(message);
|
||||||
|
} catch (FrameException e) {
|
||||||
|
logger.warn("openwebnet skipping sending message '{}': {}.", message, e.getMessage());
|
||||||
|
return responseMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenGateway gw = handler.getGateway();
|
||||||
|
if (gw != null && gw.isConnected()) {
|
||||||
|
try {
|
||||||
|
Response res = gw.send(msg);
|
||||||
|
logger.debug("sent message {} to gateway. Response: {}.", msg, res.getResponseMessages());
|
||||||
|
responseMap.put("success", res.isSuccess());
|
||||||
|
List<String> resultList = res.getResponseMessages().stream().map(rm -> rm.getFrameValue())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
responseMap.put("responseMessages", resultList);
|
||||||
|
return responseMap;
|
||||||
|
} catch (OWNException e) {
|
||||||
|
logger.warn("openwebnet exception while sending message '{}' to gateway: {}.", msg, e.getMessage());
|
||||||
|
return responseMap;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.warn("openwebnet skipping sendMessage for bridge {}: gateway is not connected.",
|
||||||
|
handler.getThing().getUID());
|
||||||
|
return responseMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// legacy delegate methods
|
||||||
|
public static Boolean sendMessage(@Nullable ThingActions actions, String message) {
|
||||||
|
if (actions instanceof OpenWebNetBridgeActions openwebnetBridgeActions) {
|
||||||
|
return openwebnetBridgeActions.sendMessage(message);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Instance is not an OpenWebNetBridgeActions class.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> sendMessageWithResponse(@Nullable ThingActions actions, String message) {
|
||||||
|
if (actions instanceof OpenWebNetBridgeActions openwebnetBridgeActions) {
|
||||||
|
return openwebnetBridgeActions.sendMessageWithResponse(message);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Instance is not an OpenWebNetBridgeActions class.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,7 +30,8 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link OpenWebNetCENActions} defines CEN/CEN+ actions for the openwebnet binding.
|
* The {@link OpenWebNetCENActions} defines CEN/CEN+ actions for the openwebnet
|
||||||
|
* binding.
|
||||||
*
|
*
|
||||||
* @author Massimo Valla - Initial contribution
|
* @author Massimo Valla - Initial contribution
|
||||||
*/
|
*/
|
||||||
@ -53,10 +54,10 @@ public class OpenWebNetCENActions implements ThingActions {
|
|||||||
return scenarioHandler;
|
return scenarioHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RuleAction(label = "virtualPress", description = "Virtual press of the push button")
|
@RuleAction(label = "virtualPress", description = "@text/action.virtualPress.desc")
|
||||||
public @ActionOutput(name = "success", type = "java.lang.Boolean") Boolean virtualPress(
|
public @ActionOutput(name = "success", type = "java.lang.Boolean") Boolean virtualPress(
|
||||||
@ActionInput(name = "press", label = "press", description = "Type of press") @Nullable String press,
|
@ActionInput(name = "press", label = "press", description = "@text/action.virtualPress.input.press.desc") @Nullable String press,
|
||||||
@ActionInput(name = "button", label = "button", description = "Button number") int button) {
|
@ActionInput(name = "button", label = "button", description = "@text/action.virtualPress.input.button.desc") int button) {
|
||||||
OpenWebNetScenarioHandler handler = scenarioHandler;
|
OpenWebNetScenarioHandler handler = scenarioHandler;
|
||||||
if (handler == null) {
|
if (handler == null) {
|
||||||
logger.warn("openwebnet OpenWebNetCENActions: scenarioHandler is null!");
|
logger.warn("openwebnet OpenWebNetCENActions: scenarioHandler is null!");
|
||||||
@ -86,9 +87,9 @@ public class OpenWebNetCENActions implements ThingActions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// legacy delegate methods
|
// legacy delegate methods
|
||||||
public static void virtualPress(@Nullable ThingActions actions, @Nullable String press, int button) {
|
public static Boolean virtualPress(@Nullable ThingActions actions, @Nullable String press, int button) {
|
||||||
if (actions instanceof OpenWebNetCENActions openWebNetCENActions) {
|
if (actions instanceof OpenWebNetCENActions openWebNetCENActions) {
|
||||||
openWebNetCENActions.virtualPress(press, button);
|
return openWebNetCENActions.virtualPress(press, button);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Instance is not an OpenWebNetCENActions class.");
|
throw new IllegalArgumentException("Instance is not an OpenWebNetCENActions class.");
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants;
|
import org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants;
|
||||||
|
import org.openhab.binding.openwebnet.internal.actions.OpenWebNetBridgeActions;
|
||||||
import org.openhab.binding.openwebnet.internal.discovery.OpenWebNetDeviceDiscoveryService;
|
import org.openhab.binding.openwebnet.internal.discovery.OpenWebNetDeviceDiscoveryService;
|
||||||
import org.openhab.binding.openwebnet.internal.handler.config.OpenWebNetBusBridgeConfig;
|
import org.openhab.binding.openwebnet.internal.handler.config.OpenWebNetBusBridgeConfig;
|
||||||
import org.openhab.binding.openwebnet.internal.handler.config.OpenWebNetZigBeeBridgeConfig;
|
import org.openhab.binding.openwebnet.internal.handler.config.OpenWebNetZigBeeBridgeConfig;
|
||||||
@ -271,9 +272,18 @@ public class OpenWebNetBridgeHandler extends ConfigStatusBridgeHandler implement
|
|||||||
reconnecting = false;
|
reconnecting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the OpenGateway linked to this BridgeHandler
|
||||||
|
*
|
||||||
|
* @return the linked OpenGateway
|
||||||
|
*/
|
||||||
|
public @Nullable OpenGateway getGateway() {
|
||||||
|
return gateway;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Class<? extends ThingHandlerService>> getServices() {
|
public Collection<Class<? extends ThingHandlerService>> getServices() {
|
||||||
return Set.of(OpenWebNetDeviceDiscoveryService.class);
|
return Set.of(OpenWebNetDeviceDiscoveryService.class, OpenWebNetBridgeActions.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -309,7 +309,6 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
|
|||||||
}
|
}
|
||||||
} catch (MalformedFrameException | OWNException e) {
|
} catch (MalformedFrameException | OWNException e) {
|
||||||
logger.warn("handleSetpoint() {}", e.getMessage());
|
logger.warn("handleSetpoint() {}", e.getMessage());
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info("handleSetpoint() Setpoint temperature must be between 5°C and 40°C for thing {}",
|
logger.info("handleSetpoint() Setpoint temperature must be between 5°C and 40°C for thing {}",
|
||||||
|
@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class SerialPortAdapter implements org.openwebnet4j.communication.serial.spi.SerialPort {
|
public class SerialPortAdapter implements org.openwebnet4j.communication.serial.spi.SerialPort {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(SerialPortAdapter.class);
|
private final Logger logger = LoggerFactory.getLogger(SerialPortAdapter.class);
|
||||||
|
|
||||||
private static final int OPEN_TIMEOUT_MS = 200;
|
private static final int OPEN_TIMEOUT_MS = 200;
|
||||||
|
|
||||||
|
@ -321,3 +321,12 @@ offline.conf-error-no-bridge = No bridge associated. Assign a bridge in configur
|
|||||||
offline.conf-error-auth = Authentication failed. Check gateway password in configuration
|
offline.conf-error-auth = Authentication failed. Check gateway password in configuration
|
||||||
offline.bridge-offline = Bridge offline
|
offline.bridge-offline = Bridge offline
|
||||||
unknown.waiting-state = Waiting state update...
|
unknown.waiting-state = Waiting state update...
|
||||||
|
|
||||||
|
# actions
|
||||||
|
|
||||||
|
action.sendMessage.desc = Sends a message to the gateway
|
||||||
|
action.sendMessage.input.message.desc = The message to send
|
||||||
|
action.sendMessageWithResponse.desc = Sends a message to the gateway and returns the response messages
|
||||||
|
action.virtualPress.desc = Virtual press of a push button
|
||||||
|
action.virtualPress.input.press.desc = Type of press
|
||||||
|
action.virtualPress.input.button.desc = Button number
|
||||||
|
Loading…
Reference in New Issue
Block a user