Updated external content (Jenkins build 995)
parent
f6b3d9fc6b
commit
e7762f2ff7
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,243 @@
|
|||
---
|
||||
id: wundergroundupdatereceiver
|
||||
label: Wunderground Update Receiver
|
||||
title: Wunderground Update Receiver - Bindings
|
||||
type: binding
|
||||
description: "Many personal weather stations or similar devices are only capable of submitting measurements to the wunderground.com update site."
|
||||
since: 3x
|
||||
install: manual
|
||||
---
|
||||
|
||||
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
|
||||
|
||||
{% include base.html %}
|
||||
|
||||
# Wunderground Update Receiver Binding
|
||||
|
||||
Many personal weather stations or similar devices are only capable of submitting measurements to the wunderground.com update site.
|
||||
|
||||
This binding enables acting as a receiver of updates from devices that post measurements to https://rtupdate.wunderground.com/weatherstation/updateweatherstation.php.
|
||||
If the hostname is configurable - as on weather stations based on the Fine Offset Electronics WH2600-IP - this is simple, otherwise you have to set up dns such that it resolves the above hostname to your server, without preventing the server from resolving the proper ip if you want to forward the request.
|
||||
|
||||
The server thus listens at http(s)://<your-openHAB-server>:<openHAB-port>/weatherstation/updateweatherstation.php and the device needs to be pointed at this address.
|
||||
If you can't configure the device itself to submit to an alternate hostname you would need to set up a dns server that resolves rtupdate.wunderground.com to the IP-address of your server and provide as dns to the device does DHCP.
|
||||
Make sure not to use this dns server instance for any other DHCP clients.
|
||||
|
||||
The request is in itself simple to parse, so by redirecting it to your openHAB server you can intercept the values and use them to control items in your home.
|
||||
E.g. use measured wind-speed to close an awning or turn on the sprinkler system after some time without rain.
|
||||
This binding allows you to mix and match products from various manufacturers that otherwise have a closed system.
|
||||
|
||||
If you wish to pass the measurements on to rtupdate.wunderground.com, you can use a simple rule that triggers on the `wundergroundupdatereceiver:wundergroundUpdateReceiver:<channel-id>:metadata#last-query-trigger` to do so.
|
||||
It can also be used to submit the same measurements to multiple weather services via multiple rules.
|
||||
|
||||
## Supported Things
|
||||
|
||||
Any device that sends weather measurement updates to the wunderground.com update URLs is supported.
|
||||
It is easiest to use with devices that have a configurable target address, but can be made to work with any internet-connected device, that gets its dns server via DHCP or where the DNS server can be set.
|
||||
|
||||
## Discovery
|
||||
|
||||
The binding starts listening at the above-mentioned URI as soon as it is initialized.
|
||||
Any request with an unregistered stationId is recorded and if auto-discovery is enabled appears in the inbox, otherwise can be registered when a manual scan is initiated.
|
||||
For each request parameter a channel is generated, based on a list of known parameters from https://support.weather.com/s/article/PWS-Upload-Protocol?language=en_US and other observed parameters from various devices.
|
||||
If you have a device that submits a parameter that is unknown in the current version of the binding please feel free to submit an issue to have it added.
|
||||
|
||||
While discovery is active, either in the background or during a manual scan, any request parameters that don't have a channel associated with them are added to the thing's channels.
|
||||
This supports using multiple devices that submit measurements to the same station ID.
|
||||
The thing is the wunderground account, not the individual devices submitting measurements.
|
||||
|
||||
## Thing Configuration
|
||||
|
||||
The only configurable value is the station id, which should match the one configured on the device.
|
||||
If you don't plan on submitting measurements to wunderground.com, it can be any unique non-empty string value, otherwise it must be the actual station ID.
|
||||
|
||||
## Channels
|
||||
|
||||
Each measurement type the wunderground.com update service accepts has a channel.
|
||||
The channels must be named exactly as the request parameter they receive.
|
||||
I.e. the wind speed channel must be named `windspeedmph` as that is the request parameter name defined by Wunderground in their API.
|
||||
The channel name set up in the binding should be considered an id with no semantic content other than pointing to the wounderground API.
|
||||
Additionally there is a receipt timestamp and a trigger channel.
|
||||
|
||||
### Request parameters are mapped to one of the following channel-types:
|
||||
|
||||
#### Normal channel-types:
|
||||
|
||||
| Request parameter | Channel type id | Type | Label | Description | Group |
|
||||
|-------------------|------------------------------|----------------------|--------------------------------|----------------------------------------------------------------------------------------|-------------|
|
||||
| winddir | wind-direction | Number:Angle | Current Wind Direction | Current wind direction | Wind |
|
||||
| windspeedmph | wind-speed | Number:Speed | Current Wind Speed | Current wind speed, using software specific time period. | Wind |
|
||||
| windgustmph | wind-gust-speed | Number:Speed | Current Gust Speed | Current wind gust speed, using software specific time period. | Wind |
|
||||
| windgustdir | wind-gust-direction | Number:Angle | Gust Direction | Current wind gust direction expressed as an angle using software specific time period. | Wind |
|
||||
| tempf | temperature | Number:Temperature | Outdoor Temperature | Current outdoor temperature | Temperature |
|
||||
| indoortempf | indoor-temperature | Number:Temperature | Indoor Temperature | Indoor temperature. | Temperature |
|
||||
| rainin | rain | Number:Length | Hourly Rain | Rain over the past hour. | Rain |
|
||||
| dailyrainin | rain-daily | Number:Length | Daily Rain | Rain since the start of the day. | Rain |
|
||||
| solarradiation | solarradiation | Number:Intensity | Solar Radiation | Solar radiation | Sun |
|
||||
| UV | uv | Number:Dimensionless | UV Index | UV index. | Sun |
|
||||
| humidity | humidity | Number:Dimensionless | Humidity | Humidity in %. | Humidity |
|
||||
| indoorhumidity | indoor-humidity | Number:Dimensionless | Indoor Humidity | Indoor humidity in %. | Humidity |
|
||||
| baromin |
|
||||
|
||||
#### Advanced channel-types:
|
||||
|
||||
| Request parameter | Channel type id | Type | Label | Description | Group |
|
||||
|-------------------|------------------------------|----------------------|--------------------------------|-----------------------------------------------------------------------------------------------------|-------------|
|
||||
| windspdmph_avg2m | wind-speed-avg-2min | Number:Speed | Wind Speed 2min Average | 2 minute average wind speed. | Wind |
|
||||
| winddir_avg2m | wind-direction-avg-2min | Number:Angle | Wind Direction 2min Average | 2 minute average wind direction. | Wind |
|
||||
| windgustmph_10m | wind-gust-speed-10min | Number:Speed | Gust Speed 10min Average | 10 minute average gust speed. | Wind |
|
||||
| windgustdir_10m | wind-gust-direction-10min | Number:Angle | Gust Direction 10min Average | 10 minute average gust direction. | Wind |
|
||||
| windchillf | wind-chill | Number:Temperature | Wind Chill | The apparent wind chill temperature. | Temperature |
|
||||
| soiltempf | soil-temperature | Number:Temperature | Soil Temperature | Soil temperature. | Temperature |
|
||||
| weeklyrainin | rain-weekly | Number:Length | Weekly Rain | Rain since the start of this week. | Rain |
|
||||
| monthlyrainin | rain-monthly | Number:Length | Monthly Rain | Rain since the start if this month. | Rain |
|
||||
| yearlyrainin | rain-yearly | Number:Length | Yearly Rain | Rain since the start of this year. | Rain |
|
||||
| weather | metar | String | METAR Weather Report | METAR formatted weather report | Sun_Clouds |
|
||||
| clouds | clouds | String | Cloud Cover | METAR style cloud cover. | Sun_Clouds |
|
||||
| visibility | visibility | Number:Length | Visibility | Visibility. | Sun_Clouds |
|
||||
| dewptf | dew-point | Number:Temperature | Dew Point | Outdoor dew point. | Humidity |
|
||||
| soilmoisture | soil-moisture | Number:Dimensionless | Soil Moisture | Soil moisture in %. | Moisture |
|
||||
| leafwetness | leafwetness | Number:Dimensionless | Leaf Wetness | Leaf wetness in %. | Moisture |
|
||||
| AqNO | nitric-oxide | Number:Dimensionless | Nitric Oxide | Nitric Oxide ppm. | Pollution |
|
||||
| AqNO2T | nitrogen-dioxide-measured | Number:Dimensionless | Nitrogen Dioxide | Nitrogen Dioxide, true measure ppb. | Pollution |
|
||||
| AqNO2 | nitrogen-dioxide-nox-no | Number:Dimensionless | NO2 X computed | NO2 computed, NOx-NO ppb. | Pollution |
|
||||
| AqNO2Y | nitrogen-dioxide-noy-no | Number:Dimensionless | NO2 Y computed, NOy-NO ppb | NO2 computed, NOy-NO ppb. | Pollution |
|
||||
| AqNOX | nitrogen-oxides | Number:Dimensionless | Nitrogen Oxides | Nitrogen Oxides ppb. | Pollution |
|
||||
| AqNOY | total-reactive-nitrogen | Number:Dimensionless | Total Reactive Nitrogen | Total reactive nitrogen. | Pollution |
|
||||
| AqNO3 | no3-ion | Number:Density | NO3 ion | NO3 ion (nitrate, not adjusted for ammonium ion) µG/m3. | Pollution |
|
||||
| AqSO4 | so4-ion | Number:Density | SO4 ion | SO4 ion (sulfate, not adjusted for ammonium ion) µG/m3. | Pollution |
|
||||
| AqSO2 | sulfur-dioxide | Number:Dimensionless | Sulfur Dioxide | Sulfur Dioxide, conventional ppb. | Pollution |
|
||||
| AqSO2T | sulfur-dioxide-trace-levels | Number:Dimensionless | Sulfur Dioxide Trace Levels | Sulfur Dioxide, trace levels ppb. | Pollution |
|
||||
| AqCO | carbon-monoxide | Number:Dimensionless | Carbon Monoxide | Carbon Monoxide, conventional ppm. | Pollution |
|
||||
| AqCOT | carbon-monoxide-trace-levels | Number:Dimensionless | Carbon Monoxide Trace Levels | Carbon Monoxide, trace levels ppb. | Pollution |
|
||||
| AqEC | elemental-carbon | Number:Density | Elemental Carbon | Elemental Carbon, PM2.5 µG/m3. | Pollution |
|
||||
| AqOC | organic-carbon | Number:Density | Organic Carbon | Organic Carbon, not adjusted for oxygen and hydrogen, PM2.5 µG/m3. | Pollution |
|
||||
| AqBC | black-carbon | Number:Density | Black Carbon | Black Carbon at 880 nm, µG/m3. | Pollution |
|
||||
| AqUV-AETH | aethalometer | Number:Density | Second Channel of Aethalometer | second channel of Aethalometer at 370 nm, µG/m3. | Pollution |
|
||||
| AqPM2.5 | pm2_5-mass | Number:Density | PM2.5 Mass | PM2.5 mass, µG/m3. | Pollution |
|
||||
| AqPM10 | pm10-mass | Number:Density | PM10 Mass | PM10 mass, µG/m3. | Pollution |
|
||||
| AqOZONE | ozone | Number:Dimensionless | Ozone | Ozone, ppb. | Pollution |
|
||||
|
||||
#### Metadata channel-types:
|
||||
|
||||
| Request parameter | Channel type id | Type | Label | Description | Group |
|
||||
|-------------------|------------------------------|----------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------|-------------|
|
||||
| dateutc | dateutc | String | Last Updated | The date and time of the last update in UTC as submitted by the weather station. This can be 'now'. | Metadata |
|
||||
| softwaretype | softwaretype | String | Software Type | A software type string from the weather station | Metadata |
|
||||
| rtfreq | realtime-frequency | Number | Realtime Frequency | How often does the weather station submit measurements | Metadata |
|
||||
| lowbatt | system:low-battery | Switch | Low Battery | Low battery warning with possible values on (low battery) and off (battery ok) | Metadata |
|
||||
|
||||
#### Synthetic channel-types. These are programmatically added:
|
||||
|
||||
| Channel type id | Type | Channel type | Label | Description | Group |
|
||||
|------------------------|----------------------|--------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
|
||||
| dateutc-datetime | dateutc-datetime | state | Last Updated as DateTime | The date and time of the last update in UTC as submitted by the weather station converted to a DateTime value. In case of 'now', the current time is used. | Metadata |
|
||||
| last-received-datetime | DateTime | state | Last Received | The date and time of the last update. | Metadata |
|
||||
| last-query-state | String | state | The last query | The part of the last query after the first unurlencoded '?' | Metadata |
|
||||
| last-query-trigger | String | trigger | The last query | The part of the last query after the first unurlencoded '?' | Metadata |
|
||||
|
||||
The trigger channel's payload is the last querystring, so the following dsl rule script would send the measurements on to wunderground.com:
|
||||
|
||||
```
|
||||
val requestQuery = receivedEvent
|
||||
sendHttpGetRequest("https://rtupdate.wunderground.com/weatherstation/updateweatherstation.php?" + requestQuery)
|
||||
```
|
||||
|
||||
The PASSWORD, action and realtime parameters are ignored, as they are wunderground technical constants, that devices must send.
|
||||
The ID parameter is used to identify the correct thing the request pertains to, i.e. the stationId configuration value.
|
||||
|
||||
As described by the wunderground specification a device can submit multiple values for the outdoor temperature, soil temperature, soil moisture and leaf wetness channels by inserting an index number into the name of the request parameter, fx. tempf can be temp1f, temp2f, etc.
|
||||
This is supported by the discovery mechanism, creating a channel for each of the values.
|
||||
|
||||
# Examples
|
||||
|
||||
### Thing file
|
||||
|
||||
Configuration using thing and item files is not the recommended method, as you have to manually replicate the configuration discovery produces.
|
||||
Channels _must_ be named as the request parameters in the channel type table, otherwise the binding will not be able to update with values from requests.
|
||||
So the request parameter names submitted by your particular device(s) need to be found before being able to write appropriate thing files.
|
||||
You need to intercept a request from your devices(s) using something like wireshark.
|
||||
Both thing and item files must be created manually to produce a result practically identical to the one produced through automatic discovery.
|
||||
|
||||
Assuming you have intercepted a request such as `https://rtupdate.wunderground.com/weatherstation/updateweatherstation.php?ID=MYSTATIONID&PASSWORD=XXXXXX&windspeedmph=3.11&dateutc=2021-02-07%2014:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5`, you can configure a thing to intercept the request thus:
|
||||
|
||||
```
|
||||
Thing wundergroundupdatereceiver:wundergroundUpdateReceiver:ATHINGID "Foo" [stationId="MYSTATIONID"] {
|
||||
Channels:
|
||||
Type wind-speed : windspeedmph []
|
||||
Type dateutc : dateutc []
|
||||
Type softwaretype : softwaretype []
|
||||
Type realtime-frequency : rtfreq []
|
||||
Type dateutc-datetime : dateutc-datetime []
|
||||
Type last-received-datetime : last-received-datetime []
|
||||
Type last-query-state : last-query-state []
|
||||
Type last-query-trigger : last-query-trigger []
|
||||
}
|
||||
```
|
||||
|
||||
The pattern for a given channel is `Type <channel type id> : <request paramter> []` from the channel types table.
|
||||
Casing of the request parameter is significant.
|
||||
None of the current channels take config.
|
||||
|
||||
### Item file
|
||||
|
||||
```
|
||||
Number:Speed WuBinding_WeatherStation_WindSpeed "Current Wind Speed [%.2f %unit%]" <wind> { channel="wundergroundupdatereceiver:wundergroundUpdateReceiver:ATHINGID:windspeedmph" }
|
||||
DateTime WuBinding_LastRecieved "Last Recieved Time [%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS]" <time> { channel="wundergroundupdatereceiver:wundergroundUpdateReceiver:ATHINGID:last-received-datetime" }
|
||||
```
|
||||
|
||||
The binding tries to post received values as the item types described in the channel types table, so attaching a channel that takes a given type to an item of a different type has undefined behaviour.
|
||||
|
||||
### Rule examples
|
||||
|
||||
You can use the trigger channel to create a rule to calculate additional values.
|
||||
Create an new manual Item with a meaningful id, fx. WundergroundUpdateReceiverBinging_HeatIndex with a Number type.
|
||||
Create a rule that triggers when the trigger channel is updated and the following DSL:
|
||||
|
||||
```
|
||||
if ( (WH2k6_OutdoorTemperature.state != NULL) && (WH2k6_OutdoorTemperature.state != UNDEF) &&
|
||||
(WH2k6_Humidity.state != NULL) && (WH2k6_Humidity.state != UNDEF)
|
||||
)
|
||||
{
|
||||
val Double tempf = (WH2k6_OutdoorTemperature.state as QuantityType<Number>).toUnit("°F").doubleValue
|
||||
val Double humidity = (WH2k6_Humidity.state as QuantityType<Number>).toUnit("%").doubleValue
|
||||
|
||||
// https://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
|
||||
if ( tempf>=80.0 ) {
|
||||
var Double heatindex = -42.379 + 2.04901523*tempf + 10.14333127*humidity - 0.22475541*tempf*humidity - 0.00683783*tempf*tempf - 0.05481717*humidity*humidity + 0.00122874*tempf*tempf*humidity + 0.00085282*tempf*humidity*humidity - 0.00000199*tempf*tempf*humidity*humidity;
|
||||
|
||||
if ( (humidity <= 13.0) && (tempf >= 80.0) && (tempf <= 112.0) ) {
|
||||
heatindex = heatindex - ((13.0 - humidity)/4.0) * (Math::sqrt(17.0-Math::abs(tempf-95.0)/17.0));
|
||||
} else if ( (humidity >= 85.0) && (tempf >= 80.0) && (tempf <= 87.0) ) {
|
||||
heatindex = heatindex + ((humidity - 85.0)/10.0)*((87.0-tempf)/5.0);
|
||||
}
|
||||
WundergroundUpdateReceiverBinging_HeatIndex.postUpdate(heatindex + "°F")
|
||||
} else {
|
||||
WundergroundUpdateReceiverBinging_HeatIndex.postUpdate(UNDEF)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
You would then have to trigger another rule to submit the original request with any calculated values appended.
|
||||
|
||||
You can also define a transformation to fx. get a cardinal direction (N, S, W, E):
|
||||
|
||||
```
|
||||
(function(s){
|
||||
if ( (s == "NULL") || (s == "UNDEF") )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
var dir = ["N ⬇️", "NNO ⬇️", "NO ↙️", "ONO ⬅️", "O ⬅️", "OSO ⬅️", "SO ↖️", "SSO ⬆️", "S ⬆️", "SSW ⬆️", "SW ↗️", "WSW ➡️", "W ➡️", "WNW ➡️", "NW ↘️", "NNW ⬇️"]; var wind = parseInt(s.split(" ")[0]);
|
||||
var winddiroffset = (wind + (360.0/32.0)) % 360.0;
|
||||
var winddiridx = Math.floor(winddiroffset / (360.0/16.0));
|
||||
var winddir = dir[winddiridx];
|
||||
|
||||
return winddir + ' ('+ wind +'°)';
|
||||
}
|
||||
})(input)
|
||||
```
|
||||
|
||||
The examples were kindly provided by MikeTheTux.
|
|
@ -0,0 +1,404 @@
|
|||
---
|
||||
id: actiontemplatehli
|
||||
label: Action Template Interpreter
|
||||
title: Action Template Interpreter - Voices
|
||||
type: voice
|
||||
description: "A human language interpreter implementation powered by OpenNLP."
|
||||
since: 3x
|
||||
install: manual
|
||||
---
|
||||
|
||||
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
|
||||
|
||||
{% include base.html %}
|
||||
|
||||
# Action Template Interpreter
|
||||
|
||||
A human language interpreter implementation powered by OpenNLP.
|
||||
This is an attempt to provide you with a template system to match text commands to specific items and read its state or send command to them.
|
||||
For doing this the interpreter takes advantage of some nlp techniques.
|
||||
|
||||
The (Apache OpenNLP)[https://opennlp.apache.org] library is a machine learning based toolkit for the processing of natural language text.
|
||||
This human language interpreter aims to have no language dependency as it does nothing out of the box, please report any incompatibility with your language.
|
||||
|
||||
You can find models provided by OpenNLP for some languages [here](https://opennlp.apache.org/models.html) and [here](http://opennlp.sourceforge.net/models-1.5/).
|
||||
Those are not required, as you can use the build-in white space or simple tokenizers (from OpenNLP),they are just required to use the match by lemmas and the optional language tag functionalities.
|
||||
|
||||
There are some examples at the end that you can review if you want a general idea of what can be done.
|
||||
|
||||
## NLP Terminology
|
||||
|
||||
I will briefly explain some terms that will be used:
|
||||
|
||||
* Tokenize: first step of the recognition is to split the text, each of these parts is called token.
|
||||
* Named Entity Recognition (NER): is the process of finding a subset of tokens on the input.
|
||||
* Part Of Speech (POS) tagging: categorizing tokens in a text, depending on the definition of the token and its context.
|
||||
* Lemmatize: is the process of getting a generic representation of the tokens, each of it is called lemma. (Example of one token to lemma conversion: 'is' -> 'be').
|
||||
|
||||
## Action Template Target:
|
||||
|
||||
This interpreter allows two ways to target items:
|
||||
|
||||
* You can link an action to a specific item by adding the custom metadata namespace 'actiontemplatehli' to it.
|
||||
* You can link an action to all items of a type by providing the file '<OPENHAB_USERDATA>/actiontemplatehli/type_actions/<ITEM_TYPE_NAME>.json' (here you can restrict each action by item tags).
|
||||
|
||||
Two important notes:
|
||||
|
||||
* Actions linked to items have prevalence over actions linked to a whole item type.
|
||||
* On actions linked to an item type the itemLabel placeholder will always be applied (explained bellow). If there are multiple item labels detected on the input the actions linked to both will be scored, each using the correct itemLabel value, so there should be no collisions in case a template contains a token that matches an item label.
|
||||
|
||||
## Action Template Scoring
|
||||
|
||||
The scoring mechanism scores each action configuration to look for the best scored.
|
||||
If a token fails the comparison, the action scores 0.
|
||||
If all actions scored 0, none is executed.
|
||||
|
||||
The action configuration field 'type' defines if the template should be compared using tokens or lemmas.
|
||||
Please note that the captured placeholder value is extracted from the tokens not from the lemmas, but the equivalent lemmas are replaced before scoring.
|
||||
|
||||
The action template string is a list of tokens separated by white space.
|
||||
You can use the ';' separator to provide alternative templates and the '|' to provide alternative tokens.
|
||||
Here is an example of string: "what app|application is open on $itemLabel;what app|application is on $itemLabel".
|
||||
|
||||
Take in account that, as this is a token basis comparison, matching depends on the tokenizer you are using as they can produce different tokens for the same text.
|
||||
|
||||
## Action Template Options:
|
||||
|
||||
The location where action configurations are placed changes whether you are targeting an item or many, so take a look to the 'Action Template Target' to understand where to put those configurations.
|
||||
Also, you can check the paths indicated on the examples at the end.
|
||||
|
||||
Actions can read the state from an item or send a command to it.
|
||||
This is defined by the boolean field read which is 'false' by default.
|
||||
|
||||
When read is false:
|
||||
|
||||
* template: action template. (Required)
|
||||
* value: value to be sent. It can be used to capture the transformed placeholder values. (Required unless the target item type is String, in which case silent mode is assumed to be true and the whole text is passed to the item).
|
||||
* type: action template type, either "tokens" or "lemmas".
|
||||
* requiredTags: allow to restrict the items targeted by its tags by ignoring items not having all these tags.
|
||||
* placeholders: defined placeholders that can be used on the template and replaced on the value.
|
||||
* silent: boolean used to avoid confirmation message.
|
||||
* targetMembers: when targeting a Group item, can be used to send the command to its member items instead.
|
||||
|
||||
When read is true:
|
||||
|
||||
* template: action template. (Required)
|
||||
* value: read template, can use the placeholders symbols $itemLabel and $state.
|
||||
* emptyValue: An alternative template. Is used when the state value is empty or NULL after the post transformation. The $itemLabel is available.
|
||||
* type: action template type, either "tokens" or "lemmas".
|
||||
* requiredTags: allow to restrict the items targeted by its tags by ignoring items not having all these tags.
|
||||
* placeholders: only the placeholder with label state will be used, to process its POS transformation on the state.
|
||||
* targetMembers: when targeting a Group item, can be used to access the state of one of its members. In case of multiple matches, a warning is shown and the first one is used.
|
||||
|
||||
## Placeholders
|
||||
|
||||
This configuration allow you to define symbols to use on your templates.
|
||||
You can define the sets of tokens to match using ner, and a transformation using pos.
|
||||
Those are its fields:
|
||||
|
||||
* label: label for the placeholder, is prefixed with '$' and spaces are replaced by '_' to create the symbol you can use on the template (Required).
|
||||
* nerValues: list of strings containing parts of the text to look for. Takes precedence over the ner field.
|
||||
* ner: name for a file under the ner folder (<OPENHAB_USERDATA>/actiontemplatehli/ner), first it will look for a <ner>.bin model and then for a <ner>.xml dictionary for applying ner (prevalence over 'nerValues').
|
||||
* posValues: apply a pos transformation with static values. Takes precedence over the pos field.
|
||||
* pos: name for a file under the pos folder (<OPENHAB_USERDATA>/actiontemplatehli/pos), first it will look for a <pos>.bin model and then for a <pos>.xml dictionary (prevalence over 'posValues').
|
||||
|
||||
The placeholder symbol replaces the text tokens matched using NER (before scoring the actions) and the captured value could be transformed using POS and will be accessible to the value under its symbol.
|
||||
As a summary, using the placeholders you can configure how parts of the speech are converted into valid item values and backward.
|
||||
The examples at the end of the document can help you to see it clearer.
|
||||
|
||||
There are some special placeholders:
|
||||
|
||||
### The 'itemLabel' Placeholder
|
||||
|
||||
The itemLabel placeholder is always applied when scoring actions linked to item types. It's replaced using NER (no case-sensitive) with your item labels and synonyms (collisions will be reported in debug logs). Its value is only available for read actions.
|
||||
|
||||
### The 'groupLabel' Placeholder
|
||||
|
||||
The groupLabel placeholder is only available for read actions when targeting a group member.
|
||||
When it's present, the 'itemLabel' placeholder will take the value of the target member label and the 'groupLabel' the label of the group.
|
||||
|
||||
### The 'state' Placeholder
|
||||
|
||||
It's used to access the value on the read actions, you can configure a POS transformation for it.
|
||||
|
||||
### The 'itemOption' Placeholder
|
||||
|
||||
This placeholder is available for both write and read actions and doesn't need to be configured.
|
||||
|
||||
When read is false, the 'itemOption' placeholder will be computed from the item command description options, or from the state description options if the command description options are not present.
|
||||
|
||||
When read is true, the 'itemOption' placeholder will be computed from the item state description options.
|
||||
|
||||
Note that, when targeting multiple group members, 'ner' (value matching) is done by merging all available member options but 'pos' (value transformation) is done using just the target member item options.
|
||||
|
||||
### The '*' Placeholder (the dynamic placeholder)
|
||||
|
||||
The dynamic placeholder is designed to capture free text. The captured value is exposed to the value under the symbol '$*' as other placeholders.
|
||||
It has some restrictions:
|
||||
|
||||
* Can not be the only token on the template.
|
||||
* Can not be used as an optional token.
|
||||
* Can not be used multiple times on the same template alternative.
|
||||
|
||||
Note that the dynamic placeholder does not score. This way you can use it to fallback other sentences.
|
||||
|
||||
This example can help you to understand how this works:
|
||||
|
||||
You have an action with the template "play $* on living room" and another action with the template "play $musicAuthor on living room" and assuming 'mozart' is a valid value for the placeholder '$musicAuthor'.
|
||||
|
||||
The sentence "play mozart on living room" will score 4 when compared with the template containing the dynamic placeholder and 5 when compared with the one without it.
|
||||
The action with template "play $musicAuthor on living room" will be executed.
|
||||
|
||||
The sentence "play beethoven on living room" will score 4 when compared with the template containing the dynamic placeholder and 0 when compared with the one without it.
|
||||
The action with template "play $* on living room" will be executed.
|
||||
|
||||
### POS Transformation
|
||||
|
||||
POS is a technique which produces tags for each token, here though we are going to use it to match a group of words with a value so we should transform those words to a single token.
|
||||
That's the reason why the whitespace character should be replaced by '__' in the POS dictionaries and static values, you can see some examples bellow.
|
||||
|
||||
### Target members:
|
||||
|
||||
When the target of an action is a group item, you can target its members instead.
|
||||
|
||||
You can use the following fields:
|
||||
|
||||
* itemName: name of the item member to target. If present the other fields are ignored.
|
||||
* itemType: type of the item members to target.
|
||||
* requiredTags: allow to restrict the members targeted by tags when matching by type.
|
||||
* recursive: when matching by itemType, look for group members in a recursive way, default true.
|
||||
* mergeState: on a read action when matching by itemType, merge the item states by performing an AND operation, only allowed for 'Switch' and 'Contact' item types, default false.
|
||||
|
||||
## Text Preprocessing
|
||||
|
||||
The interpreter needs to match the input text with a target item and action configuration, to know what to do.
|
||||
To do so, it needs the tokens and optionally the POS tags and the lemmas.
|
||||
|
||||
### Tokenizer
|
||||
|
||||
You can provide a custom model at '<OPENHAB_USERDATA>/actiontemplatehli/token.bin', otherwise it will use the built-in simple tokenizer or whitespace tokenizer (configurable).
|
||||
|
||||
Here you have an example of the built-in ones:
|
||||
|
||||
* Using the white space tokenizer "What time is it?" produces the tokens "what" "time" "is" "it?"
|
||||
* Using the simple tokenizer "What time is it?" produces the tokens "what" "time" "is" "it" "?"
|
||||
|
||||
Tokenizing the text is enough to use the action type 'tokens' as tokens are the only ones required for scoring (but the option 'optionalLanguageTags' will not take effect unless you have the POS language tags).
|
||||
|
||||
### POSTagger (language tags)
|
||||
|
||||
You need to provide a model for POS tagging at '<OPENHAB_USERDATA>/actiontemplatehli/pos.bin' for your language.
|
||||
This will produce a language tag for each token, that can be used in 'optionalLanguageTags' to make some optional for scoring.
|
||||
Please note that these labels may be different depending on the model, please refer to your model's documentation.
|
||||
As an example:
|
||||
|
||||
The tokens "that,sounds,good" produces the tags "DT,VBZ,JJ".
|
||||
|
||||
Assuming optionalLanguageTags is empty, if we have an action with template "sounds good" it will get a 0 score when compared to the text "that sounds good" because the token "that" is not in the template.
|
||||
|
||||
But if we set optionalLanguageTags to "DT", the action template "sounds good" will score 2 against the text "that sounds good" as the tokens with the tag "DT" are considered optional when scoring.
|
||||
|
||||
Note that if we have another action with the template "that sounds good" it will score 3 and take prevalence.
|
||||
|
||||
You need the correct language tags for the lemmatizer to work.
|
||||
|
||||
### Lemmatizer
|
||||
|
||||
You need to provide a model for the lemmatizer at '<OPENHAB_USERDATA>/actiontemplatehli/lemma.bin' for your language.
|
||||
This will produce a lemma for each token, then you can use the action type 'lemmas'.
|
||||
|
||||
Note that you need the POS language tags for your language, the ones covered on the previous section, for the lemmatizer to work.
|
||||
|
||||
## Interpreter Configuration
|
||||
|
||||
| Config | Group | Type | Default | Description |
|
||||
|-------------------------|----------|---------|----------------------|---------------------------------------------------------------------------------------------------------------|
|
||||
| lowerText | nlp | boolean | false | Convert the input text to lowercase before processing |
|
||||
| caseSensitive | nlp | boolean | false | Enable case sensitivity, do not apply to dictionaries and models, do not apply to the 'itemLabel' placeholder |
|
||||
| useSimpleTokenizer | nlp | boolean | false | Prefer simple tokenizer over white space tokenizer |
|
||||
| detokenizeOptimization | nlp | boolean | true | Enables build-in detokenization based on original text, otherwise string join by space is used |
|
||||
| optionalLanguageTags | nlp | text | | Comma separated POS language tags that will be optional when comparing |
|
||||
| commandSentMessage | messages | text | Done | Message for successful command |
|
||||
| unhandledMessage | messages | text | I can not do that | Message for unsuccessful action |
|
||||
| failureMessage | messages | text | There was an error | Message for error during processing |
|
||||
|
||||
## Examples:
|
||||
|
||||
### String type action configs example:
|
||||
|
||||
This example contains the files to add actions for opening an android application and checking what application is opened.
|
||||
These actions will target all String items with the tag 'launch_android_app'.
|
||||
|
||||
These are the files needed:
|
||||
|
||||
#### File '<OPENHAB_USERDATA>/actiontemplatehli/type_actions/String.json'
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"template": "launch|open $app on $itemLabel",
|
||||
"value": "$app",
|
||||
"type": "tokens",
|
||||
"requiredTags": ["launch_android_app"],
|
||||
"placeholders": [
|
||||
{
|
||||
"label": "app",
|
||||
"ner": "applications",
|
||||
"pos": "application_to_package"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"template": "what app|application is open on $itemLabel;what app|application is on $itemLabel",
|
||||
"read": true,
|
||||
"value": "the open app is $state",
|
||||
"emptyValue": "no app open on $itemLabel",
|
||||
"type": "tokens",
|
||||
"requiredTags": ["launch_android_app"],
|
||||
"placeholders": [
|
||||
{
|
||||
"label": "state",
|
||||
"pos": "package_to_application"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
#### File '<OPENHAB_USERDATA>/actiontemplatehli/ner/applications.xml'
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<dictionary case_sensitive="false">
|
||||
<entry>
|
||||
<token>youtube</token>
|
||||
</entry>
|
||||
<entry>
|
||||
<token>jellyfin</token>
|
||||
</entry>
|
||||
<entry>
|
||||
<token>amazon</token>
|
||||
<token>video</token>
|
||||
</entry>
|
||||
<entry>
|
||||
<token>netflix</token>
|
||||
</entry>
|
||||
</dictionary>
|
||||
```
|
||||
|
||||
#### File '<OPENHAB_USERDATA>/actiontemplatehli/pos/package_to_application.xml'
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<dictionary>
|
||||
<entry tags="youtube">
|
||||
<token>com.google.android.youtube</token>
|
||||
</entry>
|
||||
<entry tags="netflix">
|
||||
<token>com.netflix.ninja</token>
|
||||
</entry>
|
||||
<entry tags="jellyfin">
|
||||
<token>org.jellyfin.androidtv</token>
|
||||
</entry>
|
||||
<entry tags="amazon__video"> // note the __
|
||||
<token>com.amazon.amazonvideo.livingroom</token>
|
||||
</entry>
|
||||
</dictionary>
|
||||
```
|
||||
|
||||
#### File '<OPENHAB_USERDATA>/actiontemplatehli/pos/application_to_package.xml'
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<dictionary>
|
||||
<entry tags="com.google.android.youtube">
|
||||
<token>youtube</token>
|
||||
</entry>
|
||||
<entry tags="com.netflix.ninja">
|
||||
<token>netflix</token>
|
||||
</entry>
|
||||
<entry tags="org.jellyfin.androidtv">
|
||||
<token>jellyfin</token>
|
||||
</entry>
|
||||
<entry tags="com.amazon.amazonvideo.livingroom">
|
||||
<token>amazon__video</token> // note the __
|
||||
</entry>
|
||||
</dictionary>
|
||||
```
|
||||
|
||||
### Switch type action configs example:
|
||||
|
||||
This example contains the files to add actions for turning a switch on or off.
|
||||
These actions will target all Switch items.
|
||||
|
||||
#### File '<OPENHAB_USERDATA>/actiontemplatehli/type_actions/Switch.json'
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"template": "$onOff $itemLabel",
|
||||
"value": "$onOff",
|
||||
"type": "tokens",
|
||||
"placeholders": [
|
||||
{
|
||||
"label": "onOff",
|
||||
"nerValues": [
|
||||
"turn on",
|
||||
"turn off"
|
||||
],
|
||||
"posValues": {
|
||||
"turn__on": "ON", // note the __
|
||||
"turn__off": "OFF"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"template": "how be the $itemLabel",
|
||||
"read": true,
|
||||
"type": "lemmas",
|
||||
"value": "$itemLabel is $state"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Switch item action configs example:
|
||||
|
||||
This example contains the item metadata to add an action to an item with type 'Switch''.
|
||||
Add a custom metadata 'actiontemplatehli' to the 'Switch' item with the following:
|
||||
|
||||
```yaml
|
||||
value: ""
|
||||
config:
|
||||
placeholders:
|
||||
- label: onOff
|
||||
nerValues:
|
||||
- turn on
|
||||
- turn off
|
||||
posValues:
|
||||
turn__on: ON
|
||||
turn__off: OFF
|
||||
template: $onOff $itemLabel
|
||||
type: tokens
|
||||
value: $onOff
|
||||
```
|
||||
|
||||
### Dynamic placeholder, sending a message example:
|
||||
|
||||
This example contains the item metadata to add an action that uses the dynamic placeholder.
|
||||
Add a custom metadata 'actiontemplatehli' to a String item with the following:
|
||||
|
||||
```yaml
|
||||
value: ""
|
||||
config:
|
||||
placeholders:
|
||||
- label: contact
|
||||
nerValues:
|
||||
- Andrea
|
||||
- Jacob
|
||||
- Raquel
|
||||
silent: true
|
||||
template: send message $* to $contact
|
||||
type: tokens
|
||||
value: $contact:$*
|
||||
```
|
|
@ -0,0 +1,88 @@
|
|||
---
|
||||
id: rustpotterks
|
||||
label: Rustpotter Keyword Spotter
|
||||
title: Rustpotter Keyword Spotter - Voices
|
||||
type: voice
|
||||
description: "This voice service allows you to use the open source library Rustpotter as your keyword spotter in openHAB."
|
||||
since: 3x
|
||||
install: manual
|
||||
---
|
||||
|
||||
<!-- Attention authors: Do not edit directly. Please add your changes to the appropriate source repository -->
|
||||
|
||||
{% include base.html %}
|
||||
|
||||
# Rustpotter Keyword Spotter
|
||||
|
||||
This voice service allows you to use the open source library Rustpotter as your keyword spotter in openHAB.
|
||||
[Rustpotter](https://github.com/GiviMAD/rustpotter) is a free and open-source keywords spotter written in rust.
|
||||
|
||||
Rustpotter provides personal on-device wake word detection. You need to generate a model for your keyword using audio samples.
|
||||
|
||||
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.
|
||||
|
||||
## Configuration
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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`
|
||||
|
||||
Its contents should look similar to:
|
||||
|
||||
```
|
||||
org.openhab.voice.rustpotterks:threshold=0.5
|
||||
org.openhab.voice.rustpotterks:averagedthreshold=0.2
|
||||
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
|
||||
```
|
||||
|
||||
## 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 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).
|
||||
|
||||
To use a wake word model, you should place the file under '\<openHAB userdata\>/rustpotter' and configure your magic word to match the file name replacing spaces with '_' and adding the extension '.rpw'.
|
||||
As an example, the file generated for the keyword "ok openhab" will be named 'ok_openhab.rpw'.
|
||||
|
||||
The service will only work if it's able to find the correct rpw for your magic word configuration.
|
||||
|
||||
|
||||
## Default Keyword Spotter and Magic Word Configuration
|
||||
|
||||
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.
|
||||
|
||||
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:
|
||||
|
||||
```
|
||||
org.openhab.voice:defaultKS=rustpotterks
|
||||
org.openhab.voice:keyword=hey openhab
|
||||
org.openhab.voice:listeningItem=myItemForDialog
|
||||
```
|
|
@ -53,36 +53,36 @@
|
|||
<channel-type id="statecode" advanced="true">
|
||||
<item-type>Number</item-type>
|
||||
<label>State Code</label>
|
||||
<description>API-code of the Indego state</description>
|
||||
<description>API code of the Indego state</description>
|
||||
<state readOnly="true">
|
||||
<options>
|
||||
<option value="0">Reading status</option>
|
||||
<option value="257">Charging</option>
|
||||
<option value="258">Docked</option>
|
||||
<option value="259">Docked - Software update</option>
|
||||
<option value="260">Docked</option>
|
||||
<option value="261">Docked</option>
|
||||
<option value="262">Docked - Loading map</option>
|
||||
<option value="263">Docked - Saving map</option>
|
||||
<option value="512">Mowing</option>
|
||||
<option value="514">Relocalising</option>
|
||||
<option value="515">Loading map</option>
|
||||
<option value="516">Learning lawn</option>
|
||||
<option value="517">Paused</option>
|
||||
<option value="518">Border cut</option>
|
||||
<option value="519">Idle in lawn</option>
|
||||
<option value="769">Returning to Dock</option>
|
||||
<option value="770">Returning to Dock</option>
|
||||
<option value="771">Returning to Dock - Battery low</option>
|
||||
<option value="772">Returning to Dock - Calendar timeslot ended</option>
|
||||
<option value="773">Returning to Dock - Battery temp range</option>
|
||||
<option value="774">Returning to Dock</option>
|
||||
<option value="775">Returning to Dock - Lawn complete</option>
|
||||
<option value="776">Returning to Dock - Relocalising</option>
|
||||
<option value="1025">Diagnostic mode</option>
|
||||
<option value="1026">End of life</option>
|
||||
<option value="1281">Software update</option>
|
||||
<option value="64513">Docked</option>
|
||||
<option value="0">@text/indego.state.reading-status</option>
|
||||
<option value="257">@text/indego.state.charging</option>
|
||||
<option value="258">@text/indego.state.docked</option>
|
||||
<option value="259">@text/indego.state.docked-software-update</option>
|
||||
<option value="260">@text/indego.state.docked</option>
|
||||
<option value="261">@text/indego.state.docked</option>
|
||||
<option value="262">@text/indego.state.docked-loading-map</option>
|
||||
<option value="263">@text/indego.state.docked-saving-map</option>
|
||||
<option value="512">@text/indego.state.mowing</option>
|
||||
<option value="514">@text/indego.state.relocalising</option>
|
||||
<option value="515">@text/indego.state.loading-map</option>
|
||||
<option value="516">@text/indego.state.learning-lawn</option>
|
||||
<option value="517">@text/indego.state.paused</option>
|
||||
<option value="518">@text/indego.state.border-cut</option>
|
||||
<option value="519">@text/indego.state.idle-in-lawn</option>
|
||||
<option value="769">@text/indego.state.returning-to-dock</option>
|
||||
<option value="770">@text/indego.state.returning-to-dock</option>
|
||||
<option value="771">@text/indego.state.returning-to-dock-battery-low</option>
|
||||
<option value="772">@text/indego.state.returning-to-dock-calendar-timeslot-ended</option>
|
||||
<option value="773">@text/indego.state.returning-to-dock-battery-temp-range</option>
|
||||
<option value="774">@text/indego.state.returning-to-dock</option>
|
||||
<option value="775">@text/indego.state.returning-to-dock-lawn-complete</option>
|
||||
<option value="776">@text/indego.state.returning-to-dock-relocalising</option>
|
||||
<option value="1025">@text/indego.state.diagnostic-mode</option>
|
||||
<option value="1026">@text/indego.state.end-of-life</option>
|
||||
<option value="1281">@text/indego.state.software-update</option>
|
||||
<option value="64513">@text/indego.state.docked</option>
|
||||
</options>
|
||||
</state>
|
||||
</channel-type>
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" ?>
|
||||
<thing:thing-descriptions bindingId="wundergroundupdatereceiver"
|
||||
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-group-type id="metadata-group">
|
||||
<label>Metadata</label>
|
||||
<description>Metadata regarding the last submission</description>
|
||||
<category>Text</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="wind-group">
|
||||
<label>Wind</label>
|
||||
<description>Wind measurements</description>
|
||||
<category>Wind</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="temperature-group">
|
||||
<label>Temperature</label>
|
||||
<description>Temperature measurements</description>
|
||||
<category>Temperature</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="humidity-group">
|
||||
<label>Moisture</label>
|
||||
<description>Moisture measurements</description>
|
||||
<category>Humidity</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="rain-group">
|
||||
<label>Rain</label>
|
||||
<description>Rain measurements</description>
|
||||
<category>Rain</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="sunlight-group">
|
||||
<label>Sunlight</label>
|
||||
<description>Sunlight measurements</description>
|
||||
<category>Sun_Clouds</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="pressure-group">
|
||||
<label>Pressure</label>
|
||||
<description>Barometric measurements</description>
|
||||
<category>Pressure</category>
|
||||
</channel-group-type>
|
||||
|
||||
<channel-group-type id="pollution-group">
|
||||
<label>Pollution</label>
|
||||
<description>Pollutant measurements</description>
|
||||
<category>Pollution</category>
|
||||
</channel-group-type>
|
||||
</thing:thing-descriptions>
|
|
@ -0,0 +1,580 @@
|
|||
<?xml version="1.0" ?>
|
||||
<thing:thing-descriptions bindingId="wundergroundupdatereceiver"
|
||||
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="last-received-datetime">
|
||||
<item-type>DateTime</item-type>
|
||||
<label>Last Received</label>
|
||||
<description>The date and time of the last update.</description>
|
||||
<category>Time</category>
|
||||
<tags>
|
||||
<tag>Point</tag>
|
||||
<tag>Timestamp</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="dateutc" advanced="true">
|
||||
<item-type>String</item-type>
|
||||
<label>Last Updated</label>
|
||||
<description>The date and time of the last update in UTC as submitted by the weather station. This can be 'now'.</description>
|
||||
<category>Time</category>
|
||||
<tags>
|
||||
<tag>Point</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="dateutc-datetime" advanced="true">
|
||||
<item-type>DateTime</item-type>
|
||||
<label>Last Updated as DateTime</label>
|
||||
<description>The date and time of the last update in UTC as submitted by the weather station converted to a DateTime
|
||||
value. In case of 'now', the current time is used.</description>
|
||||
<category>Time</category>
|
||||
<tags>
|
||||
<tag>Point</tag>
|
||||
<tag>Timestamp</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-speed">
|
||||
<item-type>Number:Speed</item-type>
|
||||
<label>Current Wind Speed</label>
|
||||
<description>Current wind speed, using software specific time period.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-gust-speed">
|
||||
<item-type>Number:Speed</item-type>
|
||||
<label>Current Gust Speed</label>
|
||||
<description>Current wind gust speed, using software specific time period.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-gust-direction">
|
||||
<item-type>Number:Angle</item-type>
|
||||
<label>Gust Direction</label>
|
||||
<description>Current wind gust direction expressed as an angle using software specific time period.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-speed-avg-2min" advanced="true">
|
||||
<item-type>Number:Speed</item-type>
|
||||
<label>Wind Speed 2min Average</label>
|
||||
<description>2 minute average wind speed.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-direction-avg-2min" advanced="true">
|
||||
<item-type>Number:Angle</item-type>
|
||||
<label>Wind Direction 2min Average</label>
|
||||
<description>2 minute average wind direction.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-gust-speed-10min" advanced="true">
|
||||
<item-type>Number:Speed</item-type>
|
||||
<label>Gust Speed 10min Average</label>
|
||||
<description>10 minute average gust speed.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-gust-direction-10min" advanced="true">
|
||||
<item-type>Number:Angle</item-type>
|
||||
<label>Gust Direction 10min Average</label>
|
||||
<description>10 minute average gust direction.</description>
|
||||
<category>Wind</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="humidity">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Humidity</label>
|
||||
<description>Humidity in %.</description>
|
||||
<category>Humidity</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Humidity</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.0f %%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="indoor-humidity">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Indoor Humidity</label>
|
||||
<description>Indoor humidity in %.</description>
|
||||
<category>Humidity</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Humidity</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.0f %%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="dew-point" advanced="true">
|
||||
<item-type>Number:Temperature</item-type>
|
||||
<label>Dew Point</label>
|
||||
<description>Outdoor dew point.</description>
|
||||
<category>Humidity</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Temperature</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="wind-chill" advanced="true">
|
||||
<item-type>Number:Temperature</item-type>
|
||||
<label>Wind Chill</label>
|
||||
<description>The apparent wind chill temperature.</description>
|
||||
<category>Temperature</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Wind</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.1f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<!-- for extra outdoor sensors use temp2f, temp3f, and so on -->
|
||||
<channel-type id="indoor-temperature">
|
||||
<item-type>Number:Temperature</item-type>
|
||||
<label>Indoor Temperature</label>
|
||||
<description>Indoor temperature.</description>
|
||||
<category>Temperature</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Temperature</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<!-- for sensors 2,3,4 use soiltemp2f, soiltemp3f, and soiltemp4f -->
|
||||
<channel-type id="soil-temperature" advanced="true">
|
||||
<item-type>Number:Temperature</item-type>
|
||||
<label>Soil Temperature</label>
|
||||
<description>Soil temperature.</description>
|
||||
<category>Temperature</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Temperature</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="rain">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Hourly Rain</label>
|
||||
<description>Rain over the past hour.</description>
|
||||
<category>Rain</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Rain</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="rain-daily">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Daily Rain</label>
|
||||
<description>Rain since the start of the day.</description>
|
||||
<category>Rain</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Rain</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="rain-weekly" advanced="true">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Weekly Rain</label>
|
||||
<description>Rain since the start of this week.</description>
|
||||
<category>Rain</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Rain</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="rain-monthly" advanced="true">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Monthly Rain</label>
|
||||
<description>Rain since the start if this month.</description>
|
||||
<category>Rain</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Rain</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="rain-yearly" advanced="true">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Yearly Rain</label>
|
||||
<description>Rain since the start of this year.</description>
|
||||
<category>Rain</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Rain</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.2f %unit%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="metar" advanced="true">
|
||||
<item-type>String</item-type>
|
||||
<label>METAR Weather Report</label>
|
||||
<description>METAR formatted weather report</description>
|
||||
<category>Sun_Clouds</category>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="clouds" advanced="true">
|
||||
<item-type>String</item-type>
|
||||
<label>Cloud Cover</label>
|
||||
<description>METAR style cloud cover.</description>
|
||||
<category>Sun_Clouds</category>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<!-- for sensors 2,3,4 use soilmoisture2, soilmoisture3, and soilmoisture4 -->
|
||||
<channel-type id="soil-moisture" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Soil Moisture</label>
|
||||
<description>Soil moisture in %.</description>
|
||||
<category>Moisture</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Water</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.0f %%"/>
|
||||
</channel-type>
|
||||
|
||||
<!-- for sensor 2 use leafwetness2 -->
|
||||
<channel-type id="leafwetness" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Leaf Wetness</label>
|
||||
<description>Leaf wetness in %.</description>
|
||||
<category>Moisture</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Water</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.0f %%"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="solarradiation">
|
||||
<item-type>Number:Intensity</item-type>
|
||||
<label>Solar Radiation</label>
|
||||
<description>Solar radiation</description>
|
||||
<category>Sun</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Light</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="uv">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>UV Index</label>
|
||||
<description>UV index.</description>
|
||||
<category>Sun</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
<tag>Ultraviolet</tag>
|
||||
</tags>
|
||||
<state readOnly="true" pattern="%.0f"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="visibility" advanced="true">
|
||||
<item-type>Number:Length</item-type>
|
||||
<label>Visibility</label>
|
||||
<description>Visibility.</description>
|
||||
<category>Sun_Clouds</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<!-- Pollution Fields: -->
|
||||
<channel-type id="nitric-oxide" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Nitric Oxide</label>
|
||||
<description>Nitric Oxide ppm.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="nitrogen-dioxide-measured" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Nitrogen Dioxide</label>
|
||||
<description>Nitrogen Dioxide, true measure ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="nitrogen-dioxide-nox-no" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>NO2 X computed</label>
|
||||
<description>NO2 computed, NOx-NO ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="nitrogen-dioxide-noy-no" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>NO2 Y computed, NOy-NO ppb</label>
|
||||
<description>NO2 computed, NOy-NO ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="nitrogen-oxides" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Nitrogen Oxides</label>
|
||||
<description>Nitrogen Oxides ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="total-reactive-nitrogen" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Total Reactive Nitrogen</label>
|
||||
<description>Total reactive nitrogen.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="no3-ion" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>NO3 ion</label>
|
||||
<description>NO3 ion (nitrate, not adjusted for ammonium ion) µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="so4-ion" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>SO4 ion</label>
|
||||
<description>SO4 ion (sulfate, not adjusted for ammonium ion) µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="sulfur-dioxide" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Sulfur Dioxide</label>
|
||||
<description>Sulfur Dioxide, conventional ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="sulfur-dioxide-trace-levels" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Sulfur Dioxide Trace Levels</label>
|
||||
<description>Sulfur Dioxide, trace levels ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="carbon-monoxide" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Carbon Monoxide</label>
|
||||
<description>Carbon Monoxide, conventional ppm.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="carbon-monoxide-trace-levels" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Carbon Monoxide Trace Levels</label>
|
||||
<description>Carbon Monoxide, trace levels ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="elemental-carbon" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>Elemental Carbon</label>
|
||||
<description>Elemental Carbon, PM2.5 µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="organic-carbon" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>Organic Carbon</label>
|
||||
<description>Organic Carbon, not adjusted for oxygen and hydrogen, PM2.5 µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="black-carbon" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>Black Carbon</label>
|
||||
<description>Black Carbon at 880 nm, µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="aethalometer" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>Second Channel of Aethalometer</label>
|
||||
<description>second channel of Aethalometer at 370 nm, µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="pm2_5-mass" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>PM2.5 Mass</label>
|
||||
<description>PM2.5 mass, µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="pm10-mass" advanced="true">
|
||||
<item-type>Number:Density</item-type>
|
||||
<label>PM10 Mass</label>
|
||||
<description>PM10 mass, µG/m3.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="ozone" advanced="true">
|
||||
<item-type>Number:Dimensionless</item-type>
|
||||
<label>Ozone</label>
|
||||
<description>Ozone, ppb.</description>
|
||||
<category>Pollution</category>
|
||||
<tags>
|
||||
<tag>Measurement</tag>
|
||||
</tags>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="softwaretype" advanced="true">
|
||||
<item-type>String</item-type>
|
||||
<label>Software Type</label>
|
||||
<description>A software type string from the weather station</description>
|
||||
<category>Text</category>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="realtime-frequency" advanced="true">
|
||||
<item-type>Number</item-type>
|
||||
<label>Realtime Frequency</label>
|
||||
<description>How often does the weather station submit measurements</description>
|
||||
<category>Number</category>
|
||||
<state readOnly="true" pattern="%.0f"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="last-query-state" advanced="true">
|
||||
<item-type>String</item-type>
|
||||
<kind>state</kind>
|
||||
<label>The last query</label>
|
||||
<description>The part of the last query after the first unurlencoded '?'</description>
|
||||
<state readOnly="true"/>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="last-query-trigger">
|
||||
<item-type>String</item-type>
|
||||
<kind>trigger</kind>
|
||||
<label>The last query</label>
|
||||
<description>The part of the last query after the first unurlencoded '?'</description>
|
||||
<event/>
|
||||
</channel-type>
|
||||
|
||||
</thing:thing-descriptions>
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<thing:thing-descriptions bindingId="wundergroundupdatereceiver"
|
||||
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="wundergroundUpdateReceiver">
|
||||
<label>Update Receiver</label>
|
||||
<description>An endpoint thing that can receive and propagate HTTP GET updates meant for a particular station id at
|
||||
wunderground.com</description>
|
||||
|
||||
<channel-groups>
|
||||
<channel-group id="metadata" typeId="metadata-group"/>
|
||||
<channel-group id="wind" typeId="wind-group"/>
|
||||
<channel-group id="temperature" typeId="temperature-group"/>
|
||||
<channel-group id="humidity" typeId="humidity-group"/>
|
||||
<channel-group id="rain" typeId="rain-group"/>
|
||||
<channel-group id="sunlight" typeId="sunlight-group"/>
|
||||
<channel-group id="pressure" typeId="pressure-group"/>
|
||||
<channel-group id="pollution" typeId="pollution-group"/>
|
||||
</channel-groups>
|
||||
|
||||
<representation-property>stationId</representation-property>
|
||||
<config-description>
|
||||
<parameter name="stationId" type="text" required="true" pattern="\w+">
|
||||
<label>Station ID</label>
|
||||
<description><![CDATA[<br />
|
||||
The wunderground.com update api requires a station id, that is defined for the WeatherUnderground
|
||||
account measurements are to be submitted to.<br />
|
||||
<br />
|
||||
In this binding it is used to identify a unique thing, so each weather-station or
|
||||
other apparatus submitting measurements can have a separate id, but if you don't intend to forward
|
||||
the observations to wunderground.com, this value can be any non-blank string.
|
||||
]]>
|
||||
</description>
|
||||
</parameter>
|
||||
</config-description>
|
||||
|
||||
</thing-type>
|
||||
|
||||
</thing:thing-descriptions>
|
Loading…
Reference in New Issue