]> git.basschouten.com Git - openhab-addons.git/commitdiff
[jeelink] Add support for emt7110 energy meter (#16725)
authorTimo Schober <97966906+tischober@users.noreply.github.com>
Thu, 9 May 2024 13:49:39 +0000 (15:49 +0200)
committerGitHub <noreply@github.com>
Thu, 9 May 2024 13:49:39 +0000 (15:49 +0200)
* feat: add support for emt7110 energy meter with jeelink

Signed-off-by: tischober <t.schober@outlook.de>
bundles/org.openhab.binding.jeelink/README.md
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/JeeLinkBindingConstants.java
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/SensorDefinition.java
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/config/EMT7110SensorConfig.java [new file with mode: 0644]
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110Reading.java [new file with mode: 0644]
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110ReadingConverter.java [new file with mode: 0644]
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorDefinition.java [new file with mode: 0644]
bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorHandler.java [new file with mode: 0644]
bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/i18n/jeelink.properties
bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/thing/thing-types.xml

index ab58d4684cffd90177e99069c3b885aff0dde8f7..ba5cb17ed71664f9633c01ece36cc5d92ec3b1bb 100644 (file)
@@ -92,6 +92,14 @@ The available init commands depend on the sketch that is running on the USB stic
 | Sensor ID         | Number       | The ID of the connected sensor                                                                                         |
 | Sensor Timeout    | Number       | The amount of time in seconds that should result in OFFLINE status when no readings have been received from the sensor |
 
+### EMT7110 energy meter
+
+| Parameter         | Item Type    | Description                                                                                                            |
+|-------------------|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Sensor ID         | Number       | The ID of the connected sensor                                                                                         |
+| Sensor Timeout    | Number       | The amount of time in seconds that should result in OFFLINE status when no readings have been received from the sensor |
+
+
 ## Channels
 
 ### LaCrosse temperature sensors
@@ -145,6 +153,16 @@ The available init commands depend on the sketch that is running on the USB stic
 | electricPotential | Number:ElectricPotential | The measured Electric Potential           |
 | powerFrequency    | Number:Frequency         | The measured AC power frequency           |
 
+### EMT7110 energy meter
+
+| Channel Type ID   | Item Type                | Description                           |
+|-------------------|--------------------------|---------------------------------------|
+| currentPower      | Number:Power             | Current power draw                    |
+| consumptionTotal  | Number:Energy            | Total energy consumption in kWh       |
+| electricCurrent   | Number:ElectricCurrent   | The measured Electric Current         |
+| electricPotential | Number:ElectricPotential | The measured Electric Potential in mA |
+
+
 ## Commands
 
 ### PCA301 power monitoring wireless sockets
index 2a5c398496697917eb76933770deb23bd1df72d5..16f191480bfa8da1a472af1aeaf118ce19b5bfc7 100644 (file)
@@ -42,6 +42,7 @@ public class JeeLinkBindingConstants {
     public static final ThingTypeUID LACROSSE_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "lacrosse");
     public static final ThingTypeUID EC3000_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "ec3k");
     public static final ThingTypeUID PCA301_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "pca301");
+    public static final ThingTypeUID EMT7110_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "emt7110");
     public static final ThingTypeUID TX22_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "tx22");
     public static final ThingTypeUID REVOLT_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "revolt");
     public static final ThingTypeUID LGW_SENSOR_THING_TYPE = new ThingTypeUID(BINDING_ID, "lgw");
index c939818b0397e63b5d9e986a6cc1d2e9fe53ff4f..b56fe6a808b9187c7aa9d46eef587ef87459d06f 100644 (file)
@@ -17,6 +17,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.openhab.binding.jeelink.internal.ec3k.Ec3kSensorDefinition;
+import org.openhab.binding.jeelink.internal.emt7110.Emt7110SensorDefinition;
 import org.openhab.binding.jeelink.internal.lacrosse.LaCrosseSensorDefinition;
 import org.openhab.binding.jeelink.internal.lacrosse.LgwSensorDefinition;
 import org.openhab.binding.jeelink.internal.lacrosse.Tx22SensorDefinition;
