]> git.basschouten.com Git - openhab-addons.git/blob
da92053ef82a3b98f7ae285f91753022a3df7896
[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.plugwise.internal.handler;
14
15 import static org.openhab.binding.plugwise.internal.PlugwiseBindingConstants.CHANNEL_TRIGGERED;
16 import static org.openhab.core.thing.ThingStatus.*;
17
18 import java.time.Duration;
19
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.openhab.binding.plugwise.internal.protocol.AcknowledgementMessage;
22 import org.openhab.binding.plugwise.internal.protocol.AnnounceAwakeRequestMessage;
23 import org.openhab.binding.plugwise.internal.protocol.AnnounceAwakeRequestMessage.AwakeReason;
24 import org.openhab.binding.plugwise.internal.protocol.BroadcastGroupSwitchResponseMessage;
25 import org.openhab.binding.plugwise.internal.protocol.InformationResponseMessage;
26 import org.openhab.binding.plugwise.internal.protocol.Message;
27 import org.openhab.core.library.types.OnOffType;
28 import org.openhab.core.thing.Thing;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * The {@link AbstractPlugwiseThingHandler} handles common Plugwise sleeping end device (SED) channel updates and
34  * commands.
35  *
36  * @author Wouter Born - Initial contribution
37  */
38 @NonNullByDefault
39 public abstract class AbstractSleepingEndDeviceHandler extends AbstractPlugwiseThingHandler {
40
41     private static final int SED_PROPERTIES_COUNT = 3;
42
43     private final Logger logger = LoggerFactory.getLogger(AbstractSleepingEndDeviceHandler.class);
44
45     public AbstractSleepingEndDeviceHandler(Thing thing) {
46         super(thing);
47     }
48
49     protected abstract Duration getWakeupDuration();
50
51     protected void handleAcknowledgement(AcknowledgementMessage message) {
52         updateStatusOnDetailChange();
53     }
54
55     protected void handleAnnounceAwakeRequest(AnnounceAwakeRequestMessage message) {
56         AwakeReason awakeReason = message.getAwakeReason();
57         if (awakeReason == AwakeReason.MAINTENANCE || awakeReason == AwakeReason.WAKEUP_BUTTON
58                 || editProperties().size() < SED_PROPERTIES_COUNT) {
59             updateInformation();
60             if (isConfigurationPending() && !recentlySendConfigurationUpdate()) {
61                 sendConfigurationUpdateCommands();
62             }
63         }
64     }
65
66     protected void handleBroadcastGroupSwitchResponseMessage(BroadcastGroupSwitchResponseMessage message) {
67         updateState(CHANNEL_TRIGGERED, message.getPowerState() ? OnOffType.ON : OnOffType.OFF);
68     }
69
70     protected void handleInformationResponse(InformationResponseMessage message) {
71         updateProperties(message);
72     }
73
74     @Override
75     public void handleReponseMessage(Message message) {
76         updateLastSeen();
77
78         switch (message.getType()) {
79             case ACKNOWLEDGEMENT_V1:
80             case ACKNOWLEDGEMENT_V2:
81                 handleAcknowledgement((AcknowledgementMessage) message);
82                 break;
83             case ANNOUNCE_AWAKE_REQUEST:
84                 handleAnnounceAwakeRequest((AnnounceAwakeRequestMessage) message);
85                 break;
86             case BROADCAST_GROUP_SWITCH_RESPONSE:
87                 handleBroadcastGroupSwitchResponseMessage((BroadcastGroupSwitchResponseMessage) message);
88                 break;
89             case DEVICE_INFORMATION_RESPONSE:
90                 handleInformationResponse((InformationResponseMessage) message);
91                 break;
92             default:
93                 logger.trace("Received unhandled {} message from {} ({})", message.getType(), getDeviceType(),
94                         getMACAddress());
95                 break;
96         }
97     }
98
99     @Override
100     protected boolean shouldOnlineTaskBeScheduled() {
101         return thing.getStatus() == ONLINE;
102     }
103
104     @Override
105     protected void updateOnlineState() {
106         if (thing.getStatus() == ONLINE && getWakeupDuration().minus(durationSinceLastSeen()).isNegative()) {
107             updateStatus(OFFLINE, getThingStatusDetail());
108         }
109     }
110 }