Updated external content (Jenkins build 791)

pull/1839/head
openHAB Build Server 2022-02-13 03:36:06 +00:00
parent 5daec7478f
commit e030f66db0
9 changed files with 267 additions and 64 deletions

View File

@ -19,9 +19,14 @@ This binding is for any weather station that sends data to an IP Observer module
The weather stations that do this are made by a company in China called `Fine Offset` and then re-branded by many distribution companies around the world. The weather stations that do this are made by a company in China called `Fine Offset` and then re-branded by many distribution companies around the world.
Some of the brands include Aercus (433mhz), Ambient Weather (915mhz), Frogitt, Misol (433mhz), Pantech (433mhz), Sainlogic and many more. Some of the brands include Aercus (433mhz), Ambient Weather (915mhz), Frogitt, Misol (433mhz), Pantech (433mhz), Sainlogic and many more.
Whilst Ambient Weather has it own cloud based binding, the other brands will not work with that binding and Ambient Weather do not sell outside of the United States. Whilst Ambient Weather has it own cloud based binding, the other brands will not work with that binding and Ambient Weather do not sell outside of the United States.
This binding works fully offline and uses local scraping of the weather station data at 12 second resolution if you wish and is easy to setup.
This binding works fully offline and can work via one of two methods:
1. Local scraping of the weather station's `livedata` webpage at 12 second resolution (non WiFi models only).
2. Both WiFi and RJ45 models can be setup to push the data directly to the openHAB (default 8080) server directly and the binding can parse the data from the weather underground data.
The other binding worth mentioning is the weather underground binding that allows the data to be intercepted on its way to WU, however many of the weather stations do not allow the redirection of the WU data and require you to know how to do redirections with a custom DNS server on your network. The other binding worth mentioning is the weather underground binding that allows the data to be intercepted on its way to WU, however many of the weather stations do not allow the redirection of the WU data and require you to know how to do redirections with a custom DNS server on your network.
This binding is by far the easiest method and works for all the brands and will not stop the data still being sent to WU if you wish to do both at the same time. This binding with method 1 and a RJ45 model is by far the easiest method and works for all the brands and will not stop the data still being sent to WU if you wish to do both at the same time.
If your weather station came with a LCD screen instead of the IP Observer, you can add on the unit and the LCD screen will still work in parallel as the RF data is sent 1 way from the outdoor unit to the inside screens and IP Observer units. If your weather station came with a LCD screen instead of the IP Observer, you can add on the unit and the LCD screen will still work in parallel as the RF data is sent 1 way from the outdoor unit to the inside screens and IP Observer units.
## Supported Things ## Supported Things
@ -30,15 +35,21 @@ There is only one thing that can be added and is called `weatherstation`.
## Discovery ## Discovery
Auto discovery is supported and may take a while to complete as it scans all IP addresses on your network one by one. Auto discovery is supported for the RJ45 models, while the WiFi IP Observer will need to be manually added.
Discovery may take a while to complete as it scans all IP addresses on your network one by one.
## Thing Configuration ## Thing Configuration
When the id and password are supplied, you need to set the custom WU path to `/weatherstation/updateweatherstation.php` and the port to be the same as openHAB (port 8080 by default).
If they are left blank, the binding will work in the scraping mode (RJ45 model only).
| Parameter | Required | Description | | Parameter | Required | Description |
|-|-|-| |-|-|-|
| `address` | Y | Hostname or IP for the IP Observer | | `address` | Y | Hostname or IP for the IP Observer |
| `pollTime` | Y | Time in seconds between each Scan of the livedata.htm from the IP Observer | | `pollTime` | Y | Time in seconds between each Scan of the livedata.htm from the IP Observer |
| `autoReboot` | Y | Time in milliseconds to wait for a reply before rebooting the IP Observer. A value of 0 disables this feature allowing you to manually trigger or use a rule to handle the reboots. | | `autoReboot` | Y | Time in milliseconds to wait for a reply before rebooting the IP Observer. A value of 0 disables this feature allowing you to manually trigger or use a rule to handle the reboots. |
| `id` | N | The weather underground's `station ID` that is setup in the ipobservers settings. |
| `password` | N | The weather underground's `station key` that is setup in the ipobservers settings. |
## Channels ## Channels

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

