2 * Copyright (c) 2010-2020 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.welcome;
15 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.*;
16 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
18 import java.util.List;
19 import java.util.Optional;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.openhab.binding.netatmo.internal.handler.NetatmoBridgeHandler;
24 import org.openhab.binding.netatmo.internal.handler.NetatmoModuleHandler;
25 import org.openhab.core.i18n.TimeZoneProvider;
26 import org.openhab.core.library.types.OnOffType;
27 import org.openhab.core.thing.ChannelUID;
28 import org.openhab.core.thing.Thing;
29 import org.openhab.core.types.Command;
30 import org.openhab.core.types.State;
31 import org.openhab.core.types.UnDefType;
33 import io.swagger.client.api.WelcomeApi;
34 import io.swagger.client.model.NAWelcomeEvent;
35 import io.swagger.client.model.NAWelcomeEventResponse;
36 import io.swagger.client.model.NAWelcomeFace;
37 import io.swagger.client.model.NAWelcomePerson;
40 * {@link NAWelcomePersonHandler} is the class used to handle the Welcome Home Data
42 * @author Ing. Peter Weiss - Initial contribution
46 public class NAWelcomePersonHandler extends NetatmoModuleHandler<NAWelcomePerson> {
47 private @Nullable String avatarURL;
48 private @Nullable NAWelcomeEvent lastEvent;
50 public NAWelcomePersonHandler(Thing thing, final TimeZoneProvider timeZoneProvider) {
51 super(thing, timeZoneProvider);
55 public void updateChannels(Object module) {
56 if (isRefreshRequired()) {
57 getApi().ifPresent(api -> {
58 NAWelcomeEventResponse eventResponse = api.getlasteventof(getParentId(), getId(), 10);
60 // Search the last event for this person
61 List<NAWelcomeEvent> rawEventList = eventResponse.getBody().getEventsList();
62 rawEventList.forEach(event -> {
63 if (event.getPersonId() != null && event.getPersonId().equalsIgnoreCase(getId())
64 && (lastEvent == null || lastEvent.getTime() < event.getTime())) {
70 setRefreshRequired(false);
72 super.updateChannels(module);
76 protected State getNAThingProperty(String channelId) {
77 Optional<NAWelcomeEvent> lastEvt = getLastEvent();
80 case CHANNEL_WELCOME_PERSON_LASTSEEN:
81 return getModule().map(m -> toDateTimeType(m.getLastSeen(), timeZoneProvider.getTimeZone()))
82 .orElse(UnDefType.UNDEF);
83 case CHANNEL_WELCOME_PERSON_ATHOME:
85 .map(m -> m.getOutOfSight() != null ? toOnOffType(!m.getOutOfSight()) : UnDefType.UNDEF)
86 .orElse(UnDefType.UNDEF);
87 case CHANNEL_WELCOME_PERSON_AVATAR_URL:
88 return toStringType(getAvatarURL());
89 case CHANNEL_WELCOME_PERSON_AVATAR:
91 return url != null ? toRawType(url) : UnDefType.UNDEF;
92 case CHANNEL_WELCOME_PERSON_LASTMESSAGE:
93 return (lastEvt.isPresent() && lastEvt.get().getMessage() != null)
94 ? toStringType(lastEvt.get().getMessage().replace("<b>", "").replace("</b>", ""))
96 case CHANNEL_WELCOME_PERSON_LASTTIME:
97 return lastEvt.isPresent() ? toDateTimeType(lastEvt.get().getTime(), timeZoneProvider.getTimeZone())
99 case CHANNEL_WELCOME_PERSON_LASTEVENT:
100 url = getLastEventURL();
101 return url != null ? toRawType(url) : UnDefType.UNDEF;
102 case CHANNEL_WELCOME_PERSON_LASTEVENT_URL:
103 return getLastEventURL() != null ? toStringType(getLastEventURL()) : UnDefType.UNDEF;
105 return super.getNAThingProperty(channelId);
108 private @Nullable String getLastEventURL() {
109 Optional<NetatmoBridgeHandler> handler = getBridgeHandler();
110 Optional<NAWelcomeEvent> lastEvt = getLastEvent();
111 if (handler.isPresent() && lastEvt.isPresent() && lastEvt.get().getSnapshot() != null) {
112 return handler.get().getPictureUrl(lastEvt.get().getSnapshot().getId(),
113 lastEvt.get().getSnapshot().getKey());
118 private @Nullable String getAvatarURL() {
119 Optional<NetatmoBridgeHandler> handler = getBridgeHandler();
120 Optional<NAWelcomePerson> person = getModule();
121 if (handler.isPresent() && avatarURL == null && person.isPresent()) {
122 NAWelcomeFace face = person.get().getFace();
124 avatarURL = handler.get().getPictureUrl(face.getId(), face.getKey());
131 public void handleCommand(ChannelUID channelUID, Command command) {
132 super.handleCommand(channelUID, command);
133 if ((command instanceof OnOffType) && (CHANNEL_WELCOME_PERSON_ATHOME.equalsIgnoreCase(channelUID.getId()))) {
134 getApi().ifPresent(api -> {
135 if ((OnOffType) command == OnOffType.OFF) {
136 api.setpersonsaway(getParentId(), getId());
138 api.setpersonshome(getParentId(), "[\"" + getId() + "\"]");
140 invalidateParentCacheAndRefresh();
145 private Optional<WelcomeApi> getApi() {
146 return getBridgeHandler().flatMap(handler -> handler.getWelcomeApi());
149 private Optional<NAWelcomeEvent> getLastEvent() {
150 NAWelcomeEvent evt = lastEvent;
151 return evt != null ? Optional.of(evt) : Optional.empty();