]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Handle new event types (#15533)
authorGaël L'hopital <gael@lhopital.org>
Wed, 6 Sep 2023 06:36:58 +0000 (08:36 +0200)
committerGitHub <noreply@github.com>
Wed, 6 Sep 2023 06:36:58 +0000 (08:36 +0200)
* Adding new Netatmo events
* Changed NAPushType to record.
* Adding impact on WebhookEvent

---------

Signed-off-by: clinique <gael@lhopital.org>
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/EventSubType.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/EventType.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/Event.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/dto/WebhookEvent.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/deserialization/NAPushType.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/deserialization/NAPushTypeDeserializer.java

index 44748ffc103ebe5d866dcd8be3dd2f1414022c59..1e839f60e7027a565be84336a5d8840837b6a27f 100644 (file)
@@ -24,53 +24,57 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 @NonNullByDefault
 public enum EventSubType {
     // SD Card sub events
-    SD_CARD_MISSING(1, EventType.SD),
-    SD_CARD_INSERTED(2, EventType.SD),
-    SD_CARD_FORMATTED(3, EventType.SD),
-    SD_CARD_WORKING(4, EventType.SD),
-    SD_CARD_DEFECTIVE(5, EventType.SD),
-    SD_CARD_INCOMPATIBLE_SPEED(6, EventType.SD),
-    SD_CARD_INSUFFICIENT_SPACE(7, EventType.SD),
+    SD_CARD_MISSING("1", EventType.SD),
+    SD_CARD_INSERTED("2", EventType.SD),
+    SD_CARD_FORMATTED("3", EventType.SD),
+    SD_CARD_WORKING("4", EventType.SD),
+    SD_CARD_DEFECTIVE("5", EventType.SD),
+    SD_CARD_INCOMPATIBLE_SPEED("6", EventType.SD),
+    SD_CARD_INSUFFICIENT_SPACE("7", EventType.SD),
 
     // Power sub events
-    ALIM_INCORRECT_POWER(1, EventType.ALIM),
-    ALIM_CORRECT_POWER(2, EventType.ALIM),
+    ALIM_INCORRECT_POWER("1", EventType.ALIM),
+    ALIM_CORRECT_POWER("2", EventType.ALIM),
 
     // Smoke detector sub events
-    DETECTION_CHAMBER_CLEAN(0, EventType.DETECTION_CHAMBER_STATUS),
-    DETECTION_CHAMBER_DIRTY(1, EventType.DETECTION_CHAMBER_STATUS),
-    BATTERY_LOW(0, EventType.BATTERY_STATUS),
-    BATTERY_VERY_LOW(1, EventType.BATTERY_STATUS),
-    SMOKE_CLEARED(0, EventType.SMOKE),
-    SMOKE_DETECTED(1, EventType.SMOKE),
-    HUSH_ACTIVATED(0, EventType.HUSH),
-    HUSH_DEACTIVATED(1, EventType.HUSH),
-    SOUND_TEST_OK(0, EventType.SOUND_TEST),
-    SOUND_TEST_ERROR(1, EventType.SOUND_TEST),
-    DETECTOR_READY(0, EventType.TAMPERED),
-    DETECTOR_TAMPERED(1, EventType.TAMPERED),
+    DETECTION_CHAMBER_CLEAN("0", EventType.DETECTION_CHAMBER_STATUS),
+    DETECTION_CHAMBER_DIRTY("1", EventType.DETECTION_CHAMBER_STATUS),
+    BATTERY_LOW("0", EventType.BATTERY_STATUS),
+    BATTERY_VERY_LOW("1", EventType.BATTERY_STATUS),
+    SMOKE_CLEARED("0", EventType.SMOKE),
+    SMOKE_DETECTED("1", EventType.SMOKE),
+    HUSH_ACTIVATED("0", EventType.HUSH),
+    HUSH_DEACTIVATED("1", EventType.HUSH),
+    SOUND_TEST_OK("0", EventType.SOUND_TEST),
+    SOUND_TEST_ERROR("1", EventType.SOUND_TEST),
+    DETECTOR_READY("0", EventType.TAMPERED),
+    DETECTOR_TAMPERED("1", EventType.TAMPERED),
 
     // Carbon Monoxide Alarm
-    CO_OK(0, EventType.CO_DETECTED),
-    CO_PRE_ALARM(1, EventType.CO_DETECTED),
-    CO_ALARM(2, EventType.CO_DETECTED),
+    CO_OK("0", EventType.CO_DETECTED),
+    CO_PRE_ALARM("1", EventType.CO_DETECTED),
+    CO_ALARM("2", EventType.CO_DETECTED),
 
-    WIFI_STATUS_OK(1, EventType.WIFI_STATUS),
-    WIFI_STATUS_ERROR(0, EventType.WIFI_STATUS),
+    WIFI_STATUS_OK("1", EventType.WIFI_STATUS),
+    WIFI_STATUS_ERROR("0", EventType.WIFI_STATUS),
 
     // Artificially implemented by the binding subtypes
-    PERSON_ARRIVAL(1, EventType.PERSON, EventType.PERSON_HOME),
-    PERSON_SEEN(2, EventType.PERSON),
-    PERSON_DEPARTURE(1, EventType.PERSON_AWAY),
-    MOVEMENT_HUMAN(1, EventType.MOVEMENT, EventType.HUMAN),
-    MOVEMENT_VEHICLE(2, EventType.MOVEMENT),
-    MOVEMENT_ANIMAL(3, EventType.MOVEMENT, EventType.ANIMAL);
+    PERSON_ARRIVAL("1", EventType.PERSON, EventType.PERSON_HOME),
+    PERSON_SEEN("2", EventType.PERSON),
+    PERSON_DEPARTURE("1", EventType.PERSON_AWAY),
+    MOVEMENT_HUMAN("1", EventType.MOVEMENT, EventType.HUMAN),
+    MOVEMENT_VEHICLE("2", EventType.MOVEMENT),
+    MOVEMENT_ANIMAL("3", EventType.MOVEMENT, EventType.ANIMAL),
+
+    // Weather station events
+    RAIN_ALARM("rain", EventType.ALARM_EVENT),
+    CO2_ALARM("co2", EventType.ALARM_EVENT);
 
     public final List<EventType> types;
-    public final int subType;
+    public final String subType;
 
-    EventSubType(int i, EventType... types) {
+    EventSubType(String subType, EventType... types) {
         this.types = List.of(types);
-        this.subType = i;
+        this.subType = subType;
     }
 }
index 2ff660b6f410e3e028ba9340cb3540830fc8078a..fafec0bd4415a4bd2658a7b18d3348969f095062 100644 (file)
@@ -143,7 +143,25 @@ public enum EventType {
     NEW_DEVICE(ModuleType.HOME),
 
     @SerializedName("co_detected")
-    CO_DETECTED(ModuleType.CO_DETECTOR);
+    CO_DETECTED(ModuleType.CO_DETECTOR),
+
+    @SerializedName("alarm_event") // an alarm event arrived on a weather station module
+    ALARM_EVENT(ModuleType.WEATHER_STATION),
+
+    @SerializedName("entered") // the alarm was raised
+    ALARM_ENTERED(ModuleType.WEATHER_STATION),
+
+    @SerializedName("exited") // the alarm is stopped
+    ALARM_EXITED(ModuleType.WEATHER_STATION),
+
+    @SerializedName("display_change") // a manual action has been done on the thermostat
+    DISPLAY_CHANGE(ModuleType.THERMOSTAT),
+
+    @SerializedName("set_point") // a setpoint has been set
+    SET_POINT(ModuleType.THERMOSTAT),
+
+    @SerializedName("cancel_set_point") // manual setpoint ended
+    CANCEL_SET_POINT(ModuleType.THERMOSTAT);
 
     public static final EnumSet<EventType> AS_SET = EnumSet.allOf(EventType.class);
 
@@ -161,4 +179,8 @@ public enum EventType {
     public boolean validFor(ModuleType searched) {
         return appliesTo.contains(searched);
     }
+
+    public ModuleType getFirstModule() {
+        return appliesTo.iterator().next();
+    }
 }
index 1f5847f1c3908a52f5b55bf9d93ea628d592b88d..e81232bb5c53b4a63b87eedd7c92f7e6899117b8 100644 (file)
@@ -35,7 +35,7 @@ public abstract class Event extends NAObject {
     protected EventType type = EventType.UNKNOWN;
     @SerializedName(value = "camera_id", alternate = { "module_id" })
     private String cameraId = "";
-    protected int subType = -1;
+    protected String subType = "";
 
     public abstract ZonedDateTime getTime();
 
@@ -54,11 +54,11 @@ public abstract class Event extends NAObject {
     @Override
     public @Nullable String getName() {
         String localMessage = super.getName();
-        return (localMessage != null ? localMessage.replace("<b>", "").replace("</b>", "") : "");
+        return localMessage != null ? localMessage.replace("<b>", "").replace("</b>", "") : "";
     }
 
     public Optional<EventSubType> getSubTypeDescription() {
-        return Stream.of(EventSubType.values()).filter(v -> v.types.contains(getEventType()) && v.subType == subType)
-                .findFirst();
+        return Stream.of(EventSubType.values())
+                .filter(v -> v.types.contains(getEventType()) && v.subType.equals(subType)).findFirst();
     }
 }
index 71ef8ff29c289fdc1a4d8380f73cdda29553d0ff..c8e84368112f6b6e9505b6b864514729aeda2bff 100644 (file)
@@ -33,6 +33,7 @@ import org.openhab.binding.netatmo.internal.deserialization.NAPushType;
 public class WebhookEvent extends Event {
     private NAPushType pushType = NAPushType.UNKNOWN;
     private String homeId = "";
+    private String roomId = "";
     private String deviceId = "";
     private @Nullable String snapshotUrl;
     private @Nullable String vignetteUrl;
@@ -50,7 +51,7 @@ public class WebhookEvent extends Event {
 
     @Override
     public EventType getEventType() {
-        return pushType.getEvent();
+        return pushType.event();
     }
 
     @Override
@@ -77,6 +78,7 @@ public class WebhookEvent extends Event {
         result.add(getCameraId());
         addNotBlank(result, homeId);
         addNotBlank(result, deviceId);
+        addNotBlank(result, roomId);
         addNotBlank(result, getCameraId());
         result.addAll(getPersons().keySet());
         return result;
index aca4191196c624c538c05ee7c5be4a5b2ee69a20..6a0938ce4b1a9f4534963bf636aae47374156f7d 100644 (file)
@@ -22,22 +22,6 @@ import org.openhab.binding.netatmo.internal.api.data.ModuleType;
  * @author Gaël L'hopital - Initial contribution
  */
 @NonNullByDefault
-public class NAPushType {
+public record NAPushType(ModuleType moduleType, EventType event) {
     public static final NAPushType UNKNOWN = new NAPushType(ModuleType.UNKNOWN, EventType.UNKNOWN);
-
-    private final ModuleType moduleType;
-    private final EventType event;
-
-    NAPushType(ModuleType moduleType, EventType event) {
-        this.moduleType = moduleType;
-        this.event = event;
-    }
-
-    public ModuleType getModuleType() {
-        return moduleType;
-    }
-
-    public EventType getEvent() {
-        return event;
-    }
 }
index d552ddea868d052972a64bb854cf9e3bfdd6d90a..57ac0e11888ac811ebbaaf3017b62ef0cefd61cc 100644 (file)
@@ -46,12 +46,12 @@ class NAPushTypeDeserializer implements JsonDeserializer<NAPushType> {
             moduleType = fromNetatmoObject(elements[0]);
             eventType = fromEvent(elements[1]);
         } else if (elements.length == 1) {
-            moduleType = ModuleType.ACCOUNT;
             eventType = fromEvent(string);
+            moduleType = eventType.getFirstModule();
         }
 
         if (moduleType.equals(ModuleType.UNKNOWN) || eventType.equals(EventType.UNKNOWN)) {
-            logger.warn("Unknown module or event type : {}, deserialized to '{}-{}'", string, moduleType, eventType);
+            logger.warn("Unknown module or event type: {}, deserialized to '{}-{}'", string, moduleType, eventType);
         }
 
         return new NAPushType(moduleType, eventType);