]> git.basschouten.com Git - openhab-addons.git/commitdiff
[paradoxalarm] Implement detailed partition state (#14618)
authorKonstantin Polihronov <polychronov@gmail.com>
Thu, 19 Oct 2023 11:10:20 +0000 (14:10 +0300)
committerGitHub <noreply@github.com>
Thu, 19 Oct 2023 11:10:20 +0000 (13:10 +0200)
* Implement partition detailed state

---------

Signed-off-by: Konstantin Polihronov <polychronov@gmail.com>
bundles/org.openhab.binding.paradoxalarm/README.md
bundles/org.openhab.binding.paradoxalarm/src/main/java/org/openhab/binding/paradoxalarm/internal/handlers/ParadoxAlarmBindingConstants.java
bundles/org.openhab.binding.paradoxalarm/src/main/java/org/openhab/binding/paradoxalarm/internal/handlers/ParadoxPartitionHandler.java
bundles/org.openhab.binding.paradoxalarm/src/main/java/org/openhab/binding/paradoxalarm/internal/model/Partition.java
bundles/org.openhab.binding.paradoxalarm/src/main/java/org/openhab/binding/paradoxalarm/internal/model/PartitionState.java
bundles/org.openhab.binding.paradoxalarm/src/main/resources/OH-INF/i18n/paradoxalarm.properties
bundles/org.openhab.binding.paradoxalarm/src/main/resources/OH-INF/thing/partition.xml
bundles/org.openhab.binding.paradoxalarm/src/main/resources/OH-INF/update/partition_type_update.xml [new file with mode: 0644]

index 55ceb2f95b68dddd8a5a676c44ea763a190409f5..20be7230d3cddf1c2ddf041f9abad463e36bafa7 100644 (file)
@@ -76,7 +76,8 @@ Currently binding supports the following panels: EVO192, EVO48(not tested), EVO9
 | Channel                  | Type    | Description                                                                                   |
 |--------------------------|---------|-----------------------------------------------------------------------------------------------|
 | partitionLabel           | String  | Label of partition inside Paradox configuration                                               |
-| state                    | String  |State of partition (armed, disarmed, in alarm)                                                 |
+| state                    | String  | Calculated overall state of the partition (Armed, Disarmed, In Alarm)                         |
+| detailedState            | String  | Calculated detailed state of the partition based on partition state bits (see below table for possible values)             |
 | additionalState          | String  | This used to be a channel where all different states were consolidated as semi-colon separated string. With implementation of each state as channel additional states should be no longer used. (deprecated channel)                             |
 | readyToArm               | Switch  | Partition is Ready to arm                                                                     |
 | inExitDelay              | Switch  | Partition is in Exit delay                                                                    |
@@ -95,6 +96,13 @@ Currently binding supports the following panels: EVO192, EVO48(not tested), EVO9
 | allZonesClosed           | Contact | All zones in partition are currently closed                                                   |
 | command                  | String  | Command to be send to partition. Can be (ARM, DISARM, FORCE_ARM, INSTANT_ARM, STAY_ARM, BEEP) |
 
+### Partition detailed state possible values:
+| Overall state value      | Detailed state value (depending on the sub-state)                                            |
+|--------------------------|----------------------------------------------------------------------------------------------|
+| InAlarm                  | Silent Alarm, Audible Alarm, Fire Alarm, In Alarm (if none of the first three)               |
+| Armed                    | Away Armed, Stay Armed, NoEntry Armed, Armed (if none of the first three)                    |
+| Disarmed                 | Disarmed                                                                                     |
+
 ### Zone channels:
 
 | Channel                            | Type    | Description                                                                    |
index a082d7c8085fdcd8520c65bbfe76415b9b937a45..74d4f43eddf15b5a0a6e4bb68dee4430c21f3c3a 100644 (file)
@@ -69,6 +69,7 @@ public class ParadoxAlarmBindingConstants {
 
     public static final String PARTITION_LABEL_CHANNEL_UID = "label";
     public static final String PARTITION_STATE_CHANNEL_UID = "state";
+    public static final String PARTITION_DETAILED_STATE_CHANNEL_UID = "detailedState";
     @Deprecated // After implementation of channels for every possible state, the summarized additional states is no
                 // longer needed. We'll keep it for backward compatibility
     public static final String PARTITION_ADDITIONAL_STATES_CHANNEL_UID = "additionalStates";
index bfdcd92f614bbabe01825e3e2c0b6bd23250893e..8ca6ed97a5f4b0e7a06428269d1fb17d35ae5560 100644 (file)
@@ -48,6 +48,7 @@ public class ParadoxPartitionHandler extends EntityBaseHandler {
         if (partition != null) {
             updateState(PARTITION_LABEL_CHANNEL_UID, new StringType(partition.getLabel()));
             updateState(PARTITION_STATE_CHANNEL_UID, new StringType(partition.getState().getMainState()));
+            updateState(PARTITION_DETAILED_STATE_CHANNEL_UID, new StringType(partition.getState().getDetailedState()));
             updateState(PARTITION_ADDITIONAL_STATES_CHANNEL_UID,
                     new StringType("Deprecated field. Use direct channels instead"));
             updateState(PARTITION_READY_TO_ARM_CHANNEL_UID, booleanToSwitchState(partition.getState().isReadyToArm()));
index 91dae6baf3bd05275102caa849a68011694595e3..e65a3820991c9c946001578ba6a9ba0cdf098c58 100644 (file)
@@ -40,7 +40,11 @@ public class Partition extends Entity implements Commandable {
 
     public Partition setState(PartitionState state) {
         this.state = state;
-        logger.debug("Partition {}:\t{}", getLabel(), getState().getMainState());
+        logger.debug("Partition {} main state:\t{}", getLabel(), getState().getMainState());
+        if (logger.isTraceEnabled()) {
+            logger.trace("Partition {} detailed state:\t{}", getLabel(), getState().getDetailedState());
+            logger.trace("Partition {} full state dump:\t{}", getLabel(), getState());
+        }
         return this;
     }
 
index 7bf69e3c84a1c321f75964852cd7dc81d3df4115..ed44c46450480039ca14d2f80c6265ed64710454 100644 (file)
@@ -19,6 +19,16 @@ package org.openhab.binding.paradoxalarm.internal.model;
  */
 public class PartitionState {
 
+    private static final String ARMED = "Armed";
+    private static final String DISARMED = "Disarmed";
+    private static final String IN_ALARM = "InAlarm";
+
+    private static final String ARMED_IN_NO_ENTRY = "NoEntry Armed";
+    private static final String ARMED_IN_STAY = "Stay Armed";
+    private static final String ARMED_IN_AWAY = "Away Armed";
+    private static final String FIRE_ALARM = "Fire Alarm";
+    private static final String AUDIBLE_ALARM = "Audible Alarm";
+    private static final String SILENT_ALARM = "Silent Alarm";
     private boolean isArmed;
     private boolean isArmedInAway;
     private boolean isArmedInStay;
@@ -47,11 +57,35 @@ public class PartitionState {
     private boolean areAllZoneclosed;
 
     public String getMainState() {
-        if (isInAlarm) {
-            return "InAlarm";
+        if (isInAlarm || isInSilentAlarm || isInAudibleAlarm || isInFireAlarm) {
+            return IN_ALARM;
         } else {
-            return isArmed || isArmedInAway || isArmedInStay || isArmedInNoEntry ? "Armed" : "Disarmed";
+            return isArmed || isArmedInAway || isArmedInStay || isArmedInNoEntry ? ARMED : DISARMED;
+        }
+    }
+
+    public String getDetailedState() {
+        if (isInAlarm) {
+            if (isInSilentAlarm) {
+                return SILENT_ALARM;
+            } else if (isInAudibleAlarm) {
+                return AUDIBLE_ALARM;
+            } else if (isInFireAlarm) {
+                return FIRE_ALARM;
+            }
+            return IN_ALARM;
+        } else if (isArmed) {
+            if (isArmedInAway) {
+                return ARMED_IN_AWAY;
+            } else if (isArmedInStay) {
+                return ARMED_IN_STAY;
+            } else if (isArmedInNoEntry) {
+                return ARMED_IN_NO_ENTRY;
+            }
+            return ARMED;
         }
+
+        return DISARMED;
     }
 
     @Override
index b59bfef8add48cf27165820759609d0deff2daf1..0233610f5d3adc54b535ad41947f00f490726212 100644 (file)
@@ -69,6 +69,8 @@ channel-type.paradoxalarm.command.state.option.BYPASS = Bypass
 channel-type.paradoxalarm.command.state.option.CLEAR_BYPASS = Clear Bypass
 channel-type.paradoxalarm.communicationState.label = Bridge Communication State
 channel-type.paradoxalarm.communicationState.description = Status of connection to Paradox system
+channel-type.paradoxalarm.detailedState.label = Detailed Partition State
+channel-type.paradoxalarm.detailedState.description = The detailed state of partition (contains sub-states like Stay in Armed, Armed no entry, etc)
 channel-type.paradoxalarm.forceReady.label = Partition Is Force Ready
 channel-type.paradoxalarm.forceReady.description = Partition is Force Ready
 channel-type.paradoxalarm.generatedAlarm.label = Generated an Alarm
index f5d1771eb604bed1c40f91cabd924981f4531e5f..0375a0350df84d153f3ed07453eb0089e7143512 100644 (file)
@@ -15,6 +15,7 @@
                <channels>
                        <channel id="label" typeId="partitionLabel"/>
                        <channel id="state" typeId="state"/>
+                       <channel id="detailedState" typeId="detailedState"/>
                        <channel id="additionalStates" typeId="additionalState"/>
                        <channel id="readyToArm" typeId="readyToArm"/>
                        <channel id="inExitDelay" typeId="inExitDelay"/>
                        <channel id="command" typeId="command"/>
                </channels>
 
+               <properties>
+                       <property name="thingTypeVersion">1</property>
+               </properties>
+
                <config-description>
                        <parameter name="id" type="integer" min="1" max="8" required="true">
                                <label>Partition Id</label>
                <description>State of partition</description>
                <state readOnly="true" pattern="%s"/>
        </channel-type>
+       <channel-type id="detailedState">
+               <item-type>String</item-type>
+               <label>Detailed Partition State</label>
+               <description>The detailed state of partition (contains sub-states like Stay in Armed, Armed no entry, etc)</description>
+               <state readOnly="true" pattern="%s"/>
+       </channel-type>
        <channel-type id="additionalState">
                <item-type>String</item-type>
                <label>Partition Additional States</label>
diff --git a/bundles/org.openhab.binding.paradoxalarm/src/main/resources/OH-INF/update/partition_type_update.xml b/bundles/org.openhab.binding.paradoxalarm/src/main/resources/OH-INF/update/partition_type_update.xml
new file mode 100644 (file)
index 0000000..7541ba8
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<update:update-descriptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:update="https://openhab.org/schemas/update-description/v1.0.0"
+       xsi:schemaLocation="https://openhab.org/schemas/update-description/v1.0.0 https://openhab.org/schemas/update-description-1.0.0.xsd">
+
+       <thing-type uid="paradoxalarm:partition">
+               <instruction-set targetVersion="1">
+                       <add-channel id="detailedState">
+                               <type>paradoxalarm:detailedState</type>
+                       </add-channel>
+               </instruction-set>
+       </thing-type>
+
+</update:update-descriptions>