Turn off all devices that we manage if no one is present

This commit is contained in:
Dreaded_X 2022-11-15 04:00:48 +01:00
parent bfeedece77
commit 656b040cdc
Signed by: Dreaded_X
GPG Key ID: 76BDEC4E165D8AD9
4 changed files with 30 additions and 6 deletions

View File

@ -62,3 +62,7 @@ func (c *computer) Execute(execution google.Execution, updateState *google.Devic
func (c *computer) GetID() string { func (c *computer) GetID() string {
return c.macAddress return c.macAddress
} }
func (c *computer) TurnOff() {
// Scene does not implement this
}

View File

@ -168,3 +168,7 @@ func (k *kettle) Execute(execution google.Execution, updatedState *google.Device
func (k *kettle) GetID() string { func (k *kettle) GetID() string {
return k.Info.IEEEAdress 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" }`))
}

View File

@ -25,12 +25,17 @@ type DeviceInfo struct {
SoftwareBuildID string `json:"software_build_id"` SoftwareBuildID string `json:"software_build_id"`
} }
type DeviceInterface interface {
google.DeviceInterface
TurnOff()
}
type Provider struct { type Provider struct {
Service *google.Service Service *google.Service
userID string userID string
devices map[string]google.DeviceInterface devices map[string]DeviceInterface
manualDevices map[string]google.DeviceInterface manualDevices map[string]DeviceInterface
} }
func NewProvider(m *mqtt.MQTT) *Provider { func NewProvider(m *mqtt.MQTT) *Provider {
@ -41,7 +46,7 @@ func NewProvider(m *mqtt.MQTT) *Provider {
os.Exit(1) 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)) homegraphService, err := homegraph.NewService(context.Background(), option.WithCredentialsJSON(credentials))
if err != nil { if err != nil {
@ -64,8 +69,8 @@ func NewProvider(m *mqtt.MQTT) *Provider {
for _, device := range devices { for _, device := range devices {
switch device.Description { switch device.Description {
case "Kettle": case "Kettle":
outlet := NewKettle(device, m, provider.Service) kettle := NewKettle(device, m, provider.Service)
provider.devices[device.IEEEAdress] = outlet provider.devices[device.IEEEAdress] = kettle
log.Printf("Added Kettle (%s) %s\n", device.IEEEAdress, device.FriendlyName) log.Printf("Added Kettle (%s) %s\n", device.IEEEAdress, device.FriendlyName)
} }
} }
@ -77,7 +82,7 @@ func NewProvider(m *mqtt.MQTT) *Provider {
return provider return provider
} }
func (p *Provider) AddDevice(device google.DeviceInterface) { func (p *Provider) AddDevice(device DeviceInterface) {
p.devices[device.GetID()] = device p.devices[device.GetID()] = device
p.manualDevices[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 return resp, nil
} }
func (p *Provider) TurnAllOff() {
for _, device := range p.devices {
device.TurnOff()
}
}

View File

@ -52,6 +52,11 @@ func main() {
fmt.Printf("Presence: %t\n", present) fmt.Printf("Presence: %t\n", present)
h.SetFlag(41, present) h.SetFlag(41, present)
n.Presence(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: case <-h.Events:
break break