]> git.basschouten.com Git - openhab-addons.git/blob
80e0c0fbfd4e8c43f865da6a2cbcc17099f0cf2f
[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.handler.capability;
14
15 import java.util.Collection;
16 import java.util.List;
17
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.netatmo.internal.api.NetatmoException;
21 import org.openhab.binding.netatmo.internal.api.SecurityApi;
22 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FloodLightMode;
23 import org.openhab.binding.netatmo.internal.api.dto.HomeData;
24 import org.openhab.binding.netatmo.internal.api.dto.HomeDataModule;
25 import org.openhab.binding.netatmo.internal.api.dto.HomeDataPerson;
26 import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
27 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
28 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusPerson;
29 import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
30 import org.openhab.binding.netatmo.internal.deserialization.NAObjectMap;
31 import org.openhab.binding.netatmo.internal.handler.CommonInterface;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * The {@link SecurityCapability} is the base class for handler able to handle security features
37  *
38  * @author GaĆ«l L'hopital - Initial contribution
39  *
40  */
41 @NonNullByDefault
42 class SecurityCapability extends RestCapability<SecurityApi> {
43     private final Logger logger = LoggerFactory.getLogger(SecurityCapability.class);
44
45     SecurityCapability(CommonInterface handler) {
46         super(handler, SecurityApi.class);
47     }
48
49     @Override
50     protected void updateHomeData(HomeData homeData) {
51         NAObjectMap<HomeDataPerson> persons = homeData.getPersons();
52         NAObjectMap<HomeDataModule> modules = homeData.getModules();
53         handler.getActiveChildren().forEach(childHandler -> {
54             String childId = childHandler.getId();
55             persons.getOpt(childId).ifPresentOrElse(person -> {
56                 person.setIgnoredForThingUpdate(true);
57                 childHandler.setNewData(person);
58             }, () -> {
59                 modules.getOpt(childId).ifPresent(module -> {
60                     module.setIgnoredForThingUpdate(true);
61                     childHandler.setNewData(module);
62                 });
63             });
64         });
65     }
66
67     @Override
68     protected void updateHomeStatus(HomeStatus homeStatus) {
69         NAObjectMap<HomeStatusPerson> persons = homeStatus.getPersons();
70         NAObjectMap<HomeStatusModule> modules = homeStatus.getModules();
71         handler.getActiveChildren().forEach(childHandler -> {
72             String childId = childHandler.getId();
73             persons.getOpt(childId).ifPresentOrElse(person -> childHandler.setNewData(person), () -> {
74                 modules.getOpt(childId).ifPresentOrElse(module -> childHandler.setNewData(module), () -> {
75                     // This module is not present in the homestatus data, so it is considered as unreachable
76                     HomeStatusModule module = new HomeStatusModule();
77                     module.setReachable(false);
78                     childHandler.setNewData(module);
79                 });
80             });
81         });
82     }
83
84     @Override
85     protected void updateHomeEvent(HomeEvent homeEvent) {
86         String personId = homeEvent.getPersonId();
87         if (personId != null) {
88             handler.getActiveChildren().stream().filter(handler -> personId.equals(handler.getId())).findFirst()
89                     .ifPresent(handler -> {
90                         homeEvent.setIgnoredForThingUpdate(true);
91                         handler.setNewData(homeEvent);
92                     });
93         }
94         String cameraId = homeEvent.getCameraId();
95         handler.getActiveChildren().stream().filter(handler -> cameraId.equals(handler.getId())).findFirst()
96                 .ifPresent(handler -> {
97                     homeEvent.setIgnoredForThingUpdate(true);
98                     handler.setNewData(homeEvent);
99                 });
100     }
101
102     public Collection<HomeEvent> getCameraEvents(String cameraId) {
103         return getApi().map(api -> {
104             try {
105                 return api.getCameraEvents(handler.getId(), cameraId);
106             } catch (NetatmoException e) {
107                 logger.warn("Error retrieving last events of camera '{}' : {}", cameraId, e.getMessage());
108                 return null;
109             }
110         }).orElse(List.of());
111     }
112
113     public Collection<HomeEvent> getPersonEvents(String personId) {
114         return getApi().map(api -> {
115             try {
116                 return api.getPersonEvents(handler.getId(), personId);
117             } catch (NetatmoException e) {
118                 logger.warn("Error retrieving last events of person '{}' : {}", personId, e.getMessage());
119                 return null;
120             }
121         }).orElse(List.of());
122     }
123
124     public void setPersonAway(String personId, boolean away) {
125         getApi().ifPresent(api -> {
126             try {
127                 api.setPersonAwayStatus(handler.getId(), personId, away);
128                 handler.expireData();
129             } catch (NetatmoException e) {
130                 logger.warn("Error setting person away/at home '{}' : {}", personId, e.getMessage());
131             }
132         });
133     }
134
135     public @Nullable String ping(String vpnUrl) {
136         return getApi().map(api -> {
137             try {
138                 return api.ping(vpnUrl);
139             } catch (NetatmoException e) {
140                 logger.warn("Error pinging camera '{}' : {}", vpnUrl, e.getMessage());
141                 return null;
142             }
143         }).orElse(null);
144     }
145
146     public void changeStatus(@Nullable String localURL, boolean status) {
147         if (localURL == null) {
148             logger.info("Monitoring changes can only be done on local camera.");
149             return;
150         }
151         getApi().ifPresent(api -> {
152             try {
153                 api.changeStatus(localURL, status);
154                 handler.expireData();
155             } catch (NetatmoException e) {
156                 logger.warn("Error changing camera monitoring status '{}' : {}", status, e.getMessage());
157             }
158         });
159     }
160
161     public void changeFloodlightMode(@Nullable String localURL, FloodLightMode mode) {
162         if (localURL == null) {
163             logger.info("Changing floodlight mode can only be done on local camera.");
164             return;
165         }
166         getApi().ifPresent(api -> {
167             try {
168                 api.changeFloodLightMode(localURL, mode);
169                 handler.expireData();
170             } catch (NetatmoException e) {
171                 logger.warn("Error changing Presence floodlight mode '{}' : {}", mode, e.getMessage());
172             }
173         });
174     }
175 }