Updated external content (Jenkins build 1421)

pull/2077/head
openHAB Build Server 2023-03-22 05:34:12 +00:00
parent c63fe7c959
commit 5be8b99502
10 changed files with 1179 additions and 578 deletions

File diff suppressed because one or more lines are too long

View File

@ -139,44 +139,47 @@ 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 |
|--------------------|--------------------------|-------------|-------------------------------------------------------------------------------------------|---------------------------------------------------|
| presence | Switch | R | Status of presence: `ON` = presence; `OFF` = no-presence | presencesensor |
| enabled | Switch | R/W | This channel activates or deactivates the sensor | presencesensor |
| last_updated | DateTime | R | Timestamp when the sensor was last updated | all, except daylightsensor |
| last_seen | DateTime | R | Timestamp when the sensor was last seen | all, except daylightsensor |
| power | Number:Power | R | Power usage in Watts | powersensor, sometimes for consumptionsensor |
| consumption | Number:Energy | R | Energy in Watt*Hour | consumptionsensor |
| voltage | Number:ElectricPotential | R | Voltage in V | some powersensors |
| current | Number:ElectricCurrent | R | Current in mA | some powersensors |
| button | Number | R | Last pressed button id on a switch | switch, colorcontrol |
| gesture | Number | R | A gesture that was performed with the switch | switch |
| lightlux | Number:Illuminance | R | Light illuminance in Lux | lightsensor |
| light_level | Number | R | Light level | lightsensor |
| dark | Switch | R | Light level is below the darkness threshold | lightsensor, sometimes for presencesensor |
| daylight | Switch | R | Light level is above the daylight threshold | lightsensor |
| temperature | Number:Temperature | R | Temperature in ˚C | temperaturesensor, some Xiaomi sensors,thermostat |
| humidity | Number:Dimensionless | R | Humidity in % | humiditysensor |
| pressure | Number:Pressure | R | Pressure in hPa | pressuresensor |
| open | Contact | R | Status of contacts: `OPEN`; `CLOSED` | openclosesensor |
| waterleakage | Switch | R | Status of water leakage: `ON` = water leakage detected; `OFF` = no water leakage detected | waterleakagesensor |
| fire | Switch | R | Status of a fire: `ON` = fire was detected; `OFF` = no fire detected | firesensor |
| alarm | Switch | R | Status of an alarm: `ON` = alarm was triggered; `OFF` = no alarm | alarmsensor |
| tampered | Switch | R | Status of a zone: `ON` = zone is being tampered; `OFF` = zone is not tampered | any IAS sensor |
| vibration | Switch | R | Status of vibration: `ON` = vibration was detected; `OFF` = no vibration | alarmsensor |
| light | String | R | Light level: `Daylight`; `Sunset`; `Dark` | daylightsensor |
| value | Number | R | Sun position: `130` = dawn; `140` = sunrise; `190` = sunset; `210` = dusk | daylightsensor |
| battery_level | Number | R | Battery level (in %) | any battery-powered sensor |
| battery_low | Switch | R | Battery level low: `ON`; `OFF` | any battery-powered sensor |
| carbonmonoxide | Switch | R | `ON` = carbon monoxide detected | carbonmonoxide |
| color | Color | R | Color set by remote | colorcontrol |
| windowopen | Contact | R | `windowopen` status is reported by some thermostats | thermostat |
| externalwindowopen | Contact | R/W | forward a status to a thermostat (some devices) | thermostat |
| on | Switch | R | some thermostats report their output state as switch | thermostat |
| locked | Switch | R/W | reports/sets the child lock on some thermostats | thermostat |
| airquality | String | R | Airquality as string | airqualitysensor |
| airqualityppb | Number:Dimensionless | R | Airquality (in parts-per-billion) | airqualitysensor |
| moisture | Number:Dimensionless | R | Moisture | moisturesensor |
| 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 |
| battery_level | Number | R | Battery level (in %) | any battery-powered sensor |
| battery_low | Switch | R | Battery level low: `ON`; `OFF` | any battery-powered sensor |
| button | Number | R | Last pressed button id on a switch | switch, colorcontrol |
| carbonmonoxide | Switch | R | `ON` = carbon monoxide detected | carbonmonoxide |
| color | Color | R | Color set by remote | colorcontrol |
| consumption | Number:Energy | R | Energy in Watt*Hour | consumptionsensor |
| current | Number:ElectricCurrent | R | Current in mA | some powersensors |
| dark | Switch | R | Light level is below the darkness threshold | lightsensor, sometimes for presencesensor |
| daylight | Switch | R | Light level is above the daylight threshold | lightsensor |
| enabled | Switch | R/W | This channel activates or deactivates the sensor | presencesensor |
| externalwindowopen | Contact | R/W | forward a status to a thermostat (some devices) | thermostat |
| fire | Switch | R | Status of a fire: `ON` = fire was detected; `OFF` = no fire detected | firesensor |
| gesture | Number | R | A gesture that was performed with the switch | switch |
| humidity | Number:Dimensionless | R | Humidity in % | humiditysensor |
| last_updated | DateTime | R | Timestamp when the sensor was last updated | all, except daylightsensor |
| last_seen | DateTime | R | Timestamp when the sensor was last seen | all, except daylightsensor |
| light | String | R | Light level: `Daylight`; `Sunset`; `Dark` | daylightsensor |
| lightlux | Number:Illuminance | R | Light illuminance in Lux | lightsensor |
| light_level | Number | R | Light level | lightsensor |
| locked | Switch | R/W | reports/sets the child lock on some thermostats | thermostat |
| moisture | Number:Dimensionless | R | Moisture | moisturesensor |
| on | Switch | R | some thermostats report their output state as switch | thermostat |
| open | Contact | R | Status of contacts: `OPEN`; `CLOSED` | openclosesensor |
| orientation_x, _y, _z | Number | R | Orientation of vibration sensor | vibrationsensor |
| power | Number:Power | R | Power usage in Watts | powersensor, sometimes for consumptionsensor |
| presence | Switch | R | Status of presence: `ON` = presence; `OFF` = no-presence | presencesensor |
| pressure | Number:Pressure | R | Pressure in hPa | pressuresensor |
| tampered | Switch | R | Status of a zone: `ON` = zone is being tampered; `OFF` = zone is not tampered | any IAS sensor |
| temperature | Number:Temperature | R | Temperature in ˚C | temperaturesensor, some Xiaomi sensors,thermostat |
| tiltangle | Number:Angle | R | Tilt angle of vibration sensor | vibrationsensor |
| value | Number | R | Sun position: `130` = dawn; `140` = sunrise; `190` = sunset; `210` = dusk | daylightsensor |
| vibration | Switch | R | Vibration detected | vibrationsensor |
| vibrationstrength | Number | R | Strength of detected vibration (value is device-dependent) | vibrationsensor |
| voltage | Number:ElectricPotential | R | Voltage in V | some powersensors |
| waterleakage | Switch | R | Status of water leakage: `ON` = water leakage detected; `OFF` = no water leakage detected | waterleakagesensor |
| windowopen | Contact | R | `windowopen` status is reported by some thermostats | thermostat |
**NOTE:** Beside other non-mandatory channels, the `battery_level` and `battery_low` channels will be added to the Thing during runtime if the sensor is battery-powered.
The specification of your sensor depends on the deCONZ capabilities.

