Skip to content

Commit

Permalink
feat(linux): change power management sensor to power state sensor
Browse files Browse the repository at this point in the history
- rename power management to power state
- use a single sensor for different states
  • Loading branch information
joshuar committed Nov 6, 2023
1 parent c815184 commit 820a23f
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 98 deletions.
2 changes: 1 addition & 1 deletion internal/agent/device_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ func sensorWorkers() []func(context.Context, device.SensorTracker) {
linux.UsersUpdater,
linux.Versions,
linux.TempUpdater,
linux.PowerMgmtUpdater)
linux.PowerStateUpdater)
return workers
}
91 changes: 0 additions & 91 deletions internal/linux/powerMgmtSensor.go

This file was deleted.

91 changes: 91 additions & 0 deletions internal/linux/powerStateSensor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Copyright (c) 2023 Joshua Rich <[email protected]>
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

package linux

import (
"context"

"github.com/godbus/dbus/v5"
"github.com/joshuar/go-hass-agent/internal/device"
"github.com/rs/zerolog/log"
)

type powerStateSensor struct {
linuxSensor
}

func (s *powerStateSensor) Icon() string {
switch s.value.(string) {
case "Suspended":
return "mdi:power-sleep"
case "Powered Off":
return "mdi:power-off"
}
return "mdi:power-on"
}

func PowerStateUpdater(ctx context.Context, tracker device.SensorTracker) {
sensorCh := make(chan interface{})
go func() {
defer close(sensorCh)
<-ctx.Done()
}()
go func() {
for sensor := range sensorCh {
if err := tracker.UpdateSensors(ctx, sensor); err != nil {
log.Error().Err(err).Msg("Could not update power state sensor.")
}
}
}()

sensorCh <- newPowerState("Powered On")

err := NewBusRequest(ctx, SystemBus).
Path("/org/freedesktop/login1").
Match([]dbus.MatchOption{
dbus.WithMatchInterface("org.freedesktop.login1.Manager"),
}).
Event("org.freedesktop.DBus.Properties.PropertiesChanged").
Handler(func(s *dbus.Signal) {
switch s.Name {
case "org.freedesktop.login1.Manager.PrepareForSleep":
if assertTruthiness(s.Body[0]) {
sensorCh <- newPowerState("Suspended")
} else {
sensorCh <- newPowerState("Powered On")
}
case "org.freedesktop.login1.Manager.PrepareForShutdown":
if assertTruthiness(s.Body[0]) {
sensorCh <- newPowerState("Powered Off")
} else {
sensorCh <- newPowerState("Powered On")
}
}
}).
AddWatch(ctx)
if err != nil {
log.Warn().Err(err).
Msg("Failed to create user D-Bus watch. Will not track powered off state.")
}
}

func newPowerState(state string) *powerStateSensor {
return &powerStateSensor{
linuxSensor: linuxSensor{
sensorType: powerState,
value: state,
source: srcDbus,
diagnostic: true,
},
}
}

func assertTruthiness(v interface{}) bool {
if isTrue, ok := v.(bool); ok && isTrue {
return true
}
return false
}
3 changes: 1 addition & 2 deletions internal/linux/sensorType.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ const (
version // Distribution Version
users // Current Users
deviceTemp // Temperature
isSuspended // Suspended
isShutdown // Powered Off
powerState // Power State
)

// sensorType represents the unique type of sensor data being reported. Every
Expand Down
7 changes: 3 additions & 4 deletions internal/linux/sensorTypeStrings.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 820a23f

Please sign in to comment.