diff --git a/internal/services/event.go b/internal/services/event.go new file mode 100644 index 0000000..9205db1 --- /dev/null +++ b/internal/services/event.go @@ -0,0 +1,39 @@ +package services + +import ( + "context" + + "saml.dev/gome-assistant/internal" + ws "saml.dev/gome-assistant/internal/websocket" +) + +type Event struct { + conn *ws.WebsocketWriter + ctx context.Context +} + +// Fire an event +type FireEventRequest struct { + Id int64 `json:"id"` + Type string `json:"type"` // always set to "fire_event" + EventType string `json:"event_type"` + EventData map[string]any `json:"event_data,omitempty"` +} + +/* Public API */ + +// Fire an event. Takes an event type and an optional map that is sent +// as `event_data`. +func (e Event) Fire(eventType string, eventData ...map[string]any) { + req := FireEventRequest{ + Id: internal.GetId(), + Type: "fire_event", + } + + req.EventType = eventType + if len(eventData) != 0 { + req.EventData = eventData[0] + } + + e.conn.WriteMessage(req, e.ctx) +} diff --git a/internal/services/services.go b/internal/services/services.go index 9b16492..6dbb024 100644 --- a/internal/services/services.go +++ b/internal/services/services.go @@ -21,6 +21,7 @@ func BuildService[ InputDatetime | InputText | InputNumber | + Event | Notify | Number | Scene | diff --git a/service.go b/service.go index 566d425..c861ec7 100644 --- a/service.go +++ b/service.go @@ -22,6 +22,7 @@ type Service struct { InputText *services.InputText InputDatetime *services.InputDatetime InputNumber *services.InputNumber + Event *services.Event Notify *services.Notify Number *services.Number Scene *services.Scene @@ -46,6 +47,7 @@ func newService(conn *ws.WebsocketWriter, ctx context.Context, httpClient *http. InputText: services.BuildService[services.InputText](conn, ctx), InputDatetime: services.BuildService[services.InputDatetime](conn, ctx), InputNumber: services.BuildService[services.InputNumber](conn, ctx), + Event: services.BuildService[services.Event](conn, ctx), Notify: services.BuildService[services.Notify](conn, ctx), Number: services.BuildService[services.Number](conn, ctx), Scene: services.BuildService[services.Scene](conn, ctx),