]> git.basschouten.com Git - openhab-addons.git/blob
a24e7fc31abd40246c968f4e3ce622de03e70d8c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.lgwebos.internal;
14
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Optional;
20
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.openhab.binding.lgwebos.internal.handler.LGWebOSHandler;
24 import org.openhab.binding.lgwebos.internal.handler.command.ServiceSubscription;
25 import org.openhab.binding.lgwebos.internal.handler.core.ChannelInfo;
26 import org.openhab.binding.lgwebos.internal.handler.core.CommandConfirmation;
27 import org.openhab.binding.lgwebos.internal.handler.core.ResponseListener;
28 import org.openhab.core.library.types.StringType;
29 import org.openhab.core.thing.ThingUID;
30 import org.openhab.core.types.Command;
31 import org.openhab.core.types.RefreshType;
32 import org.openhab.core.types.StateOption;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 /**
37  * Handles TV Control Channel Command.
38  * Allows to set a channel to an absolute channel number.
39  *
40  * @author Sebastian Prehn - Initial contribution
41  */
42 @NonNullByDefault
43 public class TVControlChannel extends BaseChannelHandler<ChannelInfo> {
44     private final Logger logger = LoggerFactory.getLogger(TVControlChannel.class);
45     private final Map<ThingUID, List<ChannelInfo>> channelListCache = new HashMap<>();
46     private final ResponseListener<CommandConfirmation> objResponseListener = createResponseListener();
47
48     @Override
49     public void onDeviceReady(String channelId, LGWebOSHandler handler) {
50         super.onDeviceReady(channelId, handler);
51         handler.getSocket().getChannelList(new ResponseListener<List<ChannelInfo>>() {
52             @Override
53             public void onError(@Nullable String error) {
54                 logger.warn("error requesting channel list: {}.", error);
55             }
56
57             @Override
58             @NonNullByDefault({})
59             public void onSuccess(List<ChannelInfo> channels) {
60                 if (logger.isDebugEnabled()) {
61                     channels.forEach(c -> logger.debug("Channel {} - {}", c.getChannelNumber(), c.getName()));
62                 }
63                 channelListCache.put(handler.getThing().getUID(), channels);
64                 List<StateOption> options = new ArrayList<>();
65                 for (ChannelInfo channel : channels) {
66                     String name = channel.getName() == null ? "" : channel.getName();
67                     options.add(new StateOption(channel.getId(), channel.getChannelNumber() + " - " + name));
68                 }
69                 handler.setOptions(channelId, options);
70             }
71         });
72     }
73
74     @Override
75     public void onDeviceRemoved(String channelId, LGWebOSHandler handler) {
76         super.onDeviceRemoved(channelId, handler);
77         channelListCache.remove(handler.getThing().getUID());
78     }
79
80     @Override
81     public void onReceiveCommand(String channelId, LGWebOSHandler handler, Command command) {
82         if (RefreshType.REFRESH == command) {
83             handler.getSocket().getCurrentChannel(createResponseListener(channelId, handler));
84             return;
85         }
86
87         final String value = command.toString();
88
89         List<ChannelInfo> channels = channelListCache.get(handler.getThing().getUID());
90         if (channels == null) {
91             logger.warn("No channel list cached for this device {}, ignoring command.",
92                     handler.getThing().getUID().toString());
93         } else {
94             Optional<ChannelInfo> channelInfo = channels.stream()
95                     .filter(c -> c.getId().equals(value) || c.getChannelNumber().equals(value)).findFirst();
96             if (channelInfo.isPresent()) {
97                 handler.getSocket().setChannel(channelInfo.get(), objResponseListener);
98             } else {
99                 logger.info("TV does not have a channel: {}.", value);
100             }
101         }
102     }
103
104     @Override
105     protected Optional<ServiceSubscription<ChannelInfo>> getSubscription(String channelId, LGWebOSHandler handler) {
106         return Optional.of(handler.getSocket().subscribeCurrentChannel(createResponseListener(channelId, handler)));
107     }
108
109     private ResponseListener<ChannelInfo> createResponseListener(String channelId, LGWebOSHandler handler) {
110         return new ResponseListener<ChannelInfo>() {
111
112             @Override
113             public void onError(@Nullable String error) {
114                 logger.debug("Error in retrieving channel: {}.", error);
115             }
116
117             @Override
118             public void onSuccess(@Nullable ChannelInfo channelInfo) {
119                 if (channelInfo == null) {
120                     return;
121                 }
122                 handler.postUpdate(channelId, new StringType(channelInfo.getId()));
123             }
124         };
125     }
126
127     public List<String> reportChannels(ThingUID thingUID) {
128         List<String> report = new ArrayList<>();
129         List<ChannelInfo> channels = channelListCache.get(thingUID);
130         if (channels != null) {
131             for (ChannelInfo channel : channels) {
132                 String name = channel.getName() == null ? "" : channel.getName();
133                 report.add(channel.getId() + " : " + channel.getChannelNumber() + " - " + name);
134             }
135         }
136         return report;
137     }
138 }