[imperihome] Remove imperihome addon (#15014)
Signed-off-by: Holger Friedrich <mail@holger-friedrich.de>
This commit is contained in:
parent
d8376aa6d0
commit
ac04a4e71d
@ -388,7 +388,6 @@
|
|||||||
/bundles/org.openhab.binding.zway/ @pathec
|
/bundles/org.openhab.binding.zway/ @pathec
|
||||||
/bundles/org.openhab.io.homekit/ @andylintner @ccutrer @yfre
|
/bundles/org.openhab.io.homekit/ @andylintner @ccutrer @yfre
|
||||||
/bundles/org.openhab.io.hueemulation/ @davidgraeff @digitaldan
|
/bundles/org.openhab.io.hueemulation/ @davidgraeff @digitaldan
|
||||||
/bundles/org.openhab.io.imperihome/ @pdegeus
|
|
||||||
/bundles/org.openhab.io.metrics/ @pravussum
|
/bundles/org.openhab.io.metrics/ @pravussum
|
||||||
/bundles/org.openhab.io.neeo/ @tmrobert8
|
/bundles/org.openhab.io.neeo/ @tmrobert8
|
||||||
/bundles/org.openhab.io.openhabcloud/ @kaikreuzer
|
/bundles/org.openhab.io.openhabcloud/ @kaikreuzer
|
||||||
|
|||||||
@ -1931,11 +1931,6 @@
|
|||||||
<artifactId>org.openhab.io.hueemulation</artifactId>
|
<artifactId>org.openhab.io.hueemulation</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.openhab.addons.bundles</groupId>
|
|
||||||
<artifactId>org.openhab.io.imperihome</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.openhab.addons.bundles</groupId>
|
<groupId>org.openhab.addons.bundles</groupId>
|
||||||
<artifactId>org.openhab.io.metrics</artifactId>
|
<artifactId>org.openhab.io.metrics</artifactId>
|
||||||
|
|||||||
@ -1,13 +0,0 @@
|
|||||||
This content is produced and maintained by the openHAB project.
|
|
||||||
|
|
||||||
* Project home: https://www.openhab.org
|
|
||||||
|
|
||||||
== Declared Project Licenses
|
|
||||||
|
|
||||||
This program and the accompanying materials are made available under the terms
|
|
||||||
of the Eclipse Public License 2.0 which is available at
|
|
||||||
https://www.eclipse.org/legal/epl-2.0/.
|
|
||||||
|
|
||||||
== Source Code
|
|
||||||
|
|
||||||
https://github.com/openhab/openhab-addons
|
|
||||||
@ -1,511 +0,0 @@
|
|||||||
# ImperiHome integration service
|
|
||||||
|
|
||||||
This IO service exposes openHAB Items to the Evertygo [ImperiHome](https://imperihome.com/) dashboard app for Android and iOS.
|
|
||||||
It creates a REST service at _/imperihome/iss_ that implements the [ImperiHome Standard System API](http://dev.evertygo.com/api/iss) (ISS).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
The ImperiHome integration service can be installed through the "Misc" add-ons category in the UI.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
### openHAB Add-on
|
|
||||||
|
|
||||||
To configure the ImperiHome integration add-on in openHAB, create a _imperihome.cfg_ file in the _conf/services_ directory.
|
|
||||||
The following configuration options can be used:
|
|
||||||
|
|
||||||
**System ID**
|
|
||||||
|
|
||||||
The ImperiHome integration service identifies itself to ImperiHome using a system ID.
|
|
||||||
By default the unique identifier of your openHAB installation is used. To override the ID, use the _system.id_ configuration option.
|
|
||||||
|
|
||||||
```
|
|
||||||
system.id=my-openhab-123
|
|
||||||
```
|
|
||||||
|
|
||||||
_Warning_: the system ID can not contain the underscore character (_).
|
|
||||||
|
|
||||||
**Root URL**
|
|
||||||
|
|
||||||
Root URL of your openHAB installation.
|
|
||||||
Should point to the openHAB welcome page
|
|
||||||
This option is currently only required when using the custom icon tag.
|
|
||||||
|
|
||||||
```
|
|
||||||
openhab.rootUrl=http://myserver.example.org:7070/
|
|
||||||
```
|
|
||||||
|
|
||||||
### ImperiHome
|
|
||||||
|
|
||||||
ImperiHome must be configured to connect to your openHAB instance.
|
|
||||||
|
|
||||||
Start ImperiHome, open the menu and go to My Systems.
|
|
||||||
Add a new system (+) and choose 'ImperiHome Standard System' as the object type.
|
|
||||||
Now enter the URL to your openHAB instance as Local URL, followed by _/imperihome/iss_.
|
|
||||||
For example, if your openHAB instance is running at _<http://192.168.1.10:8080/>_, the Local URL would be _<http://192.168.1.10:8080/imperihome/iss>_.
|
|
||||||
|
|
||||||
If you have port forwarding or similar set up to access your openHAB from the internet, you can also fill the Remote URL in the same way.
|
|
||||||
For example: _<http://my-openhab-url.dyndns.org:8080/imperihome/iss>_.
|
|
||||||
_Warning_: this service provides no authentication mechanism, so anyone could use the API to control your system when accessible from the internet.
|
|
||||||
Add a secure proxy or use the openHAB Cloud proxy to protect your system ([more information](https://www.openhab.org/docs/installation/security.html)).
|
|
||||||
|
|
||||||
Click Next to let ImperiHome validate the URL.
|
|
||||||
After validation succeeded the system is added and you can continue to configure your Items for use in ImperiHome.
|
|
||||||
|
|
||||||
## Device Tagging
|
|
||||||
|
|
||||||
This service uses Item tags to determine how to expose your Items to ImperiHome.
|
|
||||||
All tags are formatted like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:<tagtype>:<value>
|
|
||||||
```
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:room:Kitchen
|
|
||||||
```
|
|
||||||
|
|
||||||
If you have defined your Items in _.items_ files, tags can be added using:
|
|
||||||
|
|
||||||
```
|
|
||||||
[ "mytag" ]
|
|
||||||
```
|
|
||||||
|
|
||||||
syntax (after the _(Groups)_ and before the _{channel}_).
|
|
||||||
|
|
||||||
### Tag: _type_
|
|
||||||
|
|
||||||
Specifies the device type to expose to ImperiHome.
|
|
||||||
Take a look at [Device types](#deviceTypes) below for the supported device types and how to configure them.
|
|
||||||
If no type is specified, this service will try to auto-detect the type from the Item, based on supported value types (OnOff for a switch, HSB for color light) and Item name.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: auto-detect<br>
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:type:DevSwitch
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _room_
|
|
||||||
|
|
||||||
Specifies the room the device will show up in in ImperiHome.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: 'No Room'<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:room:Kitchen
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _label_
|
|
||||||
|
|
||||||
Sets the device label in ImperiHome.
|
|
||||||
If no label is specified, the Item label is used if available.
|
|
||||||
Otherwise the Item name will be used.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: Item label or name<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:label:Kitchen light
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _mapping_
|
|
||||||
|
|
||||||
Sets the mapping for an ImperiHome MultiSwitch device, just like an openHAB sitemap mapping does.
|
|
||||||
In the example below, 'All off', 'Relax' and 'Reading' will be visible in ImperiHome.
|
|
||||||
Clicking one of the options will send a 0, 1 or 2 value command to the openHAB item.
|
|
||||||
|
|
||||||
_Required_: only for MultiSwitch device<br>
|
|
||||||
_Default_: none<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:mapping:0=All off,1=Relax,2=Reading
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _link_
|
|
||||||
|
|
||||||
Links two devices together, using the value from the linked device as an additional value in the device containing the link tag.
|
|
||||||
See [Device links](#deviceLinks) for details.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: none<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:link:energy:Kitchen_Current_Consumption
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _unit_
|
|
||||||
|
|
||||||
Sets the unit for devices with a numeric value, such as _DevTemperature_ and _DevGenericSensor_.
|
|
||||||
The unit is only used to tell ImperiHome what to display; no conversion is performed.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: none<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:unit:°C
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _invert_
|
|
||||||
|
|
||||||
Inverts the state of on/off devices such as switches and dimmers.
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: false<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:invert:true
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tag: _icon_
|
|
||||||
|
|
||||||
Sets a custom icon to be shown in ImperiHome.
|
|
||||||
You can use all icon names that are also available for use in your sitemaps, including custom icons.
|
|
||||||
To use this tag you must set the openHAB root URL in your [configuration](#configuration).
|
|
||||||
|
|
||||||
_Required_: no<br>
|
|
||||||
_Default_: none<br>
|
|
||||||
_Example_:
|
|
||||||
|
|
||||||
```
|
|
||||||
iss:icon:sofa
|
|
||||||
```
|
|
||||||
|
|
||||||
<a name="deviceTypes"></a>
|
|
||||||
|
|
||||||
## Device types
|
|
||||||
|
|
||||||
The following table lists the ImperiHome API device types that you can use in a _iss:type_ tag.
|
|
||||||
Not all device types are currently supported.
|
|
||||||
For those that are supported, the Item types you can use them on are listed.
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>Device</th>
|
|
||||||
<th>Description</th>
|
|
||||||
<th>Supported</th>
|
|
||||||
<th>Item types</th>
|
|
||||||
<th>Link types</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevCamera</td>
|
|
||||||
<td>MJPEG IP Camera</td>
|
|
||||||
<td>No</td>
|
|
||||||
<td></td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevCO2</td>
|
|
||||||
<td>CO2 sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevCO2Alert</td>
|
|
||||||
<td>CO2 Alert sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Number, String<sup>(1)</sup>, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevDimmer</td>
|
|
||||||
<td>Dimmable light</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Dimmer, Number</td>
|
|
||||||
<td>energy</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevDoor</td>
|
|
||||||
<td>Door / window security sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Number, String<sup>(1)</sup>, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevElectricity</td>
|
|
||||||
<td>Electricity consumption sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>kwh, watt</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevFlood</td>
|
|
||||||
<td>Flood security sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Number, String<sup>(1)</sup>, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevGenericSensor</td>
|
|
||||||
<td>Generic sensor (any value)</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number, String</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevHygrometry</td>
|
|
||||||
<td>Hygro sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevLock</td>
|
|
||||||
<td>Door lock</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevLuminosity</td>
|
|
||||||
<td>Luminance sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevMotion</td>
|
|
||||||
<td>Motion security sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Number, String<sup>(1)</sup>, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevMultiSwitch</td>
|
|
||||||
<td>Multiple choice actuator</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevNoise</td>
|
|
||||||
<td>Noise sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevPlayer</td>
|
|
||||||
<td>Audio/Video player</td>
|
|
||||||
<td>No</td>
|
|
||||||
<td></td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevPlaylist</td>
|
|
||||||
<td>Audio/Video playlist</td>
|
|
||||||
<td>No</td>
|
|
||||||
<td></td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevPressure</td>
|
|
||||||
<td>Pressure sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevRain</td>
|
|
||||||
<td>Rain sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>accum</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevRGBLight</td>
|
|
||||||
<td>RGB(W) Light (dimmable)</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Color</td>
|
|
||||||
<td>energy</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevScene</td>
|
|
||||||
<td>Scene (launchable)</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Switch, Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevShutter</td>
|
|
||||||
<td>Shutter actuator</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Dimmer, Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevSmoke</td>
|
|
||||||
<td>Smoke security sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Contact, Number, String<sup>(1)</sup>, Switch</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevSwitch</td>
|
|
||||||
<td>Standard on/off switch</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Switch</td>
|
|
||||||
<td>energy</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevTemperature</td>
|
|
||||||
<td>Temperature sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevTempHygro</td>
|
|
||||||
<td>Temperature and Hygrometry combined sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>hygro, temp</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevThermostat</td>
|
|
||||||
<td>Thermostat <sup>(2)</sup></td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>curmode, curtemp</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevUV</td>
|
|
||||||
<td>UV sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>-</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>DevWind</td>
|
|
||||||
<td>Wind sensor</td>
|
|
||||||
<td>Yes</td>
|
|
||||||
<td>Number</td>
|
|
||||||
<td>direction</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<sup>(1)</sup> When using a String Item for trippable devices, any non-empty value other than 'ok' will set the device to tripped. This makes it compatible with the Nest Protect binding.
|
|
||||||
|
|
||||||
<sup>(2)</sup> Thermostat devices require additional tags. See [Thermostat](#thermostat) for details.
|
|
||||||
|
|
||||||
<a name="deviceLinks"></a>
|
|
||||||
|
|
||||||
## Device links
|
|
||||||
|
|
||||||
Some devices can be linked to another device.
|
|
||||||
This allows you to create combined devices reporting multiple values, or reporting the energy consumption with a switch device.
|
|
||||||
|
|
||||||
The _link_ tag refers to the name of the Item it should link to.
|
|
||||||
The item must be an ImperiHome device itself, so it must have at least one _iss_ tag.
|
|
||||||
|
|
||||||
### Switch energy consumption
|
|
||||||
|
|
||||||
ImperiHome allows you to show the current energy consumption for a _DevDimmer_, _DevRGBLight_ and _DevSwitch_.
|
|
||||||
This example links the _MyLightEnergy_ Number Item to the _MyLight_ Switch Item, so the _DevSwitch_ device will also report the energy consumption value to ImperiHome:
|
|
||||||
|
|
||||||
```
|
|
||||||
Switch MyLight "My Light" ["iss:type:DevSwitch", "iss:link:energy:MyLight_Energy"] { channel="zwave:device:1:node14:switch_binary1" }
|
|
||||||
Number MyLightEnergy "My Light Usage [%.1f W]" ["iss:type:DevElectricity"] { channel="zwave:device:1:node14:meter_watts1" }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Total energy consumption
|
|
||||||
|
|
||||||
The _DevElectricity_ devices main value is the current consumption in Watts.
|
|
||||||
To add the total consumption in KWh, link your electricity device to a generic sensor device containing the total energy consumption value:
|
|
||||||
|
|
||||||
```
|
|
||||||
Number MyLight_Energy "My Light Usage [%.1f W]" ["iss:type:DevElectricity", "iss:link:kwh:MyLight_Total_Energy"] { channel="zwave:device:1:node14:meter_watts1" }
|
|
||||||
Number MyLight_Total_Energy "My Light Total usage [%.1f KWh]" ["iss:type:DevGenericSensor", "iss:unit:KWh"] { channel="zwave:device:1:node14:sensor_power1" }
|
|
||||||
```
|
|
||||||
|
|
||||||
### TempHygro
|
|
||||||
|
|
||||||
ImperiHome recognizes the special _DevTempHygro_ device, combining a temperature and hydrometry sensor.
|
|
||||||
You can create such a device by linking either from a temperature Item to a hygro Item:
|
|
||||||
|
|
||||||
```
|
|
||||||
Number MyTemp "Temperature [%.1f °C]" ["iss:type:DevTempHygro", "iss:link:hygro:MyHum"] { channel="zwave:device:1:node8:sensor_temperature" }
|
|
||||||
Number MyHum "Humidity [%d%%]" ["iss:type:DevHygrometry"] { channel="zwave:device:1:node8:sensor_relhumidity" }
|
|
||||||
```
|
|
||||||
|
|
||||||
or vise versa:
|
|
||||||
|
|
||||||
```
|
|
||||||
Number MyTemp "Temperature [%.1f °C]" ["iss:type:DevTemperature"] { channel="zwave:device:1:node8:sensor_temperature" }
|
|
||||||
Number MyHum "Humidity [%d%%]" ["iss:type:DevTempHygro", "iss:link:temp:MyTemp"] { channel="zwave:device:1:node8:sensor_relhumidity" }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Rain accumulation
|
|
||||||
|
|
||||||
The _DevRain_ devices main value is the current instant rain value (default in mm per hour).
|
|
||||||
To add the total rain accumulation value, link your rain device to a generic sensor device:
|
|
||||||
|
|
||||||
```
|
|
||||||
Number RainCurrent "Rain current [%.1f mm/h]" ["iss:type:DevRain", "iss:link:accum:RainAccumulation"] { channel="..." }
|
|
||||||
Number RainAccumulation "Rain accumulation [%.1f mm]" ["iss:type:DevGenericSensor", "iss:unit:mm"] { channel="..." }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Wind direction
|
|
||||||
|
|
||||||
The _DevWind_ devices main value is the current wind speed (default in km per hour).
|
|
||||||
To add the wind direction value (default in degrees), link your wind device to a generic sensor device:
|
|
||||||
|
|
||||||
```
|
|
||||||
Number WindSpeed "Wind speed [%.1f km/h]" ["iss:type:DevWind", "iss:link:direction:WindDirection"] { channel="..." }
|
|
||||||
Number WindDirection "Wind direction [%d deg]" ["iss:type:DevGenericSensor", "iss:unit:deg"] { channel="..." }
|
|
||||||
```
|
|
||||||
|
|
||||||
<a name="thermostat"></a>
|
|
||||||
|
|
||||||
### Thermostat
|
|
||||||
|
|
||||||
The _DevThermostat_ combines a setpoint, current temperature and mode in one ImperiHome device.
|
|
||||||
To accomplish this using openHAB items, it uses a _curtemp_ and _curmode_ link and a few additional tags.
|
|
||||||
|
|
||||||
```
|
|
||||||
Number Thermos_Setpoint "Thermostat" ["iss:room:Test", "iss:type:DevThermostat", "iss:step:0.5", "iss:minVal:15", "iss:maxVal:24", "iss:modes:Home,Away,Comfort,Sleeping", "iss:link:curmode:Thermos_Mode", "iss:link:curtemp:Thermos_Temp"] { channel="..." }
|
|
||||||
Number Thermos_Temp "Thermos temp" ["iss:room:Test", "iss:type:DevTemperature", "iss:unit:K"] { channel="..." }
|
|
||||||
String Thermos_Mode "Thermos mode" ["iss:room:Test", "iss:type:DevGenericSensor"] { channel="..." }
|
|
||||||
```
|
|
||||||
|
|
||||||
The main _DevThermostat_ device must be the Item holding the setpoint.
|
|
||||||
Using tags, this device specifies the minimum and maximum setpoint value, the setpoint step and the available modes.
|
|
||||||
The two links specify what Items contain the current temperature and current mode.
|
|
||||||
If you want to use a custom unit, set the _unit_ tag on the current temperature device.
|
|
||||||
|
|
||||||
### Shutter stopper
|
|
||||||
|
|
||||||
The _DevShutter_ device of ImperiHome support a 'stop' action.
|
|
||||||
To use this, link a Switch item to your shutter item, like so:
|
|
||||||
|
|
||||||
```
|
|
||||||
Dimmer MyShutter "Shutter" ["iss:room:Test", "iss:type:DevShutter", "iss:link:stopper:MyShutterStop"] { channel="..." }
|
|
||||||
Switch MyShutterStop "Stop shutter" ["iss:room:Test", "iss:type:DevSwitch"] { channel="..." }
|
|
||||||
```
|
|
||||||
|
|
||||||
Implement a Rule listening for the ON command on the switch to handle the stop action yourself.
|
|
||||||
|
|
||||||
## Items example
|
|
||||||
|
|
||||||
```
|
|
||||||
Color LVR_Billy "Billy" <colorlight> (Lights) ["iss:room:Living room", "iss:type:DevRGBLight"] { channel="hue:0210:001122334455:bulb1:color" }
|
|
||||||
Switch LVR_TallLamp "Tall lamp" (Lights) ["iss:room:Living room", "iss:type:DevSwitch", "iss:invert:true"] { channel="zwave:device:1:node3:switch_binary" }
|
|
||||||
Dimmer LVR_DinnerTable "Dinner table" (Lights) ["iss:room:Living room", "iss:type:DevDimmer"] { channel="zwave:device:1:node13:switch_dimmer" }
|
|
||||||
|
|
||||||
Number ENT_Entrance_Current "Entrance usage [%.1f W]" (Wattage) ["iss:room:Entrance", "iss:type:DevElectricity", "iss:unit:Watt"] { channel="zwave:device:1:node14:meter_watts1" }
|
|
||||||
|
|
||||||
Number ENT_Temperature "Entrance temperature [%.1f °C]" (Temperature) ["iss:room:Entrance", "iss:type:DevTempHygro", "iss:link:hygro:ENT_Humidity"] { channel="zwave:device:1:node8:sensor_temperature" }
|
|
||||||
Number ENT_Luminance "Entrance light [%d lm]" (Luminance) ["iss:room:Entrance", "iss:type:DevLuminosity", "iss:unit:lux"] { channel="zwave:device:1:node8:sensor_luminance" }
|
|
||||||
Number ENT_Humidity "Entrance humidity [%d%%]" (Humidity) ["iss:room:Entrance", "iss:type:DevHygrometry"] { channel="zwave:device:1:node8:sensor_relhumidity" }
|
|
||||||
```
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>org.openhab.addons.bundles</groupId>
|
|
||||||
<artifactId>org.openhab.addons.reactor.bundles</artifactId>
|
|
||||||
<version>4.0.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>org.openhab.io.imperihome</artifactId>
|
|
||||||
|
|
||||||
<name>openHAB Add-ons :: Bundles :: IO :: ImperiHome Integration Service</name>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<features name="org.openhab.io.imperihome-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
|
|
||||||
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository>
|
|
||||||
|
|
||||||
<feature name="openhab-misc-imperihome" description="ImperiHome Integration" version="${project.version}">
|
|
||||||
<feature>openhab-runtime-base</feature>
|
|
||||||
<feature>openhab-core-model-item</feature>
|
|
||||||
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.io.imperihome/${project.version}</bundle>
|
|
||||||
</feature>
|
|
||||||
</features>
|
|
||||||
@ -1,248 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Dictionary;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServlet;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.openhab.core.config.core.ConfigurableService;
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.ItemRegistry;
|
|
||||||
import org.openhab.core.persistence.PersistenceServiceRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.action.ActionRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.handler.DeviceActionHandler;
|
|
||||||
import org.openhab.io.imperihome.internal.handler.DeviceHistoryHandler;
|
|
||||||
import org.openhab.io.imperihome.internal.handler.DevicesListHandler;
|
|
||||||
import org.openhab.io.imperihome.internal.handler.RoomListHandler;
|
|
||||||
import org.openhab.io.imperihome.internal.handler.SystemHandler;
|
|
||||||
import org.openhab.io.imperihome.internal.io.DeviceParametersSerializer;
|
|
||||||
import org.openhab.io.imperihome.internal.io.DeviceTypeSerializer;
|
|
||||||
import org.openhab.io.imperihome.internal.io.ParamTypeSerializer;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParameters;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
import org.osgi.framework.Constants;
|
|
||||||
import org.osgi.service.component.annotations.Activate;
|
|
||||||
import org.osgi.service.component.annotations.Component;
|
|
||||||
import org.osgi.service.component.annotations.Deactivate;
|
|
||||||
import org.osgi.service.component.annotations.Modified;
|
|
||||||
import org.osgi.service.component.annotations.Reference;
|
|
||||||
import org.osgi.service.component.annotations.ReferencePolicy;
|
|
||||||
import org.osgi.service.http.HttpService;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main OSGi service and HTTP servlet for ImperiHome integration.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
@Component(service = HttpServlet.class, configurationPid = "org.openhab.imperihome", //
|
|
||||||
property = Constants.SERVICE_PID + "=org.openhab.imperihome")
|
|
||||||
@ConfigurableService(category = "io", label = "ImperiHome Integration", description_uri = "io:imperihome")
|
|
||||||
public class ImperiHomeApiServlet extends HttpServlet {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = -1966364789075448441L;
|
|
||||||
|
|
||||||
private static final String PATH = "/imperihome/iss";
|
|
||||||
|
|
||||||
private static final String APPLICATION_JSON = "application/json";
|
|
||||||
private static final String CHARSET = "utf-8";
|
|
||||||
|
|
||||||
private static final Pattern URL_PATTERN_SYSTEM = Pattern.compile(PATH + "/system$", Pattern.CASE_INSENSITIVE);
|
|
||||||
private static final Pattern URL_PATTERN_ROOMS = Pattern.compile(PATH + "/rooms$", Pattern.CASE_INSENSITIVE);
|
|
||||||
private static final Pattern URL_PATTERN_DEVICES = Pattern.compile(PATH + "/devices$", Pattern.CASE_INSENSITIVE);
|
|
||||||
private static final Pattern URL_PATTERN_DEVICE_ACTION = Pattern
|
|
||||||
.compile(PATH + "/devices/(.+?)/action/(.+?)(?:/(.*?))?$", Pattern.CASE_INSENSITIVE);
|
|
||||||
private static final Pattern URL_PATTERN_DEVICE_HISTORY = Pattern
|
|
||||||
.compile(PATH + "/devices/(.+?)/(.+?)/histo/(.+?)/(.+?)$", Pattern.CASE_INSENSITIVE);
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(ImperiHomeApiServlet.class);
|
|
||||||
|
|
||||||
private final Gson gson;
|
|
||||||
private final ImperiHomeConfig imperiHomeConfig;
|
|
||||||
|
|
||||||
private HttpService httpService;
|
|
||||||
private ItemRegistry itemRegistry;
|
|
||||||
private PersistenceServiceRegistry persistenceServiceRegistry;
|
|
||||||
private EventPublisher eventPublisher;
|
|
||||||
|
|
||||||
private ItemProcessor itemProcessor;
|
|
||||||
private DevicesListHandler devicesListHandler;
|
|
||||||
private RoomListHandler roomListHandler;
|
|
||||||
private SystemHandler systemHandler;
|
|
||||||
private DeviceRegistry deviceRegistry;
|
|
||||||
private DeviceActionHandler deviceActionHandler;
|
|
||||||
private DeviceHistoryHandler deviceHistoryHandler;
|
|
||||||
private ActionRegistry actionRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor.
|
|
||||||
*/
|
|
||||||
public ImperiHomeApiServlet() {
|
|
||||||
imperiHomeConfig = new ImperiHomeConfig();
|
|
||||||
|
|
||||||
GsonBuilder gsonBuilder = new GsonBuilder();
|
|
||||||
gsonBuilder.registerTypeAdapter(DeviceType.class, new DeviceTypeSerializer());
|
|
||||||
gsonBuilder.registerTypeAdapter(ParamType.class, new ParamTypeSerializer());
|
|
||||||
gsonBuilder.registerTypeAdapter(DeviceParameters.class, new DeviceParametersSerializer());
|
|
||||||
gson = gsonBuilder.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSGi activation callback.
|
|
||||||
*
|
|
||||||
* @param config Service config.
|
|
||||||
*/
|
|
||||||
@Activate
|
|
||||||
protected void activate(Map<String, Object> config) {
|
|
||||||
modified(config);
|
|
||||||
|
|
||||||
systemHandler = new SystemHandler(imperiHomeConfig);
|
|
||||||
deviceRegistry = new DeviceRegistry();
|
|
||||||
actionRegistry = new ActionRegistry(eventPublisher, deviceRegistry);
|
|
||||||
itemProcessor = new ItemProcessor(itemRegistry, deviceRegistry, actionRegistry, imperiHomeConfig);
|
|
||||||
roomListHandler = new RoomListHandler(deviceRegistry);
|
|
||||||
devicesListHandler = new DevicesListHandler(deviceRegistry);
|
|
||||||
deviceActionHandler = new DeviceActionHandler(deviceRegistry);
|
|
||||||
deviceHistoryHandler = new DeviceHistoryHandler(deviceRegistry, persistenceServiceRegistry);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Dictionary<String, String> servletParams = new Hashtable<>();
|
|
||||||
httpService.registerServlet(PATH, this, servletParams, httpService.createDefaultHttpContext());
|
|
||||||
logger.info("Started ImperiHome integration service at " + PATH);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("Could not start ImperiHome integration service: {}", e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSGi config modification callback.
|
|
||||||
*
|
|
||||||
* @param config Service config.
|
|
||||||
*/
|
|
||||||
@Modified
|
|
||||||
protected void modified(Map<String, Object> config) {
|
|
||||||
imperiHomeConfig.update(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSGi deactivation callback.
|
|
||||||
*/
|
|
||||||
@Deactivate
|
|
||||||
protected void deactivate() {
|
|
||||||
try {
|
|
||||||
httpService.unregister(PATH);
|
|
||||||
} catch (IllegalArgumentException ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
itemProcessor.destroy();
|
|
||||||
|
|
||||||
systemHandler = null;
|
|
||||||
deviceRegistry = null;
|
|
||||||
itemProcessor = null;
|
|
||||||
roomListHandler = null;
|
|
||||||
devicesListHandler = null;
|
|
||||||
deviceActionHandler = null;
|
|
||||||
deviceHistoryHandler = null;
|
|
||||||
|
|
||||||
logger.info("ImperiHome integration service stopped");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Reference(policy = ReferencePolicy.DYNAMIC)
|
|
||||||
protected void setItemRegistry(ItemRegistry itemRegistry) {
|
|
||||||
this.itemRegistry = itemRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unsetItemRegistry(ItemRegistry itemRegistry) {
|
|
||||||
this.itemRegistry = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Reference
|
|
||||||
protected void setEventPublisher(EventPublisher eventPublisher) {
|
|
||||||
this.eventPublisher = eventPublisher;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unsetEventPublisher(EventPublisher eventPublisher) {
|
|
||||||
this.eventPublisher = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Reference
|
|
||||||
protected void setHttpService(HttpService httpService) {
|
|
||||||
this.httpService = httpService;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unsetHttpService(HttpService httpService) {
|
|
||||||
this.httpService = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Reference
|
|
||||||
protected void setPersistenceServiceRegistry(PersistenceServiceRegistry persistenceServiceRegistry) {
|
|
||||||
this.persistenceServiceRegistry = persistenceServiceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unsetPersistenceServiceRegistry(PersistenceServiceRegistry persistenceServiceRegistry) {
|
|
||||||
this.persistenceServiceRegistry = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
|
||||||
String path = req.getRequestURI();
|
|
||||||
logger.debug("{}: {} {}", req.getRemoteAddr(), req.getMethod(), path);
|
|
||||||
setHeaders(resp);
|
|
||||||
|
|
||||||
Object response = null;
|
|
||||||
|
|
||||||
Matcher actionMatcher = URL_PATTERN_DEVICE_ACTION.matcher(path);
|
|
||||||
Matcher historyMatcher = URL_PATTERN_DEVICE_HISTORY.matcher(path);
|
|
||||||
|
|
||||||
if (URL_PATTERN_ROOMS.matcher(path).matches()) {
|
|
||||||
response = roomListHandler.handle(req);
|
|
||||||
} else if (URL_PATTERN_DEVICES.matcher(path).matches()) {
|
|
||||||
response = devicesListHandler.handle(req);
|
|
||||||
} else if (actionMatcher.matches()) {
|
|
||||||
deviceActionHandler.handle(req, actionMatcher);
|
|
||||||
} else if (historyMatcher.matches()) {
|
|
||||||
response = deviceHistoryHandler.handle(req, historyMatcher);
|
|
||||||
} else if (URL_PATTERN_SYSTEM.matcher(path).matches()) {
|
|
||||||
response = systemHandler.handle(req);
|
|
||||||
} else {
|
|
||||||
logger.warn("Unrecognized request: {}", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
resp.getWriter().write(gson.toJson(response));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setHeaders(HttpServletResponse response) {
|
|
||||||
response.setCharacterEncoding(CHARSET);
|
|
||||||
response.setContentType(APPLICATION_JSON);
|
|
||||||
response.setHeader("Access-Control-Allow-Origin", "*");
|
|
||||||
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
|
|
||||||
response.setHeader("Access-Control-Max-Age", "3600");
|
|
||||||
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.openhab.core.id.InstanceUUID;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configuration parser and container.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ImperiHomeConfig {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(ImperiHomeConfig.class);
|
|
||||||
|
|
||||||
private String systemId;
|
|
||||||
private String rootUrl;
|
|
||||||
|
|
||||||
public void update(Map<String, Object> config) {
|
|
||||||
Object cSystemId = config.get("system.id");
|
|
||||||
if (cSystemId == null || cSystemId.toString().isEmpty()) {
|
|
||||||
systemId = InstanceUUID.get();
|
|
||||||
} else {
|
|
||||||
systemId = cSystemId.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
Object rootUrlObj = config.get("openhab.rootUrl");
|
|
||||||
if (rootUrlObj != null) {
|
|
||||||
rootUrl = String.valueOf(rootUrlObj);
|
|
||||||
if (!rootUrl.endsWith("/")) {
|
|
||||||
rootUrl += "/";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info("Configuration updated");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSystemId() {
|
|
||||||
return systemId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRootUrl() {
|
|
||||||
return rootUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract action, called through the API by ImperiHome clients.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public abstract class Action {
|
|
||||||
|
|
||||||
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
|
|
||||||
|
|
||||||
protected static final String COMMAND_SOURCE = "imperihome";
|
|
||||||
|
|
||||||
protected final EventPublisher eventPublisher;
|
|
||||||
|
|
||||||
protected Action(EventPublisher eventPublisher) {
|
|
||||||
this.eventPublisher = eventPublisher;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates if this action can be performed on the given Item.
|
|
||||||
*
|
|
||||||
* @param device
|
|
||||||
* @param item Item to check compatibility with.
|
|
||||||
* @return True if the Item is supported.
|
|
||||||
*/
|
|
||||||
public abstract boolean supports(AbstractDevice device, Item item);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform this action on the given Item.
|
|
||||||
*
|
|
||||||
* @param device
|
|
||||||
* @param item Item to perform action on.
|
|
||||||
* @param value Action parameter value.
|
|
||||||
*/
|
|
||||||
public abstract void perform(AbstractDevice device, Item item, String value);
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action registry. Maps ImperiHome API action name to {@link Action} implementation.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ActionRegistry {
|
|
||||||
|
|
||||||
private final Map<String, Action> actions = new HashMap<>();
|
|
||||||
|
|
||||||
public ActionRegistry(EventPublisher eventPublisher, DeviceRegistry deviceRegistry) {
|
|
||||||
actions.put("setStatus", new SetStatusAction(eventPublisher));
|
|
||||||
actions.put("setColor", new SetColorAction(eventPublisher));
|
|
||||||
actions.put("setLevel", new SetLevelAction(eventPublisher));
|
|
||||||
actions.put("setChoice", new SetChoiceAction(eventPublisher));
|
|
||||||
actions.put("setMode", new SetModeAction(eventPublisher, deviceRegistry));
|
|
||||||
actions.put("setSetPoint", new SetSetPointAction(eventPublisher));
|
|
||||||
actions.put("launchScene", new LaunchSceneAction(eventPublisher));
|
|
||||||
actions.put("stopShutter", new StopShutterAction(eventPublisher, deviceRegistry));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action get(String action) {
|
|
||||||
return actions.get(action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.core.types.Command;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action performed on a DevScene. Sends an {@link OnOffType#ON} or {@link DecimalType} 1 to the Item.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class LaunchSceneAction extends Action {
|
|
||||||
|
|
||||||
public LaunchSceneAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
List<Class<? extends Command>> acceptedCommandTypes = item.getAcceptedCommandTypes();
|
|
||||||
return acceptedCommandTypes.contains(OnOffType.class) || acceptedCommandTypes.contains(DecimalType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
ItemCommandEvent event = null;
|
|
||||||
|
|
||||||
List<Class<? extends Command>> acceptedCommandTypes = item.getAcceptedCommandTypes();
|
|
||||||
if (acceptedCommandTypes.contains(OnOffType.class)) {
|
|
||||||
event = ItemEventFactory.createCommandEvent(item.getName(), OnOffType.ON, COMMAND_SOURCE);
|
|
||||||
} else if (acceptedCommandTypes.contains(DecimalType.class)) {
|
|
||||||
event = ItemEventFactory.createCommandEvent(item.getName(), new DecimalType(1), COMMAND_SOURCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event != null) {
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action setting a choice from a selection list, e.g. MultiSwitch.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetChoiceAction extends Action {
|
|
||||||
|
|
||||||
public SetChoiceAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
Map<String, String> mapping = device.getMapping();
|
|
||||||
return mapping != null && !mapping.isEmpty() && item.getAcceptedCommandTypes().contains(DecimalType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
String newValue = null;
|
|
||||||
|
|
||||||
for (Entry<String, String> entry : device.getMapping().entrySet()) {
|
|
||||||
if (Objects.equals(entry.getValue(), value)) {
|
|
||||||
newValue = entry.getKey();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newValue == null) {
|
|
||||||
logger.warn("Could not find selection '{}' in mapping {} of device {}", value, device.getMapping(), device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(item.getName(), new DecimalType(newValue),
|
|
||||||
COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.HSBType;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Items setting RGB color value.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetColorAction extends Action {
|
|
||||||
|
|
||||||
public SetColorAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
return item.getAcceptedCommandTypes().contains(HSBType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
if (value == null || value.length() != 8) {
|
|
||||||
logger.error("Invalid parameter: '{}'. Format must be 'aarrggbb'.", value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int r = Integer.parseInt(value.substring(2, 4), 16);
|
|
||||||
int g = Integer.parseInt(value.substring(4, 6), 16);
|
|
||||||
int b = Integer.parseInt(value.substring(6, 8), 16);
|
|
||||||
|
|
||||||
ItemCommandEvent event;
|
|
||||||
if (r == 0 && g == 0 && b == 0) {
|
|
||||||
event = ItemEventFactory.createCommandEvent(item.getName(), OnOffType.OFF, COMMAND_SOURCE);
|
|
||||||
} else {
|
|
||||||
HSBType hsbValue = HSBType.fromRGB(r, g, b);
|
|
||||||
event = ItemEventFactory.createCommandEvent(item.getName(), hsbValue, COMMAND_SOURCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action setting percentage level, e.g. dimmer.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetLevelAction extends Action {
|
|
||||||
|
|
||||||
public SetLevelAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
return item.getAcceptedCommandTypes().contains(PercentType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(item.getName(), new PercentType(value),
|
|
||||||
COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.StringType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action setting a thermostat mode.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetModeAction extends Action {
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
|
|
||||||
public SetModeAction(EventPublisher eventPublisher, DeviceRegistry deviceRegistry) {
|
|
||||||
super(eventPublisher);
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
if (device.getType() != DeviceType.THERMOSTAT) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
String curmode = device.getLinks().get("curmode");
|
|
||||||
return curmode != null && !curmode.isBlank();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
String modeDeviceName = device.getLinks().get("curmode");
|
|
||||||
AbstractDevice modeDevice = deviceRegistry.getDevice(ItemProcessor.getDeviceId(modeDeviceName));
|
|
||||||
if (modeDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked CurMode device '{}', make sure the Item has iss tags",
|
|
||||||
modeDeviceName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item modeItem = modeDevice.getItem();
|
|
||||||
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(modeItem.getName(), new StringType(value),
|
|
||||||
COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.library.types.StringType;
|
|
||||||
import org.openhab.core.types.Command;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action setting a thermostat setpoint.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetSetPointAction extends Action {
|
|
||||||
|
|
||||||
public SetSetPointAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
if (device.getType() != DeviceType.THERMOSTAT) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
List<Class<? extends Command>> acceptedCommandTypes = item.getAcceptedCommandTypes();
|
|
||||||
return acceptedCommandTypes.contains(DecimalType.class) || acceptedCommandTypes.contains(StringType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
List<Class<? extends Command>> acceptedCommandTypes = item.getAcceptedCommandTypes();
|
|
||||||
|
|
||||||
Command command;
|
|
||||||
if (acceptedCommandTypes.contains(DecimalType.class)) {
|
|
||||||
command = new DecimalType(value);
|
|
||||||
} else if (acceptedCommandTypes.contains(StringType.class)) {
|
|
||||||
command = new StringType(value);
|
|
||||||
} else {
|
|
||||||
logger.error("Item {} doesn't support Decimal or String type", item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(item.getName(), command, COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action setting device status to 1 or 0.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SetStatusAction extends Action {
|
|
||||||
|
|
||||||
public SetStatusAction(EventPublisher eventPublisher) {
|
|
||||||
super(eventPublisher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
return item.getAcceptedCommandTypes().contains(OnOffType.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
OnOffType cmdValue = OnOffType.OFF;
|
|
||||||
if (Objects.equals("1", value)) {
|
|
||||||
cmdValue = OnOffType.ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(item.getName(), cmdValue, COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.action;
|
|
||||||
|
|
||||||
import org.openhab.core.events.EventPublisher;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.events.ItemCommandEvent;
|
|
||||||
import org.openhab.core.items.events.ItemEventFactory;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action to stop a shutter. Actually just sends an ON command to a linked switch device, to be handled by rules.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class StopShutterAction extends Action {
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
|
|
||||||
public StopShutterAction(EventPublisher eventPublisher, DeviceRegistry deviceRegistry) {
|
|
||||||
super(eventPublisher);
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(AbstractDevice device, Item item) {
|
|
||||||
String stopper = device.getLinks().get("stopper");
|
|
||||||
return device.getType() == DeviceType.SHUTTER && stopper != null && !stopper.isBlank();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void perform(AbstractDevice device, Item item, String value) {
|
|
||||||
String modeDeviceName = device.getLinks().get("stopper");
|
|
||||||
AbstractDevice modeDevice = deviceRegistry.getDevice(ItemProcessor.getDeviceId(modeDeviceName));
|
|
||||||
if (modeDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked Stopper device '{}', make sure the Item has iss tags",
|
|
||||||
modeDeviceName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item modeItem = modeDevice.getItem();
|
|
||||||
|
|
||||||
ItemCommandEvent event = ItemEventFactory.createCommandEvent(modeItem.getName(), OnOffType.ON, COMMAND_SOURCE);
|
|
||||||
eventPublisher.post(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.handler;
|
|
||||||
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Device action request handler.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceActionHandler {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(DeviceActionHandler.class);
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
|
|
||||||
public DeviceActionHandler(DeviceRegistry deviceRegistry) {
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handle(HttpServletRequest req, Matcher urlMatcher) {
|
|
||||||
String deviceId, action, value;
|
|
||||||
deviceId = URLDecoder.decode(urlMatcher.group(1), StandardCharsets.UTF_8);
|
|
||||||
action = URLDecoder.decode(urlMatcher.group(2), StandardCharsets.UTF_8);
|
|
||||||
|
|
||||||
if (urlMatcher.group(3) == null) {
|
|
||||||
value = null;
|
|
||||||
} else {
|
|
||||||
value = URLDecoder.decode(urlMatcher.group(3), StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug("Action request for device {}: [{}] [{}]", deviceId, action, value);
|
|
||||||
|
|
||||||
AbstractDevice device = deviceRegistry.getDevice(deviceId);
|
|
||||||
if (device == null) {
|
|
||||||
logger.warn("Received action request for unknown device: {}", urlMatcher.group(0));
|
|
||||||
} else {
|
|
||||||
device.performAction(action, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,123 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.handler;
|
|
||||||
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.ZoneId;
|
|
||||||
import java.time.ZonedDateTime;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.persistence.FilterCriteria;
|
|
||||||
import org.openhab.core.persistence.HistoricItem;
|
|
||||||
import org.openhab.core.persistence.PersistenceService;
|
|
||||||
import org.openhab.core.persistence.PersistenceServiceRegistry;
|
|
||||||
import org.openhab.core.persistence.QueryablePersistenceService;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.HistoryItem;
|
|
||||||
import org.openhab.io.imperihome.internal.model.HistoryList;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Device history request handler.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceHistoryHandler {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(DeviceHistoryHandler.class);
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
private final PersistenceServiceRegistry persistenceServiceRegistry;
|
|
||||||
|
|
||||||
public DeviceHistoryHandler(DeviceRegistry deviceRegistry, PersistenceServiceRegistry persistenceServiceRegistry) {
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
this.persistenceServiceRegistry = persistenceServiceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HistoryList handle(HttpServletRequest req, Matcher urlMatcher) {
|
|
||||||
String deviceId, field;
|
|
||||||
long start, end;
|
|
||||||
try {
|
|
||||||
deviceId = URLDecoder.decode(urlMatcher.group(1), StandardCharsets.UTF_8);
|
|
||||||
field = URLDecoder.decode(urlMatcher.group(2), StandardCharsets.UTF_8);
|
|
||||||
start = Long.parseLong(urlMatcher.group(3));
|
|
||||||
end = Long.parseLong(urlMatcher.group(4));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throw new RuntimeException("Could not decode request params", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug("History request for device {}, field {}: {}-{}", deviceId, field, start, end);
|
|
||||||
|
|
||||||
AbstractDevice device = deviceRegistry.getDevice(deviceId);
|
|
||||||
if (device == null) {
|
|
||||||
logger.warn("Received history request for unknown device: {}", urlMatcher.group(0));
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
PersistenceService persistence = persistenceServiceRegistry.getDefault();
|
|
||||||
if (persistence == null) {
|
|
||||||
logger.warn("Could not retrieve default persistence service; can't serve history request");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!(persistence instanceof QueryablePersistenceService)) {
|
|
||||||
logger.warn("Default persistence service is not queryable; can't serve history request");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return serveHistory(device, (QueryablePersistenceService) persistence, start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
private HistoryList serveHistory(AbstractDevice device, QueryablePersistenceService persistence, long start,
|
|
||||||
long end) {
|
|
||||||
logger.info("Querying persistence for history of Item {}, from {} to {}", device.getItemName(), start, end);
|
|
||||||
|
|
||||||
FilterCriteria criteria = new FilterCriteria().setItemName(device.getItemName())
|
|
||||||
.setBeginDate(ZonedDateTime.ofInstant(Instant.ofEpochMilli(start), ZoneId.systemDefault()))
|
|
||||||
.setEndDate(ZonedDateTime.ofInstant(Instant.ofEpochMilli(end), ZoneId.systemDefault()));
|
|
||||||
|
|
||||||
List<HistoryItem> resultItems = new LinkedList<>();
|
|
||||||
Iterable<HistoricItem> historicItems = persistence.query(criteria);
|
|
||||||
|
|
||||||
Iterator<HistoricItem> iterator = historicItems.iterator();
|
|
||||||
if (!iterator.hasNext()) {
|
|
||||||
logger.info("Persistence returned no results for history query");
|
|
||||||
} else {
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
HistoricItem historicItem = iterator.next();
|
|
||||||
State state = historicItem.getState();
|
|
||||||
if (state instanceof DecimalType) {
|
|
||||||
Number value = ((DecimalType) state).toBigDecimal();
|
|
||||||
resultItems.add(new HistoryItem(historicItem.getTimestamp().toInstant().toEpochMilli(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resultItems.isEmpty()) {
|
|
||||||
logger.warn(
|
|
||||||
"Persistence returned results for history query, but could not be interpreted as DecimalTypes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new HistoryList(resultItems);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.handler;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceList;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Device list request handler.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DevicesListHandler {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(DevicesListHandler.class);
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
|
|
||||||
public DevicesListHandler(DeviceRegistry deviceRegistry) {
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeviceList handle(HttpServletRequest req) {
|
|
||||||
DeviceList response = new DeviceList();
|
|
||||||
|
|
||||||
Collection<AbstractDevice> devices = deviceRegistry.getDevices().values();
|
|
||||||
for (AbstractDevice device : devices) {
|
|
||||||
device.updateParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
response.setDevices(devices);
|
|
||||||
|
|
||||||
logger.debug("Device list response: {}", response);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.handler;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.RoomList;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rooms list request handler.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class RoomListHandler {
|
|
||||||
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
|
|
||||||
public RoomListHandler(DeviceRegistry deviceRegistry) {
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoomList handle(HttpServletRequest req) {
|
|
||||||
RoomList response = new RoomList();
|
|
||||||
response.setRooms(deviceRegistry.getRooms());
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.handler;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.ImperiHomeConfig;
|
|
||||||
import org.openhab.io.imperihome.internal.model.System;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* System data request handler.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SystemHandler {
|
|
||||||
|
|
||||||
private ImperiHomeConfig config;
|
|
||||||
|
|
||||||
public SystemHandler(ImperiHomeConfig imperiHomeConfig) {
|
|
||||||
config = imperiHomeConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
public System handle(HttpServletRequest req) {
|
|
||||||
System system = new System();
|
|
||||||
system.setId(config.getSystemId());
|
|
||||||
system.setApiVersion(1);
|
|
||||||
return system;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.io;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParameters;
|
|
||||||
|
|
||||||
import com.google.gson.JsonArray;
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonSerializationContext;
|
|
||||||
import com.google.gson.JsonSerializer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer for {@link DeviceParameters}.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceParametersSerializer implements JsonSerializer<DeviceParameters> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JsonElement serialize(DeviceParameters params, Type type,
|
|
||||||
JsonSerializationContext jsonSerializationContext) {
|
|
||||||
JsonArray result = new JsonArray();
|
|
||||||
for (DeviceParam param : params.values()) {
|
|
||||||
result.add(jsonSerializationContext.serialize(param));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.io;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonPrimitive;
|
|
||||||
import com.google.gson.JsonSerializationContext;
|
|
||||||
import com.google.gson.JsonSerializer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer for {@link DeviceType}.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceTypeSerializer implements JsonSerializer<DeviceType> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JsonElement serialize(DeviceType deviceType, Type type, JsonSerializationContext jsonSerializationContext) {
|
|
||||||
return new JsonPrimitive(deviceType.getApiString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.io;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonPrimitive;
|
|
||||||
import com.google.gson.JsonSerializationContext;
|
|
||||||
import com.google.gson.JsonSerializer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializer for {@link ParamType}.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ParamTypeSerializer implements JsonSerializer<ParamType> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JsonElement serialize(ParamType paramType, Type type, JsonSerializationContext jsonSerializationContext) {
|
|
||||||
return new JsonPrimitive(paramType.getApiString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* History item data object.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class HistoryItem {
|
|
||||||
|
|
||||||
private long date;
|
|
||||||
private Number value;
|
|
||||||
|
|
||||||
public HistoryItem(Date date, Number value) {
|
|
||||||
this(date.getTime(), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public HistoryItem(long date, Number value) {
|
|
||||||
this.date = date;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getDate() {
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDate(long date) {
|
|
||||||
this.date = date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Number getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(Number value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* History list data object.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class HistoryList {
|
|
||||||
|
|
||||||
private List<HistoryItem> values;
|
|
||||||
|
|
||||||
public HistoryList() {
|
|
||||||
this(new LinkedList<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
public HistoryList(List<HistoryItem> resultItems) {
|
|
||||||
this.values = resultItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<HistoryItem> getValues() {
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValues(List<HistoryItem> values) {
|
|
||||||
this.values = values;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Room data object.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class Room {
|
|
||||||
|
|
||||||
private String id;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(o instanceof Room)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Room room = (Room) o;
|
|
||||||
|
|
||||||
return id != null ? id.equals(room.id) : room.id == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return id != null ? id.hashCode() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Room{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Room list data object.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class RoomList {
|
|
||||||
|
|
||||||
private Collection<Room> rooms;
|
|
||||||
|
|
||||||
public Collection<Room> getRooms() {
|
|
||||||
return rooms;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRooms(Collection<Room> rooms) {
|
|
||||||
this.rooms = rooms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* System data object.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class System {
|
|
||||||
|
|
||||||
private String id;
|
|
||||||
private int apiVersion;
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getApiVersion() {
|
|
||||||
return apiVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setApiVersion(int apiVersion) {
|
|
||||||
this.apiVersion = apiVersion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,246 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.openhab.core.items.GenericItem;
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.StateChangeListener;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.action.Action;
|
|
||||||
import org.openhab.io.imperihome.internal.action.ActionRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParameters;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.DeviceRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.TagType;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract parent of all devices. Sets up and tears down state listeners and contains parameter and link data.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public abstract class AbstractDevice implements StateChangeListener {
|
|
||||||
|
|
||||||
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
|
|
||||||
|
|
||||||
private String id;
|
|
||||||
private String name;
|
|
||||||
private String room;
|
|
||||||
private DeviceType type;
|
|
||||||
private String defaultIcon;
|
|
||||||
private final DeviceParameters params;
|
|
||||||
|
|
||||||
private transient boolean inverted;
|
|
||||||
private transient String roomName;
|
|
||||||
private transient Item item;
|
|
||||||
|
|
||||||
private final transient Map<String, String> links;
|
|
||||||
private transient Map<String, String> mapping;
|
|
||||||
|
|
||||||
private transient DeviceRegistry deviceRegistry;
|
|
||||||
private transient ActionRegistry actionRegistry;
|
|
||||||
|
|
||||||
public AbstractDevice(DeviceType type, Item item) {
|
|
||||||
this.type = type;
|
|
||||||
this.item = item;
|
|
||||||
params = new DeviceParameters();
|
|
||||||
links = new HashMap<>();
|
|
||||||
|
|
||||||
if (item instanceof GenericItem) {
|
|
||||||
((GenericItem) item).addStateChangeListener(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void destroy() {
|
|
||||||
if (item instanceof GenericItem) {
|
|
||||||
((GenericItem) item).removeStateChangeListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
deviceRegistry = null;
|
|
||||||
actionRegistry = null;
|
|
||||||
item = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRoom() {
|
|
||||||
return room;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRoom(String room) {
|
|
||||||
this.room = room;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRoomName() {
|
|
||||||
return roomName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRoomName(String roomName) {
|
|
||||||
this.roomName = roomName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeviceType getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(DeviceType type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInverted() {
|
|
||||||
return inverted;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setInverted(boolean inverted) {
|
|
||||||
this.inverted = inverted;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDefaultIcon() {
|
|
||||||
return defaultIcon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDefaultIcon(String defaultIcon) {
|
|
||||||
this.defaultIcon = defaultIcon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeviceParameters getParams() {
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addParam(DeviceParam param) {
|
|
||||||
logger.trace("Setting param for device {}: {}", this, param);
|
|
||||||
params.set(param);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getLinks() {
|
|
||||||
return links;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addLink(String linkType, String deviceId) {
|
|
||||||
links.put(linkType, deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMapping(Map<String, String> mapping) {
|
|
||||||
this.mapping = mapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getMapping() {
|
|
||||||
return mapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeviceRegistry(DeviceRegistry deviceRegistry) {
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected DeviceRegistry getDeviceRegistry() {
|
|
||||||
return deviceRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setActionRegistry(ActionRegistry actionRegistry) {
|
|
||||||
this.actionRegistry = actionRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ActionRegistry getActionRegistry() {
|
|
||||||
return actionRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Item getItem() {
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemName() {
|
|
||||||
return item.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process any device-specific ISS tags.
|
|
||||||
*
|
|
||||||
* @param issTags ISS tags map.
|
|
||||||
*/
|
|
||||||
public void processCustomTags(Map<TagType, List<String>> issTags) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Can be implemented by Devices that require their state to be updated manually, instead of relying (only) on Item
|
|
||||||
* state change events.
|
|
||||||
* This method is called just before serializing the device to JSON.
|
|
||||||
*/
|
|
||||||
public void updateParams() {
|
|
||||||
logger.trace("updateParams on {}", this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs an action on this device.
|
|
||||||
*
|
|
||||||
* @param action Action name.
|
|
||||||
* @param value Action value.
|
|
||||||
*/
|
|
||||||
public void performAction(String action, String value) {
|
|
||||||
Action actionInst = actionRegistry.get(action);
|
|
||||||
if (actionInst == null) {
|
|
||||||
logger.warn("Unknown action: {}", action);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item item = getItem();
|
|
||||||
if (!actionInst.supports(this, item)) {
|
|
||||||
logger.warn("Action '{}' not supported on this device ({})", action, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
actionInst.perform(this, item, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateChanged(Item item, State oldState, State newState) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
logger.debug("Device item {} state changed to {}", item, newState);
|
|
||||||
|
|
||||||
OnOffType onOffState = (OnOffType) item.getStateAs(OnOffType.class);
|
|
||||||
if (onOffState != null) {
|
|
||||||
boolean isOn = onOffState == OnOffType.ON;
|
|
||||||
DeviceParam param = new DeviceParam(ParamType.STATUS, isOn ^ isInverted() ? "1" : "0");
|
|
||||||
addParam(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getClass().getSimpleName() + "{id='" + id + '\'' + ", name='" + name + '\'' + ", room='" + room + '\''
|
|
||||||
+ ", type=" + type + ", invert=" + inverted + ", icon=" + defaultIcon + ", links=" + links + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstraction of devices that allow a link to a current energy consumption item.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public abstract class AbstractEnergyLinkDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
public AbstractEnergyLinkDevice(DeviceType type, Item item) {
|
|
||||||
super(type, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
if (getLinks().containsKey("energy")) {
|
|
||||||
String deviceName = getLinks().get("energy");
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice energyDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (energyDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked energy device '{}', make sure the Item has iss tags", deviceName);
|
|
||||||
} else {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) energyDevice.getParams().get(ParamType.WATTS);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked energy device has no Watts value parameter: {}", energyDevice);
|
|
||||||
} else {
|
|
||||||
NumericValueParam energyParam = new NumericValueParam(ParamType.ENERGY, valueParam.getUnit(), null);
|
|
||||||
energyParam.setValue(valueParam.getValue());
|
|
||||||
addParam(energyParam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parent of devices with a {@link NumericValueParam}. Contains the value unit.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public abstract class AbstractNumericValueDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
private transient String unit;
|
|
||||||
|
|
||||||
public AbstractNumericValueDevice(DeviceType type, Item item, String defaultUnit) {
|
|
||||||
super(type, item);
|
|
||||||
this.unit = defaultUnit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUnit() {
|
|
||||||
return unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUnit(String unit) {
|
|
||||||
this.unit = unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getClass().getSimpleName() + "{" + "super=" + super.toString() + ", unit='" + unit + '\'' + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CO2 sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class Co2SensorDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public Co2SensorDevice(Item item) {
|
|
||||||
super(DeviceType.CO2, item, "ppm");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.CO2_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Device list holder.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceList {
|
|
||||||
|
|
||||||
private Collection<AbstractDevice> devices;
|
|
||||||
|
|
||||||
public Collection<AbstractDevice> getDevices() {
|
|
||||||
return devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDevices(Collection<AbstractDevice> devices) {
|
|
||||||
this.devices = devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "DeviceList{" + "devices=" + devices + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Device type enumeration. Contains ImperiHome API type strings.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public enum DeviceType {
|
|
||||||
|
|
||||||
SWITCH("DevSwitch"),
|
|
||||||
DIMMER("DevDimmer"),
|
|
||||||
CAMERA("DevCamera"),
|
|
||||||
CO2("DevCO2"),
|
|
||||||
CO2_ALERT("DevCO2Alert"),
|
|
||||||
DOOR("DevDoor"),
|
|
||||||
ELECTRICITY("DevElectricity"),
|
|
||||||
FLOOD("DevFlood"),
|
|
||||||
GENERIC_SENSOR("DevGenericSensor"),
|
|
||||||
HYGROMETRY("DevHygrometry"),
|
|
||||||
LOCK("DevLock"),
|
|
||||||
LUMINOSITY("DevLuminosity"),
|
|
||||||
MOTION("DevMotion"),
|
|
||||||
MULTI_SWITCH("DevMultiSwitch"),
|
|
||||||
NOISE("DevNoise"),
|
|
||||||
PLAYER("DevPlayer"),
|
|
||||||
PLAYLIST("DevPlaylist"),
|
|
||||||
PRESSURE("DevPressure"),
|
|
||||||
RAIN("DevRain"),
|
|
||||||
RGB_LIGHT("DevRGBLight"),
|
|
||||||
SCENE("DevScene"),
|
|
||||||
SHUTTER("DevShutter"),
|
|
||||||
SMOKE("DevSmoke"),
|
|
||||||
TEMPERATURE("DevTemperature"),
|
|
||||||
TEMP_HYGRO("DevTempHygro"),
|
|
||||||
THERMOSTAT("DevThermostat", "curmode", "curtemp"),
|
|
||||||
UV("DevUV"),
|
|
||||||
WIND("DevWind");
|
|
||||||
|
|
||||||
private final String apiString;
|
|
||||||
private final String[] requiredLinks;
|
|
||||||
|
|
||||||
DeviceType(String apiString, String... requiredLinks) {
|
|
||||||
this.apiString = apiString;
|
|
||||||
this.requiredLinks = requiredLinks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getApiString() {
|
|
||||||
return apiString;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getRequiredLinks() {
|
|
||||||
return requiredLinks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DeviceType forApiString(String apiString) {
|
|
||||||
for (DeviceType deviceType : values()) {
|
|
||||||
if (deviceType.getApiString().equalsIgnoreCase(apiString.trim())) {
|
|
||||||
return deviceType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dimmer device, containing on/off status and dim level.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DimmerDevice extends AbstractEnergyLinkDevice {
|
|
||||||
|
|
||||||
public DimmerDevice(Item item) {
|
|
||||||
super(DeviceType.DIMMER, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
int level = 0;
|
|
||||||
|
|
||||||
PercentType percentState = (PercentType) item.getStateAs(PercentType.class);
|
|
||||||
if (percentState != null) {
|
|
||||||
level = percentState.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
addParam(new DeviceParam(ParamType.LEVEL, String.valueOf(level)));
|
|
||||||
addParam(new DeviceParam(ParamType.STATUS, (level > 0) ^ isInverted() ? "1" : "0"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,118 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Electricity device, containing current (Watt) and total (KWh) consumption.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ElectricityDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
private static final String LINK_WATTS = "watt";
|
|
||||||
private static final String LINK_KWH = "kwh";
|
|
||||||
|
|
||||||
public ElectricityDevice(Item item) {
|
|
||||||
super(DeviceType.ELECTRICITY, item, "W");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addLink(String linkType, String deviceId) {
|
|
||||||
super.addLink(linkType, deviceId);
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_WATTS)) {
|
|
||||||
setUnit("KWh");
|
|
||||||
} else if (getLinks().containsKey(LINK_KWH)) {
|
|
||||||
setUnit("W");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = item.getStateAs(DecimalType.class);
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_WATTS) || getUnit().equalsIgnoreCase(LINK_KWH)) {
|
|
||||||
addParam(new NumericValueParam(ParamType.KWH, getUnit(), value));
|
|
||||||
} else if (getLinks().isEmpty() || getLinks().containsKey(LINK_KWH)) {
|
|
||||||
addParam(new NumericValueParam(ParamType.WATTS, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_WATTS)) {
|
|
||||||
String deviceName = getLinks().get(LINK_WATTS);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice wattsDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (wattsDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked watts device '{}', make sure the Item has iss tags", deviceName);
|
|
||||||
} else {
|
|
||||||
setWattsParam(wattsDevice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_KWH)) {
|
|
||||||
String deviceName = getLinks().get(LINK_KWH);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice kwhDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (kwhDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked KWh device '{}', make sure the Item has iss tags", deviceName);
|
|
||||||
} else {
|
|
||||||
setKwhParam(kwhDevice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setWattsParam(AbstractDevice device) {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) device.getParams().get(ParamType.WATTS);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked Watts device has no Watt value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam wattsParam = new NumericValueParam(ParamType.WATTS, valueParam.getUnit(), null);
|
|
||||||
String unit = wattsParam.getUnit();
|
|
||||||
if (unit == null || unit.isEmpty()) {
|
|
||||||
wattsParam.setUnit("W");
|
|
||||||
}
|
|
||||||
wattsParam.setValue(valueParam.getValue());
|
|
||||||
addParam(wattsParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setKwhParam(AbstractDevice device) {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) device.getParams().get(ParamType.KWH);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked KWh device has no KWh value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam kwhParam = new NumericValueParam(ParamType.KWH, valueParam.getUnit(), null);
|
|
||||||
String unit = kwhParam.getUnit();
|
|
||||||
if (unit == null || unit.isEmpty()) {
|
|
||||||
kwhParam.setUnit("KWh");
|
|
||||||
}
|
|
||||||
kwhParam.setValue(valueParam.getValue());
|
|
||||||
addParam(kwhParam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generic sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class GenericSensorDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public GenericSensorDevice(Item item) {
|
|
||||||
super(DeviceType.GENERIC_SENSOR, item, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
if (value != null) {
|
|
||||||
addParam(new NumericValueParam(ParamType.GENERIC_VALUE, getUnit(), value));
|
|
||||||
} else {
|
|
||||||
State state = item.getState();
|
|
||||||
String strVal = (state == null) ? null : state.toFullString();
|
|
||||||
addParam(new DeviceParam(ParamType.GENERIC_VALUE, strVal));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hygrometry sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class HygrometryDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public HygrometryDevice(Item item) {
|
|
||||||
super(DeviceType.HYGROMETRY, item, "%");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.HYGROMETRY_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.OpenClosedType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lock device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class LockDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
public LockDevice(Item item) {
|
|
||||||
super(DeviceType.LOCK, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
if (getParams().get(ParamType.STATUS) == null) {
|
|
||||||
OpenClosedType openClosedState = (OpenClosedType) item.getStateAs(OpenClosedType.class);
|
|
||||||
if (openClosedState != null) {
|
|
||||||
boolean value = openClosedState == OpenClosedType.OPEN;
|
|
||||||
DeviceParam param = new DeviceParam(ParamType.STATUS, value ^ isInverted() ? "1" : "0");
|
|
||||||
addParam(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Luminosity sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class LuminosityDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public LuminosityDevice(Item item) {
|
|
||||||
super(DeviceType.LUMINOSITY, item, "lux");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.LUMINOSITY_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MultiSwitch device, mimics behavior of an OH Switch with a mapping.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class MultiSwitchDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
private String itemValue = "";
|
|
||||||
|
|
||||||
public MultiSwitchDevice(Item item) {
|
|
||||||
super(DeviceType.MULTI_SWITCH, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
Map<String, String> mapping = getMapping();
|
|
||||||
if (mapping == null || mapping.isEmpty()) {
|
|
||||||
logger.error("MultiSwitch device {} contains no mapping", this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceParam choicesParam = new DeviceParam(ParamType.CHOICES,
|
|
||||||
mapping.values().stream().collect(Collectors.joining(",")));
|
|
||||||
addParam(choicesParam);
|
|
||||||
|
|
||||||
// Find current value text
|
|
||||||
String currentValue = "";
|
|
||||||
if (mapping.containsKey(itemValue)) {
|
|
||||||
currentValue = mapping.get(itemValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceParam valueParam = new DeviceParam(ParamType.MULTISWITCH_VALUE, currentValue);
|
|
||||||
addParam(valueParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
State state = item.getStateAs(DecimalType.class);
|
|
||||||
if (state instanceof DecimalType) {
|
|
||||||
itemValue = String.valueOf(((DecimalType) state).intValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Noise sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class NoiseDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public NoiseDevice(Item item) {
|
|
||||||
super(DeviceType.NOISE, item, "dB");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.NOISE_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pressure sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class PressureDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public PressureDevice(Item item) {
|
|
||||||
super(DeviceType.PRESSURE, item, "mbar");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.PRESSURE_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rain sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class RainDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
private static final String LINK_ACCUMULATION = "accum";
|
|
||||||
|
|
||||||
public RainDevice(Item item) {
|
|
||||||
super(DeviceType.RAIN, item, "mm/h");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_ACCUMULATION)) {
|
|
||||||
String deviceName = getLinks().get(LINK_ACCUMULATION);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice accumDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (accumDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked accumulation device '{}', make sure the Item has iss tags",
|
|
||||||
deviceName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) accumDevice.getParams().get(ParamType.GENERIC_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked Accumulation device has no Value parameter: {}", accumDevice);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam accumParam = new NumericValueParam(ParamType.ACCUMULATION, valueParam.getUnit(), null);
|
|
||||||
String unit = accumParam.getUnit();
|
|
||||||
if (unit == null || unit.isBlank()) {
|
|
||||||
accumParam.setUnit("mm");
|
|
||||||
}
|
|
||||||
|
|
||||||
accumParam.setValue(valueParam.getValue());
|
|
||||||
addParam(accumParam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.RAIN_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.RoundingMode;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.HSBType;
|
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RGB light device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class RgbLightDevice extends AbstractEnergyLinkDevice {
|
|
||||||
|
|
||||||
public RgbLightDevice(Item item) {
|
|
||||||
super(DeviceType.RGB_LIGHT, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
boolean status = false;
|
|
||||||
int level = 0;
|
|
||||||
String color = "00000000";
|
|
||||||
|
|
||||||
State state = item.getStateAs(HSBType.class);
|
|
||||||
boolean isHsbState = state instanceof HSBType;
|
|
||||||
|
|
||||||
// State can be of UndefType, even with the getStateAs above
|
|
||||||
if (isHsbState) {
|
|
||||||
HSBType hsbState = (HSBType) state;
|
|
||||||
PercentType[] rgb = hsbState.toRGB();
|
|
||||||
|
|
||||||
// Set state to ON if any channel > 0
|
|
||||||
boolean isOn = rgb[0].doubleValue() > 0 || rgb[1].doubleValue() > 0 || rgb[2].doubleValue() > 0;
|
|
||||||
if (isOn) {
|
|
||||||
status = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build hex string
|
|
||||||
int r = convertPercentToByte(rgb[0]) & 0xFF;
|
|
||||||
int g = convertPercentToByte(rgb[1]) & 0xFF;
|
|
||||||
int b = convertPercentToByte(rgb[2]) & 0xFF;
|
|
||||||
color = (isOn ? "FF" : "00") + toHex(r) + toHex(g) + toHex(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
State pState = item.getStateAs(PercentType.class);
|
|
||||||
if (pState instanceof PercentType) {
|
|
||||||
level = ((PercentType) pState).intValue();
|
|
||||||
if (level > 0) {
|
|
||||||
status = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addParam(new DeviceParam(ParamType.STATUS, status ^ isInverted() ? "1" : "0"));
|
|
||||||
addParam(new DeviceParam(ParamType.LEVEL, String.valueOf(level)));
|
|
||||||
addParam(new DeviceParam(ParamType.DIMMABLE, "0"));
|
|
||||||
addParam(new DeviceParam(ParamType.WHITE_CHANNEL, "1"));
|
|
||||||
addParam(new DeviceParam(ParamType.COLOR, color));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String toHex(int value) {
|
|
||||||
String hex = Integer.toHexString(value);
|
|
||||||
return StringUtils.padLeft(hex, 2, "0");
|
|
||||||
}
|
|
||||||
|
|
||||||
private int convertPercentToByte(PercentType percent) {
|
|
||||||
return percent.toBigDecimal().multiply(BigDecimal.valueOf(255))
|
|
||||||
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).intValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scene activation device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SceneDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
public SceneDevice(Item item) {
|
|
||||||
super(DeviceType.SCENE, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shutter device, containing level. Stoppable and pulseable attributes currently hardcoded to 0 (false).
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ShutterDevice extends AbstractEnergyLinkDevice {
|
|
||||||
|
|
||||||
public ShutterDevice(Item item) {
|
|
||||||
super(DeviceType.SHUTTER, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
int level = 0;
|
|
||||||
|
|
||||||
PercentType percentState = (PercentType) item.getStateAs(PercentType.class);
|
|
||||||
if (percentState != null) {
|
|
||||||
level = percentState.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
addParam(new DeviceParam(ParamType.PULSEABLE, "0"));
|
|
||||||
addParam(new DeviceParam(ParamType.STOPPABLE, getLinks().containsKey("stopper") ? "1" : "0"));
|
|
||||||
addParam(new DeviceParam(ParamType.LEVEL, String.valueOf(level)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple on/off switch device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class SwitchDevice extends AbstractEnergyLinkDevice {
|
|
||||||
|
|
||||||
public SwitchDevice(Item item) {
|
|
||||||
super(DeviceType.SWITCH, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
if (getParams().get(ParamType.STATUS) == null) {
|
|
||||||
PercentType percentState = (PercentType) item.getStateAs(PercentType.class);
|
|
||||||
if (percentState != null) {
|
|
||||||
boolean value = percentState.intValue() > 0;
|
|
||||||
DeviceParam param = new DeviceParam(ParamType.STATUS, value ^ isInverted() ? "1" : "0");
|
|
||||||
addParam(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,121 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Combined temperature/hygro sensor device. Can be specified on either a temp or hygro Item, with a link to the other
|
|
||||||
* one.
|
|
||||||
* The linked value will be retrieved in {@link #updateParams()}.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class TempHygroDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
private static final String LINK_HYGRO = "hygro";
|
|
||||||
private static final String LINK_TEMP = "temp";
|
|
||||||
|
|
||||||
public TempHygroDevice(Item item) {
|
|
||||||
super(DeviceType.TEMP_HYGRO, item, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addLink(String linkType, String deviceId) {
|
|
||||||
super.addLink(linkType, deviceId);
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_HYGRO)) {
|
|
||||||
setUnit("°C");
|
|
||||||
} else if (getLinks().containsKey(LINK_TEMP)) {
|
|
||||||
setUnit("%");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_HYGRO)) {
|
|
||||||
addParam(new NumericValueParam(ParamType.TEMPERATURE_DUAL, getUnit(), value));
|
|
||||||
} else if (getLinks().containsKey(LINK_TEMP)) {
|
|
||||||
addParam(new NumericValueParam(ParamType.HYGROMETRY_DUAL, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
boolean foundLink = false;
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_HYGRO)) {
|
|
||||||
String deviceName = getLinks().get(LINK_HYGRO);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice hygroDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (hygroDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked hygro device '{}', make sure the Item has iss tags", deviceName);
|
|
||||||
} else {
|
|
||||||
setHygroParam(hygroDevice);
|
|
||||||
foundLink = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_TEMP)) {
|
|
||||||
String deviceName = getLinks().get(LINK_TEMP);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice tempDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (tempDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked temp device '{}', make sure the Item has iss tags", deviceName);
|
|
||||||
} else {
|
|
||||||
setTempParam(tempDevice);
|
|
||||||
foundLink = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!foundLink) {
|
|
||||||
logger.warn(
|
|
||||||
"DevTempHygro device contains no valid 'hygro' or 'temp' link. Add a link to another item using 'iss:link:<type>:<item>'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setHygroParam(AbstractDevice device) {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) device.getParams().get(ParamType.HYGROMETRY_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked Hygro device has no Value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam hygroParam = new NumericValueParam(ParamType.HYGROMETRY_DUAL, valueParam.getUnit(), null);
|
|
||||||
hygroParam.setValue(valueParam.getValue());
|
|
||||||
addParam(hygroParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setTempParam(AbstractDevice device) {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) device.getParams().get(ParamType.TEMPERATURE_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked Temperature device has no Value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam tempParam = new NumericValueParam(ParamType.TEMPERATURE_DUAL, valueParam.getUnit(), null);
|
|
||||||
tempParam.setValue(valueParam.getValue());
|
|
||||||
addParam(tempParam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Temperature sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class TemperatureDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public TemperatureDevice(Item item) {
|
|
||||||
super(DeviceType.TEMPERATURE, item, "°C");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.TEMPERATURE_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.TagType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thermostat device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ThermostatDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
public ThermostatDevice(Item item) {
|
|
||||||
super(DeviceType.THERMOSTAT, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void processCustomTags(Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.STEP)) {
|
|
||||||
setStep(issTags.get(TagType.STEP).get(0));
|
|
||||||
}
|
|
||||||
if (issTags.containsKey(TagType.MIN_VAL)) {
|
|
||||||
setMinValue(issTags.get(TagType.MIN_VAL).get(0));
|
|
||||||
}
|
|
||||||
if (issTags.containsKey(TagType.MAX_VAL)) {
|
|
||||||
setMaxValue(issTags.get(TagType.MAX_VAL).get(0));
|
|
||||||
}
|
|
||||||
if (issTags.containsKey(TagType.MODES)) {
|
|
||||||
setAvailableModes(issTags.get(TagType.MODES).get(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
DecimalType state = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
if (state != null) {
|
|
||||||
DeviceParam param = new DeviceParam(ParamType.CUR_SETPOINT, state.floatValue());
|
|
||||||
addParam(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
AbstractDevice curModeDevice = getLinkedDevice("curmode", true);
|
|
||||||
if (curModeDevice != null) {
|
|
||||||
setCurModeParam(curModeDevice);
|
|
||||||
}
|
|
||||||
|
|
||||||
AbstractDevice curTempDevice = getLinkedDevice("curtemp", true);
|
|
||||||
if (curTempDevice != null) {
|
|
||||||
setCurTempParam(curTempDevice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStep(String step) {
|
|
||||||
addParam(new DeviceParam(ParamType.STEP, step));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMinValue(String minValue) {
|
|
||||||
addParam(new DeviceParam(ParamType.MIN_VAL, minValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMaxValue(String maxValue) {
|
|
||||||
addParam(new DeviceParam(ParamType.MAX_VAL, maxValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAvailableModes(String modes) {
|
|
||||||
addParam(new DeviceParam(ParamType.AVAIL_MODE, modes));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCurModeParam(AbstractDevice device) {
|
|
||||||
DeviceParam valueParam = device.getParams().get(ParamType.GENERIC_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked curmode device has no Value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
addParam(new DeviceParam(ParamType.CUR_MODE, valueParam.getValue()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCurTempParam(AbstractDevice device) {
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) device.getParams().get(ParamType.TEMPERATURE_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked curtemp device has no Value parameter: {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam tempParam = new NumericValueParam(ParamType.CUR_TEMP, valueParam.getUnit(), null);
|
|
||||||
tempParam.setValue(valueParam.getValue());
|
|
||||||
addParam(tempParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
private AbstractDevice getLinkedDevice(String linkName, boolean logWhenMissing) {
|
|
||||||
String deviceName = getLinks().get(linkName);
|
|
||||||
AbstractDevice device = null;
|
|
||||||
if (deviceName != null) {
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
device = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
}
|
|
||||||
if (logWhenMissing && device == null) {
|
|
||||||
logger.error("Couldn't resolve linked {} device '{}', make sure the Item has iss tags", linkName,
|
|
||||||
deviceName);
|
|
||||||
}
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.core.library.types.OpenClosedType;
|
|
||||||
import org.openhab.core.library.types.StringType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstraction of devices that are trippable, i.e. DevDoor, DevFlood, DevMotion, DevSmoke, DevCO2Alert.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class TrippableDevice extends AbstractDevice {
|
|
||||||
|
|
||||||
public TrippableDevice(DeviceType type, Item item) {
|
|
||||||
super(type, item);
|
|
||||||
|
|
||||||
addParam(new DeviceParam(ParamType.ARMABLE, "0"));
|
|
||||||
addParam(new DeviceParam(ParamType.ARMED, "1"));
|
|
||||||
addParam(new DeviceParam(ParamType.ACKABLE, "0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
boolean tripped = false;
|
|
||||||
|
|
||||||
if (item.getStateAs(OpenClosedType.class) != null) {
|
|
||||||
OpenClosedType state = item.getStateAs(OpenClosedType.class);
|
|
||||||
tripped = state == OpenClosedType.CLOSED;
|
|
||||||
} else if (item.getStateAs(OnOffType.class) != null) {
|
|
||||||
OnOffType state = item.getStateAs(OnOffType.class);
|
|
||||||
tripped = state == OnOffType.ON;
|
|
||||||
} else if (item.getStateAs(DecimalType.class) != null) {
|
|
||||||
DecimalType state = item.getStateAs(DecimalType.class);
|
|
||||||
tripped = state != null && state.intValue() != 0;
|
|
||||||
} else if (item.getStateAs(StringType.class) != null) {
|
|
||||||
StringType state = item.getStateAs(StringType.class);
|
|
||||||
tripped = state != null && !state.toString().isBlank() && !state.toString().trim().equals("ok");
|
|
||||||
} else {
|
|
||||||
logger.debug("Can't interpret state {} as tripped status", item.getState());
|
|
||||||
}
|
|
||||||
|
|
||||||
addParam(new DeviceParam(ParamType.TRIPPED, tripped ^ isInverted() ? "1" : "0"));
|
|
||||||
|
|
||||||
if (tripped) {
|
|
||||||
addParam(new DeviceParam(ParamType.LAST_TRIP, String.valueOf(System.currentTimeMillis())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UV sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class UvDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
public UvDevice(Item item) {
|
|
||||||
super(DeviceType.PRESSURE, item, "index");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = (DecimalType) item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.UV_VALUE, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.device;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.NumericValueParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.processor.ItemProcessor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wind sensor device.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class WindDevice extends AbstractNumericValueDevice {
|
|
||||||
|
|
||||||
private static final String LINK_DIRECTION = "direction";
|
|
||||||
|
|
||||||
public WindDevice(Item item) {
|
|
||||||
super(DeviceType.WIND, item, "km/h");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateParams() {
|
|
||||||
super.updateParams();
|
|
||||||
|
|
||||||
if (getLinks().containsKey(LINK_DIRECTION)) {
|
|
||||||
String deviceName = getLinks().get(LINK_DIRECTION);
|
|
||||||
String deviceId = ItemProcessor.getDeviceId(deviceName);
|
|
||||||
AbstractDevice dirDevice = getDeviceRegistry().getDevice(deviceId);
|
|
||||||
if (dirDevice == null) {
|
|
||||||
logger.error("Couldn't resolve linked wind direction device '{}', make sure the Item has iss tags",
|
|
||||||
deviceName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam valueParam = (NumericValueParam) dirDevice.getParams().get(ParamType.GENERIC_VALUE);
|
|
||||||
if (valueParam == null) {
|
|
||||||
logger.warn("Linked Wind direction device has no Value parameter: {}", dirDevice);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam dirParam = new NumericValueParam(ParamType.DIRECTION, valueParam.getUnit(), null);
|
|
||||||
String unit = dirParam.getUnit();
|
|
||||||
if (unit == null || unit.isEmpty()) {
|
|
||||||
dirParam.setUnit("Degrees");
|
|
||||||
}
|
|
||||||
|
|
||||||
dirParam.setValue(valueParam.getValue());
|
|
||||||
addParam(dirParam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stateUpdated(Item item, State newState) {
|
|
||||||
super.stateUpdated(item, newState);
|
|
||||||
|
|
||||||
DecimalType value = item.getStateAs(DecimalType.class);
|
|
||||||
addParam(new NumericValueParam(ParamType.SPEED, getUnit(), value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.param;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Basic device key/value parameter.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceParam {
|
|
||||||
|
|
||||||
private ParamType key;
|
|
||||||
private Object value;
|
|
||||||
|
|
||||||
public DeviceParam(ParamType type) {
|
|
||||||
this.key = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeviceParam(ParamType type, Object value) {
|
|
||||||
this.key = type;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ParamType getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(Object value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(o instanceof DeviceParam)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceParam that = (DeviceParam) o;
|
|
||||||
|
|
||||||
if (key != that.key) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return value != null ? value.equals(that.value) : that.value == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return key.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "DeviceParam{" + "key=" + key + ", value='" + value + '\'' + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.param;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* No-op extension of HashMap storing device parameters. This class exists because it allows the use of a Map in Device
|
|
||||||
* and at the same
|
|
||||||
* time makes it possible to expose the values as a JSON array using a custom serializer.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceParameters extends HashMap<ParamType, DeviceParam> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = -3877582034887195137L;
|
|
||||||
|
|
||||||
public void set(DeviceParam param) {
|
|
||||||
put(param.getKey(), param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.param;
|
|
||||||
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Numeric value param
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class NumericValueParam extends DeviceParam {
|
|
||||||
|
|
||||||
private String unit;
|
|
||||||
private boolean graphable = true;
|
|
||||||
|
|
||||||
public NumericValueParam(ParamType type, String unit) {
|
|
||||||
super(type);
|
|
||||||
setUnit(unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
public NumericValueParam(ParamType type, String unit, DecimalType value) {
|
|
||||||
this(type, unit);
|
|
||||||
setValue(value == null ? 0 : value.doubleValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Number getValue() {
|
|
||||||
return (Number) super.getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(Number value) {
|
|
||||||
super.setValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUnit() {
|
|
||||||
return unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUnit(String unit) {
|
|
||||||
this.unit = unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isGraphable() {
|
|
||||||
return graphable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGraphable(boolean graphable) {
|
|
||||||
this.graphable = graphable;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(o instanceof NumericValueParam)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!super.equals(o)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumericValueParam that = (NumericValueParam) o;
|
|
||||||
|
|
||||||
if (graphable != that.graphable) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return unit != null ? unit.equals(that.unit) : that.unit == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "NumericValueParam{" + "super=" + super.toString() + ", unit='" + unit + '\'' + ", graphable="
|
|
||||||
+ graphable + '}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.model.param;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parameter type enumeration. Contains the ISS API parameter key string.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public enum ParamType {
|
|
||||||
|
|
||||||
DEFAULT_ICON("defaultIcon"),
|
|
||||||
GENERIC_VALUE("Value"),
|
|
||||||
TEMPERATURE_VALUE("Value"),
|
|
||||||
TEMPERATURE_DUAL("temp"),
|
|
||||||
LUMINOSITY_VALUE("Value"),
|
|
||||||
HYGROMETRY_DUAL("hygro"),
|
|
||||||
HYGROMETRY_VALUE("Value"),
|
|
||||||
CO2_VALUE("Value"),
|
|
||||||
PRESSURE_VALUE("Value"),
|
|
||||||
NOISE_VALUE("Value"),
|
|
||||||
RAIN_VALUE("Value"),
|
|
||||||
UV_VALUE("Value"),
|
|
||||||
DIMMABLE("dimmable"),
|
|
||||||
ENERGY("Energy"),
|
|
||||||
STATUS("Status"),
|
|
||||||
MULTISWITCH_VALUE("Value"),
|
|
||||||
CHOICES("Choices"),
|
|
||||||
COLOR("color"),
|
|
||||||
LEVEL("Level"),
|
|
||||||
WHITE_CHANNEL("whitechannel"),
|
|
||||||
WATTS("Watts"),
|
|
||||||
KWH("ConsoTotal"),
|
|
||||||
ARMABLE("armable"),
|
|
||||||
ARMED("Armed"),
|
|
||||||
ACKABLE("ackable"),
|
|
||||||
TRIPPED("Tripped"),
|
|
||||||
LAST_TRIP("lasttrip"),
|
|
||||||
ACCUMULATION("Accumulation"),
|
|
||||||
SPEED("Speed"),
|
|
||||||
DIRECTION("Direction"),
|
|
||||||
STOPPABLE("stopable"),
|
|
||||||
PULSEABLE("pulseable"),
|
|
||||||
|
|
||||||
// Thermostat parameters
|
|
||||||
CUR_MODE("curmode"),
|
|
||||||
CUR_SETPOINT("cursetpoint"),
|
|
||||||
CUR_TEMP("curtemp"),
|
|
||||||
MIN_VAL("minVal"),
|
|
||||||
MAX_VAL("maxVal"),
|
|
||||||
AVAIL_MODE("availablemodes"),
|
|
||||||
STEP("step");
|
|
||||||
|
|
||||||
private final String apiString;
|
|
||||||
|
|
||||||
ParamType(String apiString) {
|
|
||||||
this.apiString = apiString;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getApiString() {
|
|
||||||
return apiString;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,116 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.processor;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import org.openhab.io.imperihome.internal.model.Room;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The device registry stores created devices by ID.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class DeviceRegistry implements Iterable<AbstractDevice> {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(DeviceRegistry.class);
|
|
||||||
|
|
||||||
private final Map<String, AbstractDevice> devices;
|
|
||||||
private Set<Room> rooms;
|
|
||||||
|
|
||||||
public DeviceRegistry() {
|
|
||||||
devices = new ConcurrentHashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractDevice getDevice(String deviceId) {
|
|
||||||
return devices.get(deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, AbstractDevice> getDevices() {
|
|
||||||
return new HashMap<>(devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<Room> getRooms() {
|
|
||||||
return new HashSet<>(rooms);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasDevices() {
|
|
||||||
return !devices.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasDevice(String deviceId) {
|
|
||||||
return devices.containsKey(deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(AbstractDevice device) {
|
|
||||||
// Workaround for Eclipse SH bug: ignore add-event for same item
|
|
||||||
// https://github.com/eclipse/smarthome/issues/3160
|
|
||||||
if (devices.containsKey(device.getId())) {
|
|
||||||
logger.warn("Ignoring duplicate device #{}, name={}, item={}", device.getId(), device.getName(),
|
|
||||||
device.getItemName());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
devices.put(device.getId(), device);
|
|
||||||
updateRooms();
|
|
||||||
|
|
||||||
logger.debug("Device {} added, registry now contains {} total", device.getName(), devices.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractDevice remove(String deviceId) {
|
|
||||||
AbstractDevice removed = devices.remove(deviceId);
|
|
||||||
if (removed != null) {
|
|
||||||
updateRooms();
|
|
||||||
logger.debug("Device {} removed, registry now contains {} total", removed.getName(), devices.size());
|
|
||||||
}
|
|
||||||
return removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<AbstractDevice> iterator() {
|
|
||||||
return devices.values().iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear() {
|
|
||||||
for (AbstractDevice device : devices.values()) {
|
|
||||||
device.destroy();
|
|
||||||
}
|
|
||||||
devices.clear();
|
|
||||||
|
|
||||||
if (rooms != null) {
|
|
||||||
rooms.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug("Device registry cleared");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateRooms() {
|
|
||||||
Set<Room> newRooms = new HashSet<>();
|
|
||||||
for (AbstractDevice device : devices.values()) {
|
|
||||||
Room room = new Room();
|
|
||||||
room.setId(device.getRoom());
|
|
||||||
room.setName(device.getRoomName());
|
|
||||||
newRooms.add(room);
|
|
||||||
}
|
|
||||||
rooms = newRooms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,455 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.processor;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.openhab.core.items.Item;
|
|
||||||
import org.openhab.core.items.ItemRegistry;
|
|
||||||
import org.openhab.core.items.ItemRegistryChangeListener;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
|
||||||
import org.openhab.core.library.types.HSBType;
|
|
||||||
import org.openhab.core.library.types.OnOffType;
|
|
||||||
import org.openhab.core.library.types.OpenClosedType;
|
|
||||||
import org.openhab.core.types.State;
|
|
||||||
import org.openhab.io.imperihome.internal.ImperiHomeConfig;
|
|
||||||
import org.openhab.io.imperihome.internal.action.ActionRegistry;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.AbstractNumericValueDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.Co2SensorDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DeviceType;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.DimmerDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.ElectricityDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.GenericSensorDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.HygrometryDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.LockDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.LuminosityDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.MultiSwitchDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.NoiseDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.PressureDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.RainDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.RgbLightDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.SceneDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.ShutterDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.SwitchDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.TempHygroDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.TemperatureDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.ThermostatDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.TrippableDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.UvDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.device.WindDevice;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.DeviceParam;
|
|
||||||
import org.openhab.io.imperihome.internal.model.param.ParamType;
|
|
||||||
import org.openhab.io.imperihome.internal.util.DigestUtil;
|
|
||||||
import org.openhab.io.imperihome.internal.util.StringUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Processor of openHAB Items. Parses ISS tags and creates and registers {@link AbstractDevice} implementations where
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public class ItemProcessor implements ItemRegistryChangeListener {
|
|
||||||
|
|
||||||
private static final String PREFIX_ISS = "iss:";
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(ItemProcessor.class);
|
|
||||||
|
|
||||||
private final ItemRegistry itemRegistry;
|
|
||||||
private final DeviceRegistry deviceRegistry;
|
|
||||||
private final ActionRegistry actionRegistry;
|
|
||||||
private final ImperiHomeConfig config;
|
|
||||||
|
|
||||||
public ItemProcessor(ItemRegistry itemRegistry, DeviceRegistry deviceRegistry, ActionRegistry actionRegistry,
|
|
||||||
ImperiHomeConfig config) {
|
|
||||||
this.itemRegistry = itemRegistry;
|
|
||||||
this.deviceRegistry = deviceRegistry;
|
|
||||||
this.actionRegistry = actionRegistry;
|
|
||||||
this.config = config;
|
|
||||||
|
|
||||||
allItemsChanged(Collections.emptyList());
|
|
||||||
itemRegistry.addRegistryChangeListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void destroy() {
|
|
||||||
itemRegistry.removeRegistryChangeListener(this);
|
|
||||||
|
|
||||||
// Destroy all Devices (unregisters state listeners)
|
|
||||||
synchronized (deviceRegistry) {
|
|
||||||
for (AbstractDevice device : deviceRegistry) {
|
|
||||||
device.destroy();
|
|
||||||
}
|
|
||||||
deviceRegistry.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseItem(Item item) {
|
|
||||||
Map<TagType, List<String>> issTags = getIssTags(item);
|
|
||||||
if (!issTags.isEmpty()) {
|
|
||||||
logger.debug("Found item {} with ISS tags: {}", item, issTags);
|
|
||||||
|
|
||||||
DeviceType deviceType = getDeviceType(item, issTags);
|
|
||||||
if (deviceType == null) {
|
|
||||||
logger.warn("Unrecognized device type for item: {}", item);
|
|
||||||
} else {
|
|
||||||
AbstractDevice device = getDeviceInstance(deviceType, item);
|
|
||||||
device.setId(getDeviceId(item));
|
|
||||||
device.setName(getLabel(item, issTags));
|
|
||||||
device.setInverted(isInverted(issTags));
|
|
||||||
device.setActionRegistry(actionRegistry);
|
|
||||||
|
|
||||||
setIcon(device, issTags);
|
|
||||||
setDeviceRoom(device, issTags);
|
|
||||||
setDeviceLinks(device, item, issTags);
|
|
||||||
setMapping(device, item, issTags);
|
|
||||||
setUnit(device, issTags);
|
|
||||||
|
|
||||||
device.processCustomTags(issTags);
|
|
||||||
|
|
||||||
// Set initial state
|
|
||||||
logger.debug("Setting initial state of {} to {}", device, item.getState());
|
|
||||||
device.stateUpdated(item, item.getState());
|
|
||||||
|
|
||||||
logger.debug("Item parsed to device: {}", device);
|
|
||||||
synchronized (deviceRegistry) {
|
|
||||||
deviceRegistry.add(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setIcon(AbstractDevice device, Map<TagType, List<String>> issTags) {
|
|
||||||
if (!issTags.containsKey(TagType.ICON)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String icon = issTags.get(TagType.ICON).get(0);
|
|
||||||
if (!icon.toLowerCase().startsWith("http")) {
|
|
||||||
String rootUrl = config.getRootUrl();
|
|
||||||
if (rootUrl == null || rootUrl.isEmpty()) {
|
|
||||||
logger.error("Can't set icon; 'openhab.rootUrl' not set in configuration");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
icon = rootUrl + "icon/" + icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
device.addParam(new DeviceParam(ParamType.DEFAULT_ICON, icon));
|
|
||||||
}
|
|
||||||
|
|
||||||
private AbstractDevice getDeviceInstance(DeviceType deviceType, Item item) {
|
|
||||||
switch (deviceType) {
|
|
||||||
case SWITCH:
|
|
||||||
return new SwitchDevice(item);
|
|
||||||
case DIMMER:
|
|
||||||
return new DimmerDevice(item);
|
|
||||||
case RGB_LIGHT:
|
|
||||||
return new RgbLightDevice(item);
|
|
||||||
case TEMPERATURE:
|
|
||||||
return new TemperatureDevice(item);
|
|
||||||
case TEMP_HYGRO:
|
|
||||||
return new TempHygroDevice(item);
|
|
||||||
case LUMINOSITY:
|
|
||||||
return new LuminosityDevice(item);
|
|
||||||
case HYGROMETRY:
|
|
||||||
return new HygrometryDevice(item);
|
|
||||||
case CO2:
|
|
||||||
return new Co2SensorDevice(item);
|
|
||||||
case ELECTRICITY:
|
|
||||||
return new ElectricityDevice(item);
|
|
||||||
case SCENE:
|
|
||||||
return new SceneDevice(item);
|
|
||||||
case MULTI_SWITCH:
|
|
||||||
return new MultiSwitchDevice(item);
|
|
||||||
case GENERIC_SENSOR:
|
|
||||||
return new GenericSensorDevice(item);
|
|
||||||
case PRESSURE:
|
|
||||||
return new PressureDevice(item);
|
|
||||||
case UV:
|
|
||||||
return new UvDevice(item);
|
|
||||||
case NOISE:
|
|
||||||
return new NoiseDevice(item);
|
|
||||||
case RAIN:
|
|
||||||
return new RainDevice(item);
|
|
||||||
case WIND:
|
|
||||||
return new WindDevice(item);
|
|
||||||
case LOCK:
|
|
||||||
return new LockDevice(item);
|
|
||||||
case SHUTTER:
|
|
||||||
return new ShutterDevice(item);
|
|
||||||
case THERMOSTAT:
|
|
||||||
return new ThermostatDevice(item);
|
|
||||||
case CO2_ALERT:
|
|
||||||
case SMOKE:
|
|
||||||
case DOOR:
|
|
||||||
case MOTION:
|
|
||||||
case FLOOD:
|
|
||||||
return new TrippableDevice(deviceType, item);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IllegalArgumentException("Unknown device type: " + deviceType);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getLabel(Item item, Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.LABEL)) {
|
|
||||||
return issTags.get(TagType.LABEL).get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
String label = item.getLabel();
|
|
||||||
if (label != null && !label.isBlank()) {
|
|
||||||
label = label.trim();
|
|
||||||
if (label.matches("\\[.*\\]$")) {
|
|
||||||
label = label.substring(0, label.indexOf('['));
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
return item.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isInverted(Map<TagType, List<String>> issTags) {
|
|
||||||
return issTags.containsKey(TagType.INVERT) && StringUtils.toBoolean(issTags.get(TagType.INVERT).get(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setDeviceRoom(AbstractDevice device, Map<TagType, List<String>> issTags) {
|
|
||||||
String roomName = "No room";
|
|
||||||
if (issTags.containsKey(TagType.ROOM)) {
|
|
||||||
roomName = issTags.get(TagType.ROOM).get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
device.setRoom(DigestUtil.sha1(roomName));
|
|
||||||
device.setRoomName(roomName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setDeviceLinks(AbstractDevice device, Item item, Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.LINK)) {
|
|
||||||
// Pass device registry to device for linked device lookup
|
|
||||||
device.setDeviceRegistry(deviceRegistry);
|
|
||||||
|
|
||||||
// Parse link tags
|
|
||||||
for (String link : issTags.get(TagType.LINK)) {
|
|
||||||
String[] parts = link.split(":");
|
|
||||||
if (parts.length == 2) {
|
|
||||||
device.addLink(parts[0].toLowerCase().trim(), parts[1].trim());
|
|
||||||
} else {
|
|
||||||
logger.error("Item has incorrect link format (should be 'iss:link:<type>:<item>'): {}", item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check required links
|
|
||||||
for (String requiredLink : device.getType().getRequiredLinks()) {
|
|
||||||
if (!device.getLinks().containsKey(requiredLink)) {
|
|
||||||
logger.error("Item doesn't contain required link {} for {}: {}", requiredLink,
|
|
||||||
device.getType().getApiString(), item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a mapping tag, if it exists. Format: "iss:mapping:1=Foo,2=Bar,3=Foobar".
|
|
||||||
*/
|
|
||||||
private void setMapping(AbstractDevice device, Item item, Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.MAPPING)) {
|
|
||||||
String mapItems = issTags.get(TagType.MAPPING).get(0);
|
|
||||||
|
|
||||||
Map<String, String> mapping = new HashMap<>();
|
|
||||||
for (String mapItem : mapItems.split(",")) {
|
|
||||||
String[] keyVal = mapItem.split("=", 2);
|
|
||||||
if (keyVal.length != 2) {
|
|
||||||
logger.error("Invalid mapping syntax for Item {}", item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mapping.put(keyVal[0].trim(), keyVal[1].trim());
|
|
||||||
}
|
|
||||||
|
|
||||||
device.setMapping(mapping);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the unit tag, if it exists. Format: "iss:unit:°C".
|
|
||||||
*/
|
|
||||||
private void setUnit(AbstractDevice device, Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.UNIT)) {
|
|
||||||
if (!(device instanceof AbstractNumericValueDevice)) {
|
|
||||||
logger.warn("Unit tag is not supported for device {}", device);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
((AbstractNumericValueDevice) device).setUnit(issTags.get(TagType.UNIT).get(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines the Device type for the given Item. Uses the 'type' tag first, tries to auto-detect the type if no
|
|
||||||
* such tag exists.
|
|
||||||
*/
|
|
||||||
private DeviceType getDeviceType(Item item, Map<TagType, List<String>> issTags) {
|
|
||||||
if (issTags.containsKey(TagType.TYPE)) {
|
|
||||||
return DeviceType.forApiString(issTags.get(TagType.TYPE).get(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Class<? extends State>> acceptedDataTypes = item.getAcceptedDataTypes();
|
|
||||||
String name = item.getName().toLowerCase();
|
|
||||||
|
|
||||||
if (acceptedDataTypes.contains(DecimalType.class)) {
|
|
||||||
if (name.contains("tempe")) {
|
|
||||||
return DeviceType.TEMPERATURE;
|
|
||||||
} else if (name.contains("lumi")) {
|
|
||||||
return DeviceType.LUMINOSITY;
|
|
||||||
} else if (name.contains("hygro")) {
|
|
||||||
return DeviceType.HYGROMETRY;
|
|
||||||
} else if (name.contains("wind")) {
|
|
||||||
return DeviceType.WIND;
|
|
||||||
} else {
|
|
||||||
return DeviceType.GENERIC_SENSOR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (acceptedDataTypes.contains(HSBType.class)) {
|
|
||||||
return DeviceType.RGB_LIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (acceptedDataTypes.contains(OpenClosedType.class)) {
|
|
||||||
return DeviceType.DOOR;
|
|
||||||
}
|
|
||||||
if (acceptedDataTypes.contains(OnOffType.class)) {
|
|
||||||
return DeviceType.SWITCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<TagType, List<String>> getIssTags(Item item) {
|
|
||||||
Map<TagType, List<String>> tags = new EnumMap<>(TagType.class);
|
|
||||||
|
|
||||||
for (String tag : item.getTags()) {
|
|
||||||
if (tag.startsWith(PREFIX_ISS)) {
|
|
||||||
String issTag = tag.substring(PREFIX_ISS.length());
|
|
||||||
for (TagType tagType : TagType.values()) {
|
|
||||||
if (issTag.startsWith(tagType.getPrefix() + ':')) {
|
|
||||||
String tagValue = issTag.substring(tagType.getPrefix().length() + 1);
|
|
||||||
if (!tags.containsKey(tagType)) {
|
|
||||||
tags.put(tagType, new LinkedList<>());
|
|
||||||
} else if (!tagType.isMultiValue()) {
|
|
||||||
logger.error("Found multiple values for tag {} - only first value is used",
|
|
||||||
tagType.getPrefix());
|
|
||||||
}
|
|
||||||
tags.get(tagType).add(tagValue);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tags;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the given item for the device list.
|
|
||||||
*
|
|
||||||
* @param item Item to remove.
|
|
||||||
*/
|
|
||||||
private void removeItem(Item item) {
|
|
||||||
removeItem(item.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the given item for the device list.
|
|
||||||
*
|
|
||||||
* @param itemName Name of the Item to remove.
|
|
||||||
*/
|
|
||||||
private void removeItem(String itemName) {
|
|
||||||
String deviceId = getDeviceId(itemName);
|
|
||||||
|
|
||||||
AbstractDevice device;
|
|
||||||
synchronized (deviceRegistry) {
|
|
||||||
device = deviceRegistry.remove(deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device != null) {
|
|
||||||
logger.debug("Removing Device from ISS registry for Item: {}", itemName);
|
|
||||||
device.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates an unique device ID for the given item.
|
|
||||||
*
|
|
||||||
* @param item Item to get device ID for.
|
|
||||||
* @return Device ID.
|
|
||||||
*/
|
|
||||||
public static String getDeviceId(Item item) {
|
|
||||||
return getDeviceId(item.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates an unique device ID for the given item name.
|
|
||||||
*
|
|
||||||
* @param itemName Item name.
|
|
||||||
* @return Device ID.
|
|
||||||
*/
|
|
||||||
public static String getDeviceId(String itemName) {
|
|
||||||
return DigestUtil.sha1(itemName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void added(Item item) {
|
|
||||||
logger.debug("Processing item added event");
|
|
||||||
parseItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removed(Item item) {
|
|
||||||
logger.debug("Processing item removed event");
|
|
||||||
removeItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updated(Item oldItem, Item newItem) {
|
|
||||||
logger.debug("Processing item updated event");
|
|
||||||
removeItem(oldItem);
|
|
||||||
parseItem(newItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void allItemsChanged(Collection<String> oldItems) {
|
|
||||||
synchronized (deviceRegistry) {
|
|
||||||
logger.debug("Processing allItemsChanged event");
|
|
||||||
|
|
||||||
for (String oldItem : oldItems) {
|
|
||||||
removeItem(oldItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deviceRegistry.hasDevices()) {
|
|
||||||
logger.warn("There are still Devices left after processing all Items from allItemsChanged(): {}",
|
|
||||||
deviceRegistry.getDevices());
|
|
||||||
deviceRegistry.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Item item : itemRegistry.getItems()) {
|
|
||||||
parseItem(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.processor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ISS tag types enumeration.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public enum TagType {
|
|
||||||
|
|
||||||
LABEL("label", false),
|
|
||||||
ROOM("room", false),
|
|
||||||
TYPE("type", false),
|
|
||||||
MAPPING("mapping", false),
|
|
||||||
LINK("link", true),
|
|
||||||
UNIT("unit", false),
|
|
||||||
INVERT("invert", false),
|
|
||||||
ICON("icon", false),
|
|
||||||
|
|
||||||
STEP("step", false),
|
|
||||||
MIN_VAL("minVal", false),
|
|
||||||
MAX_VAL("maxVal", false),
|
|
||||||
MODES("modes", false);
|
|
||||||
|
|
||||||
private final String prefix;
|
|
||||||
private final boolean multiValue;
|
|
||||||
|
|
||||||
TagType(String prefix, boolean multiValue) {
|
|
||||||
this.prefix = prefix;
|
|
||||||
this.multiValue = multiValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Tag prefix.
|
|
||||||
*/
|
|
||||||
public String getPrefix() {
|
|
||||||
return prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return True if this tag may exist multiple times on a single item.
|
|
||||||
*/
|
|
||||||
public boolean isMultiValue() {
|
|
||||||
return multiValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.util;
|
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Digest utility.
|
|
||||||
*
|
|
||||||
* @author Pepijn de Geus - Initial contribution
|
|
||||||
*/
|
|
||||||
public final class DigestUtil {
|
|
||||||
|
|
||||||
public static String sha1(String input) {
|
|
||||||
try {
|
|
||||||
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
|
|
||||||
crypt.reset();
|
|
||||||
crypt.update(input.getBytes(StandardCharsets.UTF_8));
|
|
||||||
|
|
||||||
return new BigInteger(1, crypt.digest()).toString(16);
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
throw new RuntimeException("Could not generate SHA-1 hash", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hidden constructor
|
|
||||||
private DigestUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
|
||||||
*
|
|
||||||
* See the NOTICE file(s) distributed with this work for additional
|
|
||||||
* information.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials are made available under the
|
|
||||||
* terms of the Eclipse Public License 2.0 which is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-2.0
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*/
|
|
||||||
package org.openhab.io.imperihome.internal.util;
|
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@link StringUtils} class defines some static string utility methods
|
|
||||||
*
|
|
||||||
* @author Leo Siepel - Initial contribution
|
|
||||||
*/
|
|
||||||
@NonNullByDefault
|
|
||||||
public class StringUtils {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple method to create boolean from string.
|
|
||||||
* 'true', 'on', 'y', 't' or 'yes' (case insensitive) will return true. Otherwise, false is returned.
|
|
||||||
*/
|
|
||||||
public static boolean toBoolean(@Nullable String input) {
|
|
||||||
if (input != null) {
|
|
||||||
input = input.toLowerCase();
|
|
||||||
}
|
|
||||||
return "true".equals(input) || "on".equals(input) || "y".equals(input) || "t".equals(input)
|
|
||||||
|| "yes".equals(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String padLeft(@Nullable String input, int minSize, String padString) {
|
|
||||||
if (input == null) {
|
|
||||||
input = "";
|
|
||||||
}
|
|
||||||
return String.format("%" + minSize + "s", input).replace(" ", padString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<addon:addon id="imperihome" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xmlns:addon="https://openhab.org/schemas/addon/v1.0.0"
|
|
||||||
xsi:schemaLocation="https://openhab.org/schemas/addon/v1.0.0 https://openhab.org/schemas/addon-1.0.0.xsd">
|
|
||||||
|
|
||||||
<type>misc</type>
|
|
||||||
<name>ImperiHome</name>
|
|
||||||
<description>Exposes openHAB to the Evertygo dashboard.</description>
|
|
||||||
|
|
||||||
<service-id>org.openhab.imperihome</service-id>
|
|
||||||
|
|
||||||
<config-description-ref uri="io:imperihome"/>
|
|
||||||
|
|
||||||
</addon:addon>
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<config-description:config-descriptions
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xmlns:config-description="https://openhab.org/schemas/config-description/v1.0.0"
|
|
||||||
xsi:schemaLocation="https://openhab.org/schemas/config-description/v1.0.0
|
|
||||||
https://openhab.org/schemas/config-description-1.0.0.xsd">
|
|
||||||
<config-description uri="io:imperihome">
|
|
||||||
|
|
||||||
</config-description>
|
|
||||||
</config-description:config-descriptions>
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# service
|
|
||||||
|
|
||||||
service.io.imperihome.label = ImperiHome Integration
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# service
|
|
||||||
|
|
||||||
service.io.imperihome.label = ImperiHome Integration
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# service
|
|
||||||
|
|
||||||
service.io.imperihome.label = ImperiHome -integraatio
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# service
|
|
||||||
|
|
||||||
service.io.imperihome.label = Intégration ImperiHome
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# service
|
|
||||||
|
|
||||||
service.io.imperihome.label = Integrazione ImperiHome
|
|
||||||
@ -28,7 +28,6 @@
|
|||||||
<!-- io -->
|
<!-- io -->
|
||||||
<module>org.openhab.io.homekit</module>
|
<module>org.openhab.io.homekit</module>
|
||||||
<module>org.openhab.io.hueemulation</module>
|
<module>org.openhab.io.hueemulation</module>
|
||||||
<module>org.openhab.io.imperihome</module>
|
|
||||||
<module>org.openhab.io.metrics</module>
|
<module>org.openhab.io.metrics</module>
|
||||||
<module>org.openhab.io.neeo</module>
|
<module>org.openhab.io.neeo</module>
|
||||||
<module>org.openhab.io.openhabcloud</module>
|
<module>org.openhab.io.openhabcloud</module>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user