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.paradoxalarm.internal.parsers;
15 import org.openhab.binding.paradoxalarm.internal.model.PartitionState;
16 import org.openhab.binding.paradoxalarm.internal.model.ZoneState;
17 import org.openhab.binding.paradoxalarm.internal.model.ZoneStateFlags;
18 import org.openhab.binding.paradoxalarm.internal.util.ParadoxUtil;
21 * The {@link EvoParser} Implementation of parser interface for EVO type panels
23 * @author Konstantin Polihronov - Initial contribution
25 public class EvoParser extends AbstractParser {
28 public PartitionState calculatePartitionState(byte[] partitionFlags) {
29 byte firstByte = partitionFlags[0];
30 PartitionState state = new PartitionState();
31 state.setArmed(ParadoxUtil.isBitSet(firstByte, 0));
32 state.setArmedInAway(ParadoxUtil.isBitSet(firstByte, 1));
33 state.setArmedInStay(ParadoxUtil.isBitSet(firstByte, 2));
34 state.setArmedInNoEntry(ParadoxUtil.isBitSet(firstByte, 3));
36 state.setInAlarm(ParadoxUtil.isBitSet(firstByte, 4));
37 state.setInSilentAlarm(ParadoxUtil.isBitSet(firstByte, 5));
38 state.setInAudibleAlarm(ParadoxUtil.isBitSet(firstByte, 6));
39 state.setInFireAlarm(ParadoxUtil.isBitSet(firstByte, 7));
41 byte secondByte = partitionFlags[1];
42 state.setReadyToArm(ParadoxUtil.isBitSet(secondByte, 0));
43 state.setInExitDelay(ParadoxUtil.isBitSet(secondByte, 1));
44 state.setInEntryDelay(ParadoxUtil.isBitSet(secondByte, 2));
45 state.setInTrouble(ParadoxUtil.isBitSet(secondByte, 3));
46 state.setHasAlarmInMemory(ParadoxUtil.isBitSet(secondByte, 4));
47 state.setInZoneBypass(ParadoxUtil.isBitSet(secondByte, 5));
49 byte thirdByte = partitionFlags[2];
50 state.setHasZoneInTamperTrouble(ParadoxUtil.isBitSet(thirdByte, 4));
51 state.setHasZoneInLowBatteryTrouble(ParadoxUtil.isBitSet(thirdByte, 5));
52 state.setHasZoneInFireLoopTrouble(ParadoxUtil.isBitSet(thirdByte, 6));
53 state.setHasZoneInSupervisionTrouble(ParadoxUtil.isBitSet(thirdByte, 7));
55 byte sixthByte = partitionFlags[5];
56 state.setStayInstantReady(ParadoxUtil.isBitSet(sixthByte, 0));
57 state.setForceReady(ParadoxUtil.isBitSet(sixthByte, 1));
58 state.setBypassReady(ParadoxUtil.isBitSet(sixthByte, 2));
59 state.setInhibitReady(ParadoxUtil.isBitSet(sixthByte, 3));
60 state.setAllZoneClosed(ParadoxUtil.isBitSet(sixthByte, 4));
66 public ZoneState calculateZoneState(int id, ZoneStateFlags zoneStateFlags) {
68 int index = (id - 1) / 8;
69 int bitNumber = id % 8 - 1;
71 byte[] zonesOpened = zoneStateFlags.getZonesOpened();
72 boolean isOpened = ParadoxUtil.isBitSet(zonesOpened[index], bitNumber);
74 byte[] zonesTampered = zoneStateFlags.getZonesTampered();
75 boolean isTampered = ParadoxUtil.isBitSet(zonesTampered[index], bitNumber);
77 byte[] zonesLowBattery = zoneStateFlags.getZonesLowBattery();
78 boolean hasLowBattery = ParadoxUtil.isBitSet(zonesLowBattery[index], bitNumber);
80 return new ZoneState(isOpened, isTampered, hasLowBattery);