]> git.basschouten.com Git - openhab-addons.git/blob
086b5a687bc91fc2a06b9c8d89e151bf99c1f1c4
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.lutron.internal.radiora.handler;
14
15 import java.util.concurrent.ScheduledFuture;
16 import java.util.concurrent.TimeUnit;
17
18 import org.openhab.binding.lutron.internal.radiora.RS232Connection;
19 import org.openhab.binding.lutron.internal.radiora.RadioRAConnection;
20 import org.openhab.binding.lutron.internal.radiora.RadioRAConnectionException;
21 import org.openhab.binding.lutron.internal.radiora.RadioRAFeedbackListener;
22 import org.openhab.binding.lutron.internal.radiora.config.RS232Config;
23 import org.openhab.binding.lutron.internal.radiora.protocol.RadioRACommand;
24 import org.openhab.binding.lutron.internal.radiora.protocol.RadioRAFeedback;
25 import org.openhab.binding.lutron.internal.radiora.protocol.ZoneMapInquiryCommand;
26 import org.openhab.core.io.transport.serial.SerialPortManager;
27 import org.openhab.core.thing.Bridge;
28 import org.openhab.core.thing.ChannelUID;
29 import org.openhab.core.thing.Thing;
30 import org.openhab.core.thing.ThingStatus;
31 import org.openhab.core.thing.ThingStatusDetail;
32 import org.openhab.core.thing.binding.BaseBridgeHandler;
33 import org.openhab.core.thing.binding.ThingHandler;
34 import org.openhab.core.types.Command;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 /**
39  * The {@link RS232Handler} is responsible for handling commands, which are
40  * sent to one of the channels.
41  *
42  * @author Jeff Lauterbach - Initial contribution
43  */
44 public class RS232Handler extends BaseBridgeHandler implements RadioRAFeedbackListener {
45
46     private Logger logger = LoggerFactory.getLogger(RS232Handler.class);
47
48     private RadioRAConnection connection;
49
50     private ScheduledFuture<?> zoneMapScheduledTask;
51
52     public RS232Handler(Bridge bridge, SerialPortManager serialPortManager) {
53         super(bridge);
54
55         this.connection = new RS232Connection(serialPortManager);
56         this.connection.setListener(this);
57     }
58
59     @Override
60     public void dispose() {
61         if (zoneMapScheduledTask != null) {
62             zoneMapScheduledTask.cancel(true);
63         }
64
65         if (connection != null) {
66             connection.disconnect();
67         }
68     }
69
70     @Override
71     public void initialize() {
72         connectToRS232();
73
74         scheduleZoneMapQuery();
75     }
76
77     protected void connectToRS232() {
78         RS232Config config = getConfigAs(RS232Config.class);
79         String portName = config.getPortName();
80         int baud = config.getBaud();
81
82         logger.debug("Attempting to connect to RS232 on port {}", portName);
83
84         try {
85             connection.open(portName, baud);
86         } catch (RadioRAConnectionException e) {
87             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.HANDLER_INITIALIZING_ERROR, e.getMessage());
88             return;
89         }
90
91         logger.debug("Connected successfully");
92
93         updateStatus(ThingStatus.ONLINE);
94     }
95
96     protected void scheduleZoneMapQuery() {
97         RS232Config config = getConfigAs(RS232Config.class);
98         logger.debug("Scheduling zone map query at {} second inverval", config.getZoneMapQueryInterval());
99
100         Runnable task = () -> sendCommand(new ZoneMapInquiryCommand());
101
102         zoneMapScheduledTask = this.scheduler.scheduleWithFixedDelay(task, 3, config.getZoneMapQueryInterval(),
103                 TimeUnit.SECONDS);
104     }
105
106     public void sendCommand(RadioRACommand command) {
107         connection.write(command.toString());
108     }
109
110     @Override
111     public void handleCommand(ChannelUID channelUID, Command command) {
112     }
113
114     @Override
115     public void handleRadioRAFeedback(RadioRAFeedback feedback) {
116         for (Thing thing : getThing().getThings()) {
117             ThingHandler handler = thing.getHandler();
118             if (handler instanceof LutronHandler) {
119                 ((LutronHandler) handler).handleFeedback(feedback);
120             } else {
121                 logger.debug("Unexpected - Thing {} is not a LutronHandler", thing.getClass());
122             }
123         }
124     }
125 }