diff --git a/cmd/main/testing.go b/cmd/main/testing.go index dd32751..b6bd420 100644 --- a/cmd/main/testing.go +++ b/cmd/main/testing.go @@ -24,8 +24,8 @@ func main() { log.Println(s2) } -func lightsOut(service ga.Service, state ga.State) { - // ga.TurnOff("light.all_lights") +func lightsOut(service *ga.Service, state *ga.State) { + service.HomeAssistant.Toggle("light.office_ceiling_lights") } func cool(service ga.Service, data ga.Data) { diff --git a/internal/services/builder.go b/internal/services/builder.go index ee30859..bceb4e4 100644 --- a/internal/services/builder.go +++ b/internal/services/builder.go @@ -3,9 +3,30 @@ package services import ( "context" + "github.com/saml-dev/gome-assistant/internal/http" "nhooyr.io/websocket" ) -func BuildService[T Light | HomeAssistant](conn *websocket.Conn, ctx context.Context) *T { - return &T{conn: conn, ctx: ctx} +func BuildService[T Light | HomeAssistant](conn *websocket.Conn, ctx context.Context, httpClient *http.HttpClient) *T { + return &T{conn: conn, ctx: ctx, httpClient: httpClient} +} + +type BaseServiceRequest struct { + Id int `json:"id"` + RequestType string `json:"type"` // hardcoded "call_service" + Domain string `json:"domain"` + Service string `json:"service"` + ServiceData map[string]any `json:"service_data,omitempty"` + Target struct { + EntityId string `json:"entity_id"` + } `json:"target"` +} + +func NewBaseServiceRequest(entityId string) BaseServiceRequest { + bsr := BaseServiceRequest{ + Id: 10, + RequestType: "call_service", + } + bsr.Target.EntityId = entityId + return bsr } diff --git a/internal/services/homeassistant.go b/internal/services/homeassistant.go index a9cd7b9..16d438b 100644 --- a/internal/services/homeassistant.go +++ b/internal/services/homeassistant.go @@ -4,6 +4,7 @@ import ( "context" "github.com/saml-dev/gome-assistant/internal/http" + ws "github.com/saml-dev/gome-assistant/internal/websocket" "nhooyr.io/websocket" ) @@ -13,6 +14,26 @@ type HomeAssistant struct { httpClient *http.HttpClient } -// TODO: design how much reuse I can get between request types. E.g. -// only difference between light.turnon and homeassistant.turnon is -// domain and extra data +func (ha *HomeAssistant) TurnOn(entityId string) { + req := NewBaseServiceRequest(entityId) + req.Domain = "homeassistant" + req.Service = "turn_on" + + ws.WriteMessage(req, ha.conn, ha.ctx) +} + +func (ha *HomeAssistant) TurnOff(entityId string) { + req := NewBaseServiceRequest(entityId) + req.Domain = "homeassistant" + req.Service = "turn_off" + + ws.WriteMessage(req, ha.conn, ha.ctx) +} + +func (ha *HomeAssistant) Toggle(entityId string) { + req := NewBaseServiceRequest(entityId) + req.Domain = "homeassistant" + req.Service = "toggle" + + ws.WriteMessage(req, ha.conn, ha.ctx) +} diff --git a/internal/websocket/websocket.go b/internal/websocket/websocket.go index 984cf22..ff05482 100644 --- a/internal/websocket/websocket.go +++ b/internal/websocket/websocket.go @@ -23,7 +23,7 @@ type AuthMessage struct { func WriteMessage[T any](msg T, conn *websocket.Conn, ctx context.Context) error { msgJson, err := json.Marshal(msg) - // fmt.Println(string(msgJson)) + fmt.Println(string(msgJson)) if err != nil { return err } @@ -100,6 +100,7 @@ func VerifyAuthResponse(conn *websocket.Conn, ctx context.Context) error { var authResp authResponse json.Unmarshal(msg, &authResp) + log.Println(authResp.MsgType) if authResp.MsgType != "auth_ok" { return errors.New("invalid auth token") } diff --git a/schedule.go b/schedule.go index b6063a2..4a6aff7 100644 --- a/schedule.go +++ b/schedule.go @@ -62,7 +62,7 @@ func Duration(hour, minute int) time.Duration { return TimeOfDay(hour, minute) } -type scheduleCallback func(Service, State) +type scheduleCallback func(*Service, *State) type schedule struct { /* diff --git a/service.go b/service.go index 6717823..e9122b2 100644 --- a/service.go +++ b/service.go @@ -15,7 +15,7 @@ type Service struct { 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), + Light: services.BuildService[services.Light](conn, ctx, httpClient), + HomeAssistant: services.BuildService[services.HomeAssistant](conn, ctx, httpClient), } }