Skip to content

Commit

Permalink
[openwebnet] fixed generic device thing-type; added a time limit to d…
Browse files Browse the repository at this point in the history
…evices refresh at boot (openhab#12489)

Signed-off-by: Massimo Valla <mvcode00@gmail.com>
Signed-off-by: Nick Waterton <n.waterton@outlook.com>
  • Loading branch information
mvalla authored and NickWaterton committed Apr 27, 2022
1 parent 247decd commit 840a57f
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 27 deletions.
3 changes: 2 additions & 1 deletion bundles/org.openhab.binding.openwebnet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ThingTypeUID> SUPPORTED_THING_TYPES = OpenWebNetBindingConstants.BRIDGE_SUPPORTED_THING_TYPES;

Expand Down Expand Up @@ -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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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">

<!-- OpenWebNet Generic Device -->
<thing-type id="device">
<thing-type id="generic_device">
<supported-bridge-type-refs>
<bridge-type-ref id="bus_gateway"/>
<bridge-type-ref id="zb_gateway"/>
Expand Down

0 comments on commit 840a57f

Please sign in to comment.