[tado] Automatically reconnect offline Things if possible (#12868)

* [tado] reconnect offline things if possible & allowed
* [tado] bridge should ping the server every polling cycle

Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
This commit is contained in:
Andrew Fiddian-Green 2022-06-04 20:37:30 +02:00 committed by GitHub
parent 44b1d0c0c1
commit 3f4d1f041d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -34,9 +34,11 @@ import org.openhab.binding.tado.internal.config.TadoHomeConfig;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.thing.binding.BaseBridgeHandler;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
import org.openhab.core.types.State;
@ -85,12 +87,19 @@ public class TadoHomeHandler extends BaseBridgeHandler {
}
private void initializeBridgeStatusAndPropertiesIfOffline() {
Bridge bridge = getBridge();
if (bridge != null && bridge.getStatus() == ThingStatus.ONLINE) {
return;
if (getThing().getStatus() == ThingStatus.ONLINE) {
for (Thing thing : getThing().getThings()) {
ThingHandler handler = thing.getHandler();
if ((handler instanceof BaseHomeThingHandler) && (thing.getStatus() == ThingStatus.OFFLINE)
&& (thing.getStatusInfo().getStatusDetail() == ThingStatusDetail.COMMUNICATION_ERROR)) {
scheduler.submit(() -> handler.bridgeStatusChanged(getThing().getStatusInfo()));
}
}
}
try {
// if we are already online, don't make unnecessary calls on the server
if (getThing().getStatus() != ThingStatus.ONLINE) {
// Get user info to verify successful authentication and connection to server
User user = api.showUser();
if (user == null) {
@ -113,7 +122,9 @@ public class TadoHomeHandler extends BaseBridgeHandler {
}
homeId = firstHomeId.longValue();
}
// but always make one server call as a 'ping' to confirm we are really still online
HomeInfo homeInfo = api.showHome(homeId);
TemperatureUnit temperatureUnit = org.openhab.binding.tado.internal.api.model.TemperatureUnit.FAHRENHEIT == homeInfo
.getTemperatureUnit() ? TemperatureUnit.FAHRENHEIT : TemperatureUnit.CELSIUS;