diff --git a/cmd/sensor/add.go b/cmd/sensor/add.go index bb812d4..e6fde04 100644 --- a/cmd/sensor/add.go +++ b/cmd/sensor/add.go @@ -31,13 +31,19 @@ var addSensorCmd = &cobra.Command{ log.Fatalln(err) } + // determine gpio port + gpio, err := types.StringToGPIO(args[2]) + if err != nil { + log.Fatalln(err) + } + // create new sensor struct sensor := &types.Sensor{ SensorName: args[0], SensorModel: sensorModel, SensorLocation: location, SensorEnabled: enabled, - GPIONumber: &args[2], + GPIONumber: &gpio, WireID: &wireID, } diff --git a/cmd/temperature/read.go b/cmd/temperature/read.go index 7ea3c2d..dddbf5e 100644 --- a/cmd/temperature/read.go +++ b/cmd/temperature/read.go @@ -11,7 +11,7 @@ import ( "github.com/spf13/cobra" ) -var follow, push bool +var logs bool var readTemperatureCmd = &cobra.Command{ Use: "read", @@ -39,10 +39,18 @@ var readTemperatureCmd = &cobra.Command{ // print temperatures on stdout cli.PrintTemperatures(temperatures, fc, os.Stdout) + + if logs { + err = fc.FileLogger.LogTemperatures(temperatures) + if err != nil { + log.Fatalln(err) + } + } }, } func init() { temperatureCmd.AddCommand(readTemperatureCmd) - readTemperatureCmd.Flags().BoolVarP(&follow, "follow", "f", false, "Follow output") + // readTemperatureCmd.Flags().BoolVarP(&follow, "follow", "f", false, "Follow output") + readTemperatureCmd.Flags().BoolVarP(&logs, "logs", "l", true, "Log temperature") } diff --git a/go.mod b/go.mod index dc97261..99672a7 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,11 @@ module git.cryptic.systems/fh-trier/go-flucky go 1.12 require ( + github.com/MichaelS11/go-dht v0.0.0-20181004212404-be44b9ee7fec + github.com/d2r2/go-dht v0.0.0-20181222061613-42fe873fbabb // indirect + github.com/d2r2/go-logger v0.0.0-20181221090742-9998a510495e // indirect + github.com/d2r2/go-shell v0.0.0-20181221082743-874cb5c847b3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/satori/go.uuid v1.2.0 @@ -10,4 +15,5 @@ require ( github.com/spf13/pflag v1.0.3 // indirect github.com/yryz/ds18b20 v0.0.0-20180211073435-3cf383a40624 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + periph.io/x/periph v3.4.0+incompatible // indirect ) diff --git a/go.sum b/go.sum index f4d8724..adaa009 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,13 @@ +github.com/MichaelS11/go-dht v0.0.0-20181004212404-be44b9ee7fec h1:xMo0OOokExQqY/MRsTz6azUwy0udvlqhkJwQ5jZ6eN4= +github.com/MichaelS11/go-dht v0.0.0-20181004212404-be44b9ee7fec/go.mod h1:NTx2rUi8kfs8Qk9Fotoyf/3lQnKBdc2mhyZqO4AhVLI= +github.com/d2r2/go-dht v0.0.0-20181222061613-42fe873fbabb h1:kyXaht4l/GxAWx0ubvha2QyVrtOgIx071o03tF3q60o= +github.com/d2r2/go-dht v0.0.0-20181222061613-42fe873fbabb/go.mod h1:AzSqP4S4/6pINOKg3VC79WC7YY3zskQcrXMFzphCry0= +github.com/d2r2/go-logger v0.0.0-20181221090742-9998a510495e h1:ZG3JBA6rPRl0xxQ+nNSfO7tor8w+CNCTs05DNJQYbLM= +github.com/d2r2/go-logger v0.0.0-20181221090742-9998a510495e/go.mod h1:oA+9PUt8F1aKJ6o4YU1T120i7sgo1T6/1LWEEBy0BSs= +github.com/d2r2/go-shell v0.0.0-20181221082743-874cb5c847b3 h1:A30Vp6lwq9bHnh4D7XRHZYOpuJq2/bbMs+B94Y8NeCc= +github.com/d2r2/go-shell v0.0.0-20181221082743-874cb5c847b3/go.mod h1:FdrNob+jQ3UkEpNVeZFVn8mW86Aa2wa6U5z0vGQOEXQ= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -15,3 +25,5 @@ github.com/yryz/ds18b20 v0.0.0-20180211073435-3cf383a40624 h1:bePzgtpuLSl+F9aacw github.com/yryz/ds18b20 v0.0.0-20180211073435-3cf383a40624/go.mod h1:MqFju5qeLDFh+S9PqxYT7TEla8xeW7bgGr/69q3oki0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +periph.io/x/periph v3.4.0+incompatible h1:5gzxE4ryPq52cdqSw0mErR6pyJK8cBF2qdUAcOWh0bo= +periph.io/x/periph v3.4.0+incompatible/go.mod h1:EWr+FCIU2dBWz5/wSWeiIUJTriYv9v2j2ENBmgYyy7Y= diff --git a/pkg/sensor/dht11.go b/pkg/sensor/dht11.go index 7c904c7..60df83c 100644 --- a/pkg/sensor/dht11.go +++ b/pkg/sensor/dht11.go @@ -1,9 +1,12 @@ package sensor import ( - "log" + "fmt" + "time" "git.cryptic.systems/fh-trier/go-flucky/pkg/types" + "github.com/MichaelS11/go-dht" + uuid "github.com/satori/go.uuid" ) type DHT11Sensor struct { @@ -11,11 +14,63 @@ type DHT11Sensor struct { } func (s *DHT11Sensor) ReadHumidity() (*types.Humidity, error) { - log.Println("DHT11 Read Method not yet implemented") - return nil, nil + err := dht.HostInit() + if err != nil { + return nil, fmt.Errorf("HostInit error: %v", err) + } + + gpio, err := types.GPIOToString(*s.GPIONumber) + if err != nil { + return nil, err + } + + dht, err := dht.NewDHT(gpio, dht.Celsius, "") + if err != nil { + return nil, fmt.Errorf("NewDHT error: %v", err) + } + + humidityValue, _, err := dht.ReadRetry(11) + if err != nil { + return nil, fmt.Errorf("Read error: %v", err) + } + + humidity := &types.Humidity{ + HumidityID: uuid.NewV4().String(), + HumidityValue: humidityValue, + HumidityDate: time.Now(), + SensorID: s.SensorID, + } + + return humidity, nil } func (s *DHT11Sensor) ReadTemperature() (*types.Temperature, error) { - log.Println("DHT11 Read Method not yet implemented") - return nil, nil + err := dht.HostInit() + if err != nil { + return nil, fmt.Errorf("HostInit error: %v", err) + } + + gpio, err := types.GPIOToString(*s.GPIONumber) + if err != nil { + return nil, err + } + + dht, err := dht.NewDHT(gpio, dht.Celsius, "") + if err != nil { + return nil, fmt.Errorf("NewDHT error: %v", err) + } + + _, temperatureValue, err := dht.ReadRetry(11) + if err != nil { + return nil, fmt.Errorf("Read error: %v", err) + } + + temperature := &types.Temperature{ + TemperatureID: uuid.NewV4().String(), + TemperatureValue: temperatureValue, + TemperatureDate: time.Now(), + SensorID: s.SensorID, + } + + return temperature, nil } diff --git a/pkg/types/gpio.go b/pkg/types/gpio.go new file mode 100644 index 0000000..9bf41ac --- /dev/null +++ b/pkg/types/gpio.go @@ -0,0 +1,149 @@ +package types + +import ( + "fmt" +) + +type GPIO string + +const ( + GPIO02 GPIO = "GPIO02" + GPIO03 = "GPIO03" + GPIO04 = "GPIO04" + GPIO05 = "GPIO05" + GPIO06 = "GPIO06" + GPIO07 = "GPIO07" + GPIO08 = "GPIO08" + GPIO10 = "GPIO10" + GPIO11 = "GPIO11" + GPIO12 = "GPIO12" + GPIO13 = "GPIO13" + GPIO14 = "GPIO14" + GPIO15 = "GPIO15" + GPIO16 = "GPIO16" + GPIO17 = "GPIO17" + GPIO18 = "GPIO18" + GPIO19 = "GPIO19" + GPIO20 = "GPIO20" + GPIO21 = "GPIO21" + GPIO22 = "GPIO22" + GPIO23 = "GPIO23" + GPIO24 = "GPIO24" + GPIO25 = "GPIO25" + GPIO26 = "GPIO26" + GPIO27 = "GPIO27" +) + +func GPIOToString(gpio GPIO) (string, error) { + switch gpio { + case GPIO02: + return "GPIO02", nil + case GPIO03: + return "GPIO03", nil + case GPIO04: + return "GPIO04", nil + case GPIO05: + return "GPIO05", nil + case GPIO06: + return "GPIO06", nil + case GPIO07: + return "GPIO07", nil + case GPIO08: + return "GPIO08", nil + case GPIO10: + return "GPIO10", nil + case GPIO11: + return "GPIO11", nil + case GPIO12: + return "GPIO12", nil + case GPIO13: + return "GPIO13", nil + case GPIO14: + return "GPIO14", nil + case GPIO15: + return "GPIO15", nil + case GPIO16: + return "GPIO16", nil + case GPIO17: + return "GPIO17", nil + case GPIO18: + return "GPIO18", nil + case GPIO19: + return "GPIO19", nil + case GPIO20: + return "GPIO20", nil + case GPIO21: + return "GPIO21", nil + case GPIO22: + return "GPIO22", nil + case GPIO23: + return "GPIO23", nil + case GPIO24: + return "GPIO24", nil + case GPIO25: + return "GPIO25", nil + case GPIO26: + return "GPIO26", nil + case GPIO27: + return "GPIO27", nil + default: + return "", fmt.Errorf("Can not determine gpio %v", gpio) + } +} + +func StringToGPIO(gpio string) (GPIO, error) { + switch gpio { + case "GPIO02": + return GPIO02, nil + case "GPIO03": + return GPIO03, nil + case "GPIO04": + return GPIO04, nil + case "GPIO05": + return GPIO05, nil + case "GPIO06": + return GPIO06, nil + case "GPIO07": + return GPIO07, nil + case "GPIO08": + return GPIO08, nil + case "GPIO10": + return GPIO10, nil + case "GPIO11": + return GPIO11, nil + case "GPIO12": + return GPIO12, nil + case "GPIO13": + return GPIO13, nil + case "GPIO14": + return GPIO14, nil + case "GPIO15": + return GPIO15, nil + case "GPIO16": + return GPIO16, nil + case "GPIO17": + return GPIO17, nil + case "GPIO18": + return GPIO18, nil + case "GPIO19": + return GPIO19, nil + case "GPIO20": + return GPIO20, nil + case "GPIO21": + return GPIO21, nil + case "GPIO22": + return GPIO22, nil + case "GPIO23": + return GPIO23, nil + case "GPIO24": + return GPIO24, nil + case "GPIO25": + return GPIO25, nil + case "GPIO26": + return GPIO26, nil + case "GPIO27": + return GPIO27, nil + default: + return "", fmt.Errorf("Can not determine gpio %v", gpio) + } +} diff --git a/pkg/types/sensor.go b/pkg/types/sensor.go index 2861560..fd19772 100644 --- a/pkg/types/sensor.go +++ b/pkg/types/sensor.go @@ -1,7 +1,9 @@ package types import ( + "encoding/json" "fmt" + "io" "time" ) @@ -11,7 +13,7 @@ type Sensor struct { SensorName string `json:"sensor_name"` SensorLocation string `json:"sensor_location"` WireID *string `json:"wire_id"` - GPIONumber *string `json:"gpio_number"` + GPIONumber *GPIO `json:"gpio_number"` SensorModel SensorModel `json:"sensor_model"` SensorEnabled bool `json:"sensor_enabled"` SensorLastContact time.Time `json:"sensor_last_contact"` @@ -19,6 +21,26 @@ type Sensor struct { CreationDate time.Time `json:"creation_date"` } +// JSONDecoder decodes a json into a sensor +func (s *Sensor) JSONDecoder(r io.Reader) error { + decoder := json.NewDecoder(r) + err := decoder.Decode(s) + if err != nil { + return fmt.Errorf("Can not decode sensor from json: %v", err) + } + return nil +} + +func (s *Sensor) JSONEncoder(w io.Writer) error { + encoder := json.NewEncoder(w) + encoder.SetIndent("", " ") + err := encoder.Encode(s) + if err != nil { + return fmt.Errorf("Can not encode sensor to json: %v", err) + } + return nil +} + func (s *Sensor) Name() string { if s.SensorName != "" { return s.SensorName @@ -27,25 +49,3 @@ func (s *Sensor) Name() string { } return s.SensorID } - -type SensorModel string - -const ( - DHT11 SensorModel = "DHT11" - DHT22 = "DHT22" - DS18B20 = "DS18B20" -) - -// SelectSensorModel converts a string into a constant -func SelectSensorModel(model string) (SensorModel, error) { - switch model { - case "DHT11": - return DHT11, nil - case "DHT22": - return DHT22, nil - case "DS18B20": - return DS18B20, nil - default: - return "", fmt.Errorf("Sensor Model %v currently not supported", model) - } -} diff --git a/pkg/types/sensor_model.go b/pkg/types/sensor_model.go new file mode 100644 index 0000000..7dee42c --- /dev/null +++ b/pkg/types/sensor_model.go @@ -0,0 +1,25 @@ +package types + +import "fmt" + +type SensorModel string + +const ( + DHT11 SensorModel = "DHT11" + DHT22 = "DHT22" + DS18B20 = "DS18B20" +) + +// SelectSensorModel converts a string into a constant +func SelectSensorModel(model string) (SensorModel, error) { + switch model { + case "DHT11": + return DHT11, nil + case "DHT22": + return DHT22, nil + case "DS18B20": + return DS18B20, nil + default: + return "", fmt.Errorf("Sensor Model %v currently not supported", model) + } +}