[elroconnects] Set thingStatus earlier in initialize (#12877)

* Set thingStatus earlier in initialize
* Check device configuration
* Make sure to always set thing status
* Make thing status message localizable

Signed-off-by: Mark Herwege <mark.herwege@telenet.be>
This commit is contained in:
Mark Herwege 2022-06-05 13:19:12 +02:00 committed by GitHub
parent 29a45ef1ab
commit f5e5b5189a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 71 additions and 24 deletions

View File

@ -123,14 +123,15 @@ public class ElroConnectsDeviceCxsmAlarm extends ElroConnectsDevice {
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, String msg = String.format("@text/offline.device-not-syncing [ \"%d\" ]", deviceId);
"Device " + deviceId + " is not syncing with K1 hub"); handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
break; break;
case FAULT: case FAULT:
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Device " + deviceId + " has a fault"); msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
break; break;
default: default:
handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength)); handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength));

View File

@ -88,15 +88,16 @@ public class ElroConnectsDeviceEntrySensor extends ElroConnectsDevice {
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, String msg = String.format("@text/offline.device-not-syncing [ \"%d\" ]", deviceId);
"Device " + deviceId + " is not syncing with K1 hub"); handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
break; break;
case FAULT: case FAULT:
handler.updateState(ENTRY, UnDefType.UNDEF); handler.updateState(ENTRY, UnDefType.UNDEF);
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Device " + deviceId + " has a fault"); msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
break; break;
default: default:
handler.updateState(ENTRY, handler.updateState(ENTRY,

View File

@ -116,14 +116,15 @@ public class ElroConnectsDeviceGenericAlarm extends ElroConnectsDevice {
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, String msg = String.format("@text/offline.device-not-syncing [ \"%d\" ]", deviceId);
"Device " + deviceId + " is not syncing with K1 hub"); handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
break; break;
case FAULT: case FAULT:
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Device " + deviceId + " has a fault"); msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
break; break;
default: default:
handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength)); handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength));

View File

@ -87,15 +87,16 @@ public class ElroConnectsDeviceMotionSensor extends ElroConnectsDevice {
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, String msg = String.format("@text/offline.device-not-syncing [ \"%d\" ]", deviceId);
"Device " + deviceId + " is not syncing with K1 hub"); handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
break; break;
case FAULT: case FAULT:
handler.updateState(MOTION, UnDefType.UNDEF); handler.updateState(MOTION, UnDefType.UNDEF);
handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF); handler.updateState(SIGNAL_STRENGTH, UnDefType.UNDEF);
handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF); handler.updateState(BATTERY_LEVEL, UnDefType.UNDEF);
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Device " + deviceId + " has a fault"); msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
break; break;
default: default:
handler.updateState(MOTION, handler.updateState(MOTION,

View File

@ -69,6 +69,8 @@ public class ElroConnectsDevicePowerSocket extends ElroConnectsDevice {
String deviceStatus = this.deviceStatus; String deviceStatus = this.deviceStatus;
if (deviceStatus.length() < 6) { if (deviceStatus.length() < 6) {
logger.debug("Could not decode device status: {}", deviceStatus); logger.debug("Could not decode device status: {}", deviceStatus);
String msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
return; return;
} }
@ -81,8 +83,8 @@ public class ElroConnectsDevicePowerSocket extends ElroConnectsDevice {
: (STAT_OFF.equals(status) ? OnOffType.OFF : UnDefType.UNDEF); : (STAT_OFF.equals(status) ? OnOffType.OFF : UnDefType.UNDEF);
handler.updateState(POWER_STATE, state); handler.updateState(POWER_STATE, state);
if (UnDefType.UNDEF.equals(state)) { if (UnDefType.UNDEF.equals(state)) {
handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, String msg = String.format("@text/offline.device-not-syncing [ \"%d\" ]", deviceId);
"Device " + deviceId + " is not syncing with K1 hub"); handler.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
} else { } else {
handler.updateStatus(ThingStatus.ONLINE); handler.updateStatus(ThingStatus.ONLINE);
} }

View File

@ -75,7 +75,8 @@ public class ElroConnectsDeviceTemperatureSensor extends ElroConnectsDevice {
handler.updateState(LOW_BATTERY, UnDefType.UNDEF); handler.updateState(LOW_BATTERY, UnDefType.UNDEF);
handler.updateState(TEMPERATURE, UnDefType.UNDEF); handler.updateState(TEMPERATURE, UnDefType.UNDEF);
handler.updateState(HUMIDITY, UnDefType.UNDEF); handler.updateState(HUMIDITY, UnDefType.UNDEF);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Device " + deviceId + " has a fault"); String msg = String.format("@text/offline.device-fault [ \"%d\" ]", deviceId);
handler.updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, msg);
break; break;
default: default:
handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength)); handler.updateState(SIGNAL_STRENGTH, new DecimalType(signalStrength));

View File

@ -121,6 +121,8 @@ public class ElroConnectsAccountHandler extends BaseBridgeHandler {
login.put("password", password); login.put("password", password);
loginJson = gson.toJson(login); loginJson = gson.toJson(login);
updateStatus(ThingStatus.UNKNOWN);
// If background discovery is enabled, start polling (will do login first), else only login to take the thing // If background discovery is enabled, start polling (will do login first), else only login to take the thing
// online if successful // online if successful
if (enableBackgroundDiscovery) { if (enableBackgroundDiscovery) {

View File

@ -162,16 +162,18 @@ public class ElroConnectsBridgeHandler extends BaseBridgeHandler {
legacyFirmware = config.legacyFirmware; legacyFirmware = config.legacyFirmware;
if (connectorId.isEmpty()) { if (connectorId.isEmpty()) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "@text/offline.no-device-id"); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "@text/offline.no-connector-id");
return; return;
} else if (!CONNECTOR_ID_PATTERN.matcher(connectorId).matches()) { } else if (!CONNECTOR_ID_PATTERN.matcher(connectorId).matches()) {
String msg = String.format("@text/offline.invalid-device-id [ \"%s\" ]", connectorId); String msg = String.format("@text/offline.invalid-connector-id [ \"%s\" ]", connectorId);
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, msg);
return; return;
} }
queryString = QUERY_BASE_STRING + connectorId; queryString = QUERY_BASE_STRING + connectorId;
updateStatus(ThingStatus.UNKNOWN);
scheduler.submit(this::startCommunication); scheduler.submit(this::startCommunication);
} }

