66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/domain"
|
|
"gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/ports/driven"
|
|
)
|
|
|
|
type LightApp struct {
|
|
ha driven.HAClient
|
|
}
|
|
|
|
func NewLightApp(ha driven.HAClient) *LightApp {
|
|
return &LightApp{ha: ha}
|
|
}
|
|
|
|
func (a *LightApp) TurnOn(ctx context.Context, p domain.TurnOnParams) (*domain.EntityState, error) {
|
|
payload := map[string]any{"entity_id": string(p.EntityID)}
|
|
if p.BrightnessPct != nil {
|
|
payload["brightness_pct"] = *p.BrightnessPct
|
|
}
|
|
if p.ColorTempKelvin != nil {
|
|
payload["color_temp_kelvin"] = *p.ColorTempKelvin
|
|
}
|
|
if p.RGBColor != nil {
|
|
payload["rgb_color"] = []uint8{p.RGBColor.R, p.RGBColor.G, p.RGBColor.B}
|
|
}
|
|
if p.Transition != nil {
|
|
payload["transition"] = *p.Transition
|
|
}
|
|
return a.callService(ctx, "light", "turn_on", payload)
|
|
}
|
|
|
|
func (a *LightApp) TurnOff(ctx context.Context, p domain.TurnOffParams) (*domain.EntityState, error) {
|
|
payload := map[string]any{"entity_id": string(p.EntityID)}
|
|
if p.Transition != nil {
|
|
payload["transition"] = *p.Transition
|
|
}
|
|
return a.callService(ctx, "light", "turn_off", payload)
|
|
}
|
|
|
|
func (a *LightApp) Toggle(ctx context.Context, id domain.EntityID) (*domain.EntityState, error) {
|
|
payload := map[string]any{"entity_id": string(id)}
|
|
return a.callService(ctx, "light", "toggle", payload)
|
|
}
|
|
|
|
func (a *LightApp) callService(ctx context.Context, svcDomain, service string, payload map[string]any) (*domain.EntityState, error) {
|
|
states, err := a.ha.CallService(ctx, svcDomain, service, payload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
entityID, _ := payload["entity_id"].(string)
|
|
for _, s := range states {
|
|
if s.EntityID == entityID {
|
|
return haStateToDomain(s), nil
|
|
}
|
|
}
|
|
// HA may return an empty list on success; fall back to GetState.
|
|
s, err := a.ha.GetState(ctx, entityID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return haStateToDomain(s), nil
|
|
}
|