feat: implementation of dht11 sensor
This commit is contained in:
		| @@ -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, | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -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") | ||||
| } | ||||
|   | ||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								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 | ||||
| ) | ||||
|   | ||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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= | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										149
									
								
								pkg/types/gpio.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								pkg/types/gpio.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| 	} | ||||
| } | ||||
| @@ -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) | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										25
									
								
								pkg/types/sensor_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								pkg/types/sensor_model.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user