]> git.basschouten.com Git - openhab-addons.git/commitdiff
[openwebnet] Energy meter returns always zero power if no other device has subscribed...
authorConte Andrea <andrea@conte.com>
Thu, 13 May 2021 13:25:01 +0000 (15:25 +0200)
committerGitHub <noreply@github.com>
Thu, 13 May 2021 13:25:01 +0000 (15:25 +0200)
* add scheduler to start/stop sending instantaneous consumption

Signed-off-by: Conte Andrea <andrea@conte.com>
* added scheduler also in Initialize() in order to start reading data of a newly discovered thing

Signed-off-by: Conte Andrea <andrea@conte.com>
* removed setActivePowerNotificationsTime()  from dispose()

Signed-off-by: Conte Andrea <andrea@conte.com>
* add log in dispose() method

Signed-off-by: Conte Andrea <andrea@conte.com>
bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/handler/OpenWebNetEnergyHandler.java

index b847d5eeda023bbaca3e5c402008d6de62016fb6..dc41ae596c46756bc943a39e4540d252ba370d30 100644 (file)
@@ -15,21 +15,28 @@ package org.openhab.binding.openwebnet.handler;
 import static org.openhab.binding.openwebnet.OpenWebNetBindingConstants.CHANNEL_POWER;
 
 import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 
 import javax.measure.quantity.Power;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.openwebnet.OpenWebNetBindingConstants;
 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.thing.ThingStatus;
+import org.openhab.core.thing.ThingStatusInfo;
 import org.openhab.core.thing.ThingTypeUID;
 import org.openhab.core.types.Command;
 import org.openhab.core.types.UnDefType;
+import org.openwebnet4j.OpenGateway;
 import org.openwebnet4j.communication.OWNException;
 import org.openwebnet4j.message.BaseOpenMessage;
 import org.openwebnet4j.message.EnergyManagement;
+import org.openwebnet4j.message.EnergyManagement.DIM;
 import org.openwebnet4j.message.FrameException;
 import org.openwebnet4j.message.Where;
 import org.openwebnet4j.message.WhereEnergyManagement;
@@ -49,12 +56,87 @@ public class OpenWebNetEnergyHandler extends OpenWebNetThingHandler {
 
     private final Logger logger = LoggerFactory.getLogger(OpenWebNetEnergyHandler.class);
 
-    public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = OpenWebNetBindingConstants.ENERGY_MANAGEMENT_SUPPORTED_THING_TYPES;
+    public final static Set<ThingTypeUID> SUPPORTED_THING_TYPES = OpenWebNetBindingConstants.ENERGY_MANAGEMENT_SUPPORTED_THING_TYPES;
+    public final int ENERGY_SUBSCRIPTION_PERIOD = 10; // minutes
+    private @Nullable ScheduledFuture<?> notificationSchedule;
 
     public OpenWebNetEnergyHandler(Thing thing) {
         super(thing);
     }
 
+    public Boolean isFirstSchedulerLaunch = true;
+
+    @Override
+    public void initialize() {
+        super.initialize();
+
+        // In order to get data from the probe we must send a command over the bus, this could be done only when the
+        // bridge is online.
+        // a) usual flow: binding is starting, the bridge isn't online (startup flow not yet completed) --> subscriber
+        // can't be started here, it will be started inside the bridgeStatusChanged event.
+        // b) thing's discovery: binding is up and running, the bridge is online --> subscriber must be started here
+        // otherwise data will be read only after a reboot.
+
+        OpenWebNetBridgeHandler h = bridgeHandler;
+        if (h != null && h.isBusGateway()) {
+            OpenGateway gw = h.gateway;
+            if (gw != null && gw.isConnected()) {
+                // bridge is online
+                subscribeToActivePowerChanges();
+            }
+        }
+    }
+
+    @Override
+    public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
+        super.bridgeStatusChanged(bridgeStatusInfo);
+
+        // subscribe the scheduler only after the bridge is online
+        if (bridgeStatusInfo.getStatus().equals(ThingStatus.ONLINE)) {
+            subscribeToActivePowerChanges();
+        }
+    }
+
+    private void subscribeToActivePowerChanges() {
+        notificationSchedule = scheduler.scheduleAtFixedRate(() -> {
+            if (isFirstSchedulerLaunch) {
+                logger.debug(
+                        "subscribeToActivePowerChanges() For WHERE={} subscribing to active power changes notification for the next {}min",
+                        deviceWhere, ENERGY_SUBSCRIPTION_PERIOD);
+            } else {
+                logger.debug(
+                        "subscribeToActivePowerChanges() Refreshing subscription for the next {}min for WHERE={} to active power changes notification",
+                        ENERGY_SUBSCRIPTION_PERIOD, deviceWhere);
+            }
+
+            try {
+                bridgeHandler.gateway.send(EnergyManagement.setActivePowerNotificationsTime(deviceWhere.value(),
+                        ENERGY_SUBSCRIPTION_PERIOD));
+                isFirstSchedulerLaunch = false;
+            } catch (Exception e) {
+                if (isFirstSchedulerLaunch) {
+                    logger.warn(
+                            "subscribeToActivePowerChanges() For WHERE={} could not subscribe to active power changes notifications. Exception={}",
+                            deviceWhere, e.getMessage());
+                } else {
+                    logger.warn(
+                            "subscribeToActivePowerChanges() Unable to refresh subscription to active power changes notifications for WHERE={}. Exception={}",
+                            deviceWhere, e.getMessage());
+                }
+            }
+        }, 0, ENERGY_SUBSCRIPTION_PERIOD - 1, TimeUnit.MINUTES);
+    }
+
+    @Override
+    public void dispose() {
+        if (notificationSchedule != null) {
+            logger.debug("dispose() scheduler stopped.");
+
+            notificationSchedule.cancel(false);
+        }
+        super.dispose();
+    }
+
     @Override
     protected Where buildBusWhere(String wStr) throws IllegalArgumentException {
         return new WhereEnergyManagement(wStr);
@@ -99,7 +181,12 @@ public class OpenWebNetEnergyHandler extends OpenWebNetThingHandler {
                     msg);
             return;
         } else {
-            updateActivePower(msg);
+            // fix: check for correct DIM (ActivePower / 113)
+            if (msg.getDim().equals(DIM.ACTIVE_POWER))
+                updateActivePower(msg);
+            else
+                logger.debug("handleMessage() Ignoring message {} because it's not related to active power value.",
+                        msg);
         }
     }