From b0804e39d0697059c4ddefe2324274bf4af5670f Mon Sep 17 00:00:00 2001 From: Sam Lewis Date: Tue, 1 Nov 2022 01:20:15 -0400 Subject: [PATCH] some tweaks/renames, schedule documentation --- app.go | 86 +++++++++++++++++++++++++--------------------- entitylistener.go | 3 +- eventListener.go | 3 +- example/example.go | 18 +++++----- schedule.go | 2 +- service.go | 2 +- 6 files changed, 61 insertions(+), 53 deletions(-) diff --git a/app.go b/app.go index 0625827..f0450ba 100644 --- a/app.go +++ b/app.go @@ -41,16 +41,16 @@ type timeRange struct { } /* -NewApp establishes the websocket connection and returns an object +App establishes the websocket connection and returns an object you can use to register schedules and listeners. */ -func NewApp(connString string) *app { +func App(connString string) *app { token := os.Getenv("HA_AUTH_TOKEN") conn, ctx, ctxCancel := ws.SetupConnection(connString, token) httpClient := http.NewHttpClient(connString, token) - service := NewService(conn, ctx, httpClient) + service := newService(conn, ctx, httpClient) state := newState(httpClient) return &app{ @@ -72,54 +72,60 @@ func (a *app) Cleanup() { } } -func (a *app) RegisterSchedule(s Schedule) { - // realStartTime already set for sunset/sunrise - if s.isSunrise || s.isSunset { - a.schedules.Insert(s, float64(s.realStartTime.Unix())) - return - } +func (a *app) RegisterSchedules(schedules ...Schedule) { + for _, s := range schedules { + // realStartTime already set for sunset/sunrise + if s.isSunrise || s.isSunset { + a.schedules.Insert(s, float64(s.realStartTime.Unix())) + return + } - if s.frequency == 0 { - panic("A schedule must use either Daily() or Every() when built.") - } + if s.frequency == 0 { + panic("A schedule must use either Daily() or Every() when built.") + } - now := time.Now() - startTime := carbon.Now().StartOfDay().Carbon2Time() - // apply offset if set - if s.offset.Minutes() > 0 { - startTime = startTime.Add(s.offset) - } + now := time.Now() + startTime := carbon.Now().StartOfDay().Carbon2Time() + // apply offset if set + if s.offset.Minutes() > 0 { + startTime = startTime.Add(s.offset) + } - // advance first scheduled time by frequency until it is in the future - for startTime.Before(now) { - startTime = startTime.Add(s.frequency) - } + // advance first scheduled time by frequency until it is in the future + for startTime.Before(now) { + startTime = startTime.Add(s.frequency) + } - s.realStartTime = startTime - a.schedules.Insert(s, float64(startTime.Unix())) + s.realStartTime = startTime + a.schedules.Insert(s, float64(startTime.Unix())) + } } -func (a *app) RegisterEntityListener(etl EntityListener) { - if etl.delay != 0 && etl.toState == "" { - panic("EntityListener error: you have to use ToState() when using Duration()") - } +func (a *app) RegisterEntityListeners(etls ...EntityListener) { + for _, etl := range etls { + if etl.delay != 0 && etl.toState == "" { + panic("EntityListener error: you have to use ToState() when using Duration()") + } - for _, entity := range etl.entityIds { - if elList, ok := a.entityListeners[entity]; ok { - a.entityListeners[entity] = append(elList, &etl) - } else { - a.entityListeners[entity] = []*EntityListener{&etl} + for _, entity := range etl.entityIds { + if elList, ok := a.entityListeners[entity]; ok { + a.entityListeners[entity] = append(elList, &etl) + } else { + a.entityListeners[entity] = []*EntityListener{&etl} + } } } } -func (a *app) RegisterEventListener(evl EventListener) { - for _, eventType := range evl.eventTypes { - if elList, ok := a.eventListeners[eventType]; ok { - a.eventListeners[eventType] = append(elList, &evl) - } else { - ws.SubscribeToEventType(eventType, a.conn, a.ctx) - a.eventListeners[eventType] = []*EventListener{&evl} +func (a *app) RegisterEventListeners(evls ...EventListener) { + for _, evl := range evls { + for _, eventType := range evl.eventTypes { + if elList, ok := a.eventListeners[eventType]; ok { + a.eventListeners[eventType] = append(elList, &evl) + } else { + ws.SubscribeToEventType(eventType, a.conn, a.ctx) + a.eventListeners[eventType] = []*EventListener{&evl} + } } } } diff --git a/entitylistener.go b/entitylistener.go index 67ca2a5..5d043f8 100644 --- a/entitylistener.go +++ b/entitylistener.go @@ -26,6 +26,7 @@ type EntityListener struct { exceptionRanges []timeRange } +// TODO: add state object as second arg type EntityListenerCallback func(*Service, EntityData) type EntityData struct { @@ -60,7 +61,7 @@ type msgState struct { /* Methods */ -func EntityListenerBuilder() elBuilder1 { +func NewEntityListener() elBuilder1 { return elBuilder1{EntityListener{ lastRan: carbon.Now().StartOfCentury(), }} diff --git a/eventListener.go b/eventListener.go index 424fb71..2317e4f 100644 --- a/eventListener.go +++ b/eventListener.go @@ -21,6 +21,7 @@ type EventListener struct { exceptionRanges []timeRange } +// TODO: add state object as second arg type EventListenerCallback func(*Service, EventData) type EventData struct { @@ -30,7 +31,7 @@ type EventData struct { /* Methods */ -func EventListenerBuilder() eventListenerBuilder1 { +func NewEventListener() eventListenerBuilder1 { return eventListenerBuilder1{EventListener{ lastRan: carbon.Now().StartOfCentury(), }} diff --git a/example/example.go b/example/example.go index 7b207d2..6b3ffa3 100644 --- a/example/example.go +++ b/example/example.go @@ -9,39 +9,39 @@ import ( ) func main() { - app := ga.NewApp("0.0.0.0:8123") // Replace with your Home Assistant IP Address + app := ga.App("0.0.0.0:8123") // Replace with your Home Assistant IP Address defer app.Cleanup() pantryDoor := ga. - EntityListenerBuilder(). + NewEntityListener(). EntityIds("binary_sensor.pantry_door"). Call(pantryLights). Build() _11pmSched := ga. - ScheduleBuilder(). + NewSchedule(). Call(lightsOut). Daily(). At("23:00"). Build() _30minsBeforeSunrise := ga. - ScheduleBuilder(). + NewSchedule(). Call(sunriseSched). Daily(). Sunrise(app, "-30m"). Build() zwaveEventListener := ga. - EventListenerBuilder(). + NewEventListener(). EventTypes("zwave_js_value_notification"). Call(onEvent). Build() - app.RegisterEntityListener(pantryDoor) - app.RegisterSchedule(_11pmSched) - app.RegisterSchedule(_30minsBeforeSunrise) - app.RegisterEventListener(zwaveEventListener) + app.RegisterEntityListeners(pantryDoor) + app.RegisterSchedules(_11pmSched) + app.RegisterSchedules(_30minsBeforeSunrise) + app.RegisterEventListeners(zwaveEventListener) app.Start() diff --git a/schedule.go b/schedule.go index 97ada92..13a4c1a 100644 --- a/schedule.go +++ b/schedule.go @@ -50,7 +50,7 @@ type scheduleBuilderEnd struct { schedule Schedule } -func ScheduleBuilder() scheduleBuilder { +func NewSchedule() scheduleBuilder { return scheduleBuilder{ Schedule{ frequency: 0, diff --git a/service.go b/service.go index a5f08fb..55ea84f 100644 --- a/service.go +++ b/service.go @@ -20,7 +20,7 @@ type Service struct { InputNumber *services.InputNumber } -func NewService(conn *websocket.Conn, ctx context.Context, httpClient *http.HttpClient) *Service { +func newService(conn *websocket.Conn, ctx context.Context, httpClient *http.HttpClient) *Service { return &Service{ Light: services.BuildService[services.Light](conn, ctx), HomeAssistant: services.BuildService[services.HomeAssistant](conn, ctx),