2 * Copyright (c) 2010-2021 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.APIUtils.*;
16 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.*;
17 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
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 nonNullList(eventResponse.getBody().getEventsList()).forEach(event -> {
62 if (event.getPersonId() != null && event.getPersonId().equalsIgnoreCase(getId())
63 && (lastEvent == null || lastEvent.getTime() < event.getTime())) {
69 setRefreshRequired(false);
71 super.updateChannels(module);
75 protected State getNAThingProperty(String channelId) {
76 Optional<NAWelcomeEvent> lastEvt = getLastEvent();
79 case CHANNEL_WELCOME_PERSON_LASTSEEN:
80 return getModule().map(m -> toDateTimeType(m.getLastSeen(), timeZoneProvider.getTimeZone()))
81 .orElse(UnDefType.UNDEF);
82 case CHANNEL_WELCOME_PERSON_ATHOME:
83 return getModule().map(m -> m.isOutOfSight() != null ? toOnOffType(!m.isOutOfSight()) : UnDefType.UNDEF)
84 .orElse(UnDefType.UNDEF);
85 case CHANNEL_WELCOME_PERSON_AVATAR_URL:
86 return toStringType(getAvatarURL());
87 case CHANNEL_WELCOME_PERSON_AVATAR:
89 return url != null ? toRawType(url) : UnDefType.UNDEF;
90 case CHANNEL_WELCOME_PERSON_LASTMESSAGE:
91 return (lastEvt.isPresent() && lastEvt.get().getMessage() != null)
92 ? toStringType(lastEvt.get().getMessage().replace("<b>", "").replace("</b>", ""))
94 case CHANNEL_WELCOME_PERSON_LASTTIME:
95 return lastEvt.isPresent() ? toDateTimeType(lastEvt.get().getTime(), timeZoneProvider.getTimeZone())
97 case CHANNEL_WELCOME_PERSON_LASTEVENT:
98 url = getLastEventURL();
99 return url != null ? toRawType(url) : UnDefType.UNDEF;
100 case CHANNEL_WELCOME_PERSON_LASTEVENT_URL:
101 return getLastEventURL() != null ? toStringType(getLastEventURL()) : UnDefType.UNDEF;
103 return super.getNAThingProperty(channelId);
106 private @Nullable String getLastEventURL() {
107 Optional<NetatmoBridgeHandler> handler = getBridgeHandler();
108 Optional<NAWelcomeEvent> lastEvt = getLastEvent();
109 if (handler.isPresent() && lastEvt.isPresent() && lastEvt.get().getSnapshot() != null) {
110 return handler.get().getPictureUrl(lastEvt.get().getSnapshot().getId(),
111 lastEvt.get().getSnapshot().getKey());
116 private @Nullable String getAvatarURL() {
117 Optional<NetatmoBridgeHandler> handler = getBridgeHandler();
118 Optional<NAWelcomePerson> person = getModule();
119 if (handler.isPresent() && avatarURL == null && person.isPresent()) {
120 NAWelcomeFace face = person.get().getFace();
122 avatarURL = handler.get().getPictureUrl(face.getId(), face.getKey());
129 public void handleCommand(ChannelUID channelUID, Command command) {
130 super.handleCommand(channelUID, command);
131 if ((command instanceof OnOffType) && (CHANNEL_WELCOME_PERSON_ATHOME.equalsIgnoreCase(channelUID.getId()))) {
132 getApi().ifPresent(api -> {
133 if ((OnOffType) command == OnOffType.OFF) {
134 api.setpersonsaway(getParentId(), getId());
136 api.setpersonshome(getParentId(), "[\"" + getId() + "\"]");
138 invalidateParentCacheAndRefresh();
143 private Optional<WelcomeApi> getApi() {
144 return getBridgeHandler().flatMap(handler -> handler.getWelcomeApi());
147 private Optional<NAWelcomeEvent> getLastEvent() {
148 NAWelcomeEvent evt = lastEvent;
149 return evt != null ? Optional.of(evt) : Optional.empty();