]> git.basschouten.com Git - openhab-addons.git/blob
7475e97af8b75a90c255ab1a4415382dbaf7e8bb
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.presence;
14
15 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.toOnOffType;
16 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
17
18 import java.util.Optional;
19
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.openhab.binding.netatmo.internal.camera.CameraHandler;
22 import org.openhab.core.i18n.TimeZoneProvider;
23 import org.openhab.core.library.types.OnOffType;
24 import org.openhab.core.thing.ChannelUID;
25 import org.openhab.core.thing.Thing;
26 import org.openhab.core.types.Command;
27 import org.openhab.core.types.State;
28 import org.openhab.core.types.UnDefType;
29
30 import io.swagger.client.model.NAWelcomeCamera;
31
32 /**
33  * {@link NAPresenceCameraHandler} is the class used to handle Presence camera data
34  *
35  * @author Sven Strohschein - Initial contribution
36  */
37 @NonNullByDefault
38 public class NAPresenceCameraHandler extends CameraHandler {
39
40     private static final String FLOODLIGHT_SET_URL_PATH = "/command/floodlight_set_config";
41
42     private State floodlightAutoModeState = UnDefType.UNDEF;
43
44     public NAPresenceCameraHandler(final Thing thing, final TimeZoneProvider timeZoneProvider) {
45         super(thing, timeZoneProvider);
46     }
47
48     @Override
49     public void handleCommand(ChannelUID channelUID, Command command) {
50         String channelId = channelUID.getId();
51         switch (channelId) {
52             case CHANNEL_CAMERA_FLOODLIGHT:
53                 if (command == OnOffType.ON) {
54                     switchFloodlight(true);
55                 } else if (command == OnOffType.OFF) {
56                     switchFloodlight(false);
57                 }
58                 break;
59             case CHANNEL_CAMERA_FLOODLIGHT_AUTO_MODE:
60                 if (command == OnOffType.ON) {
61                     switchFloodlightAutoMode(true);
62                 } else if (command == OnOffType.OFF) {
63                     switchFloodlightAutoMode(false);
64                 }
65                 break;
66         }
67         super.handleCommand(channelUID, command);
68     }
69
70     @Override
71     protected State getNAThingProperty(String channelId) {
72         switch (channelId) {
73             case CHANNEL_CAMERA_FLOODLIGHT:
74                 return getFloodlightState();
75             case CHANNEL_CAMERA_FLOODLIGHT_AUTO_MODE:
76                 // The auto-mode state shouldn't be updated, because this isn't a dedicated information. When the
77                 // floodlight is switched on the state within the Netatmo API is "on" and the information if the
78                 // previous
79                 // state was "auto" instead of "off" is lost... Therefore the binding handles its own auto-mode state.
80                 if (floodlightAutoModeState == UnDefType.UNDEF) {
81                     floodlightAutoModeState = getFloodlightAutoModeState();
82                 }
83                 return floodlightAutoModeState;
84         }
85         return super.getNAThingProperty(channelId);
86     }
87
88     private State getFloodlightState() {
89         return getModule().map(m -> toOnOffType(m.getLightModeStatus() == NAWelcomeCamera.LightModeStatusEnum.ON))
90                 .orElse(UnDefType.UNDEF);
91     }
92
93     private State getFloodlightAutoModeState() {
94         return getModule().map(m -> toOnOffType(m.getLightModeStatus() == NAWelcomeCamera.LightModeStatusEnum.AUTO))
95                 .orElse(UnDefType.UNDEF);
96     }
97
98     private void switchFloodlight(boolean isOn) {
99         if (isOn) {
100             changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.ON);
101         } else {
102             switchFloodlightAutoMode(floodlightAutoModeState == OnOffType.ON);
103         }
104     }
105
106     private void switchFloodlightAutoMode(boolean isAutoMode) {
107         floodlightAutoModeState = toOnOffType(isAutoMode);
108         if (isAutoMode) {
109             changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.AUTO);
110         } else {
111             changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.OFF);
112         }
113     }
114
115     private void changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum mode) {
116         Optional<String> localCameraURL = getLocalCameraURL();
117         if (localCameraURL.isPresent()) {
118             String url = localCameraURL.get() + FLOODLIGHT_SET_URL_PATH + "?config=%7B%22mode%22:%22" + mode.toString()
119                     + "%22%7D";
120             executeGETRequest(url);
121
122             invalidateParentCacheAndRefresh();
123         }
124     }
125 }