Markus Pesch
6d9368e86c
changes: - sensor temperature add - sensor temperature list - sensor temperature rm - temperature get - temperature log - temperature push
147 lines
2.8 KiB
Go
147 lines
2.8 KiB
Go
package temperature
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"text/tabwriter"
|
|
"time"
|
|
|
|
stypes "git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
|
|
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
|
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
|
|
|
|
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
|
|
|
uuid "github.com/satori/go.uuid"
|
|
"github.com/yryz/ds18b20"
|
|
)
|
|
|
|
// Get ...
|
|
func Get(w io.Writer, sensorName string, configDir string) error {
|
|
|
|
temperature, err := getTemperature(sensorName, configDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Fprintf(w, "%3.3f\n", temperature.TemperatureValue)
|
|
return nil
|
|
|
|
}
|
|
|
|
// Logs ...
|
|
func Logs(w io.Writer, configDir string) error {
|
|
|
|
// get cnf
|
|
cnf, err := config.Read(configDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// declar tabwriter
|
|
tw := tabwriter.NewWriter(w, 0, 0, 5, ' ', 0)
|
|
|
|
// headlines
|
|
for _, sensor := range cnf.TemperatureSensors {
|
|
if sensor.Name != "" {
|
|
fmt.Fprintf(tw, "%v\t", sensor.Name)
|
|
} else {
|
|
fmt.Fprintf(tw, "%v\t", sensor.ID)
|
|
}
|
|
|
|
}
|
|
fmt.Fprint(tw, "\n")
|
|
|
|
// body
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case _, more := <-ticker.C:
|
|
if !more {
|
|
return
|
|
}
|
|
|
|
for _, sensor := range cnf.TemperatureSensors {
|
|
temperature, err := ds18b20.Temperature(sensor.ID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
fmt.Fprintf(tw, "%3.3f°\t", temperature)
|
|
}
|
|
|
|
fmt.Fprint(tw, "\n")
|
|
|
|
tw.Flush()
|
|
|
|
}
|
|
}
|
|
}()
|
|
|
|
signalChannel := make(chan os.Signal)
|
|
signal.Notify(signalChannel, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
sig := <-signalChannel
|
|
log.Printf("Got signal %s, initiating shutdown\n", sig)
|
|
ticker.Stop()
|
|
|
|
return nil
|
|
}
|
|
|
|
// Push ...
|
|
func Push(sensorName, configDir string) error {
|
|
|
|
temperature, err := getTemperature(sensorName, configDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := remote.SendTemperature(&temperature, configDir); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
func getTemperature(sensorName, configDir string) (stypes.Temperature, error) {
|
|
cnf, err := config.Read(configDir)
|
|
if err != nil {
|
|
return stypes.Temperature{}, err
|
|
}
|
|
|
|
var foundSensor types.WireSensor
|
|
var sensorFound bool
|
|
for _, sensor := range cnf.TemperatureSensors {
|
|
if sensor.ID == sensorName || sensor.Name == sensorName {
|
|
foundSensor = *sensor
|
|
sensorFound = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !sensorFound {
|
|
return stypes.Temperature{}, fmt.Errorf("Sensor not found sensor %v in config", sensorName)
|
|
}
|
|
|
|
t, err := ds18b20.Temperature(foundSensor.ID)
|
|
if err != nil {
|
|
return stypes.Temperature{}, fmt.Errorf("Can not read temperature from sensor %v: %v", foundSensor.ID, err)
|
|
}
|
|
|
|
temperature := stypes.Temperature{
|
|
TemperatureID: uuid.NewV4().String(),
|
|
TemperatureValue: t,
|
|
SensorID: foundSensor.ID,
|
|
TemperatureDate: time.Now(),
|
|
DeviceID: cnf.DeviceID,
|
|
}
|
|
|
|
return temperature, nil
|
|
}
|