PKGBUILD/pkg/sensor/ds18b20.go

74 lines
1.6 KiB
Go
Raw Normal View History

2019-02-22 12:08:58 +00:00
package sensor
import (
"fmt"
"io/ioutil"
"path/filepath"
"strconv"
"strings"
"time"
2019-02-22 12:08:58 +00:00
2019-08-20 19:37:45 +00:00
"github.com/go-flucky/flucky/pkg/internal/format"
2019-06-15 13:58:41 +00:00
"github.com/go-flucky/flucky/pkg/types"
2019-02-22 12:08:58 +00:00
uuid "github.com/satori/go.uuid"
)
// DS18B20 is a sensor to measure humidity and temperature.
2019-02-22 12:08:58 +00:00
type DS18B20 struct {
*types.Sensor
}
// GetID returns the sensor id
func (s *DS18B20) GetID() string {
return s.ID
}
// GetTicker returns a new ticker, which tick every when the sensor should be read
func (s *DS18B20) GetTicker() *time.Ticker {
duration, err := time.ParseDuration(s.TickDuration)
if err != nil {
duration = time.Minute
}
return time.NewTicker(duration)
}
// Read measured values
func (s *DS18B20) Read() ([]*types.MeasuredValue, error) {
2019-02-22 12:08:58 +00:00
2019-06-27 07:17:34 +00:00
if s.WireID == nil {
return nil, fmt.Errorf("WireID is not specified for sensor %v", s.Name)
2019-06-27 07:17:34 +00:00
}
data, err := ioutil.ReadFile(filepath.Join("/sys/bus/w1/devices", *s.WireID, "/w1_slave"))
2019-02-22 12:08:58 +00:00
if err != nil {
return nil, fmt.Errorf("Can not read data from sensor %v", s.Name)
}
raw := string(data)
i := strings.LastIndex(raw, "t=")
if i == -1 {
return nil, errorReadData
}
c, err := strconv.ParseFloat(raw[i+2:len(raw)-1], 64)
if err != nil {
return nil, errorParseData
2019-02-22 12:08:58 +00:00
}
temperatureValue := c / 1000
measuredValues := []*types.MeasuredValue{
&types.MeasuredValue{
ID: uuid.NewV4().String(),
Value: float64(temperatureValue),
ValueType: types.MeasuredValueTypeTemperature,
2019-08-20 19:37:45 +00:00
FromDate: format.FormatedTime(),
TillDate: format.FormatedTime(),
SensorID: s.ID,
},
2019-02-22 12:08:58 +00:00
}
return measuredValues, nil
}