2 * Copyright (c) 2010-2023 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.amazondashbutton.internal.handler;
15 import static org.openhab.binding.amazondashbutton.internal.AmazonDashButtonBindingConstants.PRESS;
16 import static org.openhab.core.thing.CommonTriggerEvents.PRESSED;
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;
34 * The {@link AmazonDashButtonHandler} is responsible for handling commands, which are
35 * sent to one of the channels.
37 * @author Oliver Libutzki - Initial contribution
39 public class AmazonDashButtonHandler extends BaseThingHandler implements PcapNetworkInterfaceListener {
40 private PacketCapturingService packetCapturingService;
42 private long lastCommandHandled = 0;
44 public AmazonDashButtonHandler(Thing thing) {
49 public void handleCommand(ChannelUID channelUID, Command command) {
50 // There are no commands to be handled
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.");
69 packetCapturingService = new PacketCapturingService(pcapNetworkInterface);
70 boolean capturingStarted = packetCapturingService.startCapturing(new PacketCapturingHandler() {
72 public void packetCaptured(MacAddress macAddress) {
73 long now = System.currentTimeMillis();
74 if (lastCommandHandled + packetInterval < now) {
75 triggerChannel(PRESS, PRESSED);
76 lastCommandHandled = now;
80 if (capturingStarted) {
81 updateStatus(ThingStatus.ONLINE);
83 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE,
84 "The capturing for " + pcapNetworkInterfaceName + " cannot be started.");
90 public void dispose() {
92 if (packetCapturingService != null) {
93 packetCapturingService.stopCapturing();
94 packetCapturingService = null;
96 PcapNetworkInterfaceService.instance().unregisterListener(this);
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);
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.");