]> git.basschouten.com Git - openhab-addons.git/commitdiff
[solax] Implementation of refresh command and improved thread safety (#15958)
authorKonstantin Polihronov <polychronov@gmail.com>
Mon, 27 Nov 2023 23:29:16 +0000 (01:29 +0200)
committerGitHub <noreply@github.com>
Mon, 27 Nov 2023 23:29:16 +0000 (00:29 +0100)
* Implementation of refresh command and better multi-thread handling

---------

Signed-off-by: Konstantin Polihronov <polychronov@gmail.com>
bundles/org.openhab.binding.solax/src/main/java/org/openhab/binding/solax/internal/SolaxBindingConstants.java
bundles/org.openhab.binding.solax/src/main/java/org/openhab/binding/solax/internal/SolaxLocalAccessHandler.java

index 52c871747c28830aa3c4c256c18cacee22b224db..f527511d98227802bbf21f5827afb5b746b96268 100644 (file)
@@ -26,7 +26,7 @@ import org.openhab.core.thing.ThingTypeUID;
 @NonNullByDefault
 public class SolaxBindingConstants {
 
-    private static final String BINDING_ID = "solax";
+    protected static final String BINDING_ID = "solax";
     private static final String THING_LOCAL_CONNECT_INVERTER_ID = "local-connect-inverter";
 
     // List of all Thing Type UIDs
index d53e7aeb40ae2fbff4872c3f9f179e66afc20363..c08ede75b44055f8e904a60f380e4841e72f43a6 100644 (file)
@@ -19,6 +19,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
 
 import javax.measure.Quantity;
 import javax.measure.Unit;
@@ -42,6 +43,7 @@ import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.BaseThingHandler;
 import org.openhab.core.types.Command;
+import org.openhab.core.types.RefreshType;
 import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,6 +71,8 @@ public class SolaxLocalAccessHandler extends BaseThingHandler {
 
     private final Set<String> unsupportedExistingChannels = new HashSet<String>();
 
+    private final ReentrantLock retrieveDataCallLock = new ReentrantLock();
+
     public SolaxLocalAccessHandler(Thing thing) {
         super(thing);
     }
@@ -88,19 +92,25 @@ public class SolaxLocalAccessHandler extends BaseThingHandler {
     }
 
     private void retrieveData() {
-        try {
-            String rawJsonData = localHttpConnector.retrieveData();
-            logger.debug("Raw data retrieved = {}", rawJsonData);
-
-            if (rawJsonData != null && !rawJsonData.isEmpty()) {
-                updateFromData(rawJsonData);
-            } else {
-                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
-                        SolaxBindingConstants.I18N_KEY_OFFLINE_COMMUNICATION_ERROR_JSON_CANNOT_BE_RETRIEVED);
+        if (retrieveDataCallLock.tryLock()) {
+            try {
+                String rawJsonData = localHttpConnector.retrieveData();
+                logger.debug("Raw data retrieved = {}", rawJsonData);
+
+                if (rawJsonData != null && !rawJsonData.isEmpty()) {
+                    updateFromData(rawJsonData);
+                } else {
+                    updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
+                            SolaxBindingConstants.I18N_KEY_OFFLINE_COMMUNICATION_ERROR_JSON_CANNOT_BE_RETRIEVED);
+                }
+            } catch (IOException e) {
+                logger.debug("Exception received while attempting to retrieve data via HTTP", e);
+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());
+            } finally {
+                retrieveDataCallLock.unlock();
             }
-        } catch (IOException e) {
-            logger.debug("Exception received while attempting to retrieve data via HTTP", e);
-            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());
+        } else {
+            logger.debug("Unable to retrieve data because a request is already in progress.");
         }
     }
 
@@ -283,7 +293,11 @@ public class SolaxLocalAccessHandler extends BaseThingHandler {
 
     @Override
     public void handleCommand(ChannelUID channelUID, Command command) {
-        // Nothing to do here as of now. Maybe implement a REFRESH command in the future.
+        if (command instanceof RefreshType) {
+            scheduler.execute(this::retrieveData);
+        } else {
+            logger.debug("Binding {} only supports refresh command", SolaxBindingConstants.BINDING_ID);
+        }
     }
 
     @Override