You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

70 lines
1.6 KiB

package script
import (
"fmt"
lucifer3 "git.aiterp.net/lucifer3/server"
"git.aiterp.net/lucifer3/server/device"
"git.aiterp.net/lucifer3/server/events"
"github.com/google/uuid"
"strconv"
)
type TriggerEvent string
const (
TEButton TriggerEvent = "Button"
TETime TriggerEvent = "Time"
TETemperatureAbove TriggerEvent = "TemperatureAbove"
TETemperatureBelow TriggerEvent = "TemperatureBelow"
)
type Trigger struct {
ID uuid.UUID `json:"id"`
Event TriggerEvent `json:"event"`
DeviceMatch string `json:"deviceMatch"`
Parameter string `json:"parameter"`
ScriptTarget string `json:"scriptTarget"`
ScriptName string `json:"scriptName"`
ScriptPre []Line `json:"scriptPre"`
ScriptPost []Line `json:"scriptPost"`
}
func (t *Trigger) Check(event lucifer3.Event, res device.Resolver) bool {
devices := res.Resolve(t.DeviceMatch)
switch event := event.(type) {
case events.ButtonPressed:
if t.Event != TEButton {
return false
}
for _, dev := range devices {
if dev.ID == event.ID {
return t.Parameter == event.Name
}
}
case events.Time:
if t.Event != TETime {
return false
}
return fmt.Sprintf("%02d:%02d", event.Hour, event.Minute) == t.Parameter
case events.TemperatureChanged:
if t.Event != TETemperatureAbove && t.Event != TETemperatureBelow {
return false
}
num, err := strconv.ParseFloat(t.Parameter, 64)
if err != nil {
return false
}
for _, dev := range devices {
if dev.ID == event.ID {
return (event.Temperature >= num) == (t.Event == TETemperatureAbove)
}
}
}
return false
}