mirror of
https://github.com/Xevion/go-ha.git
synced 2025-12-06 05:15:15 -06:00
some tweaks/renames, schedule documentation
This commit is contained in:
18
app.go
18
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.
|
you can use to register schedules and listeners.
|
||||||
*/
|
*/
|
||||||
func NewApp(connString string) *app {
|
func App(connString string) *app {
|
||||||
token := os.Getenv("HA_AUTH_TOKEN")
|
token := os.Getenv("HA_AUTH_TOKEN")
|
||||||
conn, ctx, ctxCancel := ws.SetupConnection(connString, token)
|
conn, ctx, ctxCancel := ws.SetupConnection(connString, token)
|
||||||
|
|
||||||
httpClient := http.NewHttpClient(connString, token)
|
httpClient := http.NewHttpClient(connString, token)
|
||||||
|
|
||||||
service := NewService(conn, ctx, httpClient)
|
service := newService(conn, ctx, httpClient)
|
||||||
state := newState(httpClient)
|
state := newState(httpClient)
|
||||||
|
|
||||||
return &app{
|
return &app{
|
||||||
@@ -72,7 +72,8 @@ func (a *app) Cleanup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *app) RegisterSchedule(s Schedule) {
|
func (a *app) RegisterSchedules(schedules ...Schedule) {
|
||||||
|
for _, s := range schedules {
|
||||||
// realStartTime already set for sunset/sunrise
|
// realStartTime already set for sunset/sunrise
|
||||||
if s.isSunrise || s.isSunset {
|
if s.isSunrise || s.isSunset {
|
||||||
a.schedules.Insert(s, float64(s.realStartTime.Unix()))
|
a.schedules.Insert(s, float64(s.realStartTime.Unix()))
|
||||||
@@ -98,8 +99,10 @@ func (a *app) RegisterSchedule(s Schedule) {
|
|||||||
s.realStartTime = startTime
|
s.realStartTime = startTime
|
||||||
a.schedules.Insert(s, float64(startTime.Unix()))
|
a.schedules.Insert(s, float64(startTime.Unix()))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (a *app) RegisterEntityListener(etl EntityListener) {
|
func (a *app) RegisterEntityListeners(etls ...EntityListener) {
|
||||||
|
for _, etl := range etls {
|
||||||
if etl.delay != 0 && etl.toState == "" {
|
if etl.delay != 0 && etl.toState == "" {
|
||||||
panic("EntityListener error: you have to use ToState() when using Duration()")
|
panic("EntityListener error: you have to use ToState() when using Duration()")
|
||||||
}
|
}
|
||||||
@@ -112,8 +115,10 @@ func (a *app) RegisterEntityListener(etl EntityListener) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (a *app) RegisterEventListener(evl EventListener) {
|
func (a *app) RegisterEventListeners(evls ...EventListener) {
|
||||||
|
for _, evl := range evls {
|
||||||
for _, eventType := range evl.eventTypes {
|
for _, eventType := range evl.eventTypes {
|
||||||
if elList, ok := a.eventListeners[eventType]; ok {
|
if elList, ok := a.eventListeners[eventType]; ok {
|
||||||
a.eventListeners[eventType] = append(elList, &evl)
|
a.eventListeners[eventType] = append(elList, &evl)
|
||||||
@@ -123,6 +128,7 @@ func (a *app) RegisterEventListener(evl EventListener) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func getSunriseSunset(a *app, sunrise bool, offset []DurationString) carbon.Carbon {
|
func getSunriseSunset(a *app, sunrise bool, offset []DurationString) carbon.Carbon {
|
||||||
printString := "Sunset"
|
printString := "Sunset"
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ type EntityListener struct {
|
|||||||
exceptionRanges []timeRange
|
exceptionRanges []timeRange
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: add state object as second arg
|
||||||
type EntityListenerCallback func(*Service, EntityData)
|
type EntityListenerCallback func(*Service, EntityData)
|
||||||
|
|
||||||
type EntityData struct {
|
type EntityData struct {
|
||||||
@@ -60,7 +61,7 @@ type msgState struct {
|
|||||||
|
|
||||||
/* Methods */
|
/* Methods */
|
||||||
|
|
||||||
func EntityListenerBuilder() elBuilder1 {
|
func NewEntityListener() elBuilder1 {
|
||||||
return elBuilder1{EntityListener{
|
return elBuilder1{EntityListener{
|
||||||
lastRan: carbon.Now().StartOfCentury(),
|
lastRan: carbon.Now().StartOfCentury(),
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ type EventListener struct {
|
|||||||
exceptionRanges []timeRange
|
exceptionRanges []timeRange
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: add state object as second arg
|
||||||
type EventListenerCallback func(*Service, EventData)
|
type EventListenerCallback func(*Service, EventData)
|
||||||
|
|
||||||
type EventData struct {
|
type EventData struct {
|
||||||
@@ -30,7 +31,7 @@ type EventData struct {
|
|||||||
|
|
||||||
/* Methods */
|
/* Methods */
|
||||||
|
|
||||||
func EventListenerBuilder() eventListenerBuilder1 {
|
func NewEventListener() eventListenerBuilder1 {
|
||||||
return eventListenerBuilder1{EventListener{
|
return eventListenerBuilder1{EventListener{
|
||||||
lastRan: carbon.Now().StartOfCentury(),
|
lastRan: carbon.Now().StartOfCentury(),
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -9,39 +9,39 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
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()
|
defer app.Cleanup()
|
||||||
|
|
||||||
pantryDoor := ga.
|
pantryDoor := ga.
|
||||||
EntityListenerBuilder().
|
NewEntityListener().
|
||||||
EntityIds("binary_sensor.pantry_door").
|
EntityIds("binary_sensor.pantry_door").
|
||||||
Call(pantryLights).
|
Call(pantryLights).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
_11pmSched := ga.
|
_11pmSched := ga.
|
||||||
ScheduleBuilder().
|
NewSchedule().
|
||||||
Call(lightsOut).
|
Call(lightsOut).
|
||||||
Daily().
|
Daily().
|
||||||
At("23:00").
|
At("23:00").
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
_30minsBeforeSunrise := ga.
|
_30minsBeforeSunrise := ga.
|
||||||
ScheduleBuilder().
|
NewSchedule().
|
||||||
Call(sunriseSched).
|
Call(sunriseSched).
|
||||||
Daily().
|
Daily().
|
||||||
Sunrise(app, "-30m").
|
Sunrise(app, "-30m").
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
zwaveEventListener := ga.
|
zwaveEventListener := ga.
|
||||||
EventListenerBuilder().
|
NewEventListener().
|
||||||
EventTypes("zwave_js_value_notification").
|
EventTypes("zwave_js_value_notification").
|
||||||
Call(onEvent).
|
Call(onEvent).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
app.RegisterEntityListener(pantryDoor)
|
app.RegisterEntityListeners(pantryDoor)
|
||||||
app.RegisterSchedule(_11pmSched)
|
app.RegisterSchedules(_11pmSched)
|
||||||
app.RegisterSchedule(_30minsBeforeSunrise)
|
app.RegisterSchedules(_30minsBeforeSunrise)
|
||||||
app.RegisterEventListener(zwaveEventListener)
|
app.RegisterEventListeners(zwaveEventListener)
|
||||||
|
|
||||||
app.Start()
|
app.Start()
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ type scheduleBuilderEnd struct {
|
|||||||
schedule Schedule
|
schedule Schedule
|
||||||
}
|
}
|
||||||
|
|
||||||
func ScheduleBuilder() scheduleBuilder {
|
func NewSchedule() scheduleBuilder {
|
||||||
return scheduleBuilder{
|
return scheduleBuilder{
|
||||||
Schedule{
|
Schedule{
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type Service struct {
|
|||||||
InputNumber *services.InputNumber
|
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{
|
return &Service{
|
||||||
Light: services.BuildService[services.Light](conn, ctx),
|
Light: services.BuildService[services.Light](conn, ctx),
|
||||||
HomeAssistant: services.BuildService[services.HomeAssistant](conn, ctx),
|
HomeAssistant: services.BuildService[services.HomeAssistant](conn, ctx),
|
||||||
|
|||||||
Reference in New Issue
Block a user