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