View File

@ -12,11 +12,14 @@
*/ */
package org.openhab.binding.elroconnects.internal.handler; package org.openhab.binding.elroconnects.internal.handler;
import static org.openhab.binding.elroconnects.internal.ElroConnectsBindingConstants.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.elroconnects.internal.ElroConnectsBindingConstants.ElroDeviceType;
import org.openhab.binding.elroconnects.internal.devices.ElroConnectsDevice; import org.openhab.binding.elroconnects.internal.devices.ElroConnectsDevice;
import org.openhab.binding.elroconnects.internal.util.ElroConnectsUtil; import org.openhab.binding.elroconnects.internal.util.ElroConnectsUtil;
import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Bridge;
@ -24,6 +27,7 @@ import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing; import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus; import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail; import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.thing.ThingStatusInfo;
import org.openhab.core.thing.binding.BaseThingHandler; import org.openhab.core.thing.binding.BaseThingHandler;
import org.openhab.core.types.Command; import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType; import org.openhab.core.types.RefreshType;
@ -49,13 +53,31 @@ public class ElroConnectsDeviceHandler extends BaseThingHandler {
deviceId = config.deviceId; deviceId = config.deviceId;
ElroConnectsBridgeHandler bridgeHandler = getBridgeHandler(); ElroConnectsBridgeHandler bridgeHandler = getBridgeHandler();
if (bridgeHandler == null) {
// Thing status has already been updated in getBridgeHandler()
return;
}
if (bridgeHandler != null) { if (bridgeHandler.getThing().getStatus() == ThingStatus.ONLINE) {
ElroConnectsDevice device = bridgeHandler.getDevice(deviceId);
if (device != null) {
ElroDeviceType deviceType = TYPE_MAP.get(device.getDeviceType());
if ((deviceType == null) || !thing.getThingTypeUID().equals(THING_TYPE_MAP.get(deviceType))) {
String msg = String.format("@text/offline.invalid-device-type [ \"%s\" ]", deviceType);
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, msg);
} else {
bridgeHandler.setDeviceHandler(deviceId, this); bridgeHandler.setDeviceHandler(deviceId, this);
updateProperties(bridgeHandler); updateProperties(bridgeHandler);
updateDeviceName(bridgeHandler); updateDeviceName(bridgeHandler);
refreshChannels(bridgeHandler); refreshChannels(bridgeHandler);
} }
} else {
String msg = String.format("@text/offline.invalid-device-id [ \"%d\" ]", deviceId);
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, msg);
}
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE);
}
} }
@Override @Override
@ -90,6 +112,15 @@ public class ElroConnectsDeviceHandler extends BaseThingHandler {
return bridgeHandler; return bridgeHandler;
} }
@Override
public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
if (bridgeStatusInfo.getStatus() == ThingStatus.ONLINE) {
initialize();
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE);
}
}
@Override @Override
public void handleCommand(ChannelUID channelUID, Command command) { public void handleCommand(ChannelUID channelUID, Command command) {
ElroConnectsBridgeHandler bridgeHandler = getBridgeHandler(); ElroConnectsBridgeHandler bridgeHandler = getBridgeHandler();

View File

@ -93,8 +93,8 @@ offline.credentials-error = Invalid username or password
offline.request-timeout = Request timeout offline.request-timeout = Request timeout
offline.request-failed = Request failed offline.request-failed = Request failed
offline.no-device-id = Device ID not set offline.no-connector-id = Connector ID not set
offline.invalid-device-id = Device ID {0} not of format ST_xxxxxxxxxxxx with xxxxxxxxxxxx the lowercase MAC address of the connector offline.invalid-connector-id = Connector ID {0} not of format ST_xxxxxxxxxxxx with xxxxxxxxxxxx the lowercase MAC address of the connector
offline.find-ip-fail = Error trying to find IP address for connector with ID {0} offline.find-ip-fail = Error trying to find IP address for connector with ID {0}
offline.communication-data-error = Communication data error while starting communication offline.communication-data-error = Communication data error while starting communication
offline.communication-error = Error in communication: {0} offline.communication-error = Error in communication: {0}
@ -104,3 +104,8 @@ offline.no-hub-address = Error in communication, hub address was not set
offline.no-bridge = No bridge defined for device: {0} offline.no-bridge = No bridge defined for device: {0}
offline.no-bridge-handler = No bridge handler defined for device: {0} offline.no-bridge-handler = No bridge handler defined for device: {0}
offline.invalid-device-id = Device ID {0} not defined in the connector
offline.invalid-device-type = Thing type does not match device type {0}
offline.device-not-syncing = Device {0} not syncing with K1 hub
offline.device-fault = Device {0} has a fault