]> git.basschouten.com Git - openhab-addons.git/blob
80858941be14c865383d2cba9728e8b5e83cf039
[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.minecraft.internal.handler;
14
15 import org.openhab.binding.minecraft.internal.MinecraftBindingConstants;
16 import org.openhab.binding.minecraft.internal.config.SignConfig;
17 import org.openhab.binding.minecraft.internal.message.OHMessage;
18 import org.openhab.binding.minecraft.internal.message.data.SignData;
19 import org.openhab.binding.minecraft.internal.message.data.commands.SignCommandData;
20 import org.openhab.core.library.types.OnOffType;
21 import org.openhab.core.thing.Bridge;
22 import org.openhab.core.thing.ChannelUID;
23 import org.openhab.core.thing.Thing;
24 import org.openhab.core.thing.ThingStatus;
25 import org.openhab.core.thing.ThingStatusDetail;
26 import org.openhab.core.thing.binding.BaseThingHandler;
27 import org.openhab.core.thing.binding.ThingHandler;
28 import org.openhab.core.types.Command;
29 import org.openhab.core.types.State;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 import com.google.gson.Gson;
34 import com.google.gson.GsonBuilder;
35 import com.google.gson.JsonElement;
36
37 import rx.Observable;
38 import rx.Subscription;
39
40 /**
41  * The {@link MinecraftSignHandler} is responsible for handling commands, which are
42  * sent to one of the channels.
43  *
44  * @author Mattias Markehed - Initial contribution
45  */
46 public class MinecraftSignHandler extends BaseThingHandler {
47
48     private Logger logger = LoggerFactory.getLogger(MinecraftSignHandler.class);
49
50     private MinecraftServerHandler bridgeHandler;
51     private Subscription signSubscription;
52     private SignConfig config;
53
54     private Gson gson = new GsonBuilder().create();
55
56     public MinecraftSignHandler(Thing thing) {
57         super(thing);
58     }
59
60     @Override
61     public void initialize() {
62         this.bridgeHandler = getBridgeHandler();
63         this.config = getThing().getConfiguration().as(SignConfig.class);
64
65         if (getThing().getBridgeUID() == null) {
66             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "No bridge configured");
67
68             return;
69         }
70
71         updateStatus(ThingStatus.ONLINE);
72         hookupListeners(bridgeHandler);
73     }
74
75     @Override
76     public void dispose() {
77         super.dispose();
78         if (!signSubscription.isUnsubscribed()) {
79             signSubscription.unsubscribe();
80         }
81     }
82
83     private String getSignName() {
84         return config.getName();
85     }
86
87     private void hookupListeners(MinecraftServerHandler bridgeHandler) {
88         signSubscription = bridgeHandler.getSignsRx().flatMap(signs -> Observable.from(signs))
89                 .filter(sign -> config.getName().equals(sign.getName())).subscribe(sign -> updateSignState(sign));
90     }
91
92     /**
93      * Updates sign state of player.
94      *
95      * @param sign the sign to update
96      */
97     private void updateSignState(SignData sign) {
98         State activeState = sign.getState() ? OnOffType.ON : OnOffType.OFF;
99         updateState(MinecraftBindingConstants.CHANNEL_SIGN_ACTIVE, activeState);
100     }
101
102     private synchronized MinecraftServerHandler getBridgeHandler() {
103         Bridge bridge = getBridge();
104         if (bridge == null) {
105             logger.debug("Required bridge not defined for device {}.", getThing().getUID());
106             return null;
107         } else {
108             return getBridgeHandler(bridge);
109         }
110     }
111
112     private synchronized MinecraftServerHandler getBridgeHandler(Bridge bridge) {
113         MinecraftServerHandler bridgeHandler = null;
114
115         ThingHandler handler = bridge.getHandler();
116         if (handler instanceof MinecraftServerHandler) {
117             bridgeHandler = (MinecraftServerHandler) handler;
118         } else {
119             logger.debug("No available bridge handler found yet. Bridge: {} .", bridge.getUID());
120             bridgeHandler = null;
121         }
122         return bridgeHandler;
123     }
124
125     @Override
126     public void updateState(String channelID, State state) {
127         ChannelUID channelUID = new ChannelUID(this.getThing().getUID(), channelID);
128         updateState(channelUID, state);
129     }
130
131     /**
132      * Send a sign command to server.
133      *
134      * @param type the type of command to send
135      * @param signName the sign that the command targets
136      * @param value the value related to command
137      */
138     private void sendSignCommand(String type, String signName, String value) {
139         SignCommandData signCommand = new SignCommandData(type, signName, value);
140         JsonElement serializedCommand = gson.toJsonTree(signCommand);
141         bridgeHandler.sendMessage(new OHMessage(OHMessage.MESSAGE_TYPE_SIGN_COMMANDS, serializedCommand));
142     }
143
144     @Override
145     public void handleCommand(ChannelUID channelUID, Command command) {
146         switch (channelUID.getId()) {
147             case MinecraftBindingConstants.CHANNEL_SIGN_ACTIVE:
148                 Boolean activeState = command == OnOffType.ON ? true : false;
149                 sendSignCommand(SignCommandData.COMMAND_SIGN_ACTIVE, getSignName(), activeState.toString());
150         }
151     }
152 }