blob: f9de63055196305231439e4146935ce209a00dbd [file] [log] [blame]
// Environment Monitor reports ambient environment sensor values
// to be recorded in metrics2.
package main
import (
"flag"
"fmt"
"time"
"go.skia.org/infra/go/common"
"go.skia.org/infra/go/metrics2"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/skolo/go/sensors"
)
var (
promPort = flag.String("prom_port", ":20000", "Metrics service address (e.g., ':10110')")
serialDevice = flag.String("serial_device", "", "Serial device (e.g., '/dev/ttyACM0' or 'COM1')")
metricsPrefix = flag.String("metric_prefix", "", "String to prefix metric names (e.g., 'skolo_')")
)
func openDevice(portName string) (*sensors.DLPTH1C, error) {
d, err := sensors.NewDLPTH1C(portName)
if err != nil {
return nil, skerr.Wrapf(err, `error opening port "%s"`, portName)
}
const maxPings = 5
err = d.ConfirmConnection(maxPings)
if err != nil {
return nil, skerr.Wrapf(err, "error confirming connection to device")
}
return d, nil
}
func main() {
common.InitWithMust(
"environment-monitor",
common.PrometheusOpt(promPort),
)
if *serialDevice == "" {
sklog.Fatal(`"serial_device" is a required parameter.`)
}
if *metricsPrefix == "" {
sklog.Fatal(`"metric_prefix" is a required parameter.`)
}
d, err := openDevice(*serialDevice)
if err != nil {
sklog.Fatal(err)
}
tempMetric := metrics2.GetFloat64Metric(fmt.Sprintf("%stemp_c", *metricsPrefix))
humidityMetric := metrics2.GetFloat64Metric(fmt.Sprintf("%shumidity", *metricsPrefix))
lightMetric := metrics2.GetFloat64Metric(fmt.Sprintf("%slight", *metricsPrefix))
soundMetric := metrics2.GetFloat64Metric(fmt.Sprintf("%ssound_db", *metricsPrefix))
for range time.Tick(time.Minute) {
t, err := d.GetTemperature()
if err != nil {
sklog.Fatalf("Error reading temperature: %s", err)
}
tempMetric.Update(float64(t))
h, err := d.GetHumidity()
if err != nil {
sklog.Fatalf("Error reading humidity: %s", err)
}
humidityMetric.Update(float64(h))
light, err := d.GetLight()
if err != nil {
sklog.Fatalf("Error reading light level: %s", err)
}
lightMetric.Update(float64(light))
s, err := d.GetBroadbandSound()
if err != nil {
sklog.Fatalf("Error reading sound level: %s", err)
}
soundMetric.Update(float64(s))
}
}