2 * Copyright (c) 2010-2022 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.presence;
15 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.toOnOffType;
16 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
18 import java.util.Optional;
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;
30 import io.swagger.client.model.NAWelcomeCamera;
33 * {@link NAPresenceCameraHandler} is the class used to handle Presence camera data
35 * @author Sven Strohschein - Initial contribution
38 public class NAPresenceCameraHandler extends CameraHandler {
40 private static final String FLOODLIGHT_SET_URL_PATH = "/command/floodlight_set_config";
42 private State floodlightAutoModeState = UnDefType.UNDEF;
44 public NAPresenceCameraHandler(final Thing thing, final TimeZoneProvider timeZoneProvider) {
45 super(thing, timeZoneProvider);
49 public void handleCommand(ChannelUID channelUID, Command command) {
50 String channelId = channelUID.getId();
52 case CHANNEL_CAMERA_FLOODLIGHT:
53 if (command == OnOffType.ON) {
54 switchFloodlight(true);
55 } else if (command == OnOffType.OFF) {
56 switchFloodlight(false);
59 case CHANNEL_CAMERA_FLOODLIGHT_AUTO_MODE:
60 if (command == OnOffType.ON) {
61 switchFloodlightAutoMode(true);
62 } else if (command == OnOffType.OFF) {
63 switchFloodlightAutoMode(false);
67 super.handleCommand(channelUID, command);
71 protected State getNAThingProperty(String 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
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();
83 return floodlightAutoModeState;
85 return super.getNAThingProperty(channelId);
88 private State getFloodlightState() {
89 return getModule().map(m -> toOnOffType(m.getLightModeStatus() == NAWelcomeCamera.LightModeStatusEnum.ON))
90 .orElse(UnDefType.UNDEF);
93 private State getFloodlightAutoModeState() {
94 return getModule().map(m -> toOnOffType(m.getLightModeStatus() == NAWelcomeCamera.LightModeStatusEnum.AUTO))
95 .orElse(UnDefType.UNDEF);
98 private void switchFloodlight(boolean isOn) {
100 changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.ON);
102 switchFloodlightAutoMode(floodlightAutoModeState == OnOffType.ON);
106 private void switchFloodlightAutoMode(boolean isAutoMode) {
107 floodlightAutoModeState = toOnOffType(isAutoMode);
109 changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.AUTO);
111 changeFloodlightMode(NAWelcomeCamera.LightModeStatusEnum.OFF);
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()
120 executeGETRequest(url);
122 invalidateParentCacheAndRefresh();