2 * Copyright (c) 2010-2023 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.souliss.internal.handler;
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.openhab.binding.souliss.internal.SoulissBindingConstants;
17 import org.openhab.binding.souliss.internal.SoulissProtocolConstants;
18 import org.openhab.core.library.types.OnOffType;
19 import org.openhab.core.library.types.PercentType;
20 import org.openhab.core.library.types.StopMoveType;
21 import org.openhab.core.library.types.StringType;
22 import org.openhab.core.library.types.UpDownType;
23 import org.openhab.core.thing.ChannelUID;
24 import org.openhab.core.thing.Thing;
25 import org.openhab.core.thing.ThingStatus;
26 import org.openhab.core.types.Command;
27 import org.openhab.core.types.PrimitiveType;
28 import org.openhab.core.types.RefreshType;
31 * The {@link SoulissT22Handler} is responsible for handling commands, which are
32 * sent to one of the channels.
34 * @author Tonino Fazio - Initial contribution
35 * @author Luca Calcaterra - Refactor for OH3
38 public class SoulissT22Handler extends SoulissGenericHandler {
39 byte t2nRawState = 0xF;
41 public SoulissT22Handler(Thing thing) {
46 public void initialize() {
49 updateStatus(ThingStatus.UNKNOWN);
51 var configurationMap = getThing().getConfiguration();
52 if (configurationMap.get(SoulissBindingConstants.CONFIG_SECURE_SEND) != null) {
53 bSecureSend = ((Boolean) configurationMap.get(SoulissBindingConstants.CONFIG_SECURE_SEND)).booleanValue();
58 public void handleCommand(ChannelUID channelUID, Command command) {
59 if (command instanceof RefreshType) {
60 switch (channelUID.getId()) {
61 case SoulissBindingConstants.ROLLERSHUTTER_CHANNEL:
67 switch (channelUID.getId()) {
68 case SoulissBindingConstants.ROLLERSHUTTER_CHANNEL:
69 if (command.equals(UpDownType.UP)) {
70 commandSEND(SoulissProtocolConstants.SOULISS_T2N_OPEN_CMD);
71 } else if (command.equals(UpDownType.DOWN)) {
72 commandSEND(SoulissProtocolConstants.SOULISS_T2N_CLOSE_CMD);
73 } else if (command.equals(StopMoveType.STOP)) {
74 commandSEND(SoulissProtocolConstants.SOULISS_T2N_STOP_CMD);
77 case SoulissBindingConstants.ONOFF_CHANNEL:
78 if (command.equals(OnOffType.ON)) {
79 commandSEND(SoulissProtocolConstants.SOULISS_T2N_OPEN_CMD_LOCAL);
80 } else if (command.equals(OnOffType.OFF)) {
81 commandSEND(SoulissProtocolConstants.SOULISS_T2N_CLOSE_CMD_LOCAL);
90 public void setState(PrimitiveType state) {
91 if (state instanceof PercentType) {
92 this.updateState(SoulissBindingConstants.ROLLERSHUTTER_CHANNEL, (PercentType) state);
97 public void setStateMessage(String rollershutterMessage) {
98 this.updateState(SoulissBindingConstants.ROLLERSHUTTER_STATE_CHANNEL_CHANNEL,
99 StringType.valueOf(rollershutterMessage));
103 public void setRawState(byte rawState) {
104 // update Last Status stored time
105 super.setLastStatusStored();
106 // update item state only if it is different from previous
107 if (t2nRawState != rawState) {
108 var val = getOhStateT22FromSoulissVal(rawState);
111 if (rawState == SoulissProtocolConstants.SOULISS_T2N_OPEN_CMD) {
112 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_OPENING_CHANNEL);
113 } else if (rawState == SoulissProtocolConstants.SOULISS_T2N_CLOSE_CMD) {
114 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_CLOSING_CHANNEL);
117 case SoulissProtocolConstants.SOULISS_T2N_COIL_STOP:
118 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_STOP_CHANNEL);
120 case SoulissProtocolConstants.SOULISS_T2N_COIL_OFF:
121 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_OPENING_CHANNEL);
123 case SoulissProtocolConstants.SOULISS_T2N_LIMSWITCH_CLOSE:
124 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_LIMITSWITCH_CLOSE_CHANNEL);
126 case SoulissProtocolConstants.SOULISS_T2N_LIMSWITCH_OPEN:
127 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_LIMITSWITCH_OPEN_CHANNEL);
129 case SoulissProtocolConstants.SOULISS_T2N_NOLIMSWITCH:
130 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_LIMITSWITCH_OPEN_CHANNEL);
132 case SoulissProtocolConstants.SOULISS_T2N_TIMER_OFF:
133 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_TIMER_OFF);
135 case SoulissProtocolConstants.SOULISS_T2N_STATE_OPEN:
136 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_STATE_OPEN_CHANNEL);
138 case SoulissProtocolConstants.SOULISS_T2N_STATE_CLOSE:
139 this.setStateMessage(SoulissBindingConstants.ROLLERSHUTTER_MESSAGE_STATE_CLOSE_CHANNEL);
144 t2nRawState = rawState;
148 private PercentType getOhStateT22FromSoulissVal(short sVal) {
151 case SoulissProtocolConstants.SOULISS_T2N_COIL_OPEN:
154 case SoulissProtocolConstants.SOULISS_T2N_COIL_CLOSE:
157 case SoulissProtocolConstants.SOULISS_T2N_COIL_STOP:
160 case SoulissProtocolConstants.SOULISS_T2N_LIMSWITCH_CLOSE:
163 case SoulissProtocolConstants.SOULISS_T2N_LIMSWITCH_OPEN:
166 case SoulissProtocolConstants.SOULISS_T2N_NOLIMSWITCH:
169 case SoulissProtocolConstants.SOULISS_T2N_TIMER_OFF:
172 case SoulissProtocolConstants.SOULISS_T2N_STATE_OPEN:
175 case SoulissProtocolConstants.SOULISS_T2N_STATE_CLOSE:
181 return PercentType.valueOf(String.valueOf(iState));
185 public byte getRawState() {
190 public byte getExpectedRawState(byte bCmd) {
192 if (bCmd == SoulissProtocolConstants.SOULISS_T2N_OPEN_CMD) {
193 return SoulissProtocolConstants.SOULISS_T2N_COIL_OPEN;
194 } else if (bCmd == SoulissProtocolConstants.SOULISS_T2N_CLOSE_CMD) {
195 return SoulissProtocolConstants.SOULISS_T2N_COIL_CLOSE;
196 } else if (bCmd >= SoulissProtocolConstants.SOULISS_T2N_STOP_CMD) {
197 return SoulissProtocolConstants.SOULISS_T2N_COIL_STOP;