[insteon] Fix duplicate scene entry feature listeners (#18275)

Signed-off-by: Jeremy Setton <jeremy.setton@gmail.com>
pull/18285/head
Jeremy 2025-02-16 18:28:10 -05:00 committed by GitHub
parent f4338cc7a1
commit 1b6e2376f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 95 deletions

View File

@ -226,92 +226,61 @@ public class SceneCommand extends InsteonCommand {
InsteonDevice device = getInsteonDevice(args[2]);
if (device == null) {
console.println("The device " + args[2] + " is not configured or enabled!");
return;
}
DeviceFeature feature = device.getFeature(args[3]);
if (feature == null) {
console.println("The device " + args[2] + " feature " + args[3] + " is not configured!");
return;
}
if (!feature.isResponderFeature()) {
console.println("The device " + args[2] + " feature " + args[3] + " is not a responder feature.");
return;
}
if (!device.getLinkDB().isComplete()) {
} else if (!device.getLinkDB().isComplete()) {
console.println("The link database for device " + args[2] + " is not loaded yet.");
return;
}
if (!device.getLinkDB().getChanges().isEmpty()) {
console.println("The link database for device " + args[2] + " has pending changes.");
return;
}
if (!getModem().getDB().isComplete()) {
} else if (!getModem().getDB().isComplete()) {
console.println("The modem database is not loaded yet.");
return;
}
if (!getModem().getDB().getChanges().isEmpty()) {
console.println("The modem database has pending changes.");
return;
}
int onLevel = OnLevel.getHexValue(args[4], feature.getType());
if (onLevel == -1) {
console.println("The feature " + args[3] + " onLevel " + args[4] + " is not valid.");
return;
}
RampRate rampRate = null;
if (RampRate.supportsFeatureType(feature.getType())) {
rampRate = args.length == 6 ? RampRate.fromString(args[5]) : RampRate.DEFAULT;
if (rampRate == null) {
console.println("The feature " + args[3] + " rampRate " + args[5] + " is not valid.");
return;
} else {
DeviceFeature feature = device.getFeature(args[3]);
if (feature == null) {
console.println("The device " + args[2] + " feature " + args[3] + " is not configured!");
} else if (!feature.isResponderFeature()) {
console.println("The device " + args[2] + " feature " + args[3] + " is not a responder feature.");
} else {
int onLevel = OnLevel.getHexValue(args[4], feature.getType());
if (onLevel == -1) {
console.println("The feature " + args[3] + " onLevel " + args[4] + " is not valid.");
return;
}
RampRate rampRate = null;
if (RampRate.supportsFeatureType(feature.getType())) {
rampRate = args.length == 6 ? RampRate.fromString(args[5]) : RampRate.DEFAULT;
if (rampRate == null) {
console.println("The feature " + args[3] + " rampRate " + args[5] + " is not valid.");
return;
}
}
console.println("Adding device " + device.getAddress() + " feature " + feature.getName() + " to scene "
+ scene.getGroup() + ".");
scene.addDeviceFeature(device, onLevel, rampRate, feature.getComponentId());
}
}
console.println("Adding device " + device.getAddress() + " feature " + feature.getName() + " to scene "
+ scene.getGroup() + ".");
scene.addDeviceFeature(device, onLevel, rampRate, feature.getComponentId());
}
private void removeDevice(Console console, String[] args) {
InsteonScene scene = getInsteonScene(args[1]);
InsteonDevice device = getInsteonDevice(args[2]);
if (scene == null) {
console.println("The scene " + args[1] + " is not configured or enabled!");
return;
}
InsteonDevice device = getInsteonDevice(args[2]);
if (device == null) {
} else if (device == null) {
console.println("The device " + args[2] + " is not configured or enabled!");
return;
}
DeviceFeature feature = device.getFeature(args[3]);
if (feature == null) {
console.println("The device " + args[2] + " feature " + args[3] + " is not configured!");
return;
}
if (!device.getLinkDB().isComplete()) {
} else if (!device.getLinkDB().isComplete()) {
console.println("The link database for device " + args[2] + " is not loaded yet.");
return;
}
if (!device.getLinkDB().getChanges().isEmpty()) {
console.println("The link database for device " + args[2] + " has pending changes.");
return;
}
if (!getModem().getDB().isComplete()) {
} else if (!getModem().getDB().isComplete()) {
console.println("The modem database is not loaded yet.");
return;
} else {
DeviceFeature feature = device.getFeature(args[3]);
if (feature == null) {
console.println("The device " + args[2] + " feature " + args[3] + " is not configured!");
} else if (!scene.hasEntry(device.getAddress(), feature.getName())) {
console.println("The device " + args[2] + " feature " + args[3] + " is not associated to scene"
+ args[1] + ".");
} else {
console.println("Removing device " + device.getAddress() + " feature " + feature.getName()
+ " from scene " + scene.getGroup() + ".");
scene.removeDeviceFeature(device, feature.getComponentId());
}
}
if (!getModem().getDB().getChanges().isEmpty()) {
console.println("The modem database has pending changes.");
return;
}
if (!scene.hasEntry(device.getAddress(), feature.getName())) {
console.println(
"The device " + args[2] + " feature " + args[3] + " is not associated to scene" + args[1] + ".");
return;
}
console.println("Removing device " + device.getAddress() + " feature " + feature.getName() + " from scene "
+ scene.getGroup() + ".");
scene.removeDeviceFeature(device, feature.getComponentId());
}
}

View File

@ -133,11 +133,10 @@ public class InsteonScene implements Scene {
* @param entry the scene entry to add
*/
private void addEntry(SceneEntry entry) {
logger.trace("adding entry to scene {}: {}", group, entry);
synchronized (entries) {
if (entries.add(entry)) {
entry.register();
logger.trace("added entry to scene {}: {}", group, entry);
}
}
}
@ -168,8 +167,6 @@ public class InsteonScene implements Scene {
* @param address the device address
*/
public void deleteEntries(InsteonAddress address) {
logger.trace("removing entries from scene {} for device {}", group, address);
getEntries(address).forEach(this::deleteEntry);
}
@ -177,9 +174,7 @@ public class InsteonScene implements Scene {
* Updates all entries for this scene
*/
public void updateEntries() {
synchronized (entries) {
entries.clear();
}
deleteEntries();
InsteonModem modem = getModem();
if (modem != null) {
@ -204,7 +199,7 @@ public class InsteonScene implements Scene {
logger.trace("updating entries for scene {} device {}", group, address);
getEntries(address).forEach(this::deleteEntry);
deleteEntries(address);
InsteonModem modem = getModem();
if (modem != null) {
@ -325,13 +320,17 @@ public class InsteonScene implements Scene {
public class SceneEntry implements FeatureListener {
private InsteonAddress address;
private DeviceFeature feature;
private byte[] data;
private State onState;
private @Nullable RampRate rampRate;
private State state = UnDefType.NULL;
public SceneEntry(InsteonAddress address, DeviceFeature feature, byte[] data) {
this.address = address;
this.feature = feature;
this.data = data;
this.onState = OnLevel.getState(Byte.toUnsignedInt(data[0]), feature.getType());
this.rampRate = RampRate.supportsFeatureType(feature.getType())
? RampRate.valueOf(Byte.toUnsignedInt(data[1]))
: null;
}
public InsteonAddress getAddress() {
@ -342,14 +341,6 @@ public class InsteonScene implements Scene {
return feature;
}
public State getOnState() {
return OnLevel.getState(Byte.toUnsignedInt(data[0]), feature.getType());
}
public RampRate getRampRate() {
return RampRate.valueOf(Byte.toUnsignedInt(data[1]));
}
public State getState() {
return state;
}
@ -359,7 +350,7 @@ public class InsteonScene implements Scene {
}
public boolean isStateOn() {
return getOnState().equals(state);
return onState.equals(state);
}
public void setState(State state) {
@ -378,9 +369,9 @@ public class InsteonScene implements Scene {
@Override
public String toString() {
String s = address + " " + feature.getName() + " currentState: " + state + " onState: " + getOnState();
if (RampRate.supportsFeatureType(feature.getType())) {
s += " rampRate: " + getRampRate();
String s = address + " " + feature.getName() + " currentState: " + state + " onState: " + onState;
if (rampRate != null) {
s += " rampRate: " + rampRate;
}
return s;
}