From cbb72ed72eebe4cb0bbecd292ec29becca0cc2a7 Mon Sep 17 00:00:00 2001 From: M Valla <12682715+mvalla@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:19:31 +0200 Subject: [PATCH] [openwebnet] Reset zones' alarm state channel when system is armed (#14566) * [openwebnet] reset zones alarm channel when system is armed and added NONE state * [openwebnet] added Technical reset alarm. Changes after 1st review --------- Signed-off-by: Massimo Valla --- .../org.openhab.binding.openwebnet/README.md | 3 +- .../internal/OpenWebNetBindingConstants.java | 2 +- .../handler/OpenWebNetAlarmHandler.java | 86 +++++++++++++++---- .../OH-INF/i18n/openwebnet.properties | 3 + .../main/resources/OH-INF/thing/channels.xml | 3 + 5 files changed, 76 insertions(+), 21 deletions(-) diff --git a/bundles/org.openhab.binding.openwebnet/README.md b/bundles/org.openhab.binding.openwebnet/README.md index c36b44150a0..d4f3d6ca075 100644 --- a/bundles/org.openhab.binding.openwebnet/README.md +++ b/bundles/org.openhab.binding.openwebnet/README.md @@ -526,5 +526,6 @@ Special thanks for helping on testing this binding go to: [@feodor](https://community.openhab.org/u/feodor), [@aconte80](https://community.openhab.org/u/aconte80), [@rubenfuser](https://community.openhab.org/u/rubenfuser), -[@stamate_viorel](https://community.openhab.org/u/stamate_viorel) +[@stamate_viorel](https://community.openhab.org/u/stamate_viorel), +[@marchino](https://community.openhab.org/u/marchino) and many others at the fantastic openHAB community! diff --git a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/OpenWebNetBindingConstants.java b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/OpenWebNetBindingConstants.java index 7827fd3bc01..7cbf637c32e 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/OpenWebNetBindingConstants.java +++ b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/OpenWebNetBindingConstants.java @@ -172,7 +172,7 @@ public class OpenWebNetBindingConstants { public static final String CHANNEL_ALARM_SYSTEM_NETWORK = "network"; public static final String CHANNEL_ALARM_SYSTEM_BATTERY = "battery"; public static final String CHANNEL_ALARM_ZONE_STATE = "state"; - public static final String CHANNEL_ALARM_ZONE_ALARM_STATE = "alarm"; + public static final String CHANNEL_ALARM_ZONE_ALARM = "alarm"; // devices config properties public static final String CONFIG_PROPERTY_WHERE = "where"; diff --git a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetAlarmHandler.java b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetAlarmHandler.java index 9d5ddb37f3a..e6abefe6be8 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetAlarmHandler.java +++ b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetAlarmHandler.java @@ -14,6 +14,7 @@ package org.openhab.binding.openwebnet.internal.handler; import static org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants.*; +import java.util.HashSet; import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -52,19 +53,35 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { private static long lastAllDevicesRefreshTS = 0; // ts when last all device refresh was sent for this handler + private static Set zoneHandlers = new HashSet(); + private static final String BATTERY_OK = "OK"; private static final String BATTERY_FAULT = "FAULT"; private static final String BATTERY_UNLOADED = "UNLOADED"; - private static final String SILENT = "SILENT"; - private static final String INTRUSION = "INTRUSION"; - private static final String ANTI_PANIC = "ANTI_PANIC"; - private static final String TAMPERING = "TAMPERING"; + private static final String ALARM_INTRUSION = "INTRUSION"; + private static final String ALARM_TAMPERING = "TAMPERING"; + private static final String ALARM_ANTI_PANIC = "ANTI_PANIC"; + private static final String ALARM_SILENT = "SILENT"; + private static final String ALARM_TECHNICAL = "TECHNICAL"; + private static final String ALARM_TECHNICAL_RESET = "TECHNICAL_RESET"; + private static final String ALARM_NONE = "NONE"; public OpenWebNetAlarmHandler(Thing thing) { super(thing); } + @Override + public void initialize() { + super.initialize(); + if (OpenWebNetBindingConstants.THING_TYPE_BUS_ALARM_ZONE.equals(thing.getThingTypeUID())) { + zoneHandlers.add(this); + // initially set zone alarm to NONE (it will be set if specific alarm message is + // received) + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_NONE)); + } + } + @Override protected void handleChannelCommand(ChannelUID channel, Command command) { logger.warn("Alarm.handleChannelCommand() Read only channel, unsupported command {}", command); @@ -115,7 +132,7 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { @Override protected void handleMessage(BaseOpenMessage msg) { - logger.debug("handleMessage({}) for thing: {}", msg, thing.getUID()); + logger.debug("handleMessage({}) for: {} {}", msg, thing.getUID(), msg.getWhat()); super.handleMessage(msg); ThingTypeUID thingType = thing.getThingTypeUID(); if (THING_TYPE_BUS_ALARM_SYSTEM.equals(thingType)) { @@ -141,18 +158,20 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { case SYSTEM_ENGAGED: updateAlarmSystemArmed(w); break; - case SYSTEM_BATTERY_FAULT: case SYSTEM_BATTERY_OK: case SYSTEM_BATTERY_UNLOADED: + case SYSTEM_BATTERY_FAULT: updateBatteryState(w); break; case SYSTEM_NETWORK_ERROR: case SYSTEM_NETWORK_OK: updateNetworkState(w); break; + case DELAY_END: + resetAllZonesAlarmState(); + break; case START_PROGRAMMING: case STOP_PROGRAMMING: - case DELAY_END: case NO_CONNECTION_TO_DEVICE: default: logger.debug("Alarm.updateSystem() Ignoring unsupported WHAT {}. Frame={}", msg.getWhat(), msg); @@ -196,10 +215,10 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { case ZONE_ALARM_TAMPERING: case ZONE_ALARM_ANTI_PANIC: case ZONE_ALARM_SILENT: - updateZoneAlarmState(w); - break; - case ZONE_ALARM_TECHNICAL:// not handled for now + case ZONE_ALARM_TECHNICAL: case ZONE_ALARM_TECHNICAL_RESET: + updateZoneAlarm(w); + break; default: logger.debug("Alarm.updateZone() Ignoring unsupported WHAT {}. Frame={}", msg.getWhat(), msg); } @@ -209,15 +228,35 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { updateState(CHANNEL_ALARM_ZONE_STATE, OnOffType.from(w == Alarm.WhatAlarm.ZONE_ENGAGED)); } - private void updateZoneAlarmState(WhatAlarm w) { - if (w == Alarm.WhatAlarm.ZONE_ALARM_SILENT) { - updateState(CHANNEL_ALARM_ZONE_ALARM_STATE, new StringType(SILENT)); - } else if (w == Alarm.WhatAlarm.ZONE_ALARM_INTRUSION) { - updateState(CHANNEL_ALARM_ZONE_ALARM_STATE, new StringType(INTRUSION)); - } else if (w == Alarm.WhatAlarm.ZONE_ALARM_ANTI_PANIC) { - updateState(CHANNEL_ALARM_ZONE_ALARM_STATE, new StringType(ANTI_PANIC)); - } else { - updateState(CHANNEL_ALARM_ZONE_ALARM_STATE, new StringType(TAMPERING)); + private void updateZoneAlarm(WhatAlarm w) { + switch (w) { + case ZONE_ALARM_INTRUSION: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_INTRUSION)); + break; + case ZONE_ALARM_TAMPERING: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_TAMPERING)); + break; + case ZONE_ALARM_ANTI_PANIC: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_ANTI_PANIC)); + break; + case ZONE_ALARM_SILENT: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_SILENT)); + break; + case ZONE_ALARM_TECHNICAL: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_TECHNICAL)); + break; + case ZONE_ALARM_TECHNICAL_RESET: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_TECHNICAL_RESET)); + break; + default: + updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_NONE)); + logger.warn("Alarm.updateZoneAlarm() Ignoring unsupported WHAT {} for zone {}", w, this.deviceWhere); + } + } + + private void resetAllZonesAlarmState() { + for (OpenWebNetAlarmHandler h : zoneHandlers) { + h.updateState(CHANNEL_ALARM_ZONE_ALARM, new StringType(ALARM_NONE)); } } @@ -230,4 +269,13 @@ public class OpenWebNetAlarmHandler extends OpenWebNetThingHandler { protected String ownIdPrefix() { return Who.BURGLAR_ALARM.value().toString(); } + + @Override + public void dispose() { + if (OpenWebNetBindingConstants.THING_TYPE_BUS_ALARM_ZONE.equals(thing.getThingTypeUID())) { + zoneHandlers.remove(this); + logger.debug("Alarm.dispose() - removed zone {}", this.deviceWhere); + } + super.dispose(); + } } diff --git a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/i18n/openwebnet.properties b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/i18n/openwebnet.properties index 201fb6144fc..a417faa795d 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/i18n/openwebnet.properties +++ b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/i18n/openwebnet.properties @@ -282,6 +282,9 @@ channel-type.openwebnet.zoneAlarm.state.option.INTRUSION = Intrusion channel-type.openwebnet.zoneAlarm.state.option.TAMPERING = Tampering channel-type.openwebnet.zoneAlarm.state.option.ANTI_PANIC = Anti Panic channel-type.openwebnet.zoneAlarm.state.option.SILENT = Silent +channel-type.openwebnet.zoneAlarm.state.option.TECHNICAL = Technical +channel-type.openwebnet.zoneAlarm.state.option.TECHNICAL_RESET = Technical Reset +channel-type.openwebnet.zoneAlarm.state.option.NONE = None # thing status descriptions diff --git a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/channels.xml index 412bed8c667..be9b6843b58 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/channels.xml +++ b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/channels.xml @@ -454,6 +454,9 @@ + + +