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.netatmo.internal.action;
15 import java.util.Optional;
17 import java.util.stream.Collectors;
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;
33 * The {@link RoomActions} defines thing actions for RoomHandler.
35 * @author Markus Dillmann - Initial contribution
37 @ThingActionsScope(name = "netatmo")
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,
44 private @Nullable CommonInterface handler;
46 public RoomActions() {
47 logger.debug("Netatmo RoomActions service created");
50 private Optional<EnergyCapability> getEnergyCapability() {
51 CommonInterface localHandler = handler;
52 if (localHandler != null) {
53 return localHandler.getHomeCapability(EnergyCapability.class);
55 return Optional.empty();
59 public void setThingHandler(@Nullable ThingHandler handler) {
60 if (handler instanceof CommonInterface) {
61 CommonInterface commonHandler = (CommonInterface) handler;
62 this.handler = commonHandler;
67 public @Nullable ThingHandler getThingHandler() {
68 return (ThingHandler) handler;
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.");
79 } else if (temp == null) {
80 logger.info("Temperature is required, action ignored");
82 } else if (endTime == null) {
83 logger.info("Temperature provided but no endtime given, action ignored");
87 .ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), SetpointMode.MANUAL, endTime, temp));
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.");
98 } else if (mode == null) {
99 logger.info("Mode is required, action ignored");
103 SetpointMode targetMode = SetpointMode.UNKNOWN;
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(", ")));
111 } catch (IllegalArgumentException e) {
112 logger.info("Invalid mode passed : {} - {}", mode, e.getMessage());
116 Long targetEndTime = endTime;
117 if (SetpointMode.HOME.equals(targetMode)) {
119 } else if (targetEndTime == null) {
120 logger.info("No endtime given, action ignored");
124 long setpointEnd = targetEndTime;
125 SetpointMode setpointMode = targetMode;
126 getEnergyCapability().ifPresent(cap -> cap.setRoomThermTemp(roomHandler.getId(), setpointMode, setpointEnd, 0));
129 public static void setThermRoomTempSetpoint(ThingActions actions, @Nullable Double temp, @Nullable Long endTime) {
130 ((RoomActions) actions).setThermRoomTempSetpoint(temp, endTime);
133 public static void setThermRoomModeSetpoint(ThingActions actions, @Nullable String mode, @Nullable Long endTime) {
134 ((RoomActions) actions).setThermRoomModeSetpoint(mode, endTime);