@@ -36,9 +37,9 @@ import org.openhab.core.thing.binding.ThingHandler;
 public abstract class SensorDefinition<R extends Reading> {
     public static final String ALL_TYPE = "All";
 
-    private static final Set<SensorDefinition<?>> SENSOR_DEFS = Stream
-            .of(new LaCrosseSensorDefinition(), new Ec3kSensorDefinition(), new Pca301SensorDefinition(),
-                    new Tx22SensorDefinition(), new RevoltSensorDefinition(), new LgwSensorDefinition())
+    private static final Set<SensorDefinition<?>> SENSOR_DEFS = Stream.of(new LaCrosseSensorDefinition(),
+            new Ec3kSensorDefinition(), new Pca301SensorDefinition(), new Emt7110SensorDefinition(),
+            new Tx22SensorDefinition(), new RevoltSensorDefinition(), new LgwSensorDefinition())
             .collect(Collectors.toSet());
     private static final Set<JeeLinkReadingConverter<?>> CONVERTERS = SENSOR_DEFS.stream()
             .map(SensorDefinition::createConverter).collect(Collectors.toSet());
diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/config/EMT7110SensorConfig.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/config/EMT7110SensorConfig.java
new file mode 100644 (file)
index 0000000..d3eeabc
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.jeelink.internal.config;
+
+/**
+ * Configuration for a EMT7110SensorHandler.
+ *
+ * @author Timo Schober - Initial contribution
+ */
+public class EMT7110SensorConfig extends JeeLinkSensorConfig {
+
+}
diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110Reading.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110Reading.java
new file mode 100644 (file)
index 0000000..67d3dd3
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.jeelink.internal.emt7110;
+
+import org.openhab.binding.jeelink.internal.Reading;
+
+/**
+ * Handler for a EMT7110 energy Sensor thing.
+ *
+ * @author Timo Schober - Initial contribution
+ */
+public class Emt7110Reading implements Reading {
+    private final String sensorId;
+    private final float voltage;
+    private final float current;
+    private final float power;
+    private final float aPower;
+    private final boolean on;
+
+    public Emt7110Reading(String sensorId, float voltage, float current, float power, float aPower, boolean deviceOn) {
+        this.sensorId = sensorId;
+        this.voltage = voltage;
+        this.current = current;
+        this.power = power;
+        this.aPower = aPower;
+        this.on = deviceOn;
+    }
+
+    @Override
+    public String getSensorId() {
+        return sensorId;
+    }
+
+    public int getChannel() {
+        return 0;
+    }
+
+    public float getVoltage() {
+        return voltage;
+    }
+
+    public float getCurrent() {
+        return current;
+    }
+
+    public boolean isOn() {
+        return on;
+    }
+
+    public float getPower() {
+        return power;
+    }
+
+    public float getaPower() {
+        return aPower;
+    }
+}
diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110ReadingConverter.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110ReadingConverter.java
new file mode 100644 (file)
index 0000000..057bea6
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.jeelink.internal.emt7110;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.openhab.binding.jeelink.internal.JeeLinkReadingConverter;
+
+/**
+ * Handler for a EMT7110 energy Sensor thing.
+ *
+ * @author Timo Schober - Initial contribution
+ */
+public class Emt7110ReadingConverter implements JeeLinkReadingConverter<Emt7110Reading> {
+    private static final Pattern READING_P = Pattern.compile(
+            "OK EMT7110\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)");
+
+    @Override
+    public Emt7110Reading createReading(String inputLine) {
+        // parse lines only if we have registered listeners
+        if (inputLine != null) {
+            Matcher matcher = READING_P.matcher(inputLine);
+            if (matcher.matches()) {
+                String id = matcher.group(1) + matcher.group(2);
+                float voltage = (Integer.parseInt(matcher.group(3)) * 256 + Integer.parseInt(matcher.group(4))) / 10f;
+                float current = (Integer.parseInt(matcher.group(5)) * 256 + Integer.parseInt(matcher.group(6)));
+                float power = (Integer.parseInt(matcher.group(7)) * 256 + Integer.parseInt(matcher.group(8)));
+                float aPower = (Integer.parseInt(matcher.group(9)) * 256 + Integer.parseInt(matcher.group(10))) / 100f;
+
+                return new Emt7110Reading(id, voltage, current, power, aPower, true);
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorDefinition.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorDefinition.java
new file mode 100644 (file)
index 0000000..5a253c0
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.jeelink.internal.emt7110;
+
+import org.openhab.binding.jeelink.internal.JeeLinkBindingConstants;
+import org.openhab.binding.jeelink.internal.JeeLinkReadingConverter;
+import org.openhab.binding.jeelink.internal.JeeLinkSensorHandler;
+import org.openhab.binding.jeelink.internal.SensorDefinition;
+import org.openhab.core.thing.Thing;
+
+/**
+ * Handler for a EMT7110 energy Sensor thing.
+ *
+ * @author Timo Schober - Initial contribution
+ */
+public class Emt7110SensorDefinition extends SensorDefinition<Emt7110Reading> {
+
+    public Emt7110SensorDefinition() {
+        super(JeeLinkBindingConstants.EMT7110_SENSOR_THING_TYPE, "EMT7110 power monitoring wireless socket", "EMT");
+    }
+
+    @Override
+    public JeeLinkReadingConverter<Emt7110Reading> createConverter() {
+        return new Emt7110ReadingConverter();
+    }
+
+    @Override
+    public Class<Emt7110Reading> getReadingClass() {
+        return Emt7110Reading.class;
+    }
+
+    @Override
+    public JeeLinkSensorHandler<Emt7110Reading> createHandler(Thing thing) {
+        return new Emt7110SensorHandler(thing, type);
+    }
+}
diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorHandler.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorHandler.java
new file mode 100644 (file)
index 0000000..f1ea565
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.jeelink.internal.emt7110;
+
+import static org.openhab.binding.jeelink.internal.JeeLinkBindingConstants.*;
+
+import org.openhab.binding.jeelink.internal.JeeLinkSensorHandler;
+import org.openhab.binding.jeelink.internal.ReadingPublisher;
+import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.unit.Units;
+import org.openhab.core.thing.ChannelUID;
+import org.openhab.core.thing.Thing;
+import org.openhab.core.types.Command;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Handler for an EMT7110 sensor thing.
+ *
+ * @author Timo Schober - Initial contribution
+ */
+public class Emt7110SensorHandler extends JeeLinkSensorHandler<Emt7110Reading> {
+    private final Logger logger = LoggerFactory.getLogger(Emt7110SensorHandler.class);
+
+    public Emt7110SensorHandler(Thing thing, String sensorType) {
+        super(thing, sensorType);
+    }
+
+    @Override
+    public Class<Emt7110Reading> getReadingClass() {
+        return Emt7110Reading.class;
+    }
+
+    @Override
+    public void initialize() {
+        super.initialize();
+
+        logger.debug("initilized handler for thing {} ({})}", getThing().getLabel(), getThing().getUID().getId());
+    }
+
+    @Override
+    public void dispose() {
+        super.dispose();
+    }
+
+    @Override
+    public synchronized void handleCommand(ChannelUID channelUid, Command command) {
+        logger.debug("received command for thing {} ({}): {}", getThing().getLabel(), getThing().getUID().getId(),
+                command);
+    }
+
+    @Override
+    public ReadingPublisher<Emt7110Reading> createPublisher() {
+        return new ReadingPublisher<>() {
+            @Override
+            public void publish(Emt7110Reading reading) {
+                if (reading != null) {
+                    updateState(CURRENT_POWER_CHANNEL, new QuantityType<>(reading.getPower(), Units.WATT));
+                    updateState(CONSUMPTION_CHANNEL, new QuantityType<>(reading.getaPower(), Units.KILOWATT_HOUR));
+                    updateState(ELECTRIC_POTENTIAL_CHANNEL, new QuantityType<>(reading.getVoltage(), Units.VOLT));
+                    updateState(ELECTRIC_CURRENT_CHANNEL,
+                            new QuantityType<>(reading.getCurrent() / 1000, Units.AMPERE));
+                }
+            }
+
+            @Override
+            public void dispose() {
+            }
+        };
+    }
+}
index 17199247b43ec1bf49f0fcbe45390a3f0a0caddd..73a2d36ad132f7b595fefa1d6d76ee5abeb575bf 100644 (file)
@@ -19,6 +19,9 @@ thing-type.ec3k.label = ec3k
 thing-type.ec3k.description = Thing for an EnergyCount 3000 Power Monitor connected to a JeeLink USB Receiver.
 thing-type.pca301.label = PCA301
 thing-type.pca301.description = Thing for a PCA301 power monitoring wireless socket connected to a JeeLink USB Receiver.
+thing-type.emt7110.label = EMT7110
+thing-type.emt7110.description = Thing for a EMT7110 power monitoring wireless socket connected to a JeeLink USB Receiver.
+
 thing-type.tx22.label = TX22 Sensor
 thing-type.tx22.description = Thing for a TX22 Sensor connected to a JeeLink USB Receiver.
 thing-type.revolt.label = Revolt Power Monitor
index 97e2e277b8c9e8d82cf45f008133480fa9419090..5f1f273044c7885112cabf9541ec7022d2b5b5b1 100644 (file)
                </config-description>
        </thing-type>
 
+       <!-- EMT7110 power monitoring wireless socket Thing Type -->
+       <thing-type id="emt7110">
+               <supported-bridge-type-refs>
+                       <bridge-type-ref id="jeelinkTcp"/>
+                       <bridge-type-ref id="jeelinkUsb"/>
+                       <bridge-type-ref id="lgwTcp"/>
+                       <bridge-type-ref id="lgwUsb"/>
+               </supported-bridge-type-refs>
+
+               <label>@text/thing-type.emt7110.label</label>
+               <description>@text/thing-type.emt7110.description</description>
+
+               <channels>
+                       <channel id="currentPower" typeId="current-power"/>
+                       <channel id="consumptionTotal" typeId="consumption-total"/>
+                       <channel id="electricPotential" typeId="electric-potential"/>
+                       <channel id="electricCurrent" typeId="electric-current"/>
+               </channels>
+
+               <config-description>
+                       <parameter name="sensorId" type="text" required="true">
+                               <label>@text/parameter.sensorid.label</label>
+                               <description>@text/parameter.sensorid.description</description>
+                       </parameter>
+                       <parameter name="sensorTimeout" type="integer" required="false" min="5" max="3600" unit="s" step="5">
+                               <label>@text/parameter.sensortimeout.label</label>
+                               <description>@text/parameter.sensortimeout.description</description>
+                               <default>600</default>
+                       </parameter>
+               </config-description>
+       </thing-type>
+
        <!-- Revolt Energy Meter Thing Type -->
        <thing-type id="revolt">
                <supported-bridge-type-refs>