]> git.basschouten.com Git - openhab-addons.git/commitdiff
[neohub] check for connection refused (#12906)
authorAndrew Fiddian-Green <software@whitebear.ch>
Wed, 8 Jun 2022 06:45:35 +0000 (08:45 +0200)
committerGitHub <noreply@github.com>
Wed, 8 Jun 2022 06:45:35 +0000 (08:45 +0200)
Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
bundles/org.openhab.binding.neohub/README.md
bundles/org.openhab.binding.neohub/src/main/java/org/openhab/binding/neohub/internal/NeoHubBindingConstants.java
bundles/org.openhab.binding.neohub/src/main/java/org/openhab/binding/neohub/internal/NeoHubHandler.java

index 7e9e3a427c53fd6bbc530ed12531e4ed48a33f09..9b0b64eb174f3cf86b5275035bbd7ea7ae73d861 100644 (file)
@@ -39,7 +39,15 @@ Before the binding can communicate with the hub, the following Configuration Par
 | portNumber              | Port number of the NeoHub (Default=4242)                                                    |
 | pollingInterval         | Time (seconds) between polling requests to the NeoHub (Min=4, Max=60, Default=60)           |
 | socketTimeout           | Time (seconds) to allow for TCP socket connections to the hub to succeed (Min=4, Max=20, Default=5) |
-| preferLegacyApi         | Prefer if the binding should use the legacy API; this only works so long as the legacy API is still supported; otherwise the binding will switch to the new API anyway (Default=false) |
+| preferLegacyApi         | ADVANCED: Prefer the binding to use older API calls; if these are not supported, it switches to the new calls (Default=false) |
+
+## Connection Refused Errors
+
+From early 2022 Heatmiser introduced NeoHub firmware that has the ability to enable / disable the NeoHub `portNumber` 4242.
+If this port is disabled the OpenHAB binding cannot connect and the binding will report a *"Connection Refused"* warning in the log.
+In prior firmware versions the port was always enabled.
+But in the new firmware the port is initially enabled on power up but if no communication occurs for 48 hours it is automatically disabled.
+Alternatively the Heatmiser mobile App has a setting (Settings | System | API Access | Legacy API Enable | On) whereby the port can be permanently enabled.
 
 ## Thing Configuration for "NeoStat" and "NeoPlug"
 
index 997ae17cf46699fd5835e75661cd132410da6c2a..710328cf325b119a2e58cc635c40aedc7a5a62f8 100644 (file)
@@ -157,6 +157,7 @@ public class NeoHubBindingConstants {
     public static final String CMD_CODE_TIMER = "{\"TIMER_%s\":\"%s\"}";
     public static final String CMD_CODE_MANUAL = "{\"MANUAL_%s\":\"%s\"}";
     public static final String CMD_CODE_READ_DCB = "{\"READ_DCB\":100}";
+    public static final String CMD_CODE_FIRMWARE = "{\"FIRMWARE\":0}";
 
     /*
      * note: from NeoHub rev2.6 onwards the INFO command is "deprecated" and it
index 53eb9ea994068caf9b6b6cc6dedc7a8c6f32a162..be17626a9a7199027a6c1d86d1fba870a2127802 100644 (file)
@@ -58,6 +58,8 @@ import com.google.gson.JsonSyntaxException;
 @NonNullByDefault
 public class NeoHubHandler extends BaseBridgeHandler {
 
+    private static final String SEE_README = "See documentation chapter \"Connection Refused Errors\"";
+
     private final Logger logger = LoggerFactory.getLogger(NeoHubHandler.class);
 
     private final Map<String, Boolean> connectionStates = new HashMap<>();
@@ -140,9 +142,26 @@ public class NeoHubHandler extends BaseBridgeHandler {
             logger.debug("hub '{}' preferLegacyApi={}", getThing().getUID(), config.preferLegacyApi);
         }
 
-        socket = new NeoHubSocket(config.hostName, config.portNumber, config.socketTimeout);
+        NeoHubSocket socket = this.socket = new NeoHubSocket(config.hostName, config.portNumber, config.socketTimeout);
         this.config = config;
 
+        /*
+         * Try to 'ping' the hub, and if there is a 'connection refused', it is probably due to the mobile App |
+         * Settings | Legacy API Enable switch not being On, so go offline and log a warning message.
+         */
+        try {
+            socket.sendMessage(CMD_CODE_FIRMWARE);
+        } catch (IOException e) {
+            String error = e.getMessage();
+            if (error != null && error.toLowerCase().startsWith("connection refused")) {
+                logger.warn("CONNECTION REFUSED!! (hub '{}') => {}", getThing().getUID(), SEE_README);
+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, SEE_README);
+                return;
+            }
+        } catch (NeoHubException e) {
+            // NeoHubException won't actually occur here
+        }
+
         if (logger.isDebugEnabled()) {
             logger.debug("hub '{}' start background polling..", getThing().getUID());
         }