Skip to content

Commit

Permalink
[openwebnet] Reset zones' alarm state channel when system is armed (#…
Browse files Browse the repository at this point in the history
…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 <mvcode00@gmail.com>
  • Loading branch information
mvalla authored Mar 26, 2023
1 parent 6757a84 commit cbb72ed
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 21 deletions.
3 changes: 2 additions & 1 deletion bundles/org.openhab.binding.openwebnet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import static org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants.*;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.jdt.annotation.NonNullByDefault;
Expand Down Expand Up @@ -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<OpenWebNetAlarmHandler> zoneHandlers = new HashSet<OpenWebNetAlarmHandler>();

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);
Expand Down Expand Up @@ -115,7 +132,7 @@ protected void refreshDevice(boolean refreshAll) {

@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)) {
Expand All @@ -141,18 +158,20 @@ private void updateSystem(Alarm msg) {
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);
Expand Down Expand Up @@ -196,10 +215,10 @@ private void updateZone(Alarm msg) {
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);
}
Expand All @@ -209,15 +228,35 @@ private void updateZoneState(WhatAlarm w) {
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));
}
}

Expand All @@ -230,4 +269,13 @@ protected Where buildBusWhere(String wStr) throws IllegalArgumentException {
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,9 @@
<option value="TAMPERING">Tampering</option>
<option value="ANTI_PANIC">Anti Panic</option>
<option value="SILENT">Silent</option>
<option value="TECHNICAL">Technical</option>
<option value="TECHNICAL_RESET">Technical Reset</option>
<option value="NONE">None</option>
</options>
</state>
</channel-type>
Expand Down

0 comments on commit cbb72ed

Please sign in to comment.