diff --git a/bundles/org.openhab.binding.jeelink/README.md b/bundles/org.openhab.binding.jeelink/README.md index ab58d4684cffd..ba5cb17ed7166 100644 --- a/bundles/org.openhab.binding.jeelink/README.md +++ b/bundles/org.openhab.binding.jeelink/README.md @@ -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 diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/JeeLinkBindingConstants.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/JeeLinkBindingConstants.java index 2a5c398496697..16f191480bfa8 100644 --- a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/JeeLinkBindingConstants.java +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/JeeLinkBindingConstants.java @@ -42,6 +42,7 @@ private 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"); diff --git a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/SensorDefinition.java b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/SensorDefinition.java index c939818b0397e..b56fe6a808b91 100644 --- a/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/SensorDefinition.java +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/SensorDefinition.java @@ -17,6 +17,7 @@ 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 @@ public abstract class SensorDefinition { public static final String ALL_TYPE = "All"; - private static final Set> SENSOR_DEFS = Stream - .of(new LaCrosseSensorDefinition(), new Ec3kSensorDefinition(), new Pca301SensorDefinition(), - new Tx22SensorDefinition(), new RevoltSensorDefinition(), new LgwSensorDefinition()) + private static final Set> 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> 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 index 0000000000000..d3eeabc3714ce --- /dev/null +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/config/EMT7110SensorConfig.java @@ -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 index 0000000000000..67d3dd326d0f9 --- /dev/null +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110Reading.java @@ -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 index 0000000000000..057bea6f3b2a3 --- /dev/null +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110ReadingConverter.java @@ -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 { + 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 index 0000000000000..5a253c0b00f9e --- /dev/null +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorDefinition.java @@ -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 { + + public Emt7110SensorDefinition() { + super(JeeLinkBindingConstants.EMT7110_SENSOR_THING_TYPE, "EMT7110 power monitoring wireless socket", "EMT"); + } + + @Override + public JeeLinkReadingConverter createConverter() { + return new Emt7110ReadingConverter(); + } + + @Override + public Class getReadingClass() { + return Emt7110Reading.class; + } + + @Override + public JeeLinkSensorHandler 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 index 0000000000000..f1ea565076ac6 --- /dev/null +++ b/bundles/org.openhab.binding.jeelink/src/main/java/org/openhab/binding/jeelink/internal/emt7110/Emt7110SensorHandler.java @@ -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 { + private final Logger logger = LoggerFactory.getLogger(Emt7110SensorHandler.class); + + public Emt7110SensorHandler(Thing thing, String sensorType) { + super(thing, sensorType); + } + + @Override + public Class 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 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() { + } + }; + } +} diff --git a/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/i18n/jeelink.properties b/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/i18n/jeelink.properties index 17199247b43ec..73a2d36ad132f 100644 --- a/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/i18n/jeelink.properties +++ b/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/i18n/jeelink.properties @@ -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 diff --git a/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/thing/thing-types.xml index 97e2e277b8c9e..5f1f273044c78 100644 --- a/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.jeelink/src/main/resources/OH-INF/thing/thing-types.xml @@ -291,6 +291,38 @@ + + + + + + + + + + + @text/thing-type.emt7110.description + + + + + + + + + + + + @text/parameter.sensorid.description + + + + @text/parameter.sensortimeout.description + 600 + + + +