diff --git a/device/computer.go b/device/computer.go index b3ba1f0..5ff42b9 100644 --- a/device/computer.go +++ b/device/computer.go @@ -62,3 +62,7 @@ func (c *computer) Execute(execution google.Execution, updateState *google.Devic func (c *computer) GetID() string { return c.macAddress } + +func (c *computer) TurnOff() { + // Scene does not implement this +} diff --git a/device/kettle.go b/device/kettle.go index 264fb65..d00ae84 100644 --- a/device/kettle.go +++ b/device/kettle.go @@ -168,3 +168,7 @@ func (k *kettle) Execute(execution google.Execution, updatedState *google.Device func (k *kettle) GetID() string { return k.Info.IEEEAdress } + +func (k *kettle) TurnOff() { + k.m.Publish(fmt.Sprintf("zigbee2mqtt/%s/set", k.Info.FriendlyName), 1, false, fmt.Sprintf(`{ "state": "OFF" }`)) +} diff --git a/device/provider.go b/device/provider.go index dd01009..8d46641 100644 --- a/device/provider.go +++ b/device/provider.go @@ -25,12 +25,17 @@ type DeviceInfo struct { SoftwareBuildID string `json:"software_build_id"` } +type DeviceInterface interface { + google.DeviceInterface + TurnOff() +} + type Provider struct { Service *google.Service userID string - devices map[string]google.DeviceInterface - manualDevices map[string]google.DeviceInterface + devices map[string]DeviceInterface + manualDevices map[string]DeviceInterface } func NewProvider(m *mqtt.MQTT) *Provider { @@ -41,7 +46,7 @@ func NewProvider(m *mqtt.MQTT) *Provider { os.Exit(1) } - provider := &Provider{userID: "Dreaded_X", devices: make(map[string]google.DeviceInterface), manualDevices: make(map[string]google.DeviceInterface)} + provider := &Provider{userID: "Dreaded_X", devices: make(map[string]DeviceInterface), manualDevices: make(map[string]DeviceInterface)} homegraphService, err := homegraph.NewService(context.Background(), option.WithCredentialsJSON(credentials)) if err != nil { @@ -64,8 +69,8 @@ func NewProvider(m *mqtt.MQTT) *Provider { for _, device := range devices { switch device.Description { case "Kettle": - outlet := NewKettle(device, m, provider.Service) - provider.devices[device.IEEEAdress] = outlet + kettle := NewKettle(device, m, provider.Service) + provider.devices[device.IEEEAdress] = kettle log.Printf("Added Kettle (%s) %s\n", device.IEEEAdress, device.FriendlyName) } } @@ -77,7 +82,7 @@ func NewProvider(m *mqtt.MQTT) *Provider { return provider } -func (p *Provider) AddDevice(device google.DeviceInterface) { +func (p *Provider) AddDevice(device DeviceInterface) { p.devices[device.GetID()] = device p.manualDevices[device.GetID()] = device } @@ -138,3 +143,9 @@ func (p *Provider) Execute(_ context.Context, _ string, commands []google.Comman return resp, nil } + +func (p *Provider) TurnAllOff() { + for _, device := range p.devices { + device.TurnOff() + } +} diff --git a/main.go b/main.go index 8b8005a..c573606 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,11 @@ func main() { fmt.Printf("Presence: %t\n", present) h.SetFlag(41, present) n.Presence(present) + if !present { + provider.TurnAllOff() + } else { + // In the future this is were we can do things like turning on the lights in the living room + } case <-h.Events: break