| 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"
@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<>();
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());
}