mirror of
https://github.com/Xevion/go-ha.git
synced 2025-12-05 23:15:07 -06:00
some tweaks/renames, schedule documentation
This commit is contained in:
86
app.go
86
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}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
}}
|
||||
|
||||
@@ -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(),
|
||||
}}
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ type scheduleBuilderEnd struct {
|
||||
schedule Schedule
|
||||
}
|
||||
|
||||
func ScheduleBuilder() scheduleBuilder {
|
||||
func NewSchedule() scheduleBuilder {
|
||||
return scheduleBuilder{
|
||||
Schedule{
|
||||
frequency: 0,
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user