2 * Copyright (c) 2010-2024 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.lgwebos.internal;
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 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.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;
37 * Handles TV Control Channel Command.
38 * Allows to set a channel to an absolute channel number.
40 * @author Sebastian Prehn - Initial contribution
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();
49 public void onDeviceReady(String channelId, LGWebOSHandler handler) {
50 super.onDeviceReady(channelId, handler);
51 handler.getSocket().getChannelList(new ResponseListener<List<ChannelInfo>>() {
53 public void onError(@Nullable String error) {
54 logger.warn("error requesting channel list: {}.", error);
59 public void onSuccess(List<ChannelInfo> channels) {
60 if (logger.isDebugEnabled()) {
61 channels.forEach(c -> logger.debug("Channel {} - {}", c.getChannelNumber(), c.getName()));
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));
69 handler.setOptions(channelId, options);
75 public void onDeviceRemoved(String channelId, LGWebOSHandler handler) {
76 super.onDeviceRemoved(channelId, handler);
77 channelListCache.remove(handler.getThing().getUID());
81 public void onReceiveCommand(String channelId, LGWebOSHandler handler, Command command) {
82 if (RefreshType.REFRESH == command) {
83 handler.getSocket().getCurrentChannel(createResponseListener(channelId, handler));
87 final String value = command.toString();
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());
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);
99 logger.info("TV does not have a channel: {}.", value);
105 protected Optional<ServiceSubscription<ChannelInfo>> getSubscription(String channelId, LGWebOSHandler handler) {
106 return Optional.of(handler.getSocket().subscribeCurrentChannel(createResponseListener(channelId, handler)));
109 private ResponseListener<ChannelInfo> createResponseListener(String channelId, LGWebOSHandler handler) {
110 return new ResponseListener<ChannelInfo>() {
113 public void onError(@Nullable String error) {
114 logger.debug("Error in retrieving channel: {}.", error);
118 public void onSuccess(@Nullable ChannelInfo channelInfo) {
119 if (channelInfo == null) {
122 handler.postUpdate(channelId, new StringType(channelInfo.getId()));
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);