]> git.basschouten.com Git - openhab-addons.git/blob
db831f7c45c2fc91e4f95a7356988ac2fe66a74b
[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.lcn.internal.subhandler;
14
15 import java.util.Arrays;
16 import java.util.Collection;
17 import java.util.Set;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
20 import java.util.stream.IntStream;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.openhab.binding.lcn.internal.LcnBindingConstants;
24 import org.openhab.binding.lcn.internal.LcnModuleHandler;
25 import org.openhab.binding.lcn.internal.common.LcnChannelGroup;
26 import org.openhab.binding.lcn.internal.common.LcnDefs;
27 import org.openhab.binding.lcn.internal.common.LcnDefs.KeyLockStateModifier;
28 import org.openhab.binding.lcn.internal.common.LcnException;
29 import org.openhab.binding.lcn.internal.common.PckGenerator;
30 import org.openhab.binding.lcn.internal.connection.ModInfo;
31 import org.openhab.core.library.types.OnOffType;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * Handles Commands and State changes of key table locks of an LCN module.
37  *
38  * @author Fabian Wolter - Initial contribution
39  */
40 @NonNullByDefault
41 public class LcnModuleKeyLockTableSubHandler extends AbstractLcnModuleSubHandler {
42     private final Logger logger = LoggerFactory.getLogger(LcnModuleKeyLockTableSubHandler.class);
43     private static final Pattern PATTERN = Pattern.compile(LcnBindingConstants.ADDRESS_REGEX
44             + "\\.TX(?<table0>\\d{3})(?<table1>\\d{3})(?<table2>\\d{3})((?<table3>\\d{3}))?");
45
46     public LcnModuleKeyLockTableSubHandler(LcnModuleHandler handler, ModInfo info) {
47         super(handler, info);
48     }
49
50     @Override
51     public void handleRefresh(LcnChannelGroup channelGroup, int number) {
52         info.refreshStatusLockedKeys();
53     }
54
55     @Override
56     public void handleRefresh(String groupId) {
57         // nothing
58     }
59
60     @Override
61     public void handleCommandOnOff(OnOffType command, LcnChannelGroup channelGroup, int number) throws LcnException {
62         KeyLockStateModifier[] keyLockStateModifiers = new LcnDefs.KeyLockStateModifier[channelGroup.getCount()];
63         Arrays.fill(keyLockStateModifiers, LcnDefs.KeyLockStateModifier.NOCHANGE);
64         keyLockStateModifiers[number] = command == OnOffType.ON ? LcnDefs.KeyLockStateModifier.ON
65                 : LcnDefs.KeyLockStateModifier.OFF;
66         int tableId = channelGroup.ordinal() - LcnChannelGroup.KEYLOCKTABLEA.ordinal();
67         handler.sendPck(PckGenerator.lockKeys(tableId, keyLockStateModifiers));
68         info.refreshStatusStatusLockedKeysAfterChange();
69     }
70
71     @Override
72     public void handleStatusMessage(Matcher matcher) {
73         info.onLockedKeysResponseReceived();
74
75         IntStream.range(0, LcnDefs.KEY_TABLE_COUNT).forEach(tableId -> {
76             String stateString = matcher.group(String.format("table%d", tableId));
77             if (stateString != null) {
78                 boolean[] states = LcnDefs.getBooleanValue(Integer.parseInt(stateString));
79                 try {
80                     LcnChannelGroup channelGroup = LcnChannelGroup.fromTableId(tableId);
81                     for (int i = 0; i < states.length; i++) {
82                         fireUpdate(channelGroup, i, states[i] ? OnOffType.ON : OnOffType.OFF);
83                     }
84                 } catch (LcnException e) {
85                     logger.warn("Failed to set key table lock state: {}", e.getMessage());
86                 }
87             }
88         });
89     }
90
91     @Override
92     public Collection<Pattern> getPckStatusMessagePatterns() {
93         return Set.of(PATTERN);
94     }
95 }