View File

@ -0,0 +1,189 @@
---
id: ecovacs
label: Ecovacs
title: Ecovacs - Bindings
type: binding
description: "This binding provides integration for vacuum cleaning / mopping robots made by Ecovacs (<https://www.ecovacs.com/>)."
since: 3x
install: manual
---
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
{% include base.html %}
# Ecovacs Binding
This binding provides integration for vacuum cleaning / mopping robots made by Ecovacs (<https://www.ecovacs.com/>).
It discovers devices and communicates to them by using Ecovacs' cloud services.
## Supported Things
- Ecovacs cloud API (`ecovacsapi`)
- Vacuum cleaner (`vacuum`)
At this point, the following devices are fully supported and verified to be working:
- Deebot OZMO 900/905
- Deebot OZMO 920
- Deebot OZMO 930
- Deebot OZMO 950
- Deebot OZMO Slim 10/11
- Deebot N8 series
The following devices will likely work because they are using similar protocols as the above ones:
- Deebot 600/601/605
- Deebot 900/901
- Deebot OZMO 610
- Deebot 710/711/711s
- Deebot OZMO T5
- Deebot (OZMO) T8 series
- Deebot T9 series
- Deebot Slim 2
- Deebot N3 MAX
- Deebot N7
- Deebot U2 series
- Deebot X1 Omni
## Discovery
At first, you need to manually create the bridge thing for the cloud API.
Once that is done, the supported devices will be automatically discovered and added to the inbox.
## Thing Configuration
For the cloud API thing, the following parameters must be configured:
| Config | Description |
|-----------|-------------------------------------------------------------------------------------------------------------------------------|
| email | The email address you used when registering the Ecovacs cloud account |
| password | The cloud account password |
| continent | The continent you are residing on, or 'World' if none matches. This is used to select the correct cloud server to connect to. |
For the vacuum things, there is no required configuration (when using discovery). The following parameters exist:
| Config | Description |
|--------------|-------------------------------------------------------------------------------------------------------------------------------|
| serialNumber | Required: The device's serial number as printed on the barcode below the dust bin. Filled automatically when using discovery. |
| refresh | Refresh interval for polled data (see below), in minutes. By default set to 5 minutes. |
## Channels
The list below lists all channels supported by the binding.
In case a particular channel is not supported by a given device (see remarks), it is automatically removed from the given thing.
| Channel | Type | Description | Read Only | Updated By | Remarks |
|-----------------------------------------|----------------------|-----------------------------------------------------------|-----------|------------|----------|
| actions#command | String | Command to execute | No | Event | [1] |
| status#state | String | Current operational state | Yes | Event | [2] |
| status#current-cleaning-mode | String | Mode used in current cleaning run | Yes | Event | [3], [4] |
| status#current-cleaning-time | Number:Time | Time spent in current cleaning run | Yes | Event | [4] |
| status#current-cleaned-area | Number:Area | Area cleaned in current cleaning run | Yes | Event | [4] |
| status#current-cleaning-spot-definition | String | The spot to clean in current cleaning run | Yes | Event | [4], [5] |
| status#water-system-present | Switch | Whether the device is currently ready for mopping | Yes | Event | [6] |
| status#wifi-rssi | Number:Power | The current Wi-Fi signal strength of the device | Yes | Polling | [7] |
| consumables#main-brush-lifetime | Number:Dimensionless | The remaining life time of the main brush in percent | Yes | Polling | [8] |
| consumables#side-brush-lifetime | Number:Dimensionless | The remaining life time of the side brush in percent | Yes | Polling | |
| consumables#dust-filter-lifetime | Number:Dimensionless | The remaining life time of the dust bin filter in percent | Yes | Polling | |
| consumables#other-component-lifetime | Number:Dimensionless | The remaining time until device maintenance in percent | Yes | Polling | [9] |
| last-clean#last-clean-start | DateTime | The start time of the last completed cleaning run | Yes | Polling | |
| last-clean#last-clean-duration | Number:Time | The duration of the last completed cleaning run | Yes | Polling | |
| last-clean#last-clean-area | Number:Area | The area cleaned in the last completed cleaning run | Yes | Polling | |
| last-clean#last-clean-mode | String | The mode used for the last completed cleaning run | Yes | Polling | [3] |
| last-clean#last-clean-map | Image | The map image of the last completed cleaning run | Yes | Polling | |
| total-stats#total-cleaning-time | Number:Time | The total time spent cleaning during the device life time | Yes | Polling | |
| total-stats#total-cleaned-area | Number:Area | The total area cleaned during the device life time | Yes | Polling | |
| total-stats#total-clean-runs | Number | The total number of clean runs in the device life time | Yes | Polling | |
| settings#auto-empty | Switch | Whether dust bin auto empty to station is enabled | No | Polling | [10] |
| settings#cleaning-passes | Number | Number of cleaning passes to be used (1 or 2) | No | Polling | [9] |
| settings#continuous-cleaning | Switch | Whether unfinished cleaning resumes after charging | No | Polling | |
| settings#suction-power | String | The power level used during cleaning | No | Polling | [11] |
| settings#true-detect-3d | Switch | Whether True Detect 3D is enabled | No | Polling | [12] |
| settings#voice-volume | Dimmer | The voice volume level in percent | No | Polling | [13] |
| settings#water-amount | String | The amount of water to be used when mopping | No | Polling | [14] |
Remarks:
- [1] See [section below](#command-channel-actions)
- [2] Possible states: 'cleaning', 'pause', 'stop', 'drying', 'washing', 'returning' and 'charging' (where 'drying' and 'washing' are only available on newer models with auto empty station)
- [3] Possible states: 'auto', 'edge', 'spot', 'spotArea', 'customArea', 'singleRoom' (some of which depend on device capabilities)
- [4] Current cleaning status is only valid if the device is currently cleaning
- [5] Only valid for 'spot', 'spotArea' and 'customArea' cleaning modes; value can be used for 'spotArea' and 'customArea' commands (see below)
- [6] Only present if device has a mopping system
- [7] Only present on newer generation devices (Deebot OZMO 950 and newer)
- [8] Only present if device has a main brush
- [9] Only present on newer generation devices (Deebot N8/T8 or newer)
- [10] Only present if device has a dustbin auto empty station; supports both on/off command (to turn on/off the setting) and the string 'trigger' (to trigger immediate auto empty)
- [11] Only present if device can control power level. Possible values vary by device: 'normal' and 'high' are always supported, 'silent' and 'higher' are supported for some models
- [12] Only present if device supports True Detect 3D
- [13] Only present if device has voice reporting
- [14] Only present if device has a mopping system. Possible values include 'low', 'medium', 'high' and 'veryhigh'
## Command Channel Actions
The following actions are supported by the `command` channel:
| Name | Action | Remarks |
|--------------|-------------------------------------------|------------------------------------------------------|
| `clean` | Start cleaning in automatic mode. | |
| `spotArea` | Start cleaning specific rooms. | <ul><li>Only if supported by device, which can be recognized by `spotArea` being present in the list of possible states of the `current-cleaning-mode` channel.</li><li>Format: `spotArea:<room IDs>`, where `room IDs` is a semicolon separated list of room letters as shown in Ecovacs' app, so a valid command could e.g. be `spotArea:A;D;E`.</li><li>If you want to run 2 clean passes, amend `:x2` to the command, e.g. `spotArea:A;C;B:x2`.</li></ul> |
| `customArea` | Start cleaning specific areas. | <ul><li>Only if supported by device, which can be recognized by `customArea` being present in the list of possible states of the `current-cleaning-mode` channel.</li><li>Format: `customArea:<x1>;<y1>;<x2>;<y2>, where the parameters are coordinates (in mm) relative to the map.</li><li>The coordinates can be obtained from the `current-cleaning-spot-definition` channel when starting a custom area run from the app.</li><li>If you want to run 2 clean passes, amend `:x2` to the command, e.g. `customArea:100;100;1000;1000:x2`.</li></ul> |
| `pause` | Pause cleaning if it's currently active. | If the device is idle, the command is ignored. |
| `resume` | Resume cleaning if it's currently paused. | If the device is not paused, the command is ignored. |
| `stop` | Stop cleaning immediately. | |
| `charge` | Send device to charging station. | |
## Rule actions
This binding includes a rule action, which allows playback of specific sounds on the device in case the device has a speaker.
There is a separate instance for each device, which can be retrieved like this:
```java
val vacuumActions = getActions("ecovacs","ecovacs:vacuum:1234567890")
```
where the first parameter always has to be `ecovacs` and the second is the full Thing UID of the device that should be used.
Once this action instance is retrieved, you can invoke the `playSound(String type)` method on it:
```java
vacuumActions.playSound("beep")
```
Supported sound types include:
- `beep`
- `iAmHere`
- `startup`
- `suspended`
- `batteryLow`
For special use cases, there is also a `playSoundWithId(int soundId)` method, where you can pass the numeric ID of the sound to play.
The exact meaning of the number depends on the specific device; you'll need to experiment with different numbers to see how the number-to-sound mapping looks like.
For reference, a list for the Deebot 900 can be found [here](https://github.com/bmartin5692/sucks/blob/D901/protocol.md#user-content-sounds).
## File Based Configuration
If you want to create the API bridge in a .things file, the entry has to look as follows:
```java
Bridge ecovacs:ecovacsapi:ecovacsapi [ email="your.email@provider.com", password="yourpassword", continent="ww" ]
```
The possible values for `continent` include the following values:
- `ww` for World
- `eu` for Europe
- `na` for North America
- `as` for Asia
The devices are detected automatically.
If you also want to enter those manually, the syntax is as follows:
```java
Bridge ecovacs:ecovacsapi:ecovacsapi [ email="your.email@provider.com", password="yourpassword", continent="ww" ]
{
Thing vacuum myDeebot "Deebot Vacuum" [ serialNumber="serial as printed on label below dust bin" ]
}
```

View File

@ -332,7 +332,7 @@ Number:Frequency GridFreq "Grid Freq"
Number:Angle GridCosPhi "Grid Cos Phi" <energy> { channel="kostalinverter:piko1020:mypiko1020:gridCosPhi" }
Number:Energy HomeConsumptionDay "Home Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionDay" }
Number:Energy OwnConsumptionDay "Own Consumption Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionDay" }
Number:Dimensionless OwnConsRateDay "Own Cons Rate Day <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateDay" }
Number:Dimensionless OwnConsRateDay "Own Cons Rate Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsRateDay" }
Number:Dimensionless AutonomyDegreeDay "Autonomy Degree Day" <energy> { channel="kostalinverter:piko1020:mypiko1020:autonomyDegreeDay" }
Number:Energy HomeConsumptionTotal "Home Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:homeConsumptionTotal" }
Number:Energy OwnConsumptionTotal "Own Consumption Total" <energy> { channel="kostalinverter:piko1020:mypiko1020:ownConsumptionTotal" }

View File

@ -24,7 +24,7 @@ If you have any issues, questions or an idea for additional features, please tak
## Latest Changes
::: tip State of this document
This documentation refers to release [v3.6.2](https://github.com/openhab/openhab-google-assistant/releases/tag/v3.6.2) of [openHAB Google Assistant](https://github.com/openhab/openhab-google-assistant) published on 2023-02-21
This documentation refers to release [v3.6.3](https://github.com/openhab/openhab-google-assistant/releases/tag/v3.6.3) of [openHAB Google Assistant](https://github.com/openhab/openhab-google-assistant) published on 2023-03-21
:::
### v3.6.0

View File

@ -20,6 +20,11 @@ This voice service allows you to use the open source library Rustpotter as your
Rustpotter provides personal on-device wake word detection. You need to generate a model for your keyword using audio samples.
You can test library in your browser using these web pages:
- [The spot demo](https://givimad.github.io/rustpotter-worklet-demo/), which include some example wakewords (but it's recommended to use your own).
- [The model creation demo](https://givimad.github.io/rustpotter-create-model-demo/), it allows you to record compatible wav files and generate a wakeword file that you can test on the previous page.
Important: No voice data listened by this service will be uploaded to the Cloud.
The voice data is processed offline, locally on your openHAB server by Rustpotter.
@ -27,17 +32,19 @@ The voice data is processed offline, locally on your openHAB server by Rustpotte
After installing, you will be able to access the service options through the openHAB configuration page in UI (**Settings / Other Services - Rustpotter Keyword Spotter**) to edit them:
* **Threshold** - Configures the detector threshold, is the min score (in range 0. to 1.) that some wake word template should obtain to trigger a detection. Defaults to 0.5.
* **Averaged Threshold** - Configures the detector averaged threshold, is the min score (in range 0. to 1.) that the audio should obtain against a combination of the wake word templates, the detection will be aborted if this is not the case. This way it can prevent to run the comparison of the current frame against each of the wake word templates which saves cpu. If set to 0 this functionality is disabled.
* **Eager mode** - Enables eager mode. End detection as soon as a result is over the score, instead of waiting to see if the next frame has a higher score.
* **Noise Detection Mode** - Use build-in noise detection to reduce computation on absence of noise. Configures the difficulty to consider a frame as noise (the required noise level).
* **Noise Detection Sensitivity** - Noise/silence ratio in the last second to consider noise is detected. Defaults to 0.5.
* **VAD Mode** - Use a voice activity detector to reduce computation in the absence of vocal sound.
* **VAD Sensitivity** - Voice/silence ratio in the last second to consider voice is detected.
* **VAD Delay** - Seconds to disable the vad detector after voice is detected. Defaults to 3.
* **Comparator Ref** - Configures the reference for the comparator used to match the samples.
* **Comparator Band Size** - Configures the band-size for the comparator used to match the samples.
- **Threshold** - Configures the detector threshold, is the min score (in range 0. to 1.) that some wake word template should obtain to trigger a detection. Defaults to 0.5.
- **Averaged Threshold** - Configures the detector averaged threshold, is the min score (in range 0. to 1.) that the audio should obtain against a combination of the wake word templates, the detection will be aborted if this is not the case. This way it can prevent to run the comparison of the current frame against each of the wake word templates which saves cpu. If set to 0 this functionality is disabled.
- **Score Mode** - Indicates how to calculate the final score.
- **Min Scores** - Minimum number of positive scores to consider a partial detection as a detection.
- **Comparator Ref** - Configures the reference for the comparator used to match the samples.
- **Comparator Band Size** - Configures the band-size for the comparator used to match the samples.
- **Gain Normalizer** - Enables an audio filter that intent to approximate the volume of the stream to a reference level.
- **Min Gain** - Min gain applied by the gain normalizer filter.
- **Max Gain** - Max gain applied by the gain normalizer filter.
- **Gain Ref** - The RMS reference used by the gain-normalizer to calculate the gain applied. If unset an estimation of the wakeword level is used.
- **Band Pass** - Enables an audio filter that attenuates frequencies outside the low cutoff and high cutoff range.
- **Low Cutoff** - Low cutoff for the band-pass filter.
- **High Cutoff** - High cutoff for the band-pass filter.
In case you would like to setup the service via a text file, create a new file in `$OPENHAB_ROOT/conf/services` named `rustpotterks.cfg`
@ -46,21 +53,24 @@ Its contents should look similar to:
```
org.openhab.voice.rustpotterks:threshold=0.5
org.openhab.voice.rustpotterks:averagedthreshold=0.2
org.openhab.voice.rustpotterks:scoreMode=max
org.openhab.voice.rustpotterks:minScores=5
org.openhab.voice.rustpotterks:comparatorRef=0.22
org.openhab.voice.rustpotterks:comparatorBandSize=6
org.openhab.voice.rustpotterks:eagerMode=true
org.openhab.voice.rustpotterks:noiseDetectionMode=hard
org.openhab.voice.rustpotterks:noiseDetectionSensitivity=0.5
org.openhab.voice.rustpotterks:vadMode=aggressive
org.openhab.voice.rustpotterks:vadSensitivity=0.5
org.openhab.voice.rustpotterks:vadDelay=3
org.openhab.voice.rustpotterks:comparatorBandSize=5
org.openhab.voice.rustpotterks:gainNormalizer=true
org.openhab.voice.rustpotterks:minGain=0.5
org.openhab.voice.rustpotterks:maxGain=1
org.openhab.voice.rustpotterks:gainRef=
org.openhab.voice.rustpotterks:bandPass=true
org.openhab.voice.rustpotterks:lowCutoff=80
org.openhab.voice.rustpotterks:highCutoff=400
```
## Magic Word Configuration
The magic word to spot is gathered from your 'Voice' configuration.
You can generate your own wake word model by using the [Rustpotter CLI](https://github.com/GiviMAD/rustpotter-cli).
You can generate your own wakeword files using the [Rustpotter CLI](https://github.com/GiviMAD/rustpotter-cli).
You can also download the models used as examples on the [rustpotter web demo](https://givimad.github.io/rustpotter-worklet-demo/) from [this folder](https://github.com/GiviMAD/rustpotter-worklet-demo/tree/main/static).
@ -74,11 +84,11 @@ The service will only work if it's able to find the correct rpw for your magic w
You can setup your preferred default keyword spotter and default magic word in the UI:
* Go to **Settings**.
* Edit **System Services - Voice**.
* Set **Rustpotter Keyword Spotter** as **Default Keyword Spotter**.
* Choose your preferred **Magic Word** for your setup.
* Choose optionally your **Listening Switch** item that will be switch ON during the period when the dialog processor has spotted the keyword and is listening for commands.
- Go to **Settings**.
- Edit **System Services - Voice**.
- Set **Rustpotter Keyword Spotter** as **Default Keyword Spotter**.
- Choose your preferred **Magic Word** for your setup.
- Choose optionally your **Listening Switch** item that will be switch ON during the period when the dialog processor has spotted the keyword and is listening for commands.
In case you would like to setup these settings via a text file, you can edit the file `runtime.cfg` in `$OPENHAB_ROOT/conf/services` and set the following entries:

View File

@ -0,0 +1,329 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="deconz"
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">
<channel-type id="airquality">
<item-type>String</item-type>
<label>Air Quality</label>
<description>Current air quality level based on volatile organic compounds (VOCs) measurement. Example: good or poor,
...</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="airqualityppb">
<item-type>Number:Dimensionless</item-type>
<label>Air Quality (ppb)</label>
<description>Current air quality based on measurements of volatile organic compounds (VOCs). The measured value is
specified in ppb (parts per billion).</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="alarm">
<item-type>Switch</item-type>
<label>Alarm</label>
<description>Alarm was triggered.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="button">
<item-type>Number</item-type>
<label>Button</label>
<description>The Button that was last pressed on the switch.</description>
<state readOnly="true" pattern="%d"/>
</channel-type>
<channel-type id="buttonevent">
<kind>Trigger</kind>
<label>Button Trigger</label>
<description>This channel is triggered on a button event. The trigger payload consists of the button event number.
</description>
<event></event>
</channel-type>
<channel-type id="carbonmonoxide">
<item-type>Switch</item-type>
<label>Carbon-monoxide</label>
<description>Carbon-monoxide was detected.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="consumption">
<item-type>Number:Energy</item-type>
<label>Consumption</label>
<description>Current consumption</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="current">
<item-type>Number:ElectricCurrent</item-type>
<label>Current</label>
<description>Current current</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="dark">
<item-type>Switch</item-type>
<label>Dark</label>
<description>Light level is below the darkness threshold.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="daylight">
<item-type>Switch</item-type>
<label>Daylight</label>
<description>Light level is above the daylight threshold.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="externalwindowopen">
<item-type>Contact</item-type>
<label>External Window Open</label>
</channel-type>
<channel-type id="fire">
<item-type>Switch</item-type>
<label>Fire</label>
<description>A fire was detected.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="gesture">
<item-type>Number</item-type>
<label>Gesture</label>
<description>A gesture that was performed with the switch.</description>
<state readOnly="true" pattern="%d">
<options>
<option value="0">None</option>
<option value="1">Shake</option>
<option value="2">Drop</option>
<option value="3">Flip 90</option>
<option value="4">Flip 180</option>
<option value="5">Push</option>
<option value="6">Double Tap</option>
<option value="7">Rotate Clockwise</option>
<option value="8">Rotate Counter Clockwise</option>
</options>
</state>
</channel-type>
<channel-type id="gestureevent">
<kind>Trigger</kind>
<label>Gesture Trigger</label>
<description>This channel is triggered on a gesture event. The trigger payload consists of the gesture event number.</description>
<event></event>
</channel-type>
<channel-type id="heatsetpoint">
<item-type>Number:Temperature</item-type>
<label>Target Temperature</label>
<description>Target temperature</description>
<category>Heating</category>
<state pattern="%.1f %unit%" step="0.5" max="28" min="6"/>
</channel-type>
<channel-type id="humidity">
<item-type>Number:Dimensionless</item-type>
<label>Humidity</label>
<description>Current humidity</description>
<category>Humidity</category>
<state readOnly="true" pattern="%.2f %unit%"/>
</channel-type>
<channel-type id="last_seen">
<item-type>DateTime</item-type>
<label>Last Seen</label>
<description>The date and time when the sensor was last seen.</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
</channel-type>
<channel-type id="last_updated">
<item-type>DateTime</item-type>
<label>Last Updated</label>
<description>The date and time when the sensor was last updated.</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
</channel-type>
<channel-type id="light">
<item-type>String</item-type>
<label>Lightlevel</label>
<state readOnly="true">
<options>
<option value="daylight">Daylight</option>
<option value="sunset">Sunset</option>
<option value="dark">Dark</option>
</options>
</state>
</channel-type>
<channel-type id="lightlux">
<item-type>Number:Illuminance</item-type>
<label>Illuminance</label>
<description>Current light illuminance</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="light_level" advanced="true">
<item-type>Number</item-type>
<label>Light Level</label>
<description>Current light level.</description>
<state readOnly="true" pattern="%d"/>
</channel-type>
<channel-type id="locked">
<item-type>Switch</item-type>
<label>Locked</label>
<description>Status of this thermostat's child lock.</description>
<category>Lock</category>
</channel-type>
<channel-type id="mode">
<item-type>String</item-type>
<label>Mode</label>
<description>Current mode</description>
<category>Heating</category>
<state>
<options>
<option value="AUTO">auto</option>
<option value="HEAT">heat</option>
<option value="OFF">off</option>
</options>
</state>
</channel-type>
<channel-type id="moisture">
<item-type>Number:Dimensionless</item-type>
<label>Moisture</label>
<description>Current moisture</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="offset">
<item-type>Number:Temperature</item-type>
<label>Offset</label>
<description>Temperature offset</description>
<state pattern="%.2f %unit%" step="0.01"/>
</channel-type>
<channel-type id="on">
<item-type>Switch</item-type>
<label>Heater State</label>
<state readOnly="true"/>
</channel-type>
<channel-type id="open">
<item-type>Contact</item-type>
<label>Open/Close</label>
<description>Open/Close detected</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="orientation_x">
<item-type>Number</item-type>
<label>Orientation X</label>
<state readOnly="true"/>
</channel-type>
<channel-type id="orientation_y">
<item-type>Number</item-type>
<label>Orientation Y</label>
<state readOnly="true"/>
</channel-type>
<channel-type id="orientation_z">
<item-type>Number</item-type>
<label>Orientation Z</label>
<state readOnly="true"/>
</channel-type>
<channel-type id="power">
<item-type>Number:Power</item-type>
<label>Power</label>
<description>Current power usage</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="pressure">
<item-type>Number:Pressure</item-type>
<label>Pressure</label>
<description>Current pressure</description>
<category>Pressure</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="tampered">
<item-type>Switch</item-type>
<label>Tampered</label>
<description>A zone is being tampered.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="temperature">
<item-type>Number:Temperature</item-type>
<label>Temperature</label>
<description>Current temperature</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.2f %unit%"/>
</channel-type>
<channel-type id="tiltangle">
<item-type>Number:Angle</item-type>
<label>Tilt Angle</label>
<state readOnly="true"/>
</channel-type>
<channel-type id="value">
<item-type>Number</item-type>
<label>Daylight Value</label>
<description>Dawn is around 130, sunrise at 140, sunset at 190, and dusk at 210</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="valve">
<item-type>Number:Dimensionless</item-type>
<label>Valve position</label>
<description>Current valve position</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="vibration">
<item-type>Switch</item-type>
<label>Vibration</label>
<description>Vibration was detected.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="vibrationstrength">
<item-type>Number</item-type>
<label>Vibrationstrength</label>
<description>Vibration strength, value is device-dependent.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="voltage">
<item-type>Number:ElectricPotential</item-type>
<label>Voltage</label>
<description>Current voltage</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="waterleakage">
<item-type>Switch</item-type>
<label>Water Leakage</label>
<description>Water leakage detected</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="windowopen">
<item-type>Contact</item-type>
<label>Window Open</label>
</channel-type>
</thing:thing-descriptions>

View File

@ -4,104 +4,64 @@
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="presencesensor">
<!-- thing types -->
<thing-type id="airqualitysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Presence Sensor</label>
<label>Air Quality Sensor</label>
<channels>
<channel typeId="system.motion" id="presence"/>
<channel typeId="airquality" id="airquality"/>
<channel typeId="airqualityppb" id="airqualityppb"/>
<channel typeId="last_updated" id="last_updated"/>
<channel typeId="system.power" id="enabled"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="alarmsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Alarm Sensor</label>
<channels>
<channel typeId="alarm" id="alarm"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="carbonmonoxidesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Carbon-monoxide Sensor</label>
<channels>
<channel typeId="carbonmonoxide" id="carbonmonoxide"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="batterysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Battery Sensor</label>
<channels>
<channel typeId="system.battery-level" id="battery_level"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="last_updated">
<item-type>DateTime</item-type>
<label>Last Updated</label>
<description>The date and time when the sensor was last updated.</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
</channel-type>
<channel-type id="last_seen">
<item-type>DateTime</item-type>
<label>Last Seen</label>
<description>The date and time when the sensor was last seen.</description>
<category>Time</category>
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
</channel-type>
<thing-type id="powersensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Power Sensor</label>
<channels>
<channel typeId="power" id="power"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="power">
<item-type>Number:Power</item-type>
<label>Power</label>
<description>Current power usage</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="voltage">
<item-type>Number:ElectricPotential</item-type>
<label>Voltage</label>
<description>Current voltage</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="current">
<item-type>Number:ElectricCurrent</item-type>
<label>Current</label>
<description>Current current</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<thing-type id="consumptionsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Consumption Sensor</label>
<channels>
<channel typeId="consumption" id="consumption"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="consumption">
<item-type>Number:Energy</item-type>
<label>Consumption</label>
<description>Current consumption</description>
<category>Energy</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<thing-type id="colorcontrol">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
@ -113,72 +73,64 @@
<channel typeId="button" id="button"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="switch">
<thing-type id="consumptionsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Switch/Button</label>
<label>Consumption Sensor</label>
<channels>
<channel typeId="buttonevent" id="buttonevent"/>
<channel typeId="button" id="button"/>
<channel typeId="consumption" id="consumption"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="buttonevent">
<kind>Trigger</kind>
<label>Button Trigger</label>
<description>This channel is triggered on a button event. The trigger payload consists of the button event number.
</description>
<event></event>
</channel-type>
<thing-type id="daylightsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Daylight Sensor</label>
<channels>
<channel typeId="value" id="value"/>
<channel typeId="light" id="light"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="button">
<item-type>Number</item-type>
<label>Button</label>
<description>The Button that was last pressed on the switch.</description>
<state readOnly="true" pattern="%d"/>
</channel-type>
<thing-type id="firesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Fire Sensor</label>
<channels>
<channel typeId="fire" id="fire"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="gestureevent">
<kind>Trigger</kind>
<label>Gesture Trigger</label>
<description>This channel is triggered on a gesture event. The trigger payload consists of the gesture event number.</description>
<event></event>
</channel-type>
<channel-type id="gesture">
<item-type>Number</item-type>
<label>Gesture</label>
<description>A gesture that was performed with the switch.</description>
<state readOnly="true" pattern="%d">
<options>
<option value="0">None</option>
<option value="1">Shake</option>
<option value="2">Drop</option>
<option value="3">Flip 90</option>
<option value="4">Flip 180</option>
<option value="5">Push</option>
<option value="6">Double Tap</option>
<option value="7">Rotate Clockwise</option>
<option value="8">Rotate Counter Clockwise</option>
</options>
</state>
</channel-type>
<thing-type id="humiditysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Humidity Sensor</label>
<channels>
<channel typeId="humidity" id="humidity"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="lightsensor">
<supported-bridge-type-refs>
@ -192,333 +144,10 @@
<channel typeId="daylight" id="daylight"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="lightlux">
<item-type>Number:Illuminance</item-type>
<label>Illuminance</label>
<description>Current light illuminance</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="light_level" advanced="true">
<item-type>Number</item-type>
<label>Light Level</label>
<description>Current light level.</description>
<state readOnly="true" pattern="%d"/>
</channel-type>
<channel-type id="dark">
<item-type>Switch</item-type>
<label>Dark</label>
<description>Light level is below the darkness threshold.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="daylight">
<item-type>Switch</item-type>
<label>Daylight</label>
<description>Light level is above the daylight threshold.</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="temperaturesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Temperature Sensor</label>
<channels>
<channel typeId="temperature" id="temperature"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="temperature">
<item-type>Number:Temperature</item-type>
<label>Temperature</label>
<description>Current temperature</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.2f %unit%"/>
</channel-type>
<thing-type id="humiditysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Humidity Sensor</label>
<channels>
<channel typeId="humidity" id="humidity"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="humidity">
<item-type>Number:Dimensionless</item-type>
<label>Humidity</label>
<description>Current humidity</description>
<category>Humidity</category>
<state readOnly="true" pattern="%.2f %unit%"/>
</channel-type>
<thing-type id="pressuresensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Pressure Sensor</label>
<channels>
<channel typeId="pressure" id="pressure"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="pressure">
<item-type>Number:Pressure</item-type>
<label>Pressure</label>
<description>Current pressure</description>
<category>Pressure</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<thing-type id="daylightsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Daylight Sensor</label>
<channels>
<channel typeId="value" id="value"/>
<channel typeId="light" id="light"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="value">
<item-type>Number</item-type>
<label>Daylight Value</label>
<description>Dawn is around 130, sunrise at 140, sunset at 190, and dusk at 210</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="light">
<item-type>String</item-type>
<label>Lightlevel</label>
<state readOnly="true">
<options>
<option value="daylight">Daylight</option>
<option value="sunset">Sunset</option>
<option value="dark">Dark</option>
</options>
</state>
</channel-type>
<thing-type id="openclosesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Open/Close Sensor</label>
<channels>
<channel typeId="open" id="open"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="open">
<item-type>Contact</item-type>
<label>Open/Close</label>
<description>Open/Close detected</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="waterleakagesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Water Leakage Sensor</label>
<channels>
<channel typeId="waterleakage" id="waterleakage"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="waterleakage">
<item-type>Switch</item-type>
<label>Water Leakage</label>
<description>Water leakage detected</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="firesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Fire Sensor</label>
<channels>
<channel typeId="fire" id="fire"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="fire">
<item-type>Switch</item-type>
<label>Fire</label>
<description>A fire was detected.</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="alarmsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Alarm Sensor</label>
<channels>
<channel typeId="alarm" id="alarm"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="alarm">
<item-type>Switch</item-type>
<label>Alarm</label>
<description>Alarm was triggered.</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="tampered">
<item-type>Switch</item-type>
<label>Tampered</label>
<description>A zone is being tampered.</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="vibrationsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Vibration Sensor</label>
<channels>
<channel typeId="vibration" id="vibration"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="vibration">
<item-type>Switch</item-type>
<label>Vibration</label>
<description>Vibration was detected.</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="batterysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Battery Sensor</label>
<channels>
<channel typeId="system.battery-level" id="battery_level"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="carbonmonoxidesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Carbon-monoxide Sensor</label>
<channels>
<channel typeId="carbonmonoxide" id="carbonmonoxide"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="carbonmonoxide">
<item-type>Switch</item-type>
<label>Carbon-monoxide</label>
<description>Carbon-monoxide was detected.</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="airqualitysensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Air Quality Sensor</label>
<channels>
<channel typeId="airquality" id="airquality"/>
<channel typeId="airqualityppb" id="airqualityppb"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="airquality">
<item-type>String</item-type>
<label>Air Quality</label>
<description>Current air quality level based on volatile organic compounds (VOCs) measurement. Example: good or poor,
...</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="airqualityppb">
<item-type>Number:Dimensionless</item-type>
<label>Air Quality (ppb)</label>
<description>Current air quality based on measurements of volatile organic compounds (VOCs). The measured value is
specified in ppb (parts per billion).</description>
<state readOnly="true"/>
</channel-type>
<thing-type id="moisturesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
@ -528,18 +157,92 @@
<channel typeId="moisture" id="moisture"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="moisture">
<item-type>Number:Dimensionless</item-type>
<label>Moisture</label>
<description>Current moisture</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<thing-type id="powersensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Power Sensor</label>
<channels>
<channel typeId="power" id="power"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="openclosesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Open/Close Sensor</label>
<channels>
<channel typeId="open" id="open"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="presencesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Presence Sensor</label>
<channels>
<channel typeId="system.motion" id="presence"/>
<channel typeId="last_updated" id="last_updated"/>
<channel typeId="system.power" id="enabled"/>
</channels>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="pressuresensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Pressure Sensor</label>
<channels>
<channel typeId="pressure" id="pressure"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="switch">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Switch/Button</label>
<channels>
<channel typeId="buttonevent" id="buttonevent"/>
<channel typeId="button" id="button"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="temperaturesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Temperature Sensor</label>
<channels>
<channel typeId="temperature" id="temperature"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="thermostat">
<supported-bridge-type-refs>
@ -558,56 +261,30 @@
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<channel-type id="locked">
<item-type>Switch</item-type>
<label>Locked</label>
<description>Status of this thermostat's child lock.</description>
<category>Lock</category>
</channel-type>
<channel-type id="windowopen">
<item-type>Contact</item-type>
<label>Window Open</label>
</channel-type>
<channel-type id="externalwindowopen">
<item-type>Contact</item-type>
<label>External Window Open</label>
</channel-type>
<channel-type id="heatsetpoint">
<item-type>Number:Temperature</item-type>
<label>Target Temperature</label>
<description>Target temperature</description>
<category>Heating</category>
<state pattern="%.1f %unit%" step="0.5" max="28" min="6"/>
</channel-type>
<channel-type id="mode">
<item-type>String</item-type>
<label>Mode</label>
<description>Current mode</description>
<category>Heating</category>
<state>
<options>
<option value="AUTO">auto</option>
<option value="HEAT">heat</option>
<option value="OFF">off</option>
</options>
</state>
</channel-type>
<channel-type id="offset">
<item-type>Number:Temperature</item-type>
<label>Offset</label>
<description>Temperature offset</description>
<state pattern="%.2f %unit%" step="0.01"/>
</channel-type>
<channel-type id="valve">
<item-type>Number:Dimensionless</item-type>
<label>Valve position</label>
<description>Current valve position</description>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="on">
<item-type>Switch</item-type>
<label>Heater State</label>
<state readOnly="true"/>
</channel-type>
<thing-type id="vibrationsensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Vibration Sensor</label>
<channels>
<channel typeId="vibration" id="vibration"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
<thing-type id="waterleakagesensor">
<supported-bridge-type-refs>
<bridge-type-ref id="deconz"/>
</supported-bridge-type-refs>
<label>Water Leakage Sensor</label>
<channels>
<channel typeId="waterleakage" id="waterleakage"/>
<channel typeId="last_updated" id="last_updated"/>
</channels>
<representation-property>uid</representation-property>
<config-description-ref uri="thing-type:deconz:sensor"/>
</thing-type>
</thing:thing-descriptions>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="ecovacs"
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">
<!-- Ecovacs API account -->
<bridge-type id="ecovacsapi">
<label>Ecovacs API Account</label>
<description>The API account</description>
<config-description>
<parameter name="email" type="text">
<label>Email</label>
<context>email</context>
<description>Email address for logging in to Ecovacs server</description>
<required>true</required>
</parameter>
<parameter name="password" type="text">
<label>Password</label>
<context>password</context>
<description>Password for logging in to Ecovacs server</description>
<required>true</required>
</parameter>
<parameter name="continent" type="text">
<label>Continent</label>
<description>Continent the account was registered on. Choose the one you are located in, or "World" if none matches.</description>
<default>ww</default>
<options>
<option value="ww">World</option>
<option value="eu">Europe</option>
<option value="na">North America</option>
<option value="as">Asia</option>
</options>
</parameter>
</config-description>
</bridge-type>
</thing:thing-descriptions>

View File

@ -0,0 +1,355 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="ecovacs"
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="vacuum">
<supported-bridge-type-refs>
<bridge-type-ref id="ecovacsapi"/>
</supported-bridge-type-refs>
<label>Ecovacs Vacuum Cleaner</label>
<description>Represents an Ecovacs vacuum cleaner</description>
<channel-groups>
<channel-group id="actions" typeId="actions"/>
<channel-group id="status" typeId="status"/>
<channel-group id="last-clean" typeId="last-clean"/>
<channel-group id="total-stats" typeId="total-stats"/>
<channel-group id="consumables" typeId="consumables"/>
<channel-group id="settings" typeId="settings"/>
</channel-groups>
<config-description>
<parameter name="serialNumber" type="text" required="true">
<label>Device Serial Number</label>
</parameter>
<parameter name="refresh" type="integer" unit="min" min="1" required="false">
<label>Refresh Interval</label>
<advanced>true</advanced>
<description>Specifies the refresh interval in minutes.</description>
<unitLabel>Minutes</unitLabel>
<default>5</default>
</parameter>
</config-description>
</thing-type>
<channel-group-type id="status">
<label>Status</label>
<channels>
<channel id="state" typeId="state"/>
<channel id="battery" typeId="system.battery-level"/>
<channel id="current-cleaning-mode" typeId="current-cleaning-mode"/>
<channel id="current-cleaning-time" typeId="current-cleaning-time"/>
<channel id="current-cleaned-area" typeId="current-cleaned-area"/>
<channel id="current-cleaning-spot-definition" typeId="current-cleaning-spot-definition"/>
<channel id="water-system-present" typeId="water-system-present"/>
<channel id="wifi-rssi" typeId="wifi-rssi"/>
<channel id="error-code" typeId="error-code"/>
<channel id="error-description" typeId="error-description"/>
</channels>
</channel-group-type>
<channel-group-type id="actions">
<label>Actions</label>
<channels>
<channel id="command" typeId="command"/>
</channels>
</channel-group-type>
<channel-group-type id="total-stats">
<label>Device Lifetime Statistics</label>
<channels>
<channel id="total-cleaning-time" typeId="total-cleaning-time"/>
<channel id="total-cleaned-area" typeId="total-cleaned-area"/>
<channel id="total-clean-runs" typeId="total-clean-runs"/>
</channels>
</channel-group-type>
<channel-group-type id="last-clean">
<label>Last Clean Run</label>
<channels>
<channel id="last-clean-start" typeId="last-clean-start"/>
<channel id="last-clean-duration" typeId="last-clean-duration"/>
<channel id="last-clean-area" typeId="last-clean-area"/>
<channel id="last-clean-mode" typeId="last-clean-mode"/>
<channel id="last-clean-map" typeId="last-clean-map"/>
</channels>
</channel-group-type>
<channel-group-type id="consumables">
<label>Consumables</label>
<channels>
<channel id="main-brush-lifetime" typeId="main-brush-lifetime"/>
<channel id="side-brush-lifetime" typeId="side-brush-lifetime"/>
<channel id="dust-filter-lifetime" typeId="dust-filter-lifetime"/>
<channel id="other-component-lifetime" typeId="other-component-lifetime"/>
</channels>
</channel-group-type>
<channel-group-type id="settings">
<label>Settings</label>
<channels>
<channel id="water-amount" typeId="water-amount"/>
<channel id="suction-power" typeId="suction-power"/>
<channel id="voice-volume" typeId="voice-volume"/>
<channel id="auto-empty" typeId="auto-empty"/>
<channel id="cleaning-passes" typeId="cleaning-passes"/>
<channel id="continuous-cleaning" typeId="continuous-cleaning"/>
<channel id="true-detect-3d" typeId="true-detect-3d"/>
</channels>
</channel-group-type>
<channel-type id="state">
<item-type>String</item-type>
<label>State</label>
<description>Current state</description>
<state readOnly="true">
<options>
<option value="cleaning">Cleaning</option>
<option value="pause">Paused</option>
<option value="stop">Stopped</option>
<option value="washing">Washing the cleaning pad</option>
<option value="drying">Drying the cleaning pad</option>
<option value="returning">Going to charge station</option>
<option value="charging">Charging</option>
<option value="idle">Idle</option>
</options>
</state>
</channel-type>
<channel-type id="command">
<item-type>String</item-type>
<label>Command</label>
<description>Command to execute</description>
<state>
<options>
<option value="clean">Automatic cleaning</option>
<option value="pause">Pause cleaning</option>
<option value="resume">Resume cleaning</option>
<option value="stop">Stop</option>
<option value="charge">Go to charge station</option>
</options>
</state>
</channel-type>
<channel-type id="current-cleaning-mode">
<item-type>String</item-type>
<label>Current Cleaning Mode</label>
<description>Mode used in current clean cycle</description>
<state readOnly="true">
<options>
<option value="auto">@text/ecovacs.cleaning-mode.auto</option>
<option value="edge">@text/ecovacs.cleaning-mode.edge</option>
<option value="spot">@text/ecovacs.cleaning-mode.spot</option>
<option value="spotArea">@text/ecovacs.cleaning-mode.spotArea</option>
<option value="customArea">@text/ecovacs.cleaning-mode.customArea</option>
<option value="singleRoom">@text/ecovacs.cleaning-mode.singleRoom</option>
</options>
</state>
</channel-type>
<channel-type id="current-cleaning-time">
<item-type>Number:Time</item-type>
<label>Current Cleaning Time</label>
<description>Cleaning time in current clean cycle</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="current-cleaned-area">
<item-type>Number:Area</item-type>
<label>Current Cleaned Area</label>
<description>Cleaned area in current clean cycle</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="current-cleaning-spot-definition" advanced="true">
<item-type>String</item-type>
<label>Current Cleaning Spot</label>
<description>Custom or spot area used in current clean cycle</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="total-cleaning-time">
<item-type>Number:Time</item-type>
<label>Total Cleaning Time</label>
<description>Cleaning time in device life time</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="total-cleaned-area">
<item-type>Number:Area</item-type>
<label>Total Cleaned Area</label>
<description>Cleaned area in device life time</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="total-clean-runs">
<item-type>Number</item-type>
<label>Total Clean Runs</label>
<description>Number of cleaning runs in device life time</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="last-clean-start">
<item-type>DateTime</item-type>
<label>Last Cleaning Start</label>
<description>Start time of last completed cleaning run</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="last-clean-duration">
<item-type>Number:Time</item-type>
<label>Last Cleaning Duration</label>
<description>Duration of last completed cleaning run</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="last-clean-area">
<item-type>Number:Area</item-type>
<label>Last Cleaned Area</label>
<description>Cleaned area in last completed cleaning run</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="last-clean-mode">
<item-type>String</item-type>
<label>Last Cleaning Mode</label>
<description>Operation mode used in last completed cleaning run</description>
<state readOnly="true">
<options>
<option value="auto">@text/ecovacs.cleaning-mode.auto</option>
<option value="edge">@text/ecovacs.cleaning-mode.edge</option>
<option value="spot">@text/ecovacs.cleaning-mode.spot</option>
<option value="spotArea">@text/ecovacs.cleaning-mode.spotArea</option>
<option value="customArea">@text/ecovacs.cleaning-mode.customArea</option>
<option value="singleRoom">@text/ecovacs.cleaning-mode.singleRoom</option>
</options>
</state>
</channel-type>
<channel-type id="last-clean-map">
<item-type>Image</item-type>
<label>Last Clean Map</label>
<description>Cleaning map for last completed cleaning run</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="auto-empty" advanced="true">
<item-type>Switch</item-type>
<label>Auto Empty</label>
<description>Automatically empty dust bin in station</description>
</channel-type>
<channel-type id="cleaning-passes" advanced="true">
<item-type>Number</item-type>
<label>Cleaning Passes</label>
<description>Number of cleaning passes used by default (if not overridden in command)</description>
<state min="1" max="2" step="1" pattern="%d"/>
</channel-type>
<channel-type id="continuous-cleaning" advanced="true">
<item-type>Switch</item-type>
<label>Continuous Cleaning</label>
<description>Automatically resume unfinished cleaning after charging</description>
</channel-type>
<channel-type id="suction-power">
<item-type>String</item-type>
<label>Cleaning Power Level</label>
<description>Amount of suction power to be used while cleaning</description>
<state>
<options>
<option value="silent">Silent</option>
<option value="normal">Normal</option>
<option value="high">Maximum</option>
<option value="higher">Maximum+</option>
</options>
</state>
</channel-type>
<channel-type id="true-detect-3d" advanced="true">
<item-type>Switch</item-type>
<label>True Detect 3D</label>
<description>Enable the True Detect 3D object recognition technology</description>
</channel-type>
<channel-type id="water-system-present">
<item-type>Switch</item-type>
<label>Water System Present</label>
<description>Water plate with mop attached to device?</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="water-amount" advanced="true">
<item-type>String</item-type>
<label>Mopping Water Amount</label>
<state>
<options>
<option value="low">Low</option>
<option value="medium">Medium</option>
<option value="high">High</option>
<option value="veryhigh">Very high</option>
</options>
</state>
</channel-type>
<channel-type id="wifi-rssi" advanced="true">
<item-type>Number:Power</item-type>
<label>Wi-Fi Signal Strength</label>
<description>Received signal strength indicator for Wi-Fi</description>
<category>QualityOfService</category>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="main-brush-lifetime">
<item-type>Number:Dimensionless</item-type>
<label>Main Brush Lifetime</label>
<description>Remaining life time of main brush in percent</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="side-brush-lifetime">
<item-type>Number:Dimensionless</item-type>
<label>Side Brush Lifetime</label>
<description>Remaining life time of side brush in percent</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="dust-filter-lifetime">
<item-type>Number:Dimensionless</item-type>
<label>Dust Filter Lifetime</label>
<description>Remaining life time of dust bin filter in percent</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="other-component-lifetime">
<item-type>Number:Dimensionless</item-type>
<label>Other Component Lifetime</label>
<description>Remaining time until device maintenance is required in percent</description>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="voice-volume">
<item-type>Dimmer</item-type>
<label>Voice Volume</label>
<description>Volume level of voice reports</description>
<state min="0" max="100" step="10"/>
</channel-type>
<channel-type id="error-code">
<item-type>Number</item-type>
<label>Last Error Code</label>
<description>The numerical value (code) of the last encountered error</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="error-description">
<item-type>String</item-type>
<label>Last Error Description</label>
<description>A text describing the last encountered error</description>
<state readOnly="true"/>
</channel-type>
</thing:thing-descriptions>