2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.caddx.internal.handler;
15 import java.util.HashMap;
17 import org.eclipse.jdt.annotation.NonNullByDefault;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.openhab.binding.caddx.internal.CaddxBindingConstants;
20 import org.openhab.binding.caddx.internal.CaddxEvent;
21 import org.openhab.binding.caddx.internal.CaddxMessage;
22 import org.openhab.binding.caddx.internal.CaddxMessageType;
23 import org.openhab.binding.caddx.internal.CaddxProperty;
24 import org.openhab.core.library.types.OnOffType;
25 import org.openhab.core.library.types.StringType;
26 import org.openhab.core.thing.ChannelUID;
27 import org.openhab.core.thing.Thing;
28 import org.openhab.core.thing.ThingStatus;
29 import org.openhab.core.types.Command;
30 import org.openhab.core.types.RefreshType;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
35 * This is a class for handling a Panel type Thing.
37 * @author Georgios Moutsos - Initial contribution
40 public class ThingHandlerPanel extends CaddxBaseThingHandler {
41 private final Logger logger = LoggerFactory.getLogger(ThingHandlerPanel.class);
42 private @Nullable HashMap<String, String> panelLogMessagesMap = null;
43 private @Nullable String communicatorStackPointer = null;
44 private long lastRefreshTime = 0;
46 public ThingHandlerPanel(Thing thing) {
47 super(thing, CaddxThingType.PANEL);
51 public void updateChannel(ChannelUID channelUID, String data) {
52 if (channelUID.getId().equals(CaddxBindingConstants.PANEL_FIRMWARE_VERSION)
53 || channelUID.getId().startsWith("panel_log_message_")) {
54 updateState(channelUID, new StringType(data));
56 // All Panel channels are OnOffType
59 onOffType = ("true".equals(data)) ? OnOffType.ON : OnOffType.OFF;
60 updateState(channelUID, onOffType);
65 public void handleCommand(ChannelUID channelUID, Command command) {
66 logger.trace("handleCommand(): Command Received - {} {}.", channelUID, command);
70 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
71 if (bridgeHandler == null) {
75 if (command instanceof RefreshType) {
76 if (CaddxBindingConstants.PANEL_LOG_MESSAGE_N_0.equals(channelUID.getId())) {
77 cmd = CaddxBindingConstants.PANEL_SYSTEM_STATUS_REQUEST;
79 } else if (System.currentTimeMillis() - lastRefreshTime > 2000) {
80 // Refresh only if 2 seconds have passed from the last refresh
81 cmd = CaddxBindingConstants.PANEL_INTERFACE_CONFIGURATION_REQUEST;
87 bridgeHandler.sendCommand(cmd, data);
88 lastRefreshTime = System.currentTimeMillis();
90 logger.debug("Unknown command {}", command);
95 public void caddxEventReceived(CaddxEvent event, Thing thing) {
96 logger.trace("caddxEventReceived(): Event Received - {}.", event);
98 if (getThing().equals(thing)) {
99 CaddxMessage message = event.getCaddxMessage();
100 CaddxMessageType mt = message.getCaddxMessageType();
101 ChannelUID channelUID = null;
103 // Log event messages have special handling
104 if (CaddxMessageType.SYSTEM_STATUS_MESSAGE.equals(mt)) {
105 handleSystemStatusMessage(message);
106 } else if (CaddxMessageType.LOG_EVENT_MESSAGE.equals(mt)) {
107 handleLogEventMessage(message);
109 for (CaddxProperty p : mt.properties) {
110 if (!p.getId().isEmpty()) {
111 String value = message.getPropertyById(p.getId());
112 channelUID = new ChannelUID(getThing().getUID(), p.getId());
113 updateChannel(channelUID, value);
118 updateStatus(ThingStatus.ONLINE);
123 * Gets the pointer into the panel's log messages ring buffer
124 * and sends the command for the retrieval of the last event_message
126 private void handleSystemStatusMessage(CaddxMessage message) {
127 // Get the bridge handler
128 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
129 if (bridgeHandler == null) {
133 String pointer = message.getPropertyById("panel_communicator_stack_pointer");
134 communicatorStackPointer = pointer;
136 // build map of log message channels to event numbers
137 HashMap<String, String> map = new HashMap<String, String>();
138 map.put(pointer, CaddxBindingConstants.PANEL_LOG_MESSAGE_N_0);
139 bridgeHandler.sendCommand(CaddxBindingConstants.PANEL_LOG_EVENT_REQUEST, pointer);
140 panelLogMessagesMap = map;
144 * This function handles the panel log messages.
145 * If the received event_number matches our communication stack pointer then this is the last panel message. The
146 * channel gets updated and the required log message requests are generated for the update of the other log message
149 private void handleLogEventMessage(CaddxMessage message) {
150 // Get the bridge handler
151 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
152 if (bridgeHandler == null) {
156 String eventNumberString = message.getPropertyById("panel_log_event_number");
157 String eventSizeString = message.getPropertyById("panel_log_event_size");
160 LogEventMessage logEventMessage = new LogEventMessage(message);
162 logger.trace("Log_event: {}", logEventMessage);
164 // get the channel id from the map
165 HashMap<String, String> logMap = panelLogMessagesMap;
166 String id = logMap.get(eventNumberString);
167 if (logMap != null && id != null) {
168 ChannelUID channelUID = new ChannelUID(getThing().getUID(), id);
169 updateChannel(channelUID, logEventMessage.toString());
172 if (communicatorStackPointer != null && eventNumberString.equals(communicatorStackPointer)) {
173 HashMap<String, String> map = new HashMap<String, String>();
175 int eventNumber = Integer.parseInt(eventNumberString);
176 int eventSize = Integer.parseInt(eventSizeString);
178 // Retrieve at maximum the 10 last log messages from the panel
179 int messagesToRetrieve = Math.min(eventSize, 10);
180 for (int i = 1; i < messagesToRetrieve; i++) {
182 if (eventNumber < 0) {
183 eventNumber = eventSize;
186 map.put(Integer.toString(eventNumber), "panel_log_message_n_" + i);
187 bridgeHandler.sendCommand(CaddxBindingConstants.PANEL_LOG_EVENT_REQUEST, Integer.toString(eventNumber));
190 communicatorStackPointer = null;
191 panelLogMessagesMap = map;