From ecb3248d07f9ef66a1d4bf948996f76685c74f5b Mon Sep 17 00:00:00 2001 From: M Valla <12682715+mvalla@users.noreply.github.com> Date: Sun, 20 Mar 2022 09:53:50 +0100 Subject: [PATCH] [openwebnet] fixed generic device thing-type; added a time limit to devices refresh at boot (#12489) Signed-off-by: Massimo Valla --- .../org.openhab.binding.openwebnet/README.md | 3 +- .../handler/OpenWebNetBridgeHandler.java | 66 ++++++++++++------- .../resources/OH-INF/thing/GenericDevice.xml | 2 +- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/bundles/org.openhab.binding.openwebnet/README.md b/bundles/org.openhab.binding.openwebnet/README.md index 043cfdb30f8a1..bbccb32565c2e 100644 --- a/bundles/org.openhab.binding.openwebnet/README.md +++ b/bundles/org.openhab.binding.openwebnet/README.md @@ -234,7 +234,8 @@ See [openwebnet.sitemap](#openwebnet-sitemap) & [openwebnet.rules](#openwebnet-r There are three WEEKLY and sixteen SCENARIO programs defined for the Central Unit. -In order to activate one of them you have to use two different channels: +In order to activate one of them you have to use two different channels: + - with `mode` you can set the mode (`WEEKLY` or `SCENARIO`) - with `weeklyProgram` (if `WEEKLY` was setted) or with `scenarioProgram` (if `SCENARIO` was setted) you can set the program number diff --git a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetBridgeHandler.java b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetBridgeHandler.java index e0b06291627c5..f28de749ab064 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetBridgeHandler.java +++ b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetBridgeHandler.java @@ -78,11 +78,16 @@ public class OpenWebNetBridgeHandler extends ConfigStatusBridgeHandler implement private static final int GATEWAY_ONLINE_TIMEOUT_SEC = 20; // Time to wait for the gateway to become connected - private static final int REFRESH_ALL_DEVICES_DELAY_MSEC = 500; // Delay to wait before sending all devices refresh - // request after a connect/reconnect - private static final int REFRESH_ALL_CHECK_DELAY_SEC = 20; + private static final int REFRESH_ALL_DEVICES_DELAY_MSEC = 500; // Delay to wait before trying again another all + // devices refresh request after a connect/reconnect + private static final int REFRESH_ALL_DEVICES_DELAY_MAX_MSEC = 15000; // Maximum delay to wait for all devices + // refresh after a connect/reconnect - private static long lastRegisteredDeviceTS = -1; // timestamp when the last device has been associated to the bridge + private static final int REFRESH_ALL_CHECK_DELAY_SEC = 20; // Delay to wait to check which devices are + // online/offline + + private long lastRegisteredDeviceTS = -1; // timestamp when the last device has been associated to the bridge + private long refreshAllDevicesDelay = 0; // delay waited before starting all devices refresh public static final Set SUPPORTED_THING_TYPES = OpenWebNetBindingConstants.BRIDGE_SUPPORTED_THING_TYPES; @@ -410,32 +415,43 @@ private void refreshAllBridgeDevices() { int total = things.size(); logger.debug("--- FOUND {} things by getThings()", total); if (total > 0) { - if (registeredDevices.isEmpty() - || (System.currentTimeMillis() - lastRegisteredDeviceTS < REFRESH_ALL_DEVICES_DELAY_MSEC)) { - // if a device has been registered with the bridge just now, let's wait for other devices: re-schedule + if (registeredDevices.isEmpty()) { // no registered device yet + if (refreshAllDevicesDelay < REFRESH_ALL_DEVICES_DELAY_MAX_MSEC) { + logger.debug("--- REGISTER device not started yet... re-scheduling refreshAllBridgeDevices()"); + refreshAllDevicesDelay += REFRESH_ALL_DEVICES_DELAY_MSEC * 3; + refreshAllSchedule = scheduler.schedule(this::refreshAllBridgeDevices, + REFRESH_ALL_DEVICES_DELAY_MSEC * 3, TimeUnit.MILLISECONDS); + return; + } else { + logger.warn( + "--- --- NONE OF {} CHILD DEVICE(S) has REGISTERED with bridge {}: check Things configuration (stopping refreshAllBridgeDevices)", + total, thing.getUID()); + refreshAllDevicesDelay = 0; + return; + } + } else if (System.currentTimeMillis() - lastRegisteredDeviceTS < REFRESH_ALL_DEVICES_DELAY_MSEC) { + // a device has been registered with the bridge just now, let's wait for other devices: re-schedule // refreshAllDevices - logger.debug( - "--- REGISTER device not started or just called... re-scheduling refreshAllBridgeDevices()"); + logger.debug("--- REGISTER device just called... re-scheduling refreshAllBridgeDevices()"); refreshAllSchedule = scheduler.schedule(this::refreshAllBridgeDevices, REFRESH_ALL_DEVICES_DELAY_MSEC, TimeUnit.MILLISECONDS); - } else { - for (Thing ownThing : things) { - OpenWebNetThingHandler hndlr = (OpenWebNetThingHandler) ownThing.getHandler(); - if (hndlr != null) { - howMany++; - logger.debug("--- REFRESHING ALL DEVICES FOR thing #{}/{}: {}", howMany, total, - ownThing.getUID()); - hndlr.refreshAllDevices(); - } else { - logger.warn("--- No handler for thing {}", ownThing.getUID()); - } + return; + } + for (Thing ownThing : things) { + OpenWebNetThingHandler hndlr = (OpenWebNetThingHandler) ownThing.getHandler(); + if (hndlr != null) { + howMany++; + logger.debug("--- REFRESHING ALL DEVICES FOR thing #{}/{}: {}", howMany, total, ownThing.getUID()); + hndlr.refreshAllDevices(); + } else { + logger.warn("--- No handler for thing {}", ownThing.getUID()); } - logger.debug("--- --- COMPLETED REFRESH all devices for bridge {}", thing.getUID()); - - // set a check that all things are Online - refreshAllSchedule = scheduler.schedule(() -> checkAllRefreshed(things), REFRESH_ALL_CHECK_DELAY_SEC, - TimeUnit.SECONDS); } + logger.debug("--- --- COMPLETED REFRESH all devices for bridge {}", thing.getUID()); + refreshAllDevicesDelay = 0; + // set a check that all things are Online + refreshAllSchedule = scheduler.schedule(() -> checkAllRefreshed(things), REFRESH_ALL_CHECK_DELAY_SEC, + TimeUnit.SECONDS); } else { logger.debug("--- --- NO CHILD DEVICE to REFRESH for bridge {}", thing.getUID()); } diff --git a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/GenericDevice.xml b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/GenericDevice.xml index 0cbfbce668cf8..830ee0e59ff79 100644 --- a/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/GenericDevice.xml +++ b/bundles/org.openhab.binding.openwebnet/src/main/resources/OH-INF/thing/GenericDevice.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> - +