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,8 +23,9 @@ type State struct {
} }
const ( const (
StateOn state = "on" storage_path = "/var/lib/waterservice/state/state.json"
StateOff state = "off" StateOn state = "on"
StateOff state = "off"
) )
var ( var (
@@ -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,13 +50,23 @@ func AddHandler() {
func Start() { func Start() {
state_mutex.Lock() state_mutex.Lock()
for _, device := range apiservice_devices.GetDevices().Devices { res, err := store.Read()
tmp := State{ if err != nil {
Name: device.Name, logger.Print(err)
State: StateOff, // build default state_cache
Runtime: 0, for _, device := range apiservice_devices.GetDevices().Devices {
tmp := State{
Name: device.Name,
State: StateOff,
Runtime: 0,
}
state_cache[device.Name] = tmp
}
} else {
err = json.Unmarshal(res, &state_cache)
if err != nil {
logger.Print(err)
} }
state_cache[device.Name] = tmp
} }
state_mutex.Unlock() state_mutex.Unlock()
@@ -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)