[insteon] Fix duplicate scene entry feature listeners (#18275)
Signed-off-by: Jeremy Setton <jeremy.setton@gmail.com>pull/18285/head
parent
f4338cc7a1
commit
1b6e2376f5
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue