fix 'all.*' conditions counting 'incapable' devices like sensors.

This commit is contained in:
2021-09-20 22:37:41 +02:00
parent 2f9bd3c007
commit 38d777404b
+36 -13
View File
@@ -101,31 +101,54 @@ func (c *EventCondition) check(key, value string, targets []Device) bool {
all := strings.HasPrefix(key, "all.")
if any || all {
count := 0
total := 0
for _, target := range targets {
if c.checkDevice(key[4:], target) {
count++
}
matches, skip := c.checkDevice(key[4:], target)
if skip {
continue
}
return (any && count > 0) || (all && count == len(targets))
if matches {
count++
}
total++
}
return (any && count > 0) || (all && count == total)
}
return c.matches(value)
}
func (c *EventCondition) checkDevice(key string, device Device) bool {
func (c *EventCondition) checkDevice(key string, device Device) (matches bool, skip bool) {
switch key {
case "power":
return c.matches(strconv.FormatBool(device.State.Power))
case "color":
return c.matches(device.State.Color.String())
case "intensity":
return c.matches(strconv.FormatFloat(device.State.Intensity, 'f', -1, 64))
case "temperature":
return c.matches(strconv.FormatFloat(device.State.Temperature, 'f', -1, 64))
if !device.HasCapability(DCPower) {
return false, true
}
return false
return c.matches(strconv.FormatBool(device.State.Power)), false
case "color":
if !device.HasCapability(DCColorKelvin, DCColorHS, DCColorHSK) {
return false, true
}
return c.matches(device.State.Color.String()), false
case "intensity":
if !device.HasCapability(DCIntensity) {
return false, true
}
return c.matches(strconv.FormatFloat(device.State.Intensity, 'f', -1, 64)), false
case "temperature":
if !device.HasCapability(DCTemperatureControl, DCTemperatureSensor) {
return false, true
}
return c.matches(strconv.FormatFloat(device.State.Temperature, 'f', -1, 64)), false
default:
return false, true
}
}
var numRegex = regexp.MustCompile("^{-[0-9].}+$")