]> git.basschouten.com Git - openhab-addons.git/blob
9b20e29db53252800171c04a2f0de419454c3e5b
[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.netatmo.internal.action;
14
15 import java.util.Optional;
16 import java.util.Set;
17 import java.util.stream.Collectors;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.SetpointMode;
22 import org.openhab.binding.netatmo.internal.handler.CommonInterface;
23 import org.openhab.binding.netatmo.internal.handler.capability.EnergyCapability;
24 import org.openhab.core.automation.annotation.ActionInput;
25 import org.openhab.core.automation.annotation.RuleAction;
26 import org.openhab.core.thing.binding.ThingActions;
27 import org.openhab.core.thing.binding.ThingActionsScope;
28 import org.openhab.core.thing.binding.ThingHandler;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * The {@link RoomActions} defines thing actions for RoomHandler.
34  *
35  * @author Markus Dillmann - Initial contribution
36  */
37 @ThingActionsScope(name = "netatmo")
38 @NonNullByDefault
39 public class RoomActions implements ThingActions {
40     private final Logger logger = LoggerFactory.getLogger(RoomActions.class);
41     private static final Set<SetpointMode> ALLOWED_MODES = Set.of(SetpointMode.MAX, SetpointMode.MANUAL,
42             SetpointMode.HOME);
43
44     private @Nullable CommonInterface handler;
45
46     public RoomActions() {
47         logger.debug("Netatmo RoomActions service created");
48     }
49
50     private Optional<EnergyCapability> getEnergyCapability() {
51         CommonInterface localHandler = handler;
52         if (localHandler != null) {
53             return localHandler.getHomeCapability(EnergyCapability.class);
54         }
55         return Optional.empty();
56     }
57
58     @Override
59     public void setThingHandler(@Nullable ThingHandler handler) {
60         if (handler instanceof CommonInterface) {
61             CommonInterface commonHandler = (CommonInterface) handler;
62             this.handler = commonHandler;
63         }
64     }
65
66     @Override
67     public @Nullable ThingHandler getThingHandler() {
68         return (ThingHandler) handler;
69     }
70
71     @RuleAction(label = "@text/actionSetThermRoomTempSetpointLabel", description = "@text/actionSetThermRoomTempSetpointDesc")
72     public void setThermRoomTempSetpoint(
73             @ActionInput(name = "temp", label = "@text/actionInputSetpointLabel", description = "@text/actionInputSetpointDesc") @Nullable Double temp,
74             @ActionInput(name = "endtime", label = "@text/actionInputEndtimeLabel", description = "@text/actionInputEndtimeDesc") @Nullable Long endTime) {
75         CommonInterface roomHandler = handler;
76         if (roomHandler == null) {
77             logger.info("Handler not set for room thing actions.");
78             return;
79         } else if (temp == null) {
80             logger.info("Temperature is required, action ignored");
81             return;
82         } else if (endTime == null) {
83             logger.info("Temperature provided but no endtime given, action ignored");
84             return;
85         }
86         getEnergyCapability()
87                 .ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), temp, endTime, SetpointMode.MANUAL));
88     }
89
90     @RuleAction(label = "@text/actionSetThermRoomModeSetpointLabel", description = "@text/actionSetThermRoomModeSetpointDesc")
91     public void setThermRoomModeSetpoint(
92             @ActionInput(name = "mode", label = "@text/actionInputModeLabel", description = "@text/actionInputModeDesc") @Nullable String mode,
93             @ActionInput(name = "endtime", label = "@text/actionInputEndtimeLabel", description = "@text/actionInputEndtimeDesc") @Nullable Long endTime) {
94         CommonInterface roomHandler = handler;
95         if (roomHandler == null) {
96             logger.info("Handler not set for room thing actions.");
97             return;
98         } else if (mode == null) {
99             logger.info("Mode is required, action ignored");
100             return;
101         }
102
103         SetpointMode targetMode = SetpointMode.UNKNOWN;
104         try {
105             targetMode = SetpointMode.valueOf(mode);
106             if (!ALLOWED_MODES.contains(targetMode)) {
107                 logger.info("Mode can only be {} for a room",
108                         ALLOWED_MODES.stream().map(s -> s.name()).collect(Collectors.joining(", ")));
109                 return;
110             }
111         } catch (IllegalArgumentException e) {
112             logger.info("Invalid mode passed : {} - {}", mode, e.getMessage());
113             return;
114         }
115
116         Long targetEndTime = endTime;
117         if (SetpointMode.HOME.equals(targetMode)) {
118             targetEndTime = 0L;
119         } else if (targetEndTime == null) {
120             logger.info("No endtime given, action ignored");
121             return;
122         }
123
124         long setpointEnd = targetEndTime;
125         SetpointMode setpointMode = targetMode;
126         getEnergyCapability().ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), 0, setpointEnd, setpointMode));
127     }
128
129     public static void setThermRoomTempSetpoint(ThingActions actions, @Nullable Double temp, @Nullable Long endTime) {
130         ((RoomActions) actions).setThermRoomTempSetpoint(temp, endTime);
131     }
132
133     public static void setThermRoomModeSetpoint(ThingActions actions, @Nullable String mode, @Nullable Long endTime) {
134         ((RoomActions) actions).setThermRoomModeSetpoint(mode, endTime);
135     }
136 }