Skip to content

Commit

Permalink
[mqtt.homeassistant] fix unbounded growth of config for device_trigger (
Browse files Browse the repository at this point in the history
openhab#17894)

Because of how it shares a channel, whenever openHAB was rebooted and it
would first restore the device trigger components from the channel configuration,
and then from the MQTT message, it didn't identify it as the same component
as before, and so would merge into another instance of itself. My Things.json
is normally 13MB, and had grown to 545MB, and my openHAB was constantly having
memory issues! So now just make sure we only keep unique information, which
will automatically clean up anyone in a bad state.

Signed-off-by: Cody Cutrer <[email protected]>
  • Loading branch information
ccutrer authored Dec 13, 2024
1 parent 334c909 commit c6f2fca
Showing 1 changed file with 12 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -111,17 +111,22 @@ public boolean merge(DeviceTrigger other) {
newConfiguration.put("nodeid", currentConfiguration.get("nodeid"));
Object objectIdObject = currentConfiguration.get("objectid");
if (objectIdObject instanceof String objectIdString) {
newConfiguration.put("objectid", List.of(objectIdString, other.getHaID().objectID));
if (!objectIdString.equals(other.getHaID().objectID)) {
newConfiguration.put("objectid", List.of(objectIdString, other.getHaID().objectID));
}
} else if (objectIdObject instanceof List<?> objectIdList) {
newConfiguration.put("objectid",
Stream.concat(objectIdList.stream(), Stream.of(other.getHaID().objectID)).toList());
newConfiguration.put("objectid", Stream.concat(objectIdList.stream(), Stream.of(other.getHaID().objectID))
.sorted().distinct().toList());
}
Object configObject = currentConfiguration.get("config");
if (configObject instanceof String configString) {
newConfiguration.put("config", List.of(configString, other.getChannelConfigurationJson()));
if (!configString.equals(other.getChannelConfigurationJson())) {
newConfiguration.put("config", List.of(configString, other.getChannelConfigurationJson()));
}
} else if (configObject instanceof List<?> configList) {
newConfiguration.put("config",
Stream.concat(configList.stream(), Stream.of(other.getChannelConfigurationJson())).toList());
Stream.concat(configList.stream(), Stream.of(other.getChannelConfigurationJson())).sorted()
.distinct().toList());
}

// Append payload to allowed values
Expand All @@ -130,7 +135,8 @@ public boolean merge(DeviceTrigger other) {
// Need to accept anything
value = new TextValue();
} else {
String[] newValues = Stream.concat(payloads.stream(), Stream.of(otherPayload)).toArray(String[]::new);
String[] newValues = Stream.concat(payloads.stream(), Stream.of(otherPayload)).distinct()
.toArray(String[]::new);
value = new TextValue(newValues);
}

Expand Down

0 comments on commit c6f2fca

Please sign in to comment.