View datapoint values

This commit is contained in:
Magnus Åhall 2024-05-05 20:16:28 +02:00
parent 5f6a48e7e0
commit d72694a8b4
14 changed files with 288 additions and 28 deletions

98
main.go
View file

@ -122,6 +122,7 @@ func main() { // {{{
service.Register("/datapoint/edit/{id}", false, false, pageDatapointEdit)
service.Register("/datapoint/update/{id}", false, false, pageDatapointUpdate)
service.Register("/datapoint/delete/{id}", false, false, pageDatapointDelete)
service.Register("/datapoint/values/{id}", false, false, pageDatapointValues)
service.Register("/triggers", false, false, pageTriggers)
service.Register("/trigger/edit/{id}", false, false, pageTriggerEdit)
@ -194,6 +195,8 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
if err != nil {
logger.Error("entry", "error", err)
}
// Multiple triggers can use the same datapoint.
for _, trigger := range triggers {
var out any
out, err = trigger.Run()
@ -204,23 +207,77 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
}
logger.Debug("entry", "datapoint", dpoint, "value", value, "trigger", trigger, "result", out)
var problemID int
switch v := out.(type) {
case bool:
// Trigger returning true - a problem occurred
if v {
err = ProblemStart(trigger)
problemID, err = ProblemStart(trigger)
logger.Info("FOO", "problemID", problemID, "err==nil", err == nil)
if err != nil {
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
} else {
err = ProblemClose(trigger)
// A problem didn't occur.
problemID, err = ProblemClose(trigger)
logger.Info("FOO", "problemID", problemID, "err==nil", err == nil)
if err != nil {
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
}
// Has a change in problem state happened?
if problemID == 0 && err == nil {
logger.Debug("notification", "trigger", trigger.ID, "state", "no change")
continue
} else {
logger.Debug("notification", "trigger", trigger.ID, "state", "change")
}
err = notificationManager.Send(problemID, []byte(trigger.Name), func(notificationService *notification.Service, err error) {
logger.Info(
"notification",
"service", (*notificationService).GetType(),
"problemID", problemID,
"prio", (*notificationService).GetPrio(),
"ok", true,
)
var errBody any
if err != nil {
errBody, _ = json.Marshal(err)
} else {
errBody = nil
}
_, err = service.Db.Conn.Exec(
`
INSERT INTO notification_send(notification_id, problem_id, uuid, ok, error)
SELECT
id, $3, '', $4, $5
FROM notification
WHERE
service=$1 AND
prio=$2
`,
(*notificationService).GetType(),
(*notificationService).GetPrio(),
problemID,
err == nil,
errBody,
)
if err != nil {
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
})
if err != nil {
err = werr.Wrap(err).Log()
logger.Error("notification", "error", err)
}
default:
err := fmt.Errorf(`Expression for trigger %s not returning bool (%T)`, trigger.Name, v)
logger.Info("entry", "error", err)
@ -519,6 +576,43 @@ func pageDatapointDelete(w http.ResponseWriter, r *http.Request, _ *session.T) {
w.Header().Add("Location", "/datapoints")
w.WriteHeader(302)
} // }}}
func pageDatapointValues(w http.ResponseWriter, r *http.Request, _ *session.T) { // {{{
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, werr.Wrap(err).Log())
return
}
var datapoint Datapoint
datapoint, err = DatapointRetrieve(id, "")
if err != nil {
httpError(w, werr.Wrap(err).Log())
return
}
var values []DatapointValue
values, err = DatapointValues(id)
if err != nil {
httpError(w, werr.Wrap(err).Log())
return
}
page := Page{
LAYOUT: "main",
PAGE: "datapoint_values",
MENU: "datapoints",
Icon: "datapoints",
Label: "Values for "+datapoint.Name,
}
page.Data = map[string]any{
"Datapoint": datapoint,
"Values": values,
}
page.Render(w)
return
} // }}}
func pageTriggers(w http.ResponseWriter, _ *http.Request, _ *session.T) { // {{{
areas, err := TriggersRetrieve()