]> git.basschouten.com Git - openhab-addons.git/blob
810d608acbd4e341979182ac030396f9864be488
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.amazondashbutton.internal.handler;
14
15 import static org.openhab.binding.amazondashbutton.internal.AmazonDashButtonBindingConstants.PRESS;
16 import static org.openhab.core.thing.CommonTriggerEvents.PRESSED;
17
18 import org.openhab.binding.amazondashbutton.internal.capturing.PacketCapturingHandler;
19 import org.openhab.binding.amazondashbutton.internal.capturing.PacketCapturingService;
20 import org.openhab.binding.amazondashbutton.internal.config.AmazonDashButtonConfig;
21 import org.openhab.binding.amazondashbutton.internal.pcap.PcapNetworkInterfaceListener;
22 import org.openhab.binding.amazondashbutton.internal.pcap.PcapNetworkInterfaceService;
23 import org.openhab.binding.amazondashbutton.internal.pcap.PcapNetworkInterfaceWrapper;
24 import org.openhab.binding.amazondashbutton.internal.pcap.PcapUtil;
25 import org.openhab.core.thing.ChannelUID;
26 import org.openhab.core.thing.Thing;
27 import org.openhab.core.thing.ThingStatus;
28 import org.openhab.core.thing.ThingStatusDetail;
29 import org.openhab.core.thing.binding.BaseThingHandler;
30 import org.openhab.core.types.Command;
31 import org.pcap4j.util.MacAddress;
32
33 /**
34  * The {@link AmazonDashButtonHandler} is responsible for handling commands, which are
35  * sent to one of the channels.
36  *
37  * @author Oliver Libutzki - Initial contribution
38  */
39 public class AmazonDashButtonHandler extends BaseThingHandler implements PcapNetworkInterfaceListener {
40     private PacketCapturingService packetCapturingService;
41
42     private long lastCommandHandled = 0;
43
44     public AmazonDashButtonHandler(Thing thing) {
45         super(thing);
46     }
47
48     @Override
49     public void handleCommand(ChannelUID channelUID, Command command) {
50         // There are no commands to be handled
51     }
52
53     @Override
54     public void initialize() {
55         PcapNetworkInterfaceService.instance().registerListener(this);
56         AmazonDashButtonConfig dashButtonConfig = getConfigAs(AmazonDashButtonConfig.class);
57         final String pcapNetworkInterfaceName = dashButtonConfig.pcapNetworkInterfaceName;
58         final String macAddress = dashButtonConfig.macAddress;
59         final Integer packetInterval = dashButtonConfig.packetInterval;
60         scheduler.submit(() -> {
61             PcapNetworkInterfaceWrapper pcapNetworkInterface = PcapUtil
62                     .getNetworkInterfaceByName(pcapNetworkInterfaceName);
63             if (pcapNetworkInterface == null) {
64                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.HANDLER_INITIALIZING_ERROR,
65                         "The networkinterface " + pcapNetworkInterfaceName + " is not present.");
66                 return;
67             }
68
69             packetCapturingService = new PacketCapturingService(pcapNetworkInterface);
70             boolean capturingStarted = packetCapturingService.startCapturing(new PacketCapturingHandler() {
71                 @Override
72                 public void packetCaptured(MacAddress macAddress) {
73                     long now = System.currentTimeMillis();
74                     if (lastCommandHandled + packetInterval < now) {
75                         triggerChannel(PRESS, PRESSED);
76                         lastCommandHandled = now;
77                     }
78                 }
79             }, macAddress);
80             if (capturingStarted) {
81                 updateStatus(ThingStatus.ONLINE);
82             } else {
83                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE,
84                         "The capturing for " + pcapNetworkInterfaceName + " cannot be started.");
85             }
86         });
87     }
88
89     @Override
90     public void dispose() {
91         super.dispose();
92         if (packetCapturingService != null) {
93             packetCapturingService.stopCapturing();
94             packetCapturingService = null;
95         }
96         PcapNetworkInterfaceService.instance().unregisterListener(this);
97     }
98
99     @Override
100     public void onPcapNetworkInterfaceAdded(PcapNetworkInterfaceWrapper newNetworkInterface) {
101         if (packetCapturingService != null) {
102             final PcapNetworkInterfaceWrapper trackedPcapNetworkInterface = packetCapturingService
103                     .getPcapNetworkInterface();
104             if (trackedPcapNetworkInterface.equals(newNetworkInterface)) {
105                 updateStatus(ThingStatus.ONLINE);
106             }
107         }
108     }
109
110     @Override
111     public void onPcapNetworkInterfaceRemoved(PcapNetworkInterfaceWrapper removedNetworkInterface) {
112         if (packetCapturingService != null) {
113             final PcapNetworkInterfaceWrapper trackedPcapNetworkInterface = packetCapturingService
114                     .getPcapNetworkInterface();
115             if (trackedPcapNetworkInterface.equals(removedNetworkInterface)) {
116                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE,
117                         "The networkinterface " + removedNetworkInterface.getName() + " is not present anymore.");
118             }
119         }
120     }
121 }