Updated external content (Jenkins build 2197)

pull/2330/head
openHAB Build Server 2024-06-29 05:42:13 +00:00
parent 42aaa23319
commit 2a219369e9
14 changed files with 807 additions and 223 deletions

File diff suppressed because one or more lines are too long

View File

@ -634,7 +634,6 @@ For example, a way to determine if today is a weekend, a public holiday, someone
Additional information can be found on the [Ephemeris Actions Docs](https://www.openhab.org/docs/configuration/actions.html#ephemeris) as well as the [Ephemeris JavaDoc](https://www.openhab.org/javadoc/latest/org/openhab/core/model/script/actions/ephemeris).
```javascript
// Example
var weekend = actions.Ephemeris.isWeekend();
```
@ -725,16 +724,6 @@ myTimer.reschedule(now.plusSeconds(5));
See [openhab-js : actions.ScriptExecution](https://openhab.github.io/openhab-js/actions.ScriptExecution.html) for complete documentation.
#### Semantics Actions
See [openhab-js : actions.Semantics](https://openhab.github.io/openhab-js/actions.html#.Semantics) for complete documentation.
#### Thing Actions
It is possible to get the actions for a Thing using `actions.Things.getActions(bindingId, thingUid)`, e.g. `actions.Things.getActions('network', 'network:pingdevice:pc')`.
See [openhab-js : actions.Things](https://openhab.github.io/openhab-js/actions.html#.Things) for complete documentation.
#### Transformation Actions
openHAB provides various [data transformation services](https://www.openhab.org/addons/#transform) which can translate between technical and human-readable values.
@ -753,20 +742,57 @@ See [openhab-js : actions.Voice](https://openhab.github.io/openhab-js/actions.ht
#### Cloud Notification Actions
Note: Optional action if [openHAB Cloud Connector](https://www.openhab.org/addons/integrations/openhabcloud/) is installed.
Requires the [openHAB Cloud Connector](https://www.openhab.org/addons/integrations/openhabcloud/) to be installed.
Notification actions may be placed in rules to send alerts to mobile devices registered with an [openHAB Cloud instance](https://github.com/openhab/openhab-cloud) such as [myopenHAB.org](https://myopenhab.org/).
For available actions have a look at the [Cloud Notification Actions Docs](https://www.openhab.org/docs/configuration/actions.html#cloud-notification-actions).
There are three different types of notifications:
- Broadcast Notifications: Sent to all registered devices and shown as notification on these devices.
- Standard Notifications: Sent to the registered devices of the specified user and shown as notification on his devices.
- Log Notifications: Only shown in the notification log, e.g. inside the Android and iOS Apps.
To send these three types of notifications, use the `notificationBuilder(message)` method of the `actions` namespace.
It returns a new `NotificationBuilder` object, which by default sends a broadcast notification and provides the following methods:
- `.logOnly()`: Send a log notification only.
- `.withIcon(icon)`: Sets the icon of the notification.
- `.withSeverity(link)`: Sets the severity of the notification.
- `.withTitle(title)`: Sets the title of the notification.
- `.addUserId(emailAddress)`: By adding the email address(es) of specific openHAB Cloud user(s), the notification is only sent to this (these) user(s).
- `.withOnClickAction(action)`: Sets the action to be performed when the notification is clicked.
- `.withMediaAttachmentUrl(mediaAttachmentUrl)`: Sets the URL of a media attachment to be displayed with the notification. This URL must be reachable by the push notification client.
- `.addActionButton(title, action)`: Adds an action button to the notification. Please note that due to Android and iOS limitations, only three action buttons are supported.
- `.send()`: Sends the notification.
The syntax for the `action` parameter is described in [openHAB Cloud Connector: Action Syntax](https://www.openhab.org/addons/integrations/openhabcloud/#action-syntax).
```javascript
// Example
actions.NotificationAction.sendNotification('<email>', '<message>'); // to a single myopenHAB user identified by e-mail
actions.NotificationAction.sendBroadcastNotification('<message>'); // to all myopenHAB users
// Send a simple broadcast notification
actions.notificationBuilder('Hello World!').send();
// Send a broadcast notification with icon, severity and title
actions.notificationBuilder('Hello World!')
.withIcon('f7:bell_fill').withSeverity('important').withTitle('Important Notification').send();
// Send a broadcast notification with icon, severity, title, media attachment URL and actions
actions.notificationBuilder('Hello World!')
.withIcon('f7:bell_fill').withSeverity('important').withTitle('Important Notification').
.withOnClickAction('ui:navigate:/page/my_floorplan_page').withMediaAttachmentUrl('http://example.com/image.jpg')
.addActionButton('Turn Kitchen Light ON=command:KitchenLights:ON').addActionButton('Turn Kitchen Light OFF=command:KitchenLights:OFF').send();
// Send a simple standard notification to two specific users
actions.notificationBuilder('Hello World!').addUserId('florian@example.com').addUserId('florian@example.org').send();
// Send a standard notification with icon, severity and title to two specific users
actions.notificationBuilder('Hello World!').addUserId('florian@example.com').addUserId('florian@example.org')
.withIcon('f7:bell_fill').withSeverity('important').withTitle('Important notification').send();
// Sends a simple log notification
actions.notificationBuilder('Hello World!').logOnly().send();
// Sends a simple log notification with icon and severity
actions.notificationBuilder('Hello World!').logOnly()
.withIcon('f7:bell_fill').withSeverity('important').send();
```
Replace `<email>` with the e-mail address of the user.
Replace `<message>` with the notification text.
See [openhab-js : actions.NotificationBuilder](https://openhab.github.io/openhab-js/actions.html#.notificationBuilder) for complete documentation.
### Cache
@ -1197,7 +1223,7 @@ Operations and conditions can also optionally take functions:
```javascript
rules.when().item("F1_light").changed().then(event => {
console.log(event);
console.log(event);
}).build("Test Rule", "My Test Rule");
```

View File

@ -25,7 +25,7 @@ There is one bridge (`deconz`) that manages the connection to the deCONZ softwar
These sensors are supported:
| Device type | Resource Type | Thing type |
|-----------------------------------|-----------------------------------|------------------------|
| --------------------------------- | --------------------------------- | ---------------------- |
| Presence Sensor | ZHAPresence, CLIPPresence | `presencesensor` |
| Power Sensor | ZHAPower, CLIPPower | `powersensor` |
| Consumption Sensor | ZHAConsumption | `consumptionsensor` |
@ -48,7 +48,7 @@ These sensors are supported:
Additionally, lights, window coverings (blinds), door locks and thermostats are supported:
| Device type | Resource Type | Thing type |
|--------------------------------------|-----------------------------------------------|-------------------------|
| ------------------------------------ | --------------------------------------------- | ----------------------- |
| Dimmable Light | Dimmable light, Dimmable plug-in unit | `dimmablelight` |
| On/Off Light | On/Off light, On/Off plug-in unit, Smart plug | `onofflight` |
| Color Temperature Light | Color temperature light | `colortemperaturelight` |
@ -76,7 +76,7 @@ If your device is not discovered, please check the DEBUG log for unknown devices
These configuration parameters are available:
| Parameter | Description | Type | Default |
|------------------|-------------------------------------------------------------------------------------------------------------------------|---------|---------|
| ---------------- | ----------------------------------------------------------------------------------------------------------------------- | ------- | ------- |
| host | Host address (hostname / ip) of deCONZ interface | string | n/a |
| httpPort | Port of deCONZ HTTP interface | string | 80 |
| port | Port of deCONZ Websocket (optional, can be filled automatically) **(Advanced)** | string | n/a |
@ -140,7 +140,7 @@ Bridge deconz:deconz:homeserver [ host="192.168.0.10", apikey="ABCDEFGHIJ" ]
The sensor devices support some of the following channels:
| Channel Type ID | Item Type | Access Mode | Description | Thing types |
|-----------------------|--------------------------|-------------|-------------------------------------------------------------------------------------------|---------------------------------------------------|
| --------------------- | ------------------------ | ----------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------- |
| airquality | String | R | Airquality as string | airqualitysensor |
| airqualityppb | Number:Dimensionless | R | Airquality (in parts-per-billion) | airqualitysensor |
| alarm | Switch | R | Status of an alarm: `ON` = alarm was triggered; `OFF` = no alarm | alarmsensor |
@ -190,14 +190,14 @@ The `last_seen` channel is added when it is available AND the `lastSeenPolling`
Other devices support
| Channel Type ID | Item Type | Access Mode | Description | Thing types |
|-------------------|----------------------|:-----------:|---------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
| brightness | Dimmer | R/W | Brightness of the light | `dimmablelight`, `colortemperaturelight` |
| ----------------- | -------------------- | :---------: | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| brightness | Dimmer | R/W | Brightness of the light | `dimmablelight`, `colortemperaturelight` |
| switch | Switch | R/W | State of a ON/OFF device | `onofflight` |
| color | Color | R/W | Color of an multi-color light | `colorlight`, `extendedcolorlight`, `lightgroup` |
| color_temperature | Number | R/W | Color temperature in Kelvin. The value range is determined by each individual light | `colortemperaturelight`, `extendedcolorlight`, `lightgroup` |
| effect | String | R/W | Effect selection. Allowed commands are set dynamically | `colorlight` |
| effectSpeed | Number | W | Effect Speed | `colorlight` |
| lock | Switch | R/W | Lock (ON) or unlock (OFF) the doorlock | `doorlock` |
| lock | Switch | R/W | Lock (ON) or unlock (OFF) the doorlock | `doorlock` |
| ontime | Number:Time | W | Timespan for which the light is turned on | all lights |
| position | Rollershutter | R/W | Position of the blind | `windowcovering` |
| heatsetpoint | Number:Temperature | R/W | Target Temperature in °C | `thermostat` |
@ -207,7 +207,7 @@ Other devices support
| alert | String | W | Turn alerts on. Allowed commands are `none`, `select` (short blinking), `lselect` (long blinking) | `warningdevice`, `lightgroup`, `dimmablelight`, `colorlight`, `extendedcolorlight`, `colortemperaturelight` |
| all_on | Switch | R | All lights in group are on | `lightgroup` |
| any_on | Switch | R | Any light in group is on | `lightgroup` |
| scene | String | W | Recall a scene. Allowed commands are set dynamically | `lightgroup` |
| scene | String | W | Recall a scene. Allowed commands are set dynamically | `lightgroup` |
**NOTE:** For groups `color` and `color_temperature` are used for sending commands to the group.
Their state represents the last command send to the group, not necessarily the actual state of the group.
@ -217,7 +217,7 @@ Their state represents the last command send to the group, not necessarily the a
The dimmer switch additionally supports trigger channels.
| Channel Type ID | Description | Thing types |
|-----------------|--------------------------|----------------------|
| --------------- | ------------------------ | -------------------- |
| buttonevent | Event for switch pressed | switch, colorcontrol |
| gestureevent | Event for gestures | switch |
@ -226,7 +226,7 @@ Both will be added during runtime if supported by the switch.
`gestureevent` can trigger one of the following events:
| Gesture | Event |
|----------------------------------|-------|
| -------------------------------- | ----- |
| GESTURE_NONE | 0 |
| GESTURE_SHAKE | 1 |
| GESTURE_DROP | 2 |
@ -244,13 +244,13 @@ Thing actions can be used to manage the network and its content.
The `deconz` thing supports a thing action to allow new devices to join the network:
| Action name | Input Value | Return Value | Description |
|------------------------|----------------------|--------------|----------------------------------------------------------------------------------------------------------------|
| ---------------------- | -------------------- | ------------ | -------------------------------------------------------------------------------------------------------------- |
| `permitJoin(duration)` | `duration` (Integer) | - | allows new devices to join for `duration` seconds. Allowed values are 1-240, default is 120 if no value given. |
The `lightgroup` thing supports thing actions for managing scenes:
| Action name | Input Value | Return Value | Description |
|---------------------|-----------------|--------------|-------------------------------------------------------------------------------------------|
| ------------------- | --------------- | ------------ | ----------------------------------------------------------------------------------------- |
| `createScene(name)` | `name` (String) | `newSceneId` | Creates a new scene with the name `name` and returns the new scene's id (if successfull). |
| `deleteScene(id)` | `id` (Integer) | - | Deletes the scene with the given id. |
| `storeScene(id)` | `id` (Integer) | - | Store the current group's state as scene with the given id. |
@ -320,20 +320,10 @@ then
end
```
# Thing Actions Example
## Thing Actions Example
:::: tabs
::: tab JavaScript
```javascript
deconzActions = actions.get("deconz", "deconz:lightgroup:00212E040ED9:5");
retVal = deconzActions.createScene("TestScene");
deconzActions.storeScene(retVal["newSceneId"]);
```
:::
::: tab DSL
```java
@ -344,6 +334,26 @@ end
:::
::: tab JavaScript
```javascript
deconzActions = actions.get("deconz", "deconz:lightgroup:00212E040ED9:5");
retVal = deconzActions.createScene("TestScene");
deconzActions.storeScene(retVal["newSceneId"]);
```
:::
::: tab JRuby
```ruby
deconz_thing = things["deconz:lightgroup:00212E040ED9:5"]
retval = deconz_thing.create_scene("TestScene")
deconz_thing.store_scene(retval["newSceneId"])
```
:::
::::
### Troubleshooting

View File

@ -205,19 +205,19 @@ The next `ON` command uses these values instead of the default (or configuration
## Channels
| Type-ID | Thing | Item | Description |
|-----------------|---------------------|----------------------|----------------------------------------------------|
|brightness |dimmer, tunablewhite |Switch, Dimmer | controls the brightness |
|color |color |Switch, Dimmer, Color | allows to set the color and brightness |
|color_temperature|tunablewhite |Number | allows to set the color temperature |
|brightness_r |color |Switch, Dimmer | controls the brightness of the red channel |
|brightness_g |color |Switch, Dimmer | controls the brightness of the green channel |
|brightness_b |color |Switch, Dimmer | controls the brightness of the blue channel |
|brightness_cw |tunablewhite |Switch, Dimmer | controls the brightness of the cool white channel |
|brightness_ww |tunablewhite |Switch, Dimmer | controls the brightness of the warm white channel |
|control |chaser |String | allows to change the chaser steps |
|switch |chaser |Switch | turns the chaser ON or OFF |
|mute |(all bridges) |Switch | mutes the DMX output of the bridge |
| Type-ID | Thing | Item | Description |
| ----------------- | -------------------- | --------------------- | ------------------------------------------------- |
| brightness | dimmer, tunablewhite | Switch, Dimmer | controls the brightness |
| color | color | Switch, Dimmer, Color | allows to set the color and brightness |
| color_temperature | tunablewhite | Number | allows to set the color temperature |
| brightness_r | color | Switch, Dimmer | controls the brightness of the red channel |
| brightness_g | color | Switch, Dimmer | controls the brightness of the green channel |
| brightness_b | color | Switch, Dimmer | controls the brightness of the blue channel |
| brightness_cw | tunablewhite | Switch, Dimmer | controls the brightness of the cool white channel |
| brightness_ww | tunablewhite | Switch, Dimmer | controls the brightness of the warm white channel |
| control | chaser | String | allows to change the chaser steps |
| switch | chaser | Switch | turns the chaser ON or OFF |
| mute | (all bridges) | Switch | mutes the DMX output of the bridge |
_Note:_ the string send to the control channel of chaser things has to be formatted like the `steps` configuration of the chaser thing.
If the new string is invalid, the old configuration will be used.
@ -231,19 +231,19 @@ There is a separate instance for each bridge, which can be retrieved e.g. throug
::: tab DSL
```php
```java
val dmxActions = getActions("dmx","dmx:sacn-bridge:mydmxbridge")
```
where the first parameter always has to be `dmx` and the second is the full Thing UID of the bridge that should be used.
Once this action instance is retrieved, you can invoke the `sendFade(String channels, String fade, Boolean resumeAfter)` method on it:
```php
```java
dmxActions.sendFade("1:41/3","10000:255,255,255:-1", false)
```
The parameters are the same as in a chaser thing configuration.
Defining more than one step in `fadeString` is supported, too.
Defining more than one step in `fadeString` is supported.
:::
@ -252,11 +252,22 @@ Defining more than one step in `fadeString` is supported, too.
The first parameter always has to be `dmx` and the second is the full Thing UID of the bridge that should be used.
```javascript
actions.get("dmx","dmx:sacn-bridge:mydmxbridge").sendFade("1:41/3","10000:255,255,255:-1", false);
actions.get("dmx","dmx:sacn-bridge:mydmxbridge").sendFade("1:41/3", "10000:255,255,255:-1", false);
```
The sendFade parameters are the same as in a chaser thing configuration.
Defining more than one step in `fadeString` is supported, too.
Defining more than one step in `fadeString` is supported.
:::
::: tab JRuby
```ruby
things["dmx:sacn-bridge:mydmxbridge"].send_fade("1:41/3", "10000:255,255,255:-1", false)
```
The `send_fade` parameters are the same as in a chaser thing configuration.
Defining more than one step in `fadeString` is supported.
:::

View File

@ -28,7 +28,7 @@ All channels are available for thing type `service`.
### `service` Thing Configuration
| Name | Type | Description | Default | Required |
|-----------------------|---------|----------------------------------------------------------------------|---------------|----------|
| --------------------- | ------- | -------------------------------------------------------------------- | ------------- | -------- |
| priceArea | text | Price area for spot prices (same as bidding zone) | | yes |
| currencyCode | text | Currency code in which to obtain spot prices | DKK | no |
| gridCompanyGLN | integer | Global Location Number of the Grid Company | | no |
@ -63,11 +63,11 @@ It will not impact channels, see [Electricity Tax](#electricity-tax) for further
### Channel Group `electricity`
| Channel | Type | Description |
|--------------------------|--------------------------|----------------------------------------------------------------------------------------|
| ------------------------ | ------------------------ | -------------------------------------------------------------------------------------- |
| spot-price | Number:EnergyPrice | Spot price in DKK or EUR per kWh |
| grid-tariff | Number:EnergyPrice | Grid tariff in DKK per kWh. Only available when `gridCompanyGLN` is configured |
| system-tariff | Number:EnergyPrice | System tariff in DKK per kWh |
| transmission-grid-tariff | Number:EnergyPrice | Transmission grid tariff in DKK per kWh |
| transmission-grid-tariff | Number:EnergyPrice | Transmission grid tariff in DKK per kWh |
| electricity-tax | Number:EnergyPrice | Electricity tax in DKK per kWh |
| reduced-electricity-tax | Number:EnergyPrice | Reduced electricity tax in DKK per kWh. For electric heating customers only |
| co2-emission-prognosis | Number:EmissionIntensity | Estimated prognosis for CO₂ emission following the day-ahead market in g/kWh |
@ -119,6 +119,35 @@ rules.when()
:::
::: tab JRuby
```ruby
rule "Calculate total price" do
channel "energidataservice:service:energidataservice:electricity#event", triggered: "DAY_AHEAD_AVAILABLE"
run do
# Persistence methods will call LocalDate#to_zoned_date_time which converts it
# to a ZonedDateTime in the default system zone, with 00:00 as its time portion
start = LocalDate.now
spot_prices = SpotPrice.all_states_between(start, start + 2.days)
next unless spot_prices # don't proceed if the persistence result is nil
time_series = TimeSeries.new # the default policy is replace
spot_prices.each do |spot_price|
total_price = spot_price.state +
GridTariff.persisted_state(spot_price.timestamp).state +
SystemTariff.persisted_state(spot_price.timestamp).state +
TransmissionGridTariff.persisted_state(spot_price.timestamp).state +
ElectricityTax.persisted_state(spot_price.timestamp).state
time_series.add(spot_price.timestamp, total_price)
end
TotalPrice.persist(time_series)
end
end
```
:::
::::
#### Currencies
@ -163,12 +192,12 @@ The tariffs are downloaded using pre-configured filters for the different [Grid
If your company is not in the list, or the filters are not working, they can be manually overridden.
To override filters, the channel `grid-tariff` has the following configuration parameters:
| Name | Type | Description | Default | Required | Advanced |
|-----------------|---------|----------------------------------------------------------------------------------------------------------------------------------|---------|----------|----------|
| chargeTypeCodes | text | Comma-separated list of charge type codes | | no | yes |
| notes | text | Comma-separated list of notes | | no | yes |
| start | text | Query start date parameter expressed as either YYYY-MM-DD or dynamically as one of `StartOfDay`, `StartOfMonth` or `StartOfYear` | | no | yes |
| offset | text | Query start date offset expressed as an ISO 8601 duration | | no | yes |
| Name | Type | Description | Default | Required | Advanced |
| --------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------- | ------- | -------- | -------- |
| chargeTypeCodes | text | Comma-separated list of charge type codes | | no | yes |
| notes | text | Comma-separated list of notes | | no | yes |
| start | text | Query start date parameter expressed as either YYYY-MM-DD or dynamically as one of `StartOfDay`, `StartOfMonth` or `StartOfYear` | | no | yes |
| offset | text | Query start date offset expressed as an ISO 8601 duration | | no | yes |
The parameters `chargeTypeCodes` and `notes` are logically combined with "AND", so if only one parameter is needed for the filter, only provide this parameter and leave the other one empty.
Using any of these parameters will override the pre-configured filter entirely.
@ -186,14 +215,14 @@ See also [Datahub Price List](https://www.energidataservice.dk/tso-electricity/D
##### Filter Examples
_N1:_
| Parameter | Value |
|-----------------|------------|
| chargeTypeCodes | CD,CD R |
| notes | |
| Parameter | Value |
| --------------- | ------- |
| chargeTypeCodes | CD,CD R |
| notes | |
_Nord Energi Net:_
| Parameter | Value |
|-----------------|------------|
| --------------- | ---------- |
| chargeTypeCodes | TAC |
| notes | Nettarif C |
| start | StartOfDay |
@ -226,9 +255,9 @@ These channels will not be updated when the configured price area is not DK1 or
Advanced channel `event` can trigger the following events:
| Event | Description |
|----------------------|--------------------------------|
| DAY_AHEAD_AVAILABLE | Day-ahead prices are available |
| Event | Description |
| ------------------- | ------------------------------ |
| DAY_AHEAD_AVAILABLE | Day-ahead prices are available |
## Thing Actions
@ -249,7 +278,7 @@ It comes in four variants with different input parameters.
The result is a `Map` with the following keys:
| Key | Type | Description |
|--------------------|--------------|-------------------------------------------------------|
| ------------------ | ------------ | ----------------------------------------------------- |
| CheapestStart | `Instant` | Start time of cheapest calculated period |
| LowestPrice | `BigDecimal` | The total price when starting at cheapest start |
| MostExpensiveStart | `Instant` | Start time of most expensive calculated period |
@ -257,11 +286,11 @@ The result is a `Map` with the following keys:
#### `calculateCheapestPeriod` from Duration
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| duration | `Duration` | The duration to fit within the timeslot |
| Parameter | Type | Description |
| ------------- | ---------- | --------------------------------------- |
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| duration | `Duration` | The duration to fit within the timeslot |
This is a convenience method that can be used when the power consumption is not known.
The calculation will assume linear consumption and will find the best timeslot based on that.
@ -275,12 +304,12 @@ var Map<String, Object> result = actions.calculateCheapestPeriod(now.toInstant()
#### `calculateCheapestPeriod` from Duration and Power
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| duration | `Duration` | The duration to fit within the timeslot |
| power | `QuantityType<Power>` | Linear power consumption |
| Parameter | Type | Description |
| ------------- | --------------------- | --------------------------------------- |
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| duration | `Duration` | The duration to fit within the timeslot |
| power | `QuantityType<Power>` | Linear power consumption |
This action is identical to the variant above, but with a known linear power consumption.
As a result the price is also included in the result.
@ -293,12 +322,12 @@ var Map<String, Object> result = actions.calculateCheapestPeriod(now.toInstant()
#### `calculateCheapestPeriod` from Power Phases
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| durationPhases | `List<Duration>` | List of durations for the phases |
| powerPhases | `List<QuantityType<Power>>` | List of power consumption for each corresponding phase |
| Parameter | Type | Description |
| -------------- | --------------------------- | ------------------------------------------------------ |
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| durationPhases | `List<Duration>` | List of durations for the phases |
| powerPhases | `List<QuantityType<Power>>` | List of power consumption for each corresponding phase |
This variant is similar to the one above, but is based on a supplied timetable.
@ -338,13 +367,13 @@ This is to ensure that the full program will finish before the provided `latestE
#### `calculateCheapestPeriod` from Energy per Phase
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| totalDuration | `Duration` | The total duration of all phases |
| durationPhases | `List<Duration>` | List of durations for the phases |
| energyUsedPerPhase | `QuantityType<Energy>` | Fixed amount of energy used per phase |
| Parameter | Type | Description |
| ------------------ | ---------------------- | ------------------------------------- |
| earliestStart | `Instant` | Earliest start time allowed |
| latestEnd | `Instant` | Latest end time allowed |
| totalDuration | `Duration` | The total duration of all phases |
| durationPhases | `List<Duration>` | List of durations for the phases |
| energyUsedPerPhase | `QuantityType<Energy>` | Fixed amount of energy used per phase |
This variant will assign the provided amount of energy into each phase.
The use case for this variant is a simplification of the previous variant.
@ -370,11 +399,11 @@ var Map<String, Object> result = actions.calculateCheapestPeriod(now.toInstant()
### `calculatePrice`
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| start | `Instant` | Start time |
| end | `Instant` | End time |
| power | `QuantityType<Power>` | Linear power consumption |
| Parameter | Type | Description |
| --------- | --------------------- | ------------------------ |
| start | `Instant` | Start time |
| end | `Instant` | End time |
| power | `QuantityType<Power>` | Linear power consumption |
**Result:** Price as `BigDecimal`.
@ -389,9 +418,9 @@ var price = actions.calculatePrice(now.toInstant(), now.plusHours(4).toInstant,
### `getPrices`
| Parameter | Type | Description |
|--------------------|-----------------------------|--------------------------------------------------------|
| priceComponents | `String` | Comma-separated list of price components to include |
| Parameter | Type | Description |
| --------------- | -------- | --------------------------------------------------- |
| priceComponents | `String` | Comma-separated list of price components to include |
**Result:** `Map<Instant, BigDecimal>`
@ -399,7 +428,7 @@ The parameter `priceComponents` is a case-insensitive comma-separated list of pr
These components can be requested:
| Price component | Description |
|------------------------|--------------------------|
| ---------------------- | ------------------------ |
| SpotPrice | Spot price |
| GridTariff | Grid tariff |
| SystemTariff | System tariff |
@ -463,7 +492,7 @@ In case persistence is only needed for charts and/or accessing prices from rules
::: tab DSL
```javascript
```java
import java.time.Duration
import java.util.ArrayList
import java.util.Map
@ -594,6 +623,69 @@ var result = edsActions.calculateCheapestPeriod(time.Instant.now(), time.Instant
:::
::: tab JRuby
```ruby
eds = things["energidataservice:service:energidataservice"]
price_map = eds.get_prices
hour_start = Instant.now.truncated_to(ChronoUnit::HOURS)
logger.info "Current total price excl. VAT: #{price_map[hour_start]}"
price_map = eds.get_prices("SpotPrice,GridTariff")
logger.info "Current spot price + grid tariff excl. VAT: #{price_map[hour_start]}"
price = eds.calculate_price(Instant.now, 1.hour.from_now.to_instant, 150 | "W")
logger.info "Total price for using 150 W for the next hour: #{price}" if price
duration_phases = [
37.minutes,
8.minutes,
4.minutes,
2.minutes,
4.minutes,
36.minutes,
41.minutes,
104.minutes
]
consumption_phases = [
162.162 | "W",
750 | "W",
1500 | "W",
3000 | "W",
1500 | "W",
166.666 | "W",
146.341 | "W",
0 | "W"
],
result = eds.calculate_cheapest_period(ZonedDateTime.now.to_instant,
24.hours.from_now.to_instant,
duration_phases,
consumption_phases)
logger.info "Cheapest start #{result["CheapestStart"]}"
logger.info "Lowest price #{result["LowestPrice"]}"
logger.info "Highest price #{result["HighestPrice"]}"
logger.info "Most expensive start #{result["MostExpensiveStart"]}"
# This is a simpler version taking advantage of the fact that each interval here represents 0.1 kWh of consumed energy.
# 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.
duration_phases = [37, 8, 4, 2, 4, 36, 41].map { |i| i.minutes }
result = eds.calculate_cheapest_period(ZonedDateTime.now.to_instant,
24.hours.from_now.to_instant,
236.minutes,
duration_phases,
0.1 | "kWh")
```
:::
::::
### Persistence Rule Example
@ -602,7 +694,7 @@ var result = edsActions.calculateCheapestPeriod(time.Instant.now(), time.Instant
::: tab DSL
```javascript
```java
var hourStart = now.plusHours(2).truncatedTo(ChronoUnit.HOURS)
var price = SpotPrice.historicState(hourStart).state
logInfo("Spot price two hours from now", price.toString)
@ -620,6 +712,16 @@ console.log("Spot price two hours from now: " + price);
:::
::: tab JRuby
```ruby
hour_start = 2.hours.from_now.truncated_to(ChronoUnit::HOURS)
price = SpotPrice.persisted_state(hour_start)
logger.info "Spot price two hours from now: #{price}"
```
:::
::::
### Trigger Channel Example
@ -628,7 +730,7 @@ console.log("Spot price two hours from now: " + price);
::: tab DSL
```javascript
```java
rule "Day-ahead event"
when
Channel 'energidataservice:service:energidataservice:electricity#event' triggered 'DAY_AHEAD_AVAILABLE'
@ -653,4 +755,17 @@ rules.when()
:::
::: tab JRuby
```ruby
rule "Day-ahead event" do
channel "energidataservice:service:energidataservice:electricity#event", triggered: "DAY_AHEAD_AVAILABLE"
run do
logger.info "Day-ahead prices for the next day are now available"
end
end
```
:::
::::

View File

@ -709,9 +709,17 @@ In scripts:
:::: tabs
::: tab DSL
```java
Var_1.sendCommand(REFRESH)
```
:::
::: tab JavaScript
``` javascript
```javascript
import org.openhab.core.types.RefreshType
...
Var_1.sendCommand(RefreshType.REFRESH)
@ -719,10 +727,10 @@ Var_1.sendCommand(RefreshType.REFRESH)
:::
::: tab DSL
::: tab JRuby
``` php
Var_1.sendCommand(REFRESH)
```ruby
Var_1.refresh
```
:::
@ -742,7 +750,7 @@ The problem can be solved by increasing the `bufferSize` value in the bridge con
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% |
| CCU | 100% | 0% |

View File

@ -174,6 +174,7 @@ val List<String> attachmentUrlList = newArrayList(
val mailActions = getActions("mail","mail:smtp:sampleserver")
mailActions.sendHtmlMailWithAttachments("mail@example.com", "Test subject", "<h1>Header</h1>This is the mail content.", attachmentUrlList)
```
:::
::: tab JavaScript
@ -182,7 +183,6 @@ mailActions.sendHtmlMailWithAttachments("mail@example.com", "Test subject", "<h1
val mailActions = actions.get("mail","mail:smtp:samplesmtp")
val success = mailActions.sendMail("mail@example.com", "Test subject", "This is the mail content.")
success = mailActions.sendMail("mail1@example.com, mail2@example.com", "Test subject", "This is the mail content sent to multiple recipients.")
```
```javascript
@ -197,7 +197,26 @@ mailActions.sendHtmlMailWithAttachments("mail@example.com", "Test subject", "<h1
:::
::: tab JRuby
```ruby
mail = things["mail:smtp:samplesmtp"]
success = mail.send_mail("mail@example.com", "Test subject", "This is the mail content.")
success = mail.send_mail("mail1@example.com, mail2@example.com", "Test subject", "This is the mail content sent to multiple recipients.")
```
```ruby
attachment_urls = [
"http://some.web/site/snap.jpg&param=value",
"file:///tmp/201601011031.jpg"
]
things["mail:smtp:sampleserver"].send_html_mail_with_attachments("mail@example.com", "Test subject", "<h1>Header</h1>This is the mail content.", attachment_urls)
```
:::
::::
## Mail Headers
The binding allows one to add custom e-mail headers to messages that it sends.
@ -209,7 +228,6 @@ See the example below.
::: tab DSL
```java
rule "Send Mail with a 'Reference' header; for threaded view in e-mail client"
when
@ -220,6 +238,7 @@ then
mailActions.sendMail("mail@example.com", "Test subject", "Test message text")
end
```
:::
::: tab JavaScript
@ -232,5 +251,15 @@ mailActions.sendMail("mail@example.com", "Test subject", "Test message text")
:::
::: tab JRuby
```ruby
mail = things["mail:smtp:sampleserver"]
mail.add_header("Reference", "<unique-thread-identifier>")
mail.send_mail("mail@example.com", "Test subject", "Test message text")
```
:::
::::
Note: in the case of the "Reference" header, the `<unique-thread-identifier>` has to be an ASCII string enclosed in angle brackets.

View File

@ -24,7 +24,7 @@ It connects to many other devices through serial ports or wired contacts and exp
The OmniPro/Lumina controller acts as a "bridge" for accessing other connected devices.
| Omni type | Hardware Type | Things |
|:---------------------------|:-------------------------------------------------|:----------------------------------|
| :------------------------- | :----------------------------------------------- | :-------------------------------- |
| Controller | Omni (Pro II, IIe, LTe), Lumina | `controller` (omni, lumina) |
| Lights | Built-in, UPB, HLC | `unit`, `dimmable`, `upb`, `room` |
| Thermostats | Omnistat, Omnistat2 | `thermostat` |
@ -71,7 +71,7 @@ The devices are identified by the device number that the OmniLink bridge assigns
The devices support some of the following channels:
| Channel Type ID | Item Type | Description | Thing types supporting this channel |
|-----------------------------|----------------------|----------------------------------------------------------------------------------------------|-----------------------------------------------------|
| --------------------------- | -------------------- | -------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| `activate_keypad_emergency` | Number | Activate a burglary, fire, or auxiliary keypad emergency alarm on Omni based models. | `area` |
| `alarm_burglary` | Switch | Indicates if a burglary alarm is active. | `area` |
| `alarm_fire` | Switch | Indicates if a fire alarm is active. | `area` |
@ -145,19 +145,19 @@ The devices support some of the following channels:
The devices support some of the following trigger channels:
| Channel Type ID | Description | Thing types supporting this channel |
|-------------------------------|--------------------------------------------------------------------------------------|-------------------------------------|
| `all_on_off_event` | Event sent when an all on/off event occurs. | `area`, `lumina_area` |
| `phone_line_event` | Event sent when the phone line changes state. | `controller` |
| `ac_power_event` | Event sent when AC trouble conditions are detected. | `controller` |
| `battery_event` | Event sent when battery trouble conditions are detected. | `controller` |
| `dcm_event` | Event sent when digital communicator trouble conditions are detected. | `controller` |
| `energy_cost_event` | Event sent when the cost of energy changes. | `controller` |
| `camera_trigger_event` | Event sent when a camera trigger is detected. | `controller` |
| `upb_link_activated_event` | Event sent when a UPB link is activated. | `controller` |
| `upb_link_deactivated_event` | Event sent when a UPB link is deactivated. | `controller` |
| `activated_event` | Event sent when a button is activated. | `button` |
| `switch_press_event` | Event sent when an ALC, UPB, Radio RA, or Starlite switch is pressed. | `dimmable`, `upb` |
| Channel Type ID | Description | Thing types supporting this channel |
| ---------------------------- | --------------------------------------------------------------------- | ----------------------------------- |
| `all_on_off_event` | Event sent when an all on/off event occurs. | `area`, `lumina_area` |
| `phone_line_event` | Event sent when the phone line changes state. | `controller` |
| `ac_power_event` | Event sent when AC trouble conditions are detected. | `controller` |
| `battery_event` | Event sent when battery trouble conditions are detected. | `controller` |
| `dcm_event` | Event sent when digital communicator trouble conditions are detected. | `controller` |
| `energy_cost_event` | Event sent when the cost of energy changes. | `controller` |
| `camera_trigger_event` | Event sent when a camera trigger is detected. | `controller` |
| `upb_link_activated_event` | Event sent when a UPB link is activated. | `controller` |
| `upb_link_deactivated_event` | Event sent when a UPB link is deactivated. | `controller` |
| `activated_event` | Event sent when a button is activated. | `button` |
| `switch_press_event` | Event sent when an ALC, UPB, Radio RA, or Starlite switch is pressed. | `dimmable`, `upb` |
## Rule Actions
@ -166,18 +166,28 @@ There is a separate instance for each contoller, which can be retrieved through:
:::: tabs
::: tab DSL
```java
val omnilinkActions = getActions("omnilink", "omnilink:controller:home")
```
:::
::: tab JavaScript
``` javascript
```javascript
var omnilinkActions = actions.get("omnilink", "omnilink:controller:home");
```
:::
::: tab DSL
::: tab JRuby
``` php
val omnilinkActions = getActions("omnilink", "omnilink:controller:home")
In JRuby, Action methods are available directly on the Thing object.
```ruby
omni_link = things["omnilink:controller:home"]
```
:::
@ -189,18 +199,26 @@ Once this action instance is retrieved, you can invoke the `synchronizeControlle
:::: tabs
::: tab DSL
```java
omnilinkActions.synchronizeControllerTime("America/Denver")
```
:::
::: tab JavaScript
``` javascript
```javascript
omnilinkActions.synchronizeControllerTime("America/Denver");
```
:::
::: tab DSL
::: tab JRuby
``` php
omnilinkActions.synchronizeControllerTime("America/Denver")
```ruby
omni_link.synchronize_controller_time("America/Denver")
```
:::

View File

@ -56,25 +56,25 @@ The following Things and OpenWebNet `WHOs` are supported:
### For MyHOME - BUS/SCS
| Category | WHO | Thing Type IDs | Description | Status |
| Category | WHO | Thing Type IDs | Description | Status |
| ----------------------------- | :-------------: | :--------------------------------------------------------------------------------: | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Gateway Management | `13` | `bus_gateway` | Any IP gateway supporting OpenWebNet protocol should work | Successfully tested: F452, F453, F453AV,F454, F455, MyHOMEServer1, MyHOME_Screen10, MyHOME_Screen3,5, MH201, MH202, MH200N. Some connection stability issues/gateway resets reported with MH202 |
| Lighting | `1` | `bus_on_off_switch`, `bus_dimmer`, `bus_light_group` | BUS switches and dimmers and groups of them | Successfully tested: F411/2, F411/4, F411U2, F422, F429. Some discovery issues reported with F429 (DALI Dimmers) |
| Automation | `2` | `bus_automation` | BUS roller shutters, with position feedback and auto-calibration | Successfully tested: LN4672M2 |
| Temperature Control | `4` | `bus_thermo_zone`, `bus_thermo_sensor`, `bus_thermo_cu` | Thermo zones management and temperature sensors (probes) | Successfully tested: Thermostats H/LN4691, HS4692, KG4691; sensors (probes): L/N/NT4577 + 3455; Central Units 4-zones (models L/N/NT/HD/HC/HS4695) and 99-zones (model 3550). See [Channels - Thermo](#configuring-thermo) for more details |
| Alarm | `5` | `bus_alarm_system`, `bus_alarm_zone` | BUS Alarm system and zones | Successfully tested: Burglar-alarm Unit 3486 |
| Auxiliary (AUX) | `9` | `bus_aux` | AUX commands | Successfully tested: AUX configured for Burglar-alarm Unit 3486. **Only sending AUX commands is supported** |
| Gateway Management | `13` | `bus_gateway` | Any IP gateway supporting OpenWebNet protocol should work | Successfully tested: F452, F453, F453AV,F454, F455, MyHOMEServer1, MyHOME_Screen10, MyHOME_Screen3,5, MH201, MH202, MH200N. Some connection stability issues/gateway resets reported with MH202 |
| Lighting | `1` | `bus_on_off_switch`, `bus_dimmer`, `bus_light_group` | BUS switches and dimmers and groups of them | Successfully tested: F411/2, F411/4, F411U2, F422, F429. Some discovery issues reported with F429 (DALI Dimmers) |
| Automation | `2` | `bus_automation` | BUS roller shutters, with position feedback and auto-calibration | Successfully tested: LN4672M2 |
| Temperature Control | `4` | `bus_thermo_zone`, `bus_thermo_sensor`, `bus_thermo_cu` | Thermo zones management and temperature sensors (probes) | Successfully tested: Thermostats H/LN4691, HS4692, KG4691; sensors (probes): L/N/NT4577 + 3455; Central Units 4-zones (models L/N/NT/HD/HC/HS4695) and 99-zones (model 3550). See [Channels - Thermo](#configuring-thermo) for more details |
| Alarm | `5` | `bus_alarm_system`, `bus_alarm_zone` | BUS Alarm system and zones | Successfully tested: Burglar-alarm Unit 3486 |
| Auxiliary (AUX) | `9` | `bus_aux` | AUX commands | Successfully tested: AUX configured for Burglar-alarm Unit 3486. **Only sending AUX commands is supported** |
| Basic, CEN & CEN+ Scenarios | `0`, `15`, `25` | `bus_scenario_control`, `bus_cen_scenario_control`, `bus_cenplus_scenario_control` | Basic and CEN/CEN+ Scenarios events and virtual activation | Successfully tested: CEN/CEN+ scenario control: HC/HD/HS/L/N/NT4680 and basic scenario modules F420/IR3456 + L4680 (WHO=0) |
| Dry Contact and IR Interfaces | `25` | `bus_dry_contact_ir` | Dry Contacts and IR Interfaces | Successfully tested: contact interfaces F428 and 3477; IR sensors: HC/HD/HS/L/N/NT4610 |
| Energy Management | `18` | `bus_energy_meter` | Energy Management | Successfully tested: F520, F521. Partially tested: F522, F523 |
| Dry Contact and IR Interfaces | `25` | `bus_dry_contact_ir` | Dry Contacts and IR Interfaces | Successfully tested: contact interfaces F428 and 3477; IR sensors: HC/HD/HS/L/N/NT4610 |
| Energy Management | `18` | `bus_energy_meter` | Energy Management | Successfully tested: F520, F521. Partially tested: F522, F523 |
### For MyHOME Radio - Zigbee
| 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 |
| 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 | |
| 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 |
| 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 | |
## Discovery
@ -246,55 +246,55 @@ For a `bus_light_group` Thing to be updated properly, at least one light Thing b
| 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`, `bus_light_group`, `zb_on_off_switch`, `zb_on_off_switch2u` | Switch | To switch the device (or group) `ON` and `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 |
| `switch` or `switch_01`/`02` for Zigbee | `bus_on_off_switch`, `bus_light_group`, `zb_on_off_switch`, `zb_on_off_switch2u` | Switch | To switch the device (or group) `ON` and `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 |
| `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) |
| `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 |
| `energyToday` | `bus_energy_meter` | Number:Energy | Current day 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 |
| `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 |
| `energyToday` | `bus_energy_meter` | Number:Energy | Current day 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 |
### Alarm channels
| 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 |
| `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 |
| `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 |
| `timestamp` | `bus_alarm_zone` | DateTime | Current date and time of the zone's alarm event (YY/MM/DD hh:mm:ss) | R |
| 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 |
| `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 |
| `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 |
| `timestamp` | `bus_alarm_zone` | DateTime | Current date and time of the zone's alarm event (YY/MM/DD hh:mm:ss) | R |
### Thermo channels
**NOTE** Channels marked in the table with `Advanced = Y` can be shown on the UI from Thing configuration > Channels tab > check `Show 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 |
| `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
|`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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| 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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
| `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 |
### Notes on channels
@ -360,8 +360,8 @@ Actions can be used for example to send commands to the BUS for a WHOs not yet s
- `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
- `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:
@ -395,11 +395,25 @@ logInfo("EventLog", "Response: " + result.responseMessages);
:::
::: tab JRuby
```ruby
openwebnet = things["openwebnet:bus_gateway:mybridge"]
result = openwebnet.send_message("*22*22#4#9*2#1##")
logger.info "Result: #{result}"
result = openwebnet.send_message_with_response("*22*22#4#9*2#1##")
logger.info "Success: #{result["success"]}"
logger.info "Response: #{result["responseMessages"]}"
```
:::
::::
## Full Example
### openwebnet.things:
### openwebnet.things
MyHOME BUS/SCS gateway and Things configuration:
@ -441,7 +455,7 @@ Bridge openwebnet:zb_gateway:myZBgateway [ serialPort="COM3" ] {
}
```
### openwebnet.items:
### openwebnet.items
Example items linked to MyHOME - BUS/SCS devices:

View File

@ -0,0 +1,114 @@
---
id: teslapowerwall
label: TeslaPowerwall
title: TeslaPowerwall - Bindings
type: binding
description: "This binding enables the capture of key data from a Tesla Powerwall 2 into openHAB."
since: 3x
install: auto
---
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
{% include base.html %}
# TeslaPowerwall Binding
This binding enables the capture of key data from a Tesla Powerwall 2 into openHAB.
## Supported Things
- `powerwall` Tesla Powerwall 2
## Discovery
The binding does not support auto discovery.
## Thing Configuration
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.
## Channels
| channel id | type | description |
|---------------------------|----------------------|--------------------------------------------------------------|
| grid-status | String | Current status of the Power Grid |
| battery-soe | Number:Dimensionless | Current battery state of charge |
| mode | String | Current operating mode |
| reserve | Number:Dimensionless | Current battery reserve % |
| grid-inst-power | Number:Power | Instantaneous Grid Power Supply |
| battery-inst-power | Number:Power | Instantaneous Battery Power Supply |
| home-inst-power | Number:Power | Instantaneous Home Power Supply |
| solar-inst-power | Number:Power | Instantaneous Solar Power Supply |
| grid-energy-exported | Number:Energy | Total Grid Energy Exported |
| battery-energy-exported | Number:Energy | Total Battery Energy Exported |
| home-energy-exported | Number:Energy | Total Home Energy Exported |
| solar-energy-exported | Number:Energy | Total Solar Energy Exported |
| grid-energy-imported | Number:Energy | Total Grid Energy Imported |
| battery-energy-imported | Number:Energy | Total Battery Energy Imported |
| home-energy-imported | Number:Energy | Total Home Energy Imported |
| solar-energy-imported | Number:Energy | Total Solar Energy Imported |
| degradation | Number:Dimensionless | Current battery degradation % (Based on single battery) |
| full-pack-energy | Number:Energy | Reported battery capacity at full |
## Full Example
### `teslapowerwall.things`:
```java
teslapowerwall:tesla-powerwall:TeslaPowerwall [ hostname="192.168.0.5" ]
```
### `teslapowerwall.items`:
```java
String TeslaPowerwall_grid-status { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:grid-status" }
Switch TeslaPowerwall_grid-services { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:grid-services" }
Number:Dimensionless TeslaPowerwall_battery-soe { channel="tesla-powerwall:teslapowerwall:TeslaPowerwall:battery-soe", unit="%" }
String TeslaPowerwall_mode { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:mode" }
Number:Dimensionless TeslaPowerwall_reserve { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:reserve", unit="%" }
Number:Power TeslaPowerwall_grid-inst-power { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:grid-inst-power" }
Number:Power TeslaPowerwall_battery-inst-power { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:battery-inst-power" }
Number:Power TeslaPowerwall_home-inst-power { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:home-inst-power" }
Number:Power TeslaPowerwall_solar-inst-power { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:solar-inst-power" }
Number:Energy TeslaPowerwall_grid-energy-exported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:grid-energy-exported" }
Number:Energy TeslaPowerwall_grid-energy-imported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:grid-energy-imported" }
Number:Energy TeslaPowerwall_battery-energy-exported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:battery-energy-exported" }
Number:Energy TeslaPowerwall_battery-energy-imported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:battery-energy-imported" }
Number:Energy TeslaPowerwall_home-energy-exported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:home-energy-exported" }
Number:Energy TeslaPowerwall_home-energy-imported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:home-energy-imported" }
Number:Energy TeslaPowerwall_solar-energy-exported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:solar-energy-exported" }
Number:Energy TeslaPowerwall_solar-energy-imported { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:solar-energy-imported" }
Number:Dimensionless TeslaPowerwall_degradation { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:degradation", unit="%" }
Number:Energy TeslaPowerwall_full-pack-energy { channel="teslapowerwall:tesla-powerwall:TeslaPowerwall:full-pack-energy" }
```
### `teslapowerwall.sitemap`:
```perl
Text item=TeslaPowerwall_grid-status label="Grid Status [%s]"
Text item=TeslaPowerwall_grid-services label="Grid Services Status [%s]"
Text item=TeslaPowerwall_battery-soe label="Battery Charge"
Text item=TeslaPowerwall_mode label="Battery Mode"
Text item=TeslaPowerwall_reserve label="Battery Reserve"
Text item=TeslaPowerwall_grid-inst-power label="Grid Power [%.1f W]"
Text item=TeslaPowerwall_battery-inst-power label="Battery Power [%.1f W]"
Text item=TeslaPowerwall_home-inst-power label="Home Power [%.1f W]"
Text item=TeslaPowerwall_solar-inst-power label="Solar Power [%.1f W]"
Text item=TeslaPowerwall_grid-energy-exported label="Grid Energy Exported [%.1f kWh]"
Text item=TeslaPowerwall_grid-energy-imported label="Grid Energy Imported [%.1f kWh]"
Text item=TeslaPowerwall_battery-energy-exported label="Battery Energy Exported [%.1f kWh]"
Text item=TeslaPowerwall_battery-energyi-mported label="Battery Energy Imported [%.1f kWh]"
Text item=TeslaPowerwall_home-energy-exported label="Home Energy Exported [%.1f kWh]"
Text item=TeslaPowerwall_home-energy-imported label="Home Energy Imported [%.1f kWh]"
Text item=TeslaPowerwall_solar-energy-exported label="Solar Energy Exported [%.1f kWh]"
Text item=TeslaPowerwall_solar-energy-imported label="Solar Energy Imported [%.1f kWh]"
Text item=TeslaPowerwall_full-pack-energy label="Full Pack Energy"
Text item=TeslaPowerwall_degradation label="Degradation level"
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -28,29 +28,31 @@ The openHAB Cloud service (and thus the connector to it) is useful for different
## Installation via UI
* Open the openHAB web portal and login as an administrator.
* Click on Add-on Store, followed by Other
* Using the Install button you can install the openHAB Cloud Connector
* Register your session (https://myopenhab.org/) using UUID and Secret identity
* 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
To authenticate with the openHAB Cloud service the add-on generates two values when the add-on is installed.
To authenticate with the openHAB Cloud service, the add-on generates two values when the add-on is installed.
These values need to be entered in your account settings of the openHAB Cloud service.
The first one is a unique identifier, which allows to identify your runtime.
One can think of it as something similar like a username for the cloud authentication.
The second one is a random secret key which serves as a password.
Both values are written to the local file system.
If you loose these files for some reason, openHAB will automatically generate new ones.
You will then have to reconfigure UUID and secret in the openHAB Cloud service under the _My account_ section.
You will need these values to register on the website before connection is accepted.
Location of UUID and Secret:
| File | Regular Installation | APT Installation |
|--------|------------------------------|---------------------------------------|
| UUID | userdata/uuid | /var/lib/openhab/uuid |
| Secret | userdata/openhabcloud/secret | /var/lib/openhab/openhabcloud/secret |
| File | Regular Installation | APT & RPM Installation |
|--------|---------------------------------------|--------------------------------------|
| UUID | $OPENHAB_USERDATA/uuid | /var/lib/openhab/uuid |
| Secret | $OPENHAB_USERDATA/openhabcloud/secret | /var/lib/openhab/openhabcloud/secret |
## Configuration
@ -58,7 +60,7 @@ After installing this add-on, you will find configuration options in the openHAB
![Configuration](doc/configuration.png)
By default both remote access and push notifications are enabled.
By default, both remote access and push notifications are enabled.
### Advanced Configuration
@ -120,7 +122,7 @@ The parameters for these actions have the following meaning:
- `emailAddress`: String containing the email address the target user is registered with in the cloud instance.
- `message`: String containing the notification message text.
- `icon`: String containing the icon name (as described in [Items]({{base}}/configuration/items.html#icons)).
- `icon`: String containing the icon name (as described in [Items: Icons]({{base}}/configuration/items.html#icons)).
- `severity`: String containing a description of the severity of the incident.
`null` may be used to skip the `icon` or `severity` parameter.
@ -148,15 +150,15 @@ The additional parameter for these variants have the following meaning:
- `title`: The title of the notification. Defaults to "openHAB" inside the Android and iOS apps.
- `onClickAction`: The action to be performed when the user clicks on the notification. Specified using the [action syntax](#action-syntax).
- `mediaAttachmentUrl`: The URL of the media attachment to be displayed with the notification. This URL must be reachable by the push notification client.
- `actionButton1`: The action to be performed when the user clicks on the first action button. Specified as `Titel=$action`, where `$action` follow the [action syntax](#action-syntax).
- `actionButton2`: The action to be performed when the user clicks on the second action button. Specified as `Titel=$action`, where `$action` follow the [action syntax](#action-syntax).
- `actionButton3`: The action to be performed when the user clicks on the third action button. Specified as `Titel=$action`, where `$action` follow the [action syntax](#action-syntax).
- `actionButton1`: The action to be performed when the user clicks on the first action button. Specified as `Title=$action`, where `$action` follows the [action syntax](#action-syntax).
- `actionButton2`: The action to be performed when the user clicks on the second action button. Specified as `Title=$action`, where `$action` follows the [action syntax](#action-syntax).
- `actionButton3`: The action to be performed when the user clicks on the third action button. Specified as `Title=$action`, where `$action` follows the [action syntax](#action-syntax).
These parameters may be skipped by setting them to `null`.
#### Action Syntax
The action syntax is a string containing the action type and the action payload seperated by a colon.
The action syntax is a string containing the action type and the action payload separated by a colon.
There are two types of actions available:
@ -182,7 +184,7 @@ Notify the openHAB Cloud user with email address _me@email.com_ that the front d
::: tab DSL
```java
```java
rule "Front Door Notification"
when
Item Apartment_FrontDoor changed to OPEN
@ -196,12 +198,29 @@ end
```javascript
rules.when().item('Apartment_FrontDoor').changed().to('OPEN').then(() => {
actions.notificationBuilder('Front door was opened!').addUserId('me@email.com').send();
actions.notificationBuilder('Front door was opened!')
.addUserId('me@email.com')
.send();
}).build('Front Door Notification');
```
:::
::: tab JRuby
```ruby
rule "Front Door Notification" do
changed Apartment_FrontDoor, to: OPEN
run do
notify("Front door was opened!", email: "me@email.com")
end
end
```
See [notify](https://openhab.github.io/openhab-jruby/main/OpenHAB/Core/Actions.html#notify-class_method)
:::
::::
Notify all openHAB Cloud users that the window was opened:
@ -225,15 +244,33 @@ end
```javascript
rules.when().item('Apartment_Window').changed().to('OPEN').then(() => {
actions.notificationBuilder('Apartment window was opened!').withIcon('window').withSeverity('HIGH').send();
actions.notificationBuilder('Apartment window was opened!')
.withIcon('window')
.withSeverity('HIGH')
.send();
}).build('Open Window Notification');
```
:::
::: tab JRuby
Broadcast notification is performed by calling [notify](https://openhab.github.io/openhab-jruby/main/OpenHAB/Core/Actions.html#notify-class_method) without providing an email address.
```ruby
rule "Open Window Notification" do
changed Apartment_Window, to: OPEN
run do
notify("Apartment window was opened!", icon: "window", severity: "HIGH")
end
end
```
:::
::::
Notify all openHAB Cloud users that motion was detected, attach a camera snapshot and add action button to turn on the light:
Notify all openHAB Cloud users that motion was detected, attach a camera snapshot and add an action button to turn on the light:
:::: tabs
@ -244,7 +281,9 @@ rule "Motion Detected Notification"
when
Item Apartment_MotionSensor changed to ON
then
sendBroadcastNotification("Motion detected in the apartment!", "motion", "MEDIUM", "Motion Detected", null, "https://apartment.my/camera-snapshot.jpg", "command:Apartment_Light:ON", null, null)
sendBroadcastNotification("Motion detected in the apartment!", "motion", "MEDIUM",
"Motion Detected", null, "https://apartment.my/camera-snapshot.jpg",
"Turn on the light=command:Apartment_Light:ON", null, null)
end
```
@ -266,4 +305,22 @@ rules.when().item('Apartment_MotionSensor').changed().to('ON').then(() => {
:::
::: tab JRuby
```ruby
rule "Motion Detected Notification" do
changed Apartment_MotionSensor, to: ON
run do
notify "Motion detected in the apartment!",
icon: "motion",
severity: "MEDIUM",
title: "Motion Detected",
attachment: "https://apartment.my/camera-snapshot.jpg",
buttons: { "Turn on the light" => "command:Apartment_Light:ON" }
end
end
```
:::
::::

View File

@ -33,7 +33,7 @@ Add Danish VAT to price:
::: tab DSL
```javascript
```java
var Number price = 499
logInfo("Price", "Price incl. VAT: " + transform("VAT", "DK", price.toString))
```
@ -49,6 +49,18 @@ console.log("Price incl. VAT: " + actions.Transformation.transform("VAT", "DK",
:::
::: tab JRuby
```ruby
price = 499
# The currency name can be either a Symbol or a String
# The input value doesn't need to be converted to string, however, the return value is a String
price_incl_vat = transform(:vat, :DK, price)
logger.info "Price incl. VAT: #{price_incl_vat}"
```
:::
::::
## Usage as a Profile

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="teslapowerwall"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<thing-type id="tesla-powerwall">
<label>Tesla Powerwall</label>
<description>Tesla Powerwall</description>
<channels>
<channel id="grid-status" typeId="grid-status"/>
<channel id="grid-services" typeId="grid-services"/>
<channel id="battery-soe" typeId="battery-soe"/>
<channel id="mode" typeId="mode"/>
<channel id="reserve" typeId="reserve"/>
<channel id="grid-inst-power" typeId="grid-inst-power"/>
<channel id="battery-inst-power" typeId="battery-inst-power"/>
<channel id="home-inst-power" typeId="home-inst-power"/>
<channel id="solar-inst-power" typeId="solar-inst-power"/>
<channel id="grid-energy-exported" typeId="grid-energy-exported"/>
<channel id="battery-energy-exported" typeId="battery-energy-exported"/>
<channel id="home-energy-exported" typeId="home-energy-exported"/>
<channel id="solar-energy-exported" typeId="solar-energy-exported"/>
<channel id="grid-energy-imported" typeId="grid-energy-imported"/>
<channel id="battery-energy-imported" typeId="battery-energy-imported"/>
<channel id="home-energy-imported" typeId="home-energy-imported"/>
<channel id="solar-energy-imported" typeId="solar-energy-imported"/>
<channel id="full-pack-energy" typeId="full-pack-energy"/>
<channel id="degradation" typeId="degradation"/>
</channels>
<config-description>
<parameter name="hostname" type="text" required="true">
<label>Hostname/IP Address</label>
<description>The host name or IP address of the Tesla Powerwall.</description>
</parameter>
<parameter name="email" type="text" required="true">
<label>Email</label>
<description>Local Powerwall account email</description>
</parameter>
<parameter name="password" type="text" required="true">
<label>Password</label>
<description>Local Powerwall account password</description>
<context>password</context>
</parameter>
<parameter name="refresh" type="integer" required="false">
<label>Refresh Interval</label>
<description>Specifies the refresh interval in seconds.</description>
<default>10</default>
</parameter>
</config-description>
</thing-type>
<channel-type id="grid-status">
<item-type>String</item-type>
<label>Grid Status</label>
<description>Current status of the power grid</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="grid-services">
<item-type>Switch</item-type>
<label>Grid Services</label>
<description>Grid services activation status</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="battery-soe">
<item-type unitHint="%">Number:Dimensionless</item-type>
<label>Battery SOE</label>
<description>Current battery state of charge</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="mode">
<item-type>String</item-type>
<label>Operating Mode</label>
<description>Current operating mode</description>
</channel-type>
<channel-type id="reserve">
<item-type unitHint="%">Number:Dimensionless</item-type>
<label>Battery Reserve</label>
<description>Current battery reserve %</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="grid-inst-power">
<item-type>Number:Power</item-type>
<label>Instant Grid Power</label>
<description>Instantaneous grid power supply</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="battery-inst-power">
<item-type>Number:Power</item-type>
<label>Instant Battery Power</label>
<description>Instantaneous battery power supply</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="home-inst-power">
<item-type>Number:Power</item-type>
<label>Instant Home Power</label>
<description>Instantaneous home power supply</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="solar-inst-power">
<item-type>Number:Power</item-type>
<label>Instant Solar Power</label>
<description>Instantaneous solar power supply</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="grid-energy-exported">
<item-type>Number:Energy</item-type>
<label>Grid Energy Exported</label>
<description>Total grid energy exported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="battery-energy-exported">
<item-type>Number:Energy</item-type>
<label>Battery Energy Exported</label>
<description>Total battery energy exported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="home-energy-exported">
<item-type>Number:Energy</item-type>
<label>Home Energy Exported</label>
<description>Total home energy exported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="solar-energy-exported">
<item-type>Number:Energy</item-type>
<label>Solar Energy Exported</label>
<description>Total solar energy exported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="grid-energy-imported">
<item-type>Number:Energy</item-type>
<label>Grid Energy Imported</label>
<description>Total grid energy imported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="battery-energy-imported">
<item-type>Number:Energy</item-type>
<label>Battery Energy Imported</label>
<description>Total battery energy imported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="home-energy-imported">
<item-type>Number:Energy</item-type>
<label>Home Energy Imported</label>
<description>Total home energy emported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="solar-energy-imported">
<item-type>Number:Energy</item-type>
<label>Solar Energy Imported</label>
<description>Total solar energy imported</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="full-pack-energy">
<item-type>Number:Energy</item-type>
<label>Battery Full Pack Energy</label>
<description>Battery full pack energy</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="degradation">
<item-type unitHint="%">Number:Dimensionless</item-type>
<label>Battery Degradation</label>
<description>Current battery degradation %, based on 13.5kW full capacity</description>
<state pattern="%.1f %unit%"/>
</channel-type>
</thing:thing-descriptions>