From 382ce10a0a164b67d34ee88107ce697b677aa9b5 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Sat, 9 Jan 2021 22:53:23 +0100 Subject: [PATCH] [deconz] Added channel to enable / disable motion sensor (#9686) * Added channel to enable / disable motion sensor Signed-off-by: Christoph Weitkamp --- bundles/org.openhab.binding.deconz/README.md | 63 ++++++------ .../deconz/internal/BindingConstants.java | 1 + .../deconz/internal/dto/SensorConfig.java | 2 +- .../internal/dto/SensorUpdateConfig.java | 26 +++++ ...onfig.java => ThermostatUpdateConfig.java} | 4 +- .../handler/DeconzBaseThingHandler.java | 7 +- .../handler/SensorBaseThingHandler.java | 34 +++---- .../handler/SensorThermostatThingHandler.java | 32 +++--- .../internal/handler/SensorThingHandler.java | 98 +++++++++++-------- .../main/resources/OH-INF/config/config.xml | 4 +- .../OH-INF/i18n/deconz_de.properties | 14 +++ .../OH-INF/thing/sensor-thing-types.xml | 1 + 12 files changed, 173 insertions(+), 113 deletions(-) create mode 100644 bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorUpdateConfig.java rename bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/{ThermostatConfig.java => ThermostatUpdateConfig.java} (86%) diff --git a/bundles/org.openhab.binding.deconz/README.md b/bundles/org.openhab.binding.deconz/README.md index d0a4007e2..5ab188f58 100644 --- a/bundles/org.openhab.binding.deconz/README.md +++ b/bundles/org.openhab.binding.deconz/README.md @@ -120,37 +120,38 @@ Bridge deconz:deconz:homeserver [ host="192.168.0.10", apikey="ABCDEFGHIJ" ] The sensor devices support some of the following channels: -| Channel Type ID | Item Type | Access Mode | Description | Thing types | -|-----------------|--------------------------|:-----------:|-------------------------------------------------------------------------------------------|----------------------------------------------| -| presence | Switch | R | Status of presence: `ON` = presence; `OFF` = no-presence | presencesensor | -| last_updated | DateTime | R | Timestamp when the sensor was last updated | all, except daylightsensor | -| last_seen | DateTime | R | Timestamp when the sensor was last seen | all, except daylightsensor | -| power | Number:Power | R | Current power usage in Watts | powersensor, sometimes for consumptionsensor | -| consumption | Number:Energy | R | Current power usage in Watts/Hour | consumptionsensor | -| voltage | Number:ElectricPotential | R | Current voltage in V | some powersensors | -| current | Number:ElectricCurrent | R | Current current in mA | some powersensors | -| button | Number | R | Last pressed button id on a switch | switch, colorcontrol | -| gesture | Number | R | A gesture that was performed with the switch | switch | -| lightlux | Number:Illuminance | R | Current light illuminance in Lux | lightsensor | -| light_level | Number | R | Current light level | lightsensor | -| dark | Switch | R | Light level is below the darkness threshold | lightsensor, sometimes for presencesensor | -| daylight | Switch | R | Light level is above the daylight threshold | lightsensor | -| temperature | Number:Temperature | R | Current temperature in ËšC | temperaturesensor, some Xiaomi sensors,thermostat| -| humidity | Number:Dimensionless | R | Current humidity in % | humiditysensor | -| pressure | Number:Pressure | R | Current pressure in hPa | pressuresensor | -| open | Contact | R | Status of contacts: `OPEN`; `CLOSED` | openclosesensor | -| waterleakage | Switch | R | Status of water leakage: `ON` = water leakage detected; `OFF` = no water leakage detected | waterleakagesensor | -| fire | Switch | R | Status of a fire: `ON` = fire was detected; `OFF` = no fire detected | firesensor | -| alarm | Switch | R | Status of an alarm: `ON` = alarm was triggered; `OFF` = no alarm | alarmsensor | -| tampered | Switch | R | Status of a zone: `ON` = zone is being tampered; `OFF` = zone is not tampered | any IAS sensor | -| vibration | Switch | R | Status of vibration: `ON` = vibration was detected; `OFF` = no vibration | alarmsensor | -| light | String | R | Light level: `Daylight`; `Sunset`; `Dark` | daylightsensor | -| value | Number | R | Sun position: `130` = dawn; `140` = sunrise; `190` = sunset; `210` = dusk | daylightsensor | -| battery_level | Number | R | Battery level (in %) | any battery-powered sensor | -| battery_low | Switch | R | Battery level low: `ON`; `OFF` | any battery-powered sensor | -| carbonmonoxide | Switch | R | `ON` = carbon monoxide detected | carbonmonoxide | -| color | Color | R | Color set by remote | colorcontrol | -| windowopen | Contact | R | `windowopen` status is reported by some thermostats | thermostat | +| Channel Type ID | Item Type | Access Mode | Description | Thing types | +|-----------------|--------------------------|-------------|-------------------------------------------------------------------------------------------|---------------------------------------------------| +| presence | Switch | R | Status of presence: `ON` = presence; `OFF` = no-presence | presencesensor | +| enabled | Switch | R/W | This channel activates or deactivates the sensor | presencesensor | +| last_updated | DateTime | R | Timestamp when the sensor was last updated | all, except daylightsensor | +| last_seen | DateTime | R | Timestamp when the sensor was last seen | all, except daylightsensor | +| power | Number:Power | R | Current power usage in Watts | powersensor, sometimes for consumptionsensor | +| consumption | Number:Energy | R | Current power usage in Watts/Hour | consumptionsensor | +| voltage | Number:ElectricPotential | R | Current voltage in V | some powersensors | +| current | Number:ElectricCurrent | R | Current current in mA | some powersensors | +| button | Number | R | Last pressed button id on a switch | switch, colorcontrol | +| gesture | Number | R | A gesture that was performed with the switch | switch | +| lightlux | Number:Illuminance | R | Current light illuminance in Lux | lightsensor | +| light_level | Number | R | Current light level | lightsensor | +| dark | Switch | R | Light level is below the darkness threshold | lightsensor, sometimes for presencesensor | +| daylight | Switch | R | Light level is above the daylight threshold | lightsensor | +| temperature | Number:Temperature | R | Current temperature in ËšC | temperaturesensor, some Xiaomi sensors,thermostat | +| humidity | Number:Dimensionless | R | Current humidity in % | humiditysensor | +| pressure | Number:Pressure | R | Current pressure in hPa | pressuresensor | +| open | Contact | R | Status of contacts: `OPEN`; `CLOSED` | openclosesensor | +| waterleakage | Switch | R | Status of water leakage: `ON` = water leakage detected; `OFF` = no water leakage detected | waterleakagesensor | +| fire | Switch | R | Status of a fire: `ON` = fire was detected; `OFF` = no fire detected | firesensor | +| alarm | Switch | R | Status of an alarm: `ON` = alarm was triggered; `OFF` = no alarm | alarmsensor | +| tampered | Switch | R | Status of a zone: `ON` = zone is being tampered; `OFF` = zone is not tampered | any IAS sensor | +| vibration | Switch | R | Status of vibration: `ON` = vibration was detected; `OFF` = no vibration | alarmsensor | +| light | String | R | Light level: `Daylight`; `Sunset`; `Dark` | daylightsensor | +| value | Number | R | Sun position: `130` = dawn; `140` = sunrise; `190` = sunset; `210` = dusk | daylightsensor | +| battery_level | Number | R | Battery level (in %) | any battery-powered sensor | +| battery_low | Switch | R | Battery level low: `ON`; `OFF` | any battery-powered sensor | +| carbonmonoxide | Switch | R | `ON` = carbon monoxide detected | carbonmonoxide | +| color | Color | R | Color set by remote | colorcontrol | +| windowopen | Contact | R | `windowopen` status is reported by some thermostats | thermostat | **NOTE:** Beside other non mandatory channels, the `battery_level` and `battery_low` channels will be added to the Thing during runtime if the sensor is battery-powered. The specification of your sensor depends on the deCONZ capabilities. diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/BindingConstants.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/BindingConstants.java index 1403aafa8..3d5cbc664 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/BindingConstants.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/BindingConstants.java @@ -70,6 +70,7 @@ public class BindingConstants { // sensor channel ids public static final String CHANNEL_PRESENCE = "presence"; + public static final String CHANNEL_ENABLED = "enabled"; public static final String CHANNEL_LAST_UPDATED = "last_updated"; public static final String CHANNEL_LAST_SEEN = "last_seen"; public static final String CHANNEL_POWER = "power"; diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorConfig.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorConfig.java index 5b3a47b90..1c0b48df5 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorConfig.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorConfig.java @@ -39,6 +39,6 @@ public class SensorConfig { @Override public String toString() { return "SensorConfig{" + "on=" + on + ", reachable=" + reachable + ", battery=" + battery + ", temperature=" - + temperature + ", heatsetpoint=" + heatsetpoint + ", mode=" + mode + ", offset=" + offset + '}'; + + temperature + ", heatsetpoint=" + heatsetpoint + ", mode=" + mode + ", offset=" + offset + "}"; } } diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorUpdateConfig.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorUpdateConfig.java new file mode 100644 index 000000000..9403ab83b --- /dev/null +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/SensorUpdateConfig.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2010-2021 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.binding.deconz.internal.dto; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link SensorUpdateConfig} is send to the Rest API to configure presence sensors. + * + * @author Christoph Weitkamp - Initial contribution + */ +@NonNullByDefault +public class SensorUpdateConfig { + public @Nullable Boolean on; +} diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatConfig.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatUpdateConfig.java similarity index 86% rename from bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatConfig.java rename to bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatUpdateConfig.java index df2c92192..e1e7d74a9 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatConfig.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/dto/ThermostatUpdateConfig.java @@ -17,12 +17,12 @@ import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.deconz.internal.types.ThermostatMode; /** - * The {@link ThermostatConfig} is send to the Rest API to configure Thermostat. + * The {@link ThermostatUpdateConfig} is send to the Rest API to configure Thermostat. * * @author Lukas Agethen - Initial contribution */ @NonNullByDefault -public class ThermostatConfig { +public class ThermostatUpdateConfig { public @Nullable Integer heatsetpoint; public @Nullable ThermostatMode mode; public @Nullable Integer offset; diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/DeconzBaseThingHandler.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/DeconzBaseThingHandler.java index b75b072cb..9f40f4902 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/DeconzBaseThingHandler.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/DeconzBaseThingHandler.java @@ -24,7 +24,12 @@ import org.openhab.binding.deconz.internal.dto.DeconzBaseMessage; import org.openhab.binding.deconz.internal.netutils.WebSocketConnection; import org.openhab.binding.deconz.internal.netutils.WebSocketMessageListener; import org.openhab.binding.deconz.internal.types.ResourceType; -import org.openhab.core.thing.*; +import org.openhab.core.thing.Bridge; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.thing.Thing; +import org.openhab.core.thing.ThingStatus; +import org.openhab.core.thing.ThingStatusDetail; +import org.openhab.core.thing.ThingStatusInfo; import org.openhab.core.thing.binding.BaseThingHandler; import org.openhab.core.types.Command; import org.slf4j.Logger; diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorBaseThingHandler.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorBaseThingHandler.java index 247e61d52..389d8c83f 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorBaseThingHandler.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorBaseThingHandler.java @@ -121,17 +121,14 @@ public abstract class SensorBaseThingHandler extends DeconzBaseThingHandler { return; } - if (!sensorConfig.on) { - updateStatus(ThingStatus.OFFLINE); - return; - } - Map editProperties = editProperties(); editProperties.put(UNIQUE_ID, sensorMessage.uniqueid); editProperties.put(Thing.PROPERTY_FIRMWARE_VERSION, sensorMessage.swversion); editProperties.put(Thing.PROPERTY_VENDOR, sensorMessage.manufacturername); editProperties.put(Thing.PROPERTY_MODEL_ID, sensorMessage.modelid); + ignoreConfigurationUpdate = true; + updateProperties(editProperties); // Some sensors support optional channels @@ -228,16 +225,16 @@ public abstract class SensorBaseThingHandler extends DeconzBaseThingHandler { /** * Update channel value from {@link SensorState} object - override to include further channels * - * @param channelID + * @param channelUID * @param newState * @param initializing */ - protected void valueUpdated(String channelID, SensorState newState, boolean initializing) { - switch (channelID) { + protected void valueUpdated(ChannelUID channelUID, SensorState newState, boolean initializing) { + switch (channelUID.getId()) { case CHANNEL_LAST_UPDATED: String lastUpdated = newState.lastupdated; if (lastUpdated != null && !"none".equals(lastUpdated)) { - updateState(channelID, Util.convertTimestampToDateTime(lastUpdated)); + updateState(channelUID, Util.convertTimestampToDateTime(lastUpdated)); } break; default: @@ -271,31 +268,32 @@ public abstract class SensorBaseThingHandler extends DeconzBaseThingHandler { protected void updateChannels(SensorState newState, boolean initializing) { sensorState = newState; - thing.getChannels().forEach(channel -> valueUpdated(channel.getUID().getId(), newState, initializing)); + thing.getChannels().forEach(channel -> valueUpdated(channel.getUID(), newState, initializing)); } - protected void updateSwitchChannel(String channelID, @Nullable Boolean value) { + protected void updateSwitchChannel(ChannelUID channelUID, @Nullable Boolean value) { if (value == null) { return; } - updateState(channelID, OnOffType.from(value)); + updateState(channelUID, OnOffType.from(value)); } - protected void updateDecimalTypeChannel(String channelID, @Nullable Number value) { + protected void updateDecimalTypeChannel(ChannelUID channelUID, @Nullable Number value) { if (value == null) { return; } - updateState(channelID, new DecimalType(value.longValue())); + updateState(channelUID, new DecimalType(value.longValue())); } - protected void updateQuantityTypeChannel(String channelID, @Nullable Number value, Unit unit) { - updateQuantityTypeChannel(channelID, value, unit, 1.0); + protected void updateQuantityTypeChannel(ChannelUID channelUID, @Nullable Number value, Unit unit) { + updateQuantityTypeChannel(channelUID, value, unit, 1.0); } - protected void updateQuantityTypeChannel(String channelID, @Nullable Number value, Unit unit, double scaling) { + protected void updateQuantityTypeChannel(ChannelUID channelUID, @Nullable Number value, Unit unit, + double scaling) { if (value == null) { return; } - updateState(channelID, new QuantityType<>(value.doubleValue() * scaling, unit)); + updateState(channelUID, new QuantityType<>(value.doubleValue() * scaling, unit)); } } diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThermostatThingHandler.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThermostatThingHandler.java index c9a12d03b..a3df6fb06 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThermostatThingHandler.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThermostatThingHandler.java @@ -26,7 +26,11 @@ import javax.measure.quantity.Temperature; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.deconz.internal.dto.*; +import org.openhab.binding.deconz.internal.dto.DeconzBaseMessage; +import org.openhab.binding.deconz.internal.dto.SensorConfig; +import org.openhab.binding.deconz.internal.dto.SensorMessage; +import org.openhab.binding.deconz.internal.dto.SensorState; +import org.openhab.binding.deconz.internal.dto.ThermostatUpdateConfig; import org.openhab.binding.deconz.internal.types.ThermostatMode; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OpenClosedType; @@ -76,12 +80,11 @@ public class SensorThermostatThingHandler extends SensorBaseThingHandler { public void handleCommand(ChannelUID channelUID, Command command) { if (command instanceof RefreshType) { sensorState.buttonevent = null; - valueUpdated(channelUID.getId(), sensorState, false); + valueUpdated(channelUID, sensorState, false); return; } - ThermostatConfig newConfig = new ThermostatConfig(); - String channelId = channelUID.getId(); - switch (channelId) { + ThermostatUpdateConfig newConfig = new ThermostatUpdateConfig(); + switch (channelUID.getId()) { case CHANNEL_HEATSETPOINT: Integer newHeatsetpoint = getTemperatureFromCommand(command); if (newHeatsetpoint == null) { @@ -131,13 +134,12 @@ public class SensorThermostatThingHandler extends SensorBaseThingHandler { super.valueUpdated(channelUID, newConfig); ThermostatMode thermostatMode = newConfig.mode; String mode = thermostatMode != null ? thermostatMode.name() : ThermostatMode.UNKNOWN.name(); - String channelID = channelUID.getId(); - switch (channelID) { + switch (channelUID.getId()) { case CHANNEL_HEATSETPOINT: - updateQuantityTypeChannel(channelID, newConfig.heatsetpoint, CELSIUS, 1.0 / 100); + updateQuantityTypeChannel(channelUID, newConfig.heatsetpoint, CELSIUS, 1.0 / 100); break; case CHANNEL_TEMPERATURE_OFFSET: - updateQuantityTypeChannel(channelID, newConfig.offset, CELSIUS, 1.0 / 100); + updateQuantityTypeChannel(channelUID, newConfig.offset, CELSIUS, 1.0 / 100); break; case CHANNEL_THERMOSTAT_MODE: updateState(channelUID, new StringType(mode)); @@ -146,19 +148,19 @@ public class SensorThermostatThingHandler extends SensorBaseThingHandler { } @Override - protected void valueUpdated(String channelID, SensorState newState, boolean initializing) { - super.valueUpdated(channelID, newState, initializing); - switch (channelID) { + protected void valueUpdated(ChannelUID channelUID, SensorState newState, boolean initializing) { + super.valueUpdated(channelUID, newState, initializing); + switch (channelUID.getId()) { case CHANNEL_TEMPERATURE: - updateQuantityTypeChannel(channelID, newState.temperature, CELSIUS, 1.0 / 100); + updateQuantityTypeChannel(channelUID, newState.temperature, CELSIUS, 1.0 / 100); break; case CHANNEL_VALVE_POSITION: - updateQuantityTypeChannel(channelID, newState.valve, PERCENT, 100.0 / 255); + updateQuantityTypeChannel(channelUID, newState.valve, PERCENT, 100.0 / 255); break; case CHANNEL_WINDOWOPEN: String open = newState.windowopen; if (open != null) { - updateState(channelID, "Closed".equals(open) ? OpenClosedType.CLOSED : OpenClosedType.OPEN); + updateState(channelUID, "Closed".equals(open) ? OpenClosedType.CLOSED : OpenClosedType.OPEN); } break; } diff --git a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThingHandler.java b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThingHandler.java index 0934c8ecc..6665de056 100644 --- a/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThingHandler.java +++ b/bundles/org.openhab.binding.deconz/src/main/java/org/openhab/binding/deconz/internal/handler/SensorThingHandler.java @@ -17,14 +17,16 @@ import static org.openhab.core.library.unit.MetricPrefix.*; import static org.openhab.core.library.unit.SIUnits.*; import static org.openhab.core.library.unit.Units.*; -import java.util.Arrays; import java.util.List; import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.deconz.internal.dto.*; +import org.openhab.binding.deconz.internal.dto.SensorConfig; +import org.openhab.binding.deconz.internal.dto.SensorState; +import org.openhab.binding.deconz.internal.dto.SensorUpdateConfig; 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.library.types.QuantityType; import org.openhab.core.library.types.StringType; @@ -60,8 +62,8 @@ public class SensorThingHandler extends SensorBaseThingHandler { THING_TYPE_ALARM_SENSOR, THING_TYPE_VIBRATION_SENSOR, THING_TYPE_BATTERY_SENSOR, THING_TYPE_CARBONMONOXIDE_SENSOR, THING_TYPE_COLOR_CONTROL); - private static final List CONFIG_CHANNELS = Arrays.asList(CHANNEL_BATTERY_LEVEL, CHANNEL_BATTERY_LOW, - CHANNEL_TEMPERATURE); + private static final List CONFIG_CHANNELS = List.of(CHANNEL_BATTERY_LEVEL, CHANNEL_BATTERY_LOW, + CHANNEL_ENABLED, CHANNEL_TEMPERATURE); public SensorThingHandler(Thing thing, Gson gson) { super(thing, gson); @@ -69,21 +71,31 @@ public class SensorThingHandler extends SensorBaseThingHandler { @Override public void handleCommand(ChannelUID channelUID, Command command) { - if (!(command instanceof RefreshType)) { + if (command instanceof RefreshType) { + sensorState.buttonevent = null; + valueUpdated(channelUID, sensorState, false); return; } - - sensorState.buttonevent = null; - valueUpdated(channelUID.getId(), sensorState, false); + switch (channelUID.getId()) { + case CHANNEL_ENABLED: + if (command instanceof OnOffType) { + SensorUpdateConfig newConfig = new SensorUpdateConfig(); + newConfig.on = OnOffType.ON.equals(command); + sendCommand(newConfig, command, channelUID, null); + } + break; + } } @Override protected void valueUpdated(ChannelUID channelUID, SensorConfig newConfig) { super.valueUpdated(channelUID, newConfig); - Float temperature = newConfig.temperature; - switch (channelUID.getId()) { + case CHANNEL_ENABLED: + updateState(channelUID, OnOffType.from(newConfig.on)); + break; case CHANNEL_TEMPERATURE: + Float temperature = newConfig.temperature; if (temperature != null) { updateState(channelUID, new QuantityType<>(temperature / 100, CELSIUS)); } @@ -92,114 +104,114 @@ public class SensorThingHandler extends SensorBaseThingHandler { } @Override - protected void valueUpdated(String channelID, SensorState newState, boolean initializing) { - super.valueUpdated(channelID, newState, initializing); - switch (channelID) { + protected void valueUpdated(ChannelUID channelUID, SensorState newState, boolean initializing) { + super.valueUpdated(channelUID, newState, initializing); + switch (channelUID.getId()) { case CHANNEL_BATTERY_LEVEL: - updateDecimalTypeChannel(channelID, newState.battery); + updateDecimalTypeChannel(channelUID, newState.battery); break; case CHANNEL_LIGHT: Boolean dark = newState.dark; if (dark != null) { Boolean daylight = newState.daylight; if (dark) { // if it's dark, it's dark ;) - updateState(channelID, new StringType("Dark")); + updateState(channelUID, new StringType("Dark")); } else if (daylight != null) { // if its not dark, it might be between darkness and daylight if (daylight) { - updateState(channelID, new StringType("Daylight")); + updateState(channelUID, new StringType("Daylight")); } else { - updateState(channelID, new StringType("Sunset")); + updateState(channelUID, new StringType("Sunset")); } } else { // if no daylight value is known, we assume !dark means daylight - updateState(channelID, new StringType("Daylight")); + updateState(channelUID, new StringType("Daylight")); } } break; case CHANNEL_POWER: - updateQuantityTypeChannel(channelID, newState.power, WATT); + updateQuantityTypeChannel(channelUID, newState.power, WATT); break; case CHANNEL_CONSUMPTION: - updateQuantityTypeChannel(channelID, newState.consumption, WATT_HOUR); + updateQuantityTypeChannel(channelUID, newState.consumption, WATT_HOUR); break; case CHANNEL_VOLTAGE: - updateQuantityTypeChannel(channelID, newState.voltage, VOLT); + updateQuantityTypeChannel(channelUID, newState.voltage, VOLT); break; case CHANNEL_CURRENT: - updateQuantityTypeChannel(channelID, newState.current, MILLI(AMPERE)); + updateQuantityTypeChannel(channelUID, newState.current, MILLI(AMPERE)); break; case CHANNEL_LIGHT_LUX: - updateQuantityTypeChannel(channelID, newState.lux, LUX); + updateQuantityTypeChannel(channelUID, newState.lux, LUX); break; case CHANNEL_COLOR: final double @Nullable [] xy = newState.xy; if (xy != null && xy.length == 2) { - updateState(channelID, HSBType.fromXY((float) xy[0], (float) xy[1])); + updateState(channelUID, HSBType.fromXY((float) xy[0], (float) xy[1])); } break; case CHANNEL_LIGHT_LEVEL: - updateDecimalTypeChannel(channelID, newState.lightlevel); + updateDecimalTypeChannel(channelUID, newState.lightlevel); break; case CHANNEL_DARK: - updateSwitchChannel(channelID, newState.dark); + updateSwitchChannel(channelUID, newState.dark); break; case CHANNEL_DAYLIGHT: - updateSwitchChannel(channelID, newState.daylight); + updateSwitchChannel(channelUID, newState.daylight); break; case CHANNEL_TEMPERATURE: - updateQuantityTypeChannel(channelID, newState.temperature, CELSIUS, 1.0 / 100); + updateQuantityTypeChannel(channelUID, newState.temperature, CELSIUS, 1.0 / 100); break; case CHANNEL_HUMIDITY: - updateQuantityTypeChannel(channelID, newState.humidity, PERCENT, 1.0 / 100); + updateQuantityTypeChannel(channelUID, newState.humidity, PERCENT, 1.0 / 100); break; case CHANNEL_PRESSURE: - updateQuantityTypeChannel(channelID, newState.pressure, HECTO(PASCAL)); + updateQuantityTypeChannel(channelUID, newState.pressure, HECTO(PASCAL)); break; case CHANNEL_PRESENCE: - updateSwitchChannel(channelID, newState.presence); + updateSwitchChannel(channelUID, newState.presence); break; case CHANNEL_VALUE: - updateDecimalTypeChannel(channelID, newState.status); + updateDecimalTypeChannel(channelUID, newState.status); break; case CHANNEL_OPENCLOSE: Boolean open = newState.open; if (open != null) { - updateState(channelID, open ? OpenClosedType.OPEN : OpenClosedType.CLOSED); + updateState(channelUID, open ? OpenClosedType.OPEN : OpenClosedType.CLOSED); } break; case CHANNEL_WATERLEAKAGE: - updateSwitchChannel(channelID, newState.water); + updateSwitchChannel(channelUID, newState.water); break; case CHANNEL_FIRE: - updateSwitchChannel(channelID, newState.fire); + updateSwitchChannel(channelUID, newState.fire); break; case CHANNEL_ALARM: - updateSwitchChannel(channelID, newState.alarm); + updateSwitchChannel(channelUID, newState.alarm); break; case CHANNEL_TAMPERED: - updateSwitchChannel(channelID, newState.tampered); + updateSwitchChannel(channelUID, newState.tampered); break; case CHANNEL_VIBRATION: - updateSwitchChannel(channelID, newState.vibration); + updateSwitchChannel(channelUID, newState.vibration); break; case CHANNEL_CARBONMONOXIDE: - updateSwitchChannel(channelID, newState.carbonmonoxide); + updateSwitchChannel(channelUID, newState.carbonmonoxide); break; case CHANNEL_BUTTON: - updateDecimalTypeChannel(channelID, newState.buttonevent); + updateDecimalTypeChannel(channelUID, newState.buttonevent); break; case CHANNEL_BUTTONEVENT: Integer buttonevent = newState.buttonevent; if (buttonevent != null && !initializing) { - triggerChannel(channelID, String.valueOf(buttonevent)); + triggerChannel(channelUID, String.valueOf(buttonevent)); } break; case CHANNEL_GESTURE: - updateDecimalTypeChannel(channelID, newState.gesture); + updateDecimalTypeChannel(channelUID, newState.gesture); break; case CHANNEL_GESTUREEVENT: Integer gesture = newState.gesture; if (gesture != null && !initializing) { - triggerChannel(channelID, String.valueOf(gesture)); + triggerChannel(channelUID, String.valueOf(gesture)); } break; } diff --git a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/config/config.xml b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/config/config.xml index caff77650..dc7cc0665 100644 --- a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/config/config.xml +++ b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/config/config.xml @@ -41,8 +41,8 @@ - Interval to poll the deCONZ Gateway for this sensor's "lastSeen" channel. Polling is disabled when set - to 1440 (once per day). + Interval to poll the deCONZ Gateway for this sensor's "last_seen" channel. Polling is disabled when set + to 0 (default: 1440, once per day). 1440 diff --git a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/i18n/deconz_de.properties b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/i18n/deconz_de.properties index cebdda931..32837cc77 100644 --- a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/i18n/deconz_de.properties +++ b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/i18n/deconz_de.properties @@ -2,3 +2,17 @@ binding.deconz.name = Dresden Elektronik deCONZ Binding binding.deconz.description = Unterstützt die Raspbee und Conbee Zigbee Dongles via deCONZ +thing-type.deconz.presencesensor.label = Bewegungsmelder +thing-type.deconz.presencesensor.description = Bewegungsmelder mit einstellbarer Sensitivität. + +thing-type.config.deconz.sensor.id.label = ID des Sensors +thing-type.config.deconz.sensor.id.description = ID zur Identifikation des Sensors. +thing-type.config.deconz.sensor.lastSeenPolling.label = Abfrageintervall +thing-type.config.deconz.sensor.lastSeenPolling.description = Intervall zur Abfrage des deCONZ-Gateways nach dem "last_seen" Channel dieses Sensors. Polling wird deaktiviert, wenn der Wert auf 0 eingestellt wird (Standard: 1440, einmal pro Tag). + +channel-type.deconz.last_updated.label = Letzte Aktualisierung +channel-type.deconz.last_updated.description = Zeit, zu der sich dieser Wert geändert hat. +channel-type.deconz.last_updated.options.pattern = %1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS +channel-type.deconz.last_seen.label = Zuletzt Gesehen +channel-type.deconz.last_seen.description = Zeit, zu der sich dieser Wert geändert hat. +channel-type.deconz.last_seen.options.pattern = %1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS diff --git a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/thing/sensor-thing-types.xml b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/thing/sensor-thing-types.xml index a991e3657..a0c93106d 100644 --- a/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/thing/sensor-thing-types.xml +++ b/bundles/org.openhab.binding.deconz/src/main/resources/OH-INF/thing/sensor-thing-types.xml @@ -13,6 +13,7 @@ + uid