import static org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants.*;
+import java.util.HashSet;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
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);
@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)) {
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);
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);
}
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));
}
}
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();
+ }
}