apiservice/state: Enhancement: store state cache

Signed-off-by: Thomas Klaehn <tkl@blackfinn.de>
This commit is contained in:
2025-08-15 09:05:51 +02:00
parent b76d394b16
commit c85d0d1f68

View File

@@ -9,6 +9,7 @@ import (
"sync" "sync"
"time" "time"
apiservice_devices "waterservice/internal/apiservice/devices" apiservice_devices "waterservice/internal/apiservice/devices"
"waterservice/internal/app/storage"
) )
type state string type state string
@@ -22,6 +23,7 @@ type State struct {
} }
const ( const (
storage_path = "/var/lib/waterservice/state/state.json"
StateOn state = "on" StateOn state = "on"
StateOff state = "off" StateOff state = "off"
) )
@@ -31,12 +33,14 @@ var (
state_cache map[string]State state_cache map[string]State
state_mutex sync.Mutex state_mutex sync.Mutex
store storage.Storage
cb_register_off registerOffSwitch cb_register_off registerOffSwitch
cb_unregister_off registerOffSwitch cb_unregister_off registerOffSwitch
) )
func init() { func init() {
logger.SetFlags(log.Llongfile | log.Ltime) logger.SetFlags(log.Llongfile | log.Ltime)
store.SetPath(storage_path)
state_cache = map[string]State{} state_cache = map[string]State{}
} }
@@ -46,6 +50,10 @@ func AddHandler() {
func Start() { func Start() {
state_mutex.Lock() state_mutex.Lock()
res, err := store.Read()
if err != nil {
logger.Print(err)
// build default state_cache
for _, device := range apiservice_devices.GetDevices().Devices { for _, device := range apiservice_devices.GetDevices().Devices {
tmp := State{ tmp := State{
Name: device.Name, Name: device.Name,
@@ -54,6 +62,12 @@ func Start() {
} }
state_cache[device.Name] = tmp state_cache[device.Name] = tmp
} }
} else {
err = json.Unmarshal(res, &state_cache)
if err != nil {
logger.Print(err)
}
}
state_mutex.Unlock() state_mutex.Unlock()
go poll_states() go poll_states()
@@ -84,6 +98,15 @@ func SetState(st State) error {
tmp := state_cache[dev.Name] tmp := state_cache[dev.Name]
tmp.State = st.State tmp.State = st.State
state_cache[dev.Name] = tmp state_cache[dev.Name] = tmp
res, err := json.Marshal(state_cache)
if err != nil {
logger.Print("unable to store state cache")
} else {
err = store.Write(res)
if err != nil {
logger.Print(err)
}
}
state_mutex.Unlock() state_mutex.Unlock()
if cb_register_off != nil && cb_unregister_off != nil { if cb_register_off != nil && cb_unregister_off != nil {
if st.State == StateOn { if st.State == StateOn {
@@ -104,6 +127,15 @@ func SetRuntime(name string, runtime time.Duration) {
tmp := state_cache[name] tmp := state_cache[name]
tmp.Runtime = runtime tmp.Runtime = runtime
state_cache[name] = tmp state_cache[name] = tmp
res, err := json.Marshal(state_cache)
if err != nil {
logger.Print("unable to store state cache")
} else {
err = store.Write(res)
if err != nil {
logger.Print(err)
}
}
state_mutex.Unlock() state_mutex.Unlock()
} }
@@ -166,6 +198,15 @@ func handle_patch(r *http.Request) error {
tmp := state_cache[dev.Name] tmp := state_cache[dev.Name]
tmp.State = st.State tmp.State = st.State
state_cache[dev.Name] = tmp state_cache[dev.Name] = tmp
res, err := json.Marshal(state_cache)
if err != nil {
logger.Print("unable to store state cache")
} else {
err = store.Write(res)
if err != nil {
logger.Print(err)
}
}
state_mutex.Unlock() state_mutex.Unlock()
if cb_register_off != nil && cb_unregister_off != nil { if cb_register_off != nil && cb_unregister_off != nil {
if st.State == StateOn { if st.State == StateOn {
@@ -213,6 +254,15 @@ func poll_states() {
tmp := state_cache[dev.Name] tmp := state_cache[dev.Name]
tmp.State = status tmp.State = status
state_cache[dev.Name] = tmp state_cache[dev.Name] = tmp
res, err := json.Marshal(state_cache)
if err != nil {
logger.Print(err)
} else {
err = store.Write(res)
if err != nil {
logger.Print(err)
}
}
state_mutex.Unlock() state_mutex.Unlock()
} }
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)