Browse Source

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

pull/1/head
Gisle Aune 3 years ago
parent
commit
38d777404b
  1. 41
      models/eventhandler.go

41
models/eventhandler.go

@ -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) {
matches, skip := c.checkDevice(key[4:], target)
if skip {
continue
}
if matches {
count++
}
total++
}
return (any && count > 0) || (all && count == len(targets))
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))
if !device.HasCapability(DCPower) {
return false, true
}
return c.matches(strconv.FormatBool(device.State.Power)), false
case "color":
return c.matches(device.State.Color.String())
if !device.HasCapability(DCColorKelvin, DCColorHS, DCColorHSK) {
return false, true
}
return c.matches(device.State.Color.String()), false
case "intensity":
return c.matches(strconv.FormatFloat(device.State.Intensity, 'f', -1, 64))
if !device.HasCapability(DCIntensity) {
return false, true
}
return c.matches(strconv.FormatFloat(device.State.Intensity, 'f', -1, 64)), false
case "temperature":
return c.matches(strconv.FormatFloat(device.State.Temperature, 'f', -1, 64))
}
if !device.HasCapability(DCTemperatureControl, DCTemperatureSensor) {
return false, true
}
return false
return c.matches(strconv.FormatFloat(device.State.Temperature, 'f', -1, 64)), false
default:
return false, true
}
}
var numRegex = regexp.MustCompile("^{-[0-9].}+$")

Loading…
Cancel
Save