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.lcn.internal.subhandler;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.regex.Matcher;
18 import java.util.regex.Pattern;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.openhab.binding.lcn.internal.LcnBindingConstants;
22 import org.openhab.binding.lcn.internal.LcnModuleHandler;
23 import org.openhab.binding.lcn.internal.common.LcnChannelGroup;
24 import org.openhab.binding.lcn.internal.common.LcnDefs;
25 import org.openhab.binding.lcn.internal.common.LcnDefs.RelayStateModifier;
26 import org.openhab.binding.lcn.internal.common.LcnException;
27 import org.openhab.binding.lcn.internal.common.PckGenerator;
28 import org.openhab.binding.lcn.internal.connection.ModInfo;
29 import org.openhab.core.library.types.PercentType;
30 import org.openhab.core.library.types.StopMoveType;
31 import org.openhab.core.library.types.UpDownType;
34 * Handles Commands and State changes of roller shutters connected to relays of an LCN module.
36 * @author Fabian Wolter - Initial contribution
39 public abstract class AbstractLcnModuleRollershutterRelaySubHandler extends AbstractLcnModuleSubHandler {
40 private static final String POSITION = "P";
41 private static final String ANGLE = "W";
42 private static final Pattern PATTERN = Pattern.compile(LcnBindingConstants.ADDRESS_REGEX + //
43 "(?<type>[" + POSITION + "|" + ANGLE + "])(?<shutterNumber>\\d)(?<percent>\\d{3})");
45 public AbstractLcnModuleRollershutterRelaySubHandler(LcnModuleHandler handler, ModInfo info) {
50 public void handleRefresh(LcnChannelGroup channelGroup, int number) {
55 public void handleCommandUpDown(UpDownType command, LcnChannelGroup channelGroup, int number, boolean invertUpDown)
57 RelayStateModifier[] relayStateModifiers = createRelayStateModifierArray();
59 relayStateModifiers[number * 2 + 1] = command == UpDownType.DOWN ^ invertUpDown ? LcnDefs.RelayStateModifier.ON
60 : LcnDefs.RelayStateModifier.OFF;
62 relayStateModifiers[number * 2] = LcnDefs.RelayStateModifier.ON;
63 handler.sendPck(PckGenerator.controlRelays(relayStateModifiers));
67 public void handleCommandStopMove(StopMoveType command, LcnChannelGroup channelGroup, int number)
69 RelayStateModifier[] relayStateModifiers = createRelayStateModifierArray();
71 relayStateModifiers[number * 2] = command == StopMoveType.MOVE ? LcnDefs.RelayStateModifier.ON
72 : LcnDefs.RelayStateModifier.OFF;
73 handler.sendPck(PckGenerator.controlRelays(relayStateModifiers));
77 public void handleStatusMessage(Matcher matcher) {
78 int shutterNumber = Integer.parseInt(matcher.group("shutterNumber")) - 1;
79 int percent = Integer.parseInt(matcher.group("percent"));
81 LcnChannelGroup group;
82 if (POSITION.equals(matcher.group("type"))) {
83 group = LcnChannelGroup.ROLLERSHUTTERRELAY;
85 group = LcnChannelGroup.ROLLERSHUTTERRELAYSLAT;
88 fireUpdate(group, shutterNumber, new PercentType(percent));
92 public Collection<Pattern> getPckStatusMessagePatterns() {
93 return Collections.singleton(PATTERN);