import org.openhab.binding.windcentrale.internal.exception.InvalidAccessTokenException;
import org.openhab.binding.windcentrale.internal.handler.WindcentraleAccountHandler;
import org.openhab.binding.windcentrale.internal.handler.WindcentraleWindmillHandler;
+import org.openhab.binding.windcentrale.internal.listener.ThingStatusListener;
import org.openhab.core.config.discovery.AbstractDiscoveryService;
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
+import org.openhab.core.thing.Thing;
+import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingUID;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.thing.binding.ThingHandlerService;
* @author Wouter Born - Initial contribution
*/
@NonNullByDefault
-public class WindcentraleDiscoveryService extends AbstractDiscoveryService implements ThingHandlerService {
+public class WindcentraleDiscoveryService extends AbstractDiscoveryService
+ implements ThingHandlerService, ThingStatusListener {
private final Logger logger = LoggerFactory.getLogger(WindcentraleDiscoveryService.class);
private @NonNullByDefault({}) WindcentraleAccountHandler accountHandler;
public void deactivate() {
cancelDiscoveryJob();
super.deactivate();
+ accountHandler.removeThingStatusListener(this);
}
@Override
@Override
public void setThingHandler(ThingHandler handler) {
if (handler instanceof WindcentraleAccountHandler accountHandler) {
+ accountHandler.addThingStatusListener(this);
this.accountHandler = accountHandler;
}
}
@Override
protected void startScan() {
+ logger.debug("Discover windmills (manual discovery)");
cancelDiscoveryJob();
discoveryJob = scheduler.submit(this::discoverWindmills);
}
super.stopScan();
}
+ @Override
+ public void thingStatusChanged(Thing thing, ThingStatus status) {
+ if (ThingStatus.ONLINE.equals(status)) {
+ logger.debug("Discover windmills (account online)");
+ discoverWindmills();
+ }
+ }
+
private void cancelDiscoveryJob() {
Future<?> localDiscoveryJob = discoveryJob;
if (localDiscoveryJob != null) {
import java.util.Collection;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.openhab.binding.windcentrale.internal.config.AccountConfiguration;
import org.openhab.binding.windcentrale.internal.exception.FailedGettingDataException;
import org.openhab.binding.windcentrale.internal.exception.InvalidAccessTokenException;
+import org.openhab.binding.windcentrale.internal.listener.ThingStatusListener;
import org.openhab.core.io.net.http.HttpClientFactory;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.ChannelUID;
private final Logger logger = LoggerFactory.getLogger(WindcentraleAccountHandler.class);
private final HttpClientFactory httpClientFactory;
+ private final List<ThingStatusListener> thingStatusListeners = new CopyOnWriteArrayList<>();
private @Nullable WindcentraleAPI api;
private @Nullable Exception apiException;
this.httpClientFactory = httpClientFactory;
}
+ public void addThingStatusListener(ThingStatusListener listener) {
+ thingStatusListeners.add(listener);
+ listener.thingStatusChanged(thing, thing.getStatus());
+ }
+
@Override
public void dispose() {
Future<?> localFuture = initializeFuture;
public void handleCommand(ChannelUID channelUID, Command command) {
}
+ public void removeThingStatusListener(ThingStatusListener listener) {
+ thingStatusListeners.remove(listener);
+ }
+
+ @Override
+ protected void updateStatus(ThingStatus status, ThingStatusDetail detail, @Nullable String comment) {
+ ThingStatus oldStatus = thing.getStatus();
+ super.updateStatus(status, detail, comment);
+ ThingStatus newStatus = thing.getStatus();
+
+ if (!oldStatus.equals(newStatus)) {
+ logger.debug("Updating listeners with status {}", status);
+ for (ThingStatusListener listener : thingStatusListeners) {
+ listener.thingStatusChanged(thing, status);
+ }
+ }
+ }
+
private void updateThingStatus() {
Exception e = apiException;
if (e != null) {
--- /dev/null
+/**
+ * Copyright (c) 2010-2023 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.windcentrale.internal.listener;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.core.thing.Thing;
+import org.openhab.core.thing.ThingStatus;
+
+/**
+ * Interface for listeners of thing status changes.
+ *
+ * @author Wouter Born - Initial contribution
+ */
+@NonNullByDefault
+public interface ThingStatusListener {
+
+ public void thingStatusChanged(Thing thing, ThingStatus status);
+}