View File

@ -3,7 +3,7 @@ id: renault
label: Renault label: Renault
title: Renault - Bindings title: Renault - Bindings
type: binding type: binding
description: "This binding allow MyRenault App. users to get battery status and other data from their cars." description: "This binding allows MyRenault App. users to get battery status and other data from their cars."
since: 3x since: 3x
logo: images/addons/renault.png logo: images/addons/renault.png
install: manual install: manual
@ -15,44 +15,133 @@ install: manual
# Renault Binding # Renault Binding
This binding allow MyRenault App. users to get battery status and other data from their cars. This binding allows MyRenault App. users to get battery status and other data from their cars.
They can also heat their cars by turning ON the HVAC status and toggle the car's charging mode.
A binding that translates the [python based renault-api](https://renault-api.readthedocs.io/en/latest/) in an easy to use binding. The binding translates the [python based renault-api](https://renault-api.readthedocs.io/en/latest/) in an easy to use openHAB java binding.
## Supported Things ## Supported Things
Supports MyRenault registered cars with an active Connected-Services account. Supports MyRenault registered cars with an active Connected-Services account.
This binding can only retrieve information that is available in the the MyRenault App. This binding can only retrieve information that is available in the MyRenault App.
## Discovery ## Discovery
No discovery No discovery
## Thing Configuration ## Thing Configuration
You require your MyRenault credential, locale and VIN for your MyRenault registered car. You require your MyRenault credential, locale and VIN for your MyRenault registered car.
| Parameter | Description | Required | | Parameter | Description | Required |
|-------------------|----------------------------------------|----------| |-------------------|----------------------------------------------------------------------------|----------|
| myRenaultUsername | MyRenault Username. | yes | | myRenaultUsername | MyRenault Username. | yes |
| myRenaultPassword | MyRenault Password. | yes | | myRenaultPassword | MyRenault Password. | yes |
| locale | MyRenault Location (language_country). | yes | | locale | MyRenault Location (language_country). | yes |
| vin | Vehicle Identification Number. | yes | | vin | Vehicle Identification Number. | yes |
| refreshInterval | Interval the car is polled in minutes. | no | | refreshInterval | Interval the car is polled in minutes. | no |
| updateDelay | How long to wait for commands to reach car and update to server in seconds.| no |
## Channels ## Channels
Currently all available channels are read only: | Channel ID | Type | Description | Read Only |
|------------------------|--------------------|-------------------------------------------------|-----------|
| Channel ID | Type | Description | | batteryavailableEnergy | Number:Energy | Battery Energy Available | Yes |
|--------------|---------------|---------------------------------| | batterylevel | Number | State of the battery in % | Yes |
| batterylevel | Number | State of the battery in % | | chargingmode | String | Charging mode. always_charging or schedule_mode | No |
| hvacstatus | Switch | HVAC status switch | | chargingstatus | String | Charging status | Yes |
| image | String | Image URL of MyRenault | | chargingremainingtime | Number:Time | Charging time remaining | Yes |
| location | Location | The GPS position of the vehicle | | plugstatus | String | Status of charging plug | Yes |
| odometer | Number:Length | Total distance travelled | | estimatedrange | Number:Length | Estimated range of the car | Yes |
| odometer | Number:Length | Total distance travelled | Yes |
| hvacstatus | String | HVAC status HVAC Status (ON, OFF, PENDING) | No |
| hvactargettemperature | Number:Temperature | HVAC target temperature (19 to 21) | No |
| externaltemperature | Number:Temperature | Temperature outside of the car | Yes |
| image | String | Image URL of MyRenault | Yes |
| location | Location | The GPS position of the vehicle | Yes |
| locationupdated | DateTime | Timestamp of the last location update | Yes |
## Limitations
Some channels may not work depending on your car and MyRenault account.
The "externaltemperature" only works on a few cars.
The "hvactargettemperature" is used by the hvacstatus ON command for pre-conditioning the car.
This seams to only allow values 19, 20 and 21 or else the pre-conditioning command will not work.
## Example
renaultcar.sitemap:
```
sitemap renaultcar label="Renault Car" {
Frame {
Image item=RenaultCar_ImageURL
Default item=RenaultCar_BatteryLevel icon="batterylevel"
Default item=RenaultCar_BatteryEnergyAvailable icon="energy"
Default item=RenaultCar_PlugStatus icon="poweroutlet"
Default item=RenaultCar_ChargingStatus icon="switch"
Selection item=RenaultCar_ChargingMode mappings=[SCHEDULE_MODE="Schedule mode",ALWAYS_CHARGING="Instant charge"] icon="switch"
Default item=RenaultCar_ChargingTimeRemaining icon="time"
Default item=RenaultCar_EstimatedRange
Default item=RenaultCar_Odometer
Selection item=RenaultCar_HVACStatus mappings=[ON="ON"] icon="switch"
Setpoint item=RenaultCar_HVACTargetTemperature minValue=19 maxValue=21 step=1 icon="temperature"
Default item=RenaultCar_LocationUpdate icon="time"
Default item=RenaultCar_Location
}
}
```
![Sitemap](doc/sitemap.png)
If you do not have a smart charger and want to limit the charge of the battery you can set up an active 15 minute charge schedule in the MyRenault App.
Then create a Dimmer item "RenaultCar_ChargeLimit" and set it to 80% for example. This rule will change the RenaultCar_ChargingMode to schedule_mode when the limit is reached.
This stops charging after the battery level reaches the charge limit.
ChargeRenaultCarLimit Code
```
configuration: {}
triggers:
- id: "1"
configuration:
itemName: RenaultCar_BatteryLevel
type: core.ItemStateUpdateTrigger
- id: "3"
configuration:
itemName: RenaultCar_ChargeLimit
type: core.ItemStateUpdateTrigger
- id: "4"
configuration:
itemName: RenaultCar_PlugStatus
type: core.ItemStateUpdateTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: >-
if ( RenaultCar_PlugStatus.state.toString == 'PLUGGED' ) {
if ( RenaultCar_BatteryLevel.state as Number >= RenaultCar_ChargeLimit.state as Number ) {
if (RenaultCar_ChargingMode.state.toString == 'ALWAYS_CHARGING' ) {
RenaultCar_ChargingMode.sendCommand("SCHEDULE_MODE")
}
} else {
if (RenaultCar_ChargingMode.state.toString == 'SCHEDULE_MODE' ) {
RenaultCar_ChargingMode.sendCommand("ALWAYS_CHARGING")
}
}
}
type: script.ScriptAction
```

View File

@ -21,6 +21,10 @@
<label>Color Temperature</label> <label>Color Temperature</label>
<description>This channel supports adjusting the color temperature from cold (0%) to warm (100%).</description> <description>This channel supports adjusting the color temperature from cold (0%) to warm (100%).</description>
<category>ColorLight</category> <category>ColorLight</category>
<tags>
<tag>Control</tag>
<tag>ColorTemperature</tag>
</tags>
</channel-type> </channel-type>
<channel-type id="program" advanced="true"> <channel-type id="program" advanced="true">

View File

@ -10,6 +10,8 @@
<channels> <channels>
<channel id="temperatureIndoor" typeId="temperatureIndoor"/> <channel id="temperatureIndoor" typeId="temperatureIndoor"/>
<channel id="temperatureOutdoor" typeId="system.outdoor-temperature"/> <channel id="temperatureOutdoor" typeId="system.outdoor-temperature"/>
<channel id="temperatureWindChill" typeId="temperatureWindChill"/>
<channel id="temperatureDewPoint" typeId="temperatureDewPoint"/>
<channel id="humidityIndoor" typeId="humidityIndoor"/> <channel id="humidityIndoor" typeId="humidityIndoor"/>
<channel id="humidityOutdoor" typeId="system.atmospheric-humidity"/> <channel id="humidityOutdoor" typeId="system.atmospheric-humidity"/>
<channel id="pressureAbsolute" typeId="pressureAbsolute"/> <channel id="pressureAbsolute" typeId="pressureAbsolute"/>
@ -51,6 +53,16 @@
feature allowing you to manually trigger or use a rule to handle the reboots</description> feature allowing you to manually trigger or use a rule to handle the reboots</description>
<default>2000</default> <default>2000</default>
</parameter> </parameter>
<parameter name="id" type="text">
<label>Station ID</label>
<description>The station ID used to connect to WeatherUnderGround. Leave blank if you wish to poll the livedata.</description>
</parameter>
<parameter name="password" type="text">
<context>password</context>
<label>Station Password</label>
<description>The station password used to connect to WeatherUnderGround. Leave blank if you wish to poll the
livedata.</description>
</parameter>
</config-description> </config-description>
</thing-type> </thing-type>
<channel-type id="responseTime" advanced="true"> <channel-type id="responseTime" advanced="true">
@ -70,6 +82,20 @@
</tags> </tags>
<state pattern="%.1f %unit%" readOnly="true"/> <state pattern="%.1f %unit%" readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="temperatureWindChill" advanced="true">
<item-type>Number:Temperature</item-type>
<label>Wind Chill Temperature</label>
<description>Wind Chill Temperature Outdoors</description>
<category>Temperature</category>
<state pattern="%.1f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="temperatureDewPoint" advanced="true">
<item-type>Number:Temperature</item-type>
<label>Dew Point Temperature</label>
<description>Dew Point Temperature Outdoors</description>
<category>Temperature</category>
<state pattern="%.1f %unit%" readOnly="true"/>
</channel-type>
<channel-type id="humidityIndoor"> <channel-type id="humidityIndoor">
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>Indoor Humidity</label> <label>Indoor Humidity</label>
@ -174,10 +200,6 @@
<label>Wind Max Gust</label> <label>Wind Max Gust</label>
<description>Max wind gust for today</description> <description>Max wind gust for today</description>
<category>Wind</category> <category>Wind</category>
<tags>
<tag>Measurement</tag>
<tag>Wind</tag>
</tags>
<state pattern="%.1f %unit%" readOnly="true"/> <state pattern="%.1f %unit%" readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="rainHourlyRate"> <channel-type id="rainHourlyRate">
@ -207,10 +229,6 @@
<label>Rain for Week</label> <label>Rain for Week</label>
<description>Weekly Rain</description> <description>Weekly Rain</description>
<category>Rain</category> <category>Rain</category>
<tags>
<tag>Measurement</tag>
<tag>Rain</tag>
</tags>
<state pattern="%.2f %unit%" readOnly="true"/> <state pattern="%.2f %unit%" readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="rainForMonth" advanced="true"> <channel-type id="rainForMonth" advanced="true">
@ -218,10 +236,6 @@
<label>Rain for Month</label> <label>Rain for Month</label>
<description>Rain since 12:00 on the 1st of this month</description> <description>Rain since 12:00 on the 1st of this month</description>
<category>Rain</category> <category>Rain</category>
<tags>
<tag>Measurement</tag>
<tag>Rain</tag>
</tags>
<state pattern="%.2f %unit%" readOnly="true"/> <state pattern="%.2f %unit%" readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="rainForYear"> <channel-type id="rainForYear">
@ -229,10 +243,6 @@
<label>Rain for Year</label> <label>Rain for Year</label>
<description>Total rain since 12:00 on 1st Jan</description> <description>Total rain since 12:00 on 1st Jan</description>
<category>Rain</category> <category>Rain</category>
<tags>
<tag>Measurement</tag>
<tag>Rain</tag>
</tags>
<state pattern="%.2f %unit%" readOnly="true"/> <state pattern="%.2f %unit%" readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="lastUpdatedTime" advanced="true"> <channel-type id="lastUpdatedTime" advanced="true">

View File

@ -430,9 +430,6 @@
<item-type>String</item-type> <item-type>String</item-type>
<label>Mode</label> <label>Mode</label>
<description>Thermostat Mode Setting</description> <description>Thermostat Mode Setting</description>
<tags>
<tag>heating</tag>
</tags>
<state pattern="%s" readOnly="false"> <state pattern="%s" readOnly="false">
<options> <options>
<option value="AUTOMATIC">AUTOMATIC</option> <option value="AUTOMATIC">AUTOMATIC</option>
@ -449,7 +446,8 @@
<description>Current measured room temperature</description> <description>Current measured room temperature</description>
<category>Temperature</category> <category>Temperature</category>
<tags> <tags>
<tag>heating</tag> <tag>Measurement</tag>
<tag>Temperature</tag>
</tags> </tags>
<state pattern="%.1f %unit%" readOnly="true"/> <state pattern="%.1f %unit%" readOnly="true"/>
</channel-type> </channel-type>
@ -460,7 +458,8 @@
<description>Thermostat Setpoint temperature</description> <description>Thermostat Setpoint temperature</description>
<category>Temperature</category> <category>Temperature</category>
<tags> <tags>
<tag>heating</tag> <tag>Setpoint</tag>
<tag>Temperature</tag>
</tags> </tags>
<state min="4.5" max="30.5" step="0.5" pattern="%.1f %unit%"/> <state min="4.5" max="30.5" step="0.5" pattern="%.1f %unit%"/>
</channel-type> </channel-type>

View File

@ -11,10 +11,19 @@
<channels> <channels>
<channel id="batterylevel" typeId="system.battery-level"/> <channel id="batterylevel" typeId="system.battery-level"/>
<channel id="batteryavailableenergy" typeId="batteryavailableenergy"/>
<channel id="plugstatus" typeId="plugstatus"/>
<channel id="chargingstatus" typeId="chargingstatus"/>
<channel id="chargingmode" typeId="chargingmode"/>
<channel id="chargingremainingtime" typeId="chargingremainingtime"/>
<channel id="estimatedrange" typeId="estimatedrange"/>
<channel id="odometer" typeId="odometer"/>
<channel id="hvacstatus" typeId="hvacstatus"/> <channel id="hvacstatus" typeId="hvacstatus"/>
<channel id="hvactargettemperature" typeId="hvactargettemperature"/>
<channel id="externaltemperature" typeId="externaltemperature"/>
<channel id="image" typeId="image"/> <channel id="image" typeId="image"/>
<channel id="location" typeId="system.location"/> <channel id="location" typeId="system.location"/>
<channel id="odometer" typeId="odometer"/> <channel id="locationupdated" typeId="locationupdated"/>
</channels> </channels>
<config-description> <config-description>
@ -69,20 +78,72 @@
<description>Interval the car is polled in minutes.</description> <description>Interval the car is polled in minutes.</description>
<default>10</default> <default>10</default>
</parameter> </parameter>
<parameter name="updateDelay" type="integer" unit="s" min="5" max="120">
<label>Update Delay</label>
<description>How long to wait for commands to reach car and update to server in seconds.</description>
<default>30</default>
</parameter>
</config-description> </config-description>
</thing-type> </thing-type>
<!-- Sample Channel Type --> <channel-type id="batteryavailableenergy">
<channel-type id="hvacstatus"> <item-type>Number:Energy</item-type>
<item-type>Switch</item-type> <label>Battery Energy Available</label>
<label>HVAC Status</label> <state pattern="%.1f %unit%" readOnly="true"></state>
<state readOnly="true"></state>
</channel-type> </channel-type>
<channel-type id="image"> <channel-type id="plugstatus">
<item-type>String</item-type> <item-type>String</item-type>
<label>Image URL</label> <label>Plug Status</label>
<description>Image URL of MyRenault</description> <description>Status of charging plug.</description>
<state readOnly="true"></state> <state readOnly="true">
<options>
<option value="UNPLUGGED">Unplugged</option>
<option value="PLUGGED">Plugged</option>
<option value="PLUG_ERROR">Plug error</option>
<option value="PLUG_UNKNOWN">Plug unknown</option>
<option value="UNKNOWN">Unknown</option>
</options>
</state>
</channel-type>
<channel-type id="chargingstatus">
<item-type>String</item-type>
<label>Charging Status</label>
<state readOnly="true">
<options>
<option value="NOT_IN_CHARGE">Not charging</option>
<option value="WAITING_FOR_A_PLANNED_CHARGE">Waiting for schedule</option>
<option value="CHARGE_ENDED">Charge ended</option>
<option value="WAITING_FOR_CURRENT_CHARGE">Waiting for charge</option>
<option value="ENERGY_FLAP_OPENED">Plug flap opened</option>
<option value="CHARGE_IN_PROGRESS">Charge in progress</option>
<option value="CHARGE_ERROR">Charge error</option>
<option value="UNAVAILABLE">Unavailable</option>
<option value="UNKNOWN">Unknown</option>
</options>
</state>
</channel-type>
<channel-type id="chargingmode">
<item-type>String</item-type>
<label>Charging Mode</label>
<state readOnly="false">
<options>
<option value="UNKNOWN">Unknown</option>
<option value="SCHEDULE_MODE">Schedule mode</option>
<option value="ALWAYS_CHARGING">Instant charge</option>
</options>
</state>
</channel-type>
<channel-type id="chargingremainingtime">
<item-type>Number:Time</item-type>
<label>Charging Time Remaining</label>
<category>Time</category>
<state pattern="%d %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="estimatedrange">
<item-type>Number:Length</item-type>
<label>Estimated Range</label>
<description>Estimated range of the car.</description>
<state pattern="%.1f %unit%" readOnly="true"></state>
</channel-type> </channel-type>
<channel-type id="odometer"> <channel-type id="odometer">
<item-type>Number:Length</item-type> <item-type>Number:Length</item-type>
@ -90,5 +151,42 @@
<description>Total distance travelled</description> <description>Total distance travelled</description>
<state pattern="%.1f %unit%" readOnly="true"></state> <state pattern="%.1f %unit%" readOnly="true"></state>
</channel-type> </channel-type>
<channel-type id="hvacstatus">
<item-type>String</item-type>
<label>HVAC Status (ON | OFF | PENDING)</label>
<state readOnly="false">
<options>
<option value="ON">On</option>
<option value="PENDING">Pending</option>
<option value="OFF">Off</option>
</options>
</state>
</channel-type>
<channel-type id="hvactargettemperature" advanced="true">
<item-type>Number:Temperature</item-type>
<label>HVAC Target Temperature</label>
<description>HVAC target temperature (19 to 21)</description>
<category>Temperature</category>
<state pattern="%.1f %unit%"></state>
</channel-type>
<channel-type id="externaltemperature" advanced="true">
<item-type>Number:Temperature</item-type>
<label>External Temperature</label>
<description>Temperature outside of the car</description>
<category>Temperature</category>
<state pattern="%.1f %unit%" readOnly="true"></state>
</channel-type>
<channel-type id="image">
<item-type>String</item-type>
<label>Image URL</label>
<description>Image URL of MyRenault</description>
<state readOnly="true"></state>
</channel-type>
<channel-type id="locationupdated">
<item-type>DateTime</item-type>
<label>Location Update</label>
<description>Timestamp of the last location update</description>
<state pattern="%1$tH:%1$tM %1$td.%1$tm.%1$tY" readOnly="true"></state>
</channel-type>
</thing:thing-descriptions> </thing:thing-descriptions>

View File

@ -251,6 +251,7 @@
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>Humidity</label> <label>Humidity</label>
<description>Relative humidity in % (0..100%)</description> <description>Relative humidity in % (0..100%)</description>
<category>Humidity</category>
<tags> <tags>
<tag>Measurement</tag> <tag>Measurement</tag>
<tag>Humidity</tag> <tag>Humidity</tag>

View File

@ -56,21 +56,12 @@
<label>Background Color</label> <label>Background Color</label>
<description>The color channel allows to control the color of a light.</description> <description>The color channel allows to control the color of a light.</description>
<category>ColorLight</category> <category>ColorLight</category>
<tags>
<tag>Control</tag>
<tag>Light</tag>
</tags>
</channel-type> </channel-type>
<channel-type id="nightlight"> <channel-type id="nightlight">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>nightlight</label> <label>nightlight</label>
<description>The nightlight channel allows to switch to nightlight mode. <description>The nightlight channel allows to switch to nightlight mode.</description>
</description>
<tags>
<tag>Switch</tag>
<tag>Light</tag>
</tags>
</channel-type> </channel-type>
</thing:thing-descriptions> </thing:thing-descriptions>