package handlerfactory import ( "fmt" "git.aiterp.net/lucifer/new-server/models" ) func CreateHandlers( config FactoryConfig, scenes []models.Scene, existing []models.EventHandler, ) ([]models.EventHandler, []models.EventHandler) { switch config.Mode { case SceneDimmer: return sceneDimmer(config, scenes, existing) case MotionSensor: return motionSensor(config, existing) default: return []models.EventHandler{}, []models.EventHandler{} } } func sceneDimmer( config FactoryConfig, scenes []models.Scene, existing []models.EventHandler, ) ([]models.EventHandler, []models.EventHandler) { kind, refValue := models.ParseFetchString(config.Target) toRemove := make([]models.EventHandler, 0, 8) for _, old := range existing { if old.Conditions["deviceId"].EQ == config.TriggerDeviceID { toRemove = append(toRemove, old) } } resolvedScenes := make([]models.Scene, 0, len(config.SceneNames)) for _, name := range config.SceneNames { for _, scene := range scenes { if name == scene.Name { resolvedScenes = append(resolvedScenes, scene) break } } } if len(scenes) < 2 { return []models.EventHandler{}, []models.EventHandler{} } handlers := make([]models.EventHandler, 0, len(scenes)+4) handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "On"}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetPower: &myTrue}, From: config.FromTime(), To: config.ToTime(), }) handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "Off"}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetPower: &myFalse}, From: config.FromTime(), To: config.ToTime(), }) for i, scene := range resolvedScenes { if i > 0 { handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "DimDown"}, "any.scene": {EQ: fmt.Sprintf("%d", scene.ID)}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetScene: &models.DeviceSceneAssignment{ SceneID: resolvedScenes[i-1].ID, Group: refValue, DurationMS: 0, }}, From: config.FromTime(), To: config.ToTime(), }) } if i < len(resolvedScenes)-1 { handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "DimUp"}, "any.scene": {EQ: fmt.Sprintf("%d", scene.ID)}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetScene: &models.DeviceSceneAssignment{ SceneID: resolvedScenes[i+1].ID, Group: refValue, DurationMS: 0, }}, From: config.FromTime(), To: config.ToTime(), }) } } handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "DimDown"}, }, OneShot: false, Priority: 90, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetScene: &models.DeviceSceneAssignment{ SceneID: resolvedScenes[len(resolvedScenes)-1].ID, Group: refValue, DurationMS: 0, }}, From: config.FromTime(), To: config.ToTime(), }) handlers = append(handlers, models.EventHandler{ EventName: "ButtonPressed", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "buttonName": {EQ: "DimUp"}, }, OneShot: false, Priority: 90, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{SetScene: &models.DeviceSceneAssignment{ SceneID: resolvedScenes[0].ID, Group: refValue, DurationMS: 0, }}, From: config.FromTime(), To: config.ToTime(), }) return optimizeLists(handlers, toRemove) } func motionSensor( config FactoryConfig, existing []models.EventHandler, ) ([]models.EventHandler, []models.EventHandler) { kind, refValue := models.ParseFetchString(config.Target) toRemove := make([]models.EventHandler, 0, 8) for _, old := range existing { if old.From != config.FromTime() || old.To != config.ToTime() { continue } if old.Conditions["deviceId"].EQ == config.TriggerDeviceID { toRemove = append(toRemove, old) } } handlers := make([]models.EventHandler, 0, len(config.After)) for _, after := range config.After { if after.Minutes == 0 { handlers = append(handlers, models.EventHandler{ EventName: "SensorPresenceStarted", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{ SetPower: after.NewState.Power, SetColor: after.NewState.Color, SetIntensity: after.NewState.Intensity, SetTemperature: after.NewState.Temperature, }, From: config.FromTime(), To: config.ToTime(), }) } else { handlers = append(handlers, models.EventHandler{ EventName: "SensorPresenceEnded", Conditions: map[string]models.EventCondition{ "deviceId": {EQ: config.TriggerDeviceID}, "minutesElapsed": {EQ: fmt.Sprintf("%d", after.Minutes)}, }, OneShot: false, Priority: 100, TargetKind: kind, TargetValue: refValue, Actions: models.EventAction{ SetPower: after.NewState.Power, SetColor: after.NewState.Color, SetIntensity: after.NewState.Intensity, SetTemperature: after.NewState.Temperature, }, From: config.FromTime(), To: config.ToTime(), }) } } return optimizeLists(handlers, toRemove) } var myTrue = true var myFalse = false