From ba9132745e1a1d9d78e05b78bb79cdb66277430d Mon Sep 17 00:00:00 2001 From: Sam Lewis Date: Sun, 6 Nov 2022 15:00:39 -0500 Subject: [PATCH] add notify service --- app.go | 4 ++++ internal/services/notify.go | 31 +++++++++++++++++++++++++++++++ internal/services/services.go | 6 +++--- service.go | 2 ++ types/requestTypes.go | 9 +++++++++ 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 internal/services/notify.go create mode 100644 types/requestTypes.go diff --git a/app.go b/app.go index f6b96c0..40b7931 100644 --- a/app.go +++ b/app.go @@ -3,6 +3,7 @@ package gomeassistant import ( "context" "fmt" + "log" "os" "time" @@ -164,6 +165,9 @@ func getSunriseSunset(a *App, sunrise bool, offset []DurationString) carbon.Carb } func (a *App) Start() { + log.Default().Println("Starting", a.schedules.Len(), "schedules") + log.Default().Println("Starting", len(a.entityListeners), "entity listeners") + log.Default().Println("Starting", len(a.eventListeners), "event listeners") // schedules go runSchedules(a) diff --git a/internal/services/notify.go b/internal/services/notify.go new file mode 100644 index 0000000..7ffb9d9 --- /dev/null +++ b/internal/services/notify.go @@ -0,0 +1,31 @@ +package services + +import ( + "context" + + "github.com/gorilla/websocket" + ws "github.com/saml-dev/gome-assistant/internal/websocket" + "github.com/saml-dev/gome-assistant/types" +) + +type Notify struct { + conn *websocket.Conn + ctx context.Context +} + +// Send a notification. Takes a types.NotifyRequest. +func (ha *Notify) Notify(reqData types.NotifyRequest) { + req := NewBaseServiceRequest("") + req.Domain = "notify" + req.Service = reqData.ServiceName + + serviceData := map[string]any{} + serviceData["message"] = reqData.Message + serviceData["title"] = reqData.Title + if reqData.Data != nil { + serviceData["data"] = reqData.Data + } + + req.ServiceData = serviceData + ws.WriteMessage(req, ha.conn, ha.ctx) +} diff --git a/internal/services/services.go b/internal/services/services.go index 256a0ae..aa9fb5b 100644 --- a/internal/services/services.go +++ b/internal/services/services.go @@ -17,7 +17,8 @@ func BuildService[ InputButton | InputDatetime | InputText | - InputNumber, + InputNumber | + Notify, ](conn *websocket.Conn, ctx context.Context) *T { return &T{conn: conn, ctx: ctx} } @@ -29,7 +30,7 @@ type BaseServiceRequest struct { Service string `json:"service"` ServiceData map[string]any `json:"service_data,omitempty"` Target struct { - EntityId string `json:"entity_id"` + EntityId string `json:"entity_id,omitempty"` } `json:"target,omitempty"` } @@ -42,6 +43,5 @@ func NewBaseServiceRequest(entityId string) BaseServiceRequest { if entityId != "" { bsr.Target.EntityId = entityId } - id += 1 return bsr } diff --git a/service.go b/service.go index 55ea84f..5b12476 100644 --- a/service.go +++ b/service.go @@ -18,6 +18,7 @@ type Service struct { InputText *services.InputText InputDatetime *services.InputDatetime InputNumber *services.InputNumber + Notify *services.Notify } func newService(conn *websocket.Conn, ctx context.Context, httpClient *http.HttpClient) *Service { @@ -31,5 +32,6 @@ func newService(conn *websocket.Conn, ctx context.Context, httpClient *http.Http InputText: services.BuildService[services.InputText](conn, ctx), InputDatetime: services.BuildService[services.InputDatetime](conn, ctx), InputNumber: services.BuildService[services.InputNumber](conn, ctx), + Notify: services.BuildService[services.Notify](conn, ctx), } } diff --git a/types/requestTypes.go b/types/requestTypes.go new file mode 100644 index 0000000..cd7064a --- /dev/null +++ b/types/requestTypes.go @@ -0,0 +1,9 @@ +package types + +type NotifyRequest struct { + // Which notify service to call, such as mobile_app_sams_iphone + ServiceName string + Message string + Title string + Data map[string]any +}