feat(pkg/db): postgres database
This commit is contained in:
parent
c0aa155f36
commit
60ee044b88
7
.env
Normal file
7
.env
Normal file
@ -0,0 +1,7 @@
|
||||
PG_INTERN_PORT=5432
|
||||
PG_EXTERN_PORT=5432
|
||||
PG_NAME=public
|
||||
PG_USER=postgres
|
||||
PG_PASSWORD=postgres
|
||||
|
||||
TZ=Europe/Berlin
|
15
.env_dev
Normal file
15
.env_dev
Normal file
@ -0,0 +1,15 @@
|
||||
SERVER_PORT=80
|
||||
DATABASE_DRIVER=postgres
|
||||
DATABASE_NAME=postgres
|
||||
DATABASE_SCHEMA=public
|
||||
DATABASE_USER=postgres
|
||||
DATABASE_PASSWORD=postgres
|
||||
|
||||
PG_HOST=flucky_db
|
||||
PG_INTERN_PORT=5432
|
||||
PG_EXTERN_PORT=5433
|
||||
PG_NAME=public
|
||||
PG_USER=postgres
|
||||
PG_PASSWORD=postgres
|
||||
|
||||
TZ=Europe/Berlin
|
@ -2,4 +2,4 @@ services:
|
||||
- docker
|
||||
|
||||
script:
|
||||
- make container-build
|
||||
- make container-go-build
|
||||
|
19
Makefile
19
Makefile
@ -8,7 +8,7 @@ GID?=$(shell id --group)
|
||||
# VERSION
|
||||
# If no version is specified as a parameter of make, the last git hash
|
||||
# value is taken.
|
||||
VERSION:=$(or ${TRAVIS_TAG}, ${TRAVIS_TAG}, $(shell git rev-parse --short HEAD)-git)
|
||||
VERSION:=$(or ${TRAVIS_TAG}, $(shell git rev-parse --short HEAD)-git)
|
||||
|
||||
CONTAINER_RUNTIME?=$(shell which docker)
|
||||
|
||||
@ -16,23 +16,24 @@ GOARCH?=amd64
|
||||
GOOS?=linux
|
||||
|
||||
# default build
|
||||
build:
|
||||
go-build: bindata
|
||||
GOOS=${GOOS} \
|
||||
GOARCH=${GOARCH} \
|
||||
go build -ldflags "-X main.version=${VERSION}"
|
||||
chown -R ${UID}:${GID} *
|
||||
|
||||
test: bindata
|
||||
go-test: go-build
|
||||
go test -v ./pkg/...
|
||||
|
||||
bindata:
|
||||
go-bindata -pkg logfile_test -o ./pkg/logfile/bindata_test.go ./pkg/logfile/test/***
|
||||
go-bindata -pkg db -o ./pkg/db/bindataSQL.go ./pkg/db/sql/***
|
||||
go-bindata -pkg goldenfiles -o ./test/goldenfiles/bindata.go ./test/goldenfiles/json/***
|
||||
|
||||
container-build:
|
||||
$(MAKE) container-run COMMAND=build
|
||||
container-go-build:
|
||||
$(MAKE) container-run COMMAND=go-build
|
||||
|
||||
container-test:
|
||||
$(MAKE) container-run COMMAND=test
|
||||
container-go-test:
|
||||
$(MAKE) container-run COMMAND=go-test
|
||||
|
||||
container-run:
|
||||
${CONTAINER_RUNTIME} run \
|
||||
@ -42,6 +43,6 @@ container-run:
|
||||
make ${COMMAND} UID=${UID} GID=${GID} VERSION=${VERSION} GOOS=${GOOS} GOARCH=${GOARCH}
|
||||
|
||||
remote:
|
||||
$(MAKE) build GOARCH=arm
|
||||
$(MAKE) go-build GOARCH=arm
|
||||
scp flucky ${FLUCKY_REMOTE}:/usr/local/bin
|
||||
ssh ${FLUCKY_REMOTE} "chmod +x /usr/local/bin/flucky"
|
||||
|
11
cmd/cmd.go
11
cmd/cmd.go
@ -2,6 +2,7 @@ package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
@ -34,12 +35,19 @@ var rootCmd = &cobra.Command{
|
||||
return fmt.Errorf("Can not locate the hostname: %v", err)
|
||||
}
|
||||
|
||||
// Time must be truncted for postgres
|
||||
// Postgres currently does not support nanoseconds which is automatically
|
||||
// include into the go time object
|
||||
t := time.Now()
|
||||
l, _ := time.LoadLocation("Europe/Berlin")
|
||||
t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), int(math.Round(float64(t.Nanosecond())/1000000)*1000000), l)
|
||||
|
||||
cnf := config.Configuration{
|
||||
Device: &types.Device{
|
||||
DeviceID: uuid.NewV4().String(),
|
||||
DeviceName: hostname,
|
||||
Logfile: "/var/log/flucky/logfile.csv",
|
||||
CreationDate: time.Now(),
|
||||
CreationDate: t,
|
||||
},
|
||||
}
|
||||
|
||||
@ -62,6 +70,7 @@ func Execute(version string) {
|
||||
compression.InitCmd(rootCmd, &configFile)
|
||||
convert.InitCmd(rootCmd, &configFile)
|
||||
daemon.InitCmd(rootCmd, &configFile)
|
||||
// db.InitCmd(rootCmd, &configFile)
|
||||
humidity.InitCmd(rootCmd, &configFile)
|
||||
pressure.InitCmd(rootCmd, &configFile)
|
||||
rgbled.InitCmd(rootCmd, &configFile)
|
||||
|
49
cmd/db/db.go
Normal file
49
cmd/db/db.go
Normal file
@ -0,0 +1,49 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
database "github.com/go-flucky/flucky/pkg/db"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var configFile *string
|
||||
|
||||
var dbCmd = &cobra.Command{
|
||||
Use: "db",
|
||||
Short: "Operates with the configured database",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
postgresDB, err := database.New(database.DBOTypePostgres, "localhost", "5432", "postgres", "postgres", "postgres")
|
||||
if err != nil {
|
||||
log.Fatalf("%v", err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
devices := []*types.Device{
|
||||
&types.Device{
|
||||
DeviceID: "1684df26-bc72-4435-a4f9-74b24bdb286c",
|
||||
DeviceName: "raspberr-pi",
|
||||
},
|
||||
&types.Device{
|
||||
DeviceID: "1684df26-bc72-4435-a4f9-74b24bdb286c",
|
||||
DeviceName: "raspberr-pi",
|
||||
},
|
||||
}
|
||||
|
||||
if err := postgresDB.InsertDevices(ctx, devices); err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Execute a
|
||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
||||
configFile = cnfFile
|
||||
|
||||
cmd.AddCommand(dbCmd)
|
||||
|
||||
}
|
17
docker-compose.yml
Normal file
17
docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
|
||||
flucky-db:
|
||||
environment:
|
||||
- PGTZ=${TZ}
|
||||
- POSTGRES_PASSWORD=${PG_PASSWORD}
|
||||
- POSTGRES_USER=${PG_USER}
|
||||
- POSTGRES_DB=${PG_NAME}
|
||||
- TZ=${TZ}
|
||||
image: postgres:11.5-alpine
|
||||
ports:
|
||||
- ${PG_EXTERN_PORT}:${PG_INTERN_PORT}/tcp
|
||||
restart: always
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
1
go.mod
1
go.mod
@ -9,6 +9,7 @@ require (
|
||||
github.com/go-flucky/go-dht v0.1.1
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/kr/pretty v0.1.0 // indirect
|
||||
github.com/lib/pq v1.2.0
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
github.com/spf13/cobra v0.0.3
|
||||
github.com/spf13/pflag v1.0.3 // indirect
|
||||
|
2
go.sum
2
go.sum
@ -15,6 +15,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
||||
"github.com/go-flucky/flucky/pkg/sensor"
|
||||
|
||||
@ -101,7 +102,7 @@ func (c *Configuration) AddSensor(sensor *types.Sensor) error {
|
||||
}
|
||||
|
||||
// overwrite creation date
|
||||
sensor.CreationDate = time.Now()
|
||||
sensor.CreationDate = format.FormatedTime()
|
||||
|
||||
//TODO: check if wire sensor exists in /dev/bus/w1/devices
|
||||
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/config"
|
||||
"github.com/go-flucky/flucky/pkg/db"
|
||||
"github.com/go-flucky/flucky/pkg/logfile"
|
||||
"github.com/go-flucky/flucky/pkg/logger"
|
||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
||||
@ -15,6 +16,14 @@ import (
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
)
|
||||
|
||||
var (
|
||||
postgresHost = "markus-pc.trier.cryptic.systems"
|
||||
postgresPort = "5432"
|
||||
postgresDatabase = "postgres"
|
||||
postgresUser = "postgres"
|
||||
postgresPassword = "postgres"
|
||||
)
|
||||
|
||||
// Start the daemon
|
||||
func Start(cnf *config.Configuration, cleanCacheInterval time.Duration, compression bool, round float64, logger logger.Logger) {
|
||||
|
||||
@ -67,7 +76,9 @@ func Start(cnf *config.Configuration, cleanCacheInterval time.Duration, compress
|
||||
logger.Error("Can not turn on blue info light: %v", err)
|
||||
}
|
||||
|
||||
err = logfile.Append(measuredValuesLogfile, compression, round, measuredValuesCache)
|
||||
// err = logfile.Append(measuredValuesLogfile, compression, round, measuredValuesCache)
|
||||
|
||||
postgres, err := db.New(db.DBOTypePostgres, postgresHost, postgresPort, postgresDatabase, postgresUser, postgresPassword)
|
||||
if err != nil {
|
||||
|
||||
err = rgbled.Error(rgbLEDs)
|
||||
@ -76,8 +87,22 @@ func Start(cnf *config.Configuration, cleanCacheInterval time.Duration, compress
|
||||
}
|
||||
|
||||
cancel()
|
||||
logger.Fatal("Can not save temperatures: %v", err)
|
||||
logger.Error("Can not open database connection: %v", err)
|
||||
}
|
||||
|
||||
postgresCtx := context.Background()
|
||||
err = postgres.InsertMeasuredValues(postgresCtx, measuredValuesCache)
|
||||
if err != nil {
|
||||
|
||||
err = rgbled.Error(rgbLEDs)
|
||||
if err != nil {
|
||||
logger.Error("Can not turn on red info light: %v", err)
|
||||
}
|
||||
|
||||
cancel()
|
||||
logger.Error("Can not save caches measured values in database: %v", err)
|
||||
}
|
||||
|
||||
measuredValuesCache = make([]*types.MeasuredValue, 0)
|
||||
|
||||
case measuredValues, _ := <-measuredValuesChannel:
|
||||
|
36
pkg/db/db.go
Normal file
36
pkg/db/db.go
Normal file
@ -0,0 +1,36 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
type DBOType string
|
||||
|
||||
func (dboType DBOType) String() string {
|
||||
return string(dboType)
|
||||
}
|
||||
|
||||
const (
|
||||
DBOTypePostgres DBOType = "postgres"
|
||||
DBOTypeOracle = "oracle"
|
||||
)
|
||||
|
||||
func New(dboType DBOType, host string, port string, database string, user string, password string) (Database, error) {
|
||||
connStr := fmt.Sprintf("%v://%v:%v@%v:%v/%v?sslmode=disable", dboType.String(), user, password, host, port, database)
|
||||
newDBO, err := sql.Open(dboType.String(), connStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch dboType {
|
||||
case "postgres":
|
||||
return &Postgres{
|
||||
dbo: newDBO,
|
||||
}, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("Unknown Database Type")
|
||||
}
|
||||
}
|
16
pkg/db/errors.go
Normal file
16
pkg/db/errors.go
Normal file
@ -0,0 +1,16 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
var (
|
||||
errorBeginTransaction = errors.New("Can not start new transaction")
|
||||
errorRowNotFound = errors.New("Can not find row by given ID")
|
||||
errorPrepareStatement = errors.New("Can not prepare sql statement")
|
||||
errorRollbackTransaction = errors.New("Can not rollback transaction")
|
||||
errorScanRow = errors.New("Can not scan row")
|
||||
errorStatementExecute = errors.New("Can not execute statement")
|
||||
errorStatementQuery = errors.New("Can not query statement")
|
||||
errorUnknownMeasuredValueType = errors.New("Unknown measured value type")
|
||||
)
|
39
pkg/db/interfaces.go
Normal file
39
pkg/db/interfaces.go
Normal file
@ -0,0 +1,39 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
)
|
||||
|
||||
type Database interface {
|
||||
|
||||
// Close DB Connction
|
||||
Close() error
|
||||
|
||||
// Delete
|
||||
DeleteDevices(ctx context.Context, devices []*types.Device) error
|
||||
DeleteMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error
|
||||
DeleteSensors(ctx context.Context, sensors []*types.Sensor) error
|
||||
|
||||
// Insert
|
||||
InsertDevices(ctx context.Context, devices []*types.Device) error
|
||||
InsertMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error
|
||||
InsertSensors(ctx context.Context, sensors []*types.Sensor) error
|
||||
|
||||
// Select
|
||||
SelectDeviceByID(ctx context.Context, id string) (*types.Device, error)
|
||||
SelectHumidities(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
SelectHumidityByID(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
SelectMeasuredValuesByIDAndType(ctx context.Context, id string, valueType types.MeasuredValueType) (*types.MeasuredValue, error)
|
||||
SelectPressures(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
SelectPressureByID(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
SelectSensorByID(ctx context.Context, id string) (*types.Sensor, error)
|
||||
SelectTemperatures(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
SelectTemperatureByID(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
|
||||
// Update
|
||||
UpdateDevices(ctx context.Context, devices []*types.Device) error
|
||||
UpdateMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error
|
||||
UpdateSensors(ctx context.Context, sensots []*types.Sensor) error
|
||||
}
|
410
pkg/db/postgres.go
Normal file
410
pkg/db/postgres.go
Normal file
@ -0,0 +1,410 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
type Postgres struct {
|
||||
dbo *sql.DB
|
||||
}
|
||||
|
||||
func (p *Postgres) Close() error {
|
||||
return p.Close()
|
||||
}
|
||||
|
||||
func (p *Postgres) DeleteDevices(ctx context.Context, devices []*types.Device) error {
|
||||
query := string(MustAsset("pkg/db/sql/psql/deleteDevice.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, device := range devices {
|
||||
_, err := stmt.ExecContext(ctx, &device.DeviceID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) DeleteSensors(ctx context.Context, sensors []*types.Sensor) error {
|
||||
query := string(MustAsset("pkg/db/sql/psql/deleteSensor.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, sensor := range sensors {
|
||||
_, err := stmt.ExecContext(ctx, &sensor.SensorID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) DeleteMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
|
||||
deleteMeasuredValue := func(ctx context.Context, query string, measuredValues []*types.MeasuredValue) error {
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
_, err := stmt.ExecContext(ctx, &measuredValue.ID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
sortedMeasuredValueTypes := make(map[types.MeasuredValueType][]*types.MeasuredValue)
|
||||
for _, measuredValue := range measuredValues {
|
||||
if _, ok := sortedMeasuredValueTypes[measuredValue.ValueType]; !ok {
|
||||
sortedMeasuredValueTypes[measuredValue.ValueType] = make([]*types.MeasuredValue, 0)
|
||||
}
|
||||
sortedMeasuredValueTypes[measuredValue.ValueType] = append(sortedMeasuredValueTypes[measuredValue.ValueType], measuredValue)
|
||||
}
|
||||
|
||||
for measuredValueType, sortedMeasuredValues := range sortedMeasuredValueTypes {
|
||||
switch measuredValueType {
|
||||
case types.MeasuredValueTypeHumidity:
|
||||
if err := deleteMeasuredValue(ctx, string(MustAsset("pkg/db/sql/psql/deleteHumidity.sql")), sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
case types.MeasuredValueTypePressure:
|
||||
if err := deleteMeasuredValue(ctx, string(MustAsset("pkg/db/sql/psql/deletePressure.sql")), sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
case types.MeasuredValueTypeTemperature:
|
||||
if err := deleteMeasuredValue(ctx, string(MustAsset("pkg/db/sql/psql/deleteTemperature.sql")), sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) InsertDevices(ctx context.Context, devices []*types.Device) error {
|
||||
|
||||
query := string(MustAsset("pkg/db/sql/psql/insertDevice.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, device := range devices {
|
||||
_, err := stmt.ExecContext(ctx, &device.DeviceID, &device.DeviceName, &device.DeviceLocation, &device.CreationDate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) InsertMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
|
||||
sortedMeasuredValueTypes := make(map[types.MeasuredValueType][]*types.MeasuredValue)
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
if _, ok := sortedMeasuredValueTypes[measuredValue.ValueType]; !ok {
|
||||
sortedMeasuredValueTypes[measuredValue.ValueType] = make([]*types.MeasuredValue, 0)
|
||||
}
|
||||
sortedMeasuredValueTypes[measuredValue.ValueType] = append(sortedMeasuredValueTypes[measuredValue.ValueType], measuredValue)
|
||||
}
|
||||
|
||||
for measuredValueType, sortedMeasuredValues := range sortedMeasuredValueTypes {
|
||||
switch measuredValueType {
|
||||
case types.MeasuredValueTypeHumidity:
|
||||
if err := p.insertHumidity(ctx, sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
case types.MeasuredValueTypePressure:
|
||||
if err := p.insertPressure(ctx, sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
case types.MeasuredValueTypeTemperature:
|
||||
if err := p.insertTemperature(ctx, sortedMeasuredValues); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) insertHumidity(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
|
||||
query := string(MustAsset("pkg/db/sql/psql/insertHumidity.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
|
||||
if measuredValue.ValueType != types.MeasuredValueTypeHumidity {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err := stmt.ExecContext(ctx, &measuredValue.ID, &measuredValue.Value, &measuredValue.FromDate, &measuredValue.TillDate, &measuredValue.SensorID, &measuredValue.CreationDate, &measuredValue.UpdateDate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) insertPressure(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
|
||||
query := string(MustAsset("pkg/db/sql/psql/insertPressure.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
|
||||
if measuredValue.ValueType != types.MeasuredValueTypePressure {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err := stmt.ExecContext(ctx, &measuredValue.ID, &measuredValue.Value, &measuredValue.FromDate, &measuredValue.TillDate, &measuredValue.SensorID, &measuredValue.CreationDate, &measuredValue.UpdateDate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) insertTemperature(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
|
||||
query := string(MustAsset("pkg/db/sql/psql/insertTemperature.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
|
||||
if measuredValue.ValueType != types.MeasuredValueTypeTemperature {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err := stmt.ExecContext(ctx, &measuredValue.ID, &measuredValue.Value, &measuredValue.FromDate, &measuredValue.TillDate, &measuredValue.SensorID, &measuredValue.CreationDate, &measuredValue.UpdateDate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) InsertSensors(ctx context.Context, sensors []*types.Sensor) error {
|
||||
|
||||
query := string(MustAsset("pkg/db/sql/psql/insertSensor.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
for _, sensor := range sensors {
|
||||
|
||||
_, err := stmt.ExecContext(ctx, &sensor.SensorID, &sensor.SensorName, &sensor.SensorLocation, &sensor.WireID, &sensor.I2CBus, &sensor.I2CAddress, &sensor.GPIONumber, &sensor.SensorModel, &sensor.SensorEnabled, &sensor.DeviceID, &sensor.CreationDate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v: %v", errorStatementExecute, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectDeviceByID(ctx context.Context, id string) (*types.Device, error) {
|
||||
query := string(MustAsset("pkg/db/sql/psql/selectDeviceByID.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
|
||||
row := stmt.QueryRowContext(ctx, id)
|
||||
if row == nil {
|
||||
return nil, errorRowNotFound
|
||||
}
|
||||
|
||||
device := new(types.Device)
|
||||
err = row.Scan(&device.DeviceID, &device.DeviceName, &device.DeviceLocation, &device.CreationDate)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorScanRow, err)
|
||||
}
|
||||
|
||||
return device, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectMeasuredValuesByIDAndType(ctx context.Context, id string, valueType types.MeasuredValueType) (*types.MeasuredValue, error) {
|
||||
switch valueType {
|
||||
case types.MeasuredValueTypeHumidity:
|
||||
return p.SelectHumidityByID(ctx, id)
|
||||
case types.MeasuredValueTypePressure:
|
||||
return p.SelectPressureByID(ctx, id)
|
||||
case types.MeasuredValueTypeTemperature:
|
||||
return p.SelectTemperatureByID(ctx, id)
|
||||
default:
|
||||
return nil, fmt.Errorf("%v: %v", errorUnknownMeasuredValueType, valueType)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectHumidities(ctx context.Context) ([]*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectHumidities.sql"
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypeHumidity, queryFile, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return measuredValues, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectHumidityByID(ctx context.Context, id string) (*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectHumidityByID.sql"
|
||||
args := []interface{}{id}
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypeHumidity, queryFile, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(measuredValues) == 0 {
|
||||
return nil, fmt.Errorf("%v: %v", errorRowNotFound, id)
|
||||
}
|
||||
|
||||
return measuredValues[0], nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectPressures(ctx context.Context) ([]*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectPressures.sql"
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypePressure, queryFile, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return measuredValues, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectPressureByID(ctx context.Context, id string) (*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectPressureByID.sql"
|
||||
args := []interface{}{id}
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypePressure, queryFile, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(measuredValues) == 0 {
|
||||
return nil, fmt.Errorf("%v: %v", errorRowNotFound, id)
|
||||
}
|
||||
|
||||
return measuredValues[0], nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectSensorByID(ctx context.Context, id string) (*types.Sensor, error) {
|
||||
query := string(MustAsset("pkg/db/sql/psql/selectSensorByID.sql"))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
|
||||
row := stmt.QueryRowContext(ctx, id)
|
||||
if row == nil {
|
||||
return nil, errorRowNotFound
|
||||
}
|
||||
|
||||
sensor := new(types.Sensor)
|
||||
err = row.Scan(&sensor.SensorID, &sensor.SensorName, &sensor.SensorLocation, &sensor.WireID, &sensor.I2CBus, &sensor.I2CAddress, &sensor.GPIONumber, &sensor.SensorModel, &sensor.SensorEnabled, &sensor.DeviceID, &sensor.CreationDate)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorScanRow, err)
|
||||
}
|
||||
|
||||
return sensor, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectTemperatures(ctx context.Context) ([]*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectTemperatures.sql"
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypeTemperature, queryFile, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return measuredValues, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) SelectTemperatureByID(ctx context.Context, id string) (*types.MeasuredValue, error) {
|
||||
queryFile := "pkg/db/sql/psql/selectTemperatureByID.sql"
|
||||
args := []interface{}{id}
|
||||
measuredValues, err := p.selectMeasuredValues(ctx, types.MeasuredValueTypeTemperature, queryFile, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(measuredValues) == 0 {
|
||||
return nil, fmt.Errorf("%v: %v", errorRowNotFound, id)
|
||||
}
|
||||
|
||||
return measuredValues[0], nil
|
||||
}
|
||||
|
||||
func (p *Postgres) selectMeasuredValues(ctx context.Context, measuredValueType types.MeasuredValueType, queryFile string, queryArgs []interface{}) ([]*types.MeasuredValue, error) {
|
||||
query := string(MustAsset(queryFile))
|
||||
|
||||
stmt, err := p.dbo.PrepareContext(ctx, query)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorPrepareStatement, err)
|
||||
}
|
||||
|
||||
rows, err := stmt.QueryContext(ctx, queryArgs...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v: %v", errorStatementQuery, err)
|
||||
}
|
||||
|
||||
measuredValues := make([]*types.MeasuredValue, 0)
|
||||
for rows.Next() {
|
||||
measuredValue := new(types.MeasuredValue)
|
||||
measuredValue.ValueType = measuredValueType
|
||||
rows.Scan(&measuredValue.ID, &measuredValue.Value, &measuredValue.FromDate, &measuredValue.TillDate, &measuredValue.SensorID, &measuredValue.CreationDate, &measuredValue.UpdateDate)
|
||||
measuredValues = append(measuredValues, measuredValue)
|
||||
}
|
||||
|
||||
return measuredValues, nil
|
||||
}
|
||||
|
||||
func (p *Postgres) UpdateDevices(ctx context.Context, devices []*types.Device) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) UpdateMeasuredValues(ctx context.Context, measuredValues []*types.MeasuredValue) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Postgres) UpdateSensors(ctx context.Context, sensots []*types.Sensor) error {
|
||||
return nil
|
||||
}
|
273
pkg/db/postgres_test.go
Normal file
273
pkg/db/postgres_test.go
Normal file
@ -0,0 +1,273 @@
|
||||
package db_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/db"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/go-flucky/flucky/test/goldenfiles"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type test struct {
|
||||
Name string
|
||||
Test func(*testing.T)
|
||||
}
|
||||
|
||||
var (
|
||||
database db.Database
|
||||
|
||||
postgresContainerImage string = "docker.io/postgres/postgres"
|
||||
postgresHost string = "localhost"
|
||||
postgresPort string = "5432"
|
||||
postgresUser string = "postgres"
|
||||
postgresPassword string = "postgres"
|
||||
postgresDatabase string = "postgres"
|
||||
|
||||
goldenDevicesFilePath string = "test/goldenfiles/json/goldenDevices.json"
|
||||
goldenSensorsFilePath string = "test/goldenfiles/json/goldenSensors.json"
|
||||
goldenMeasuredValuesFilePath string = "test/goldenfiles/json/goldenMeasuredValues.json"
|
||||
goldenPressuresFilePath string = "test/goldenfiles/json/goldenPressures.json"
|
||||
goldenHumiditiesFilePath string = "test/goldenfiles/json/goldenHumidities.json"
|
||||
goldenTemperaturesFilePath string = "test/goldenfiles/json/goldenTemperatures.json"
|
||||
|
||||
goldenDevices []*types.Device
|
||||
goldenSensors []*types.Sensor
|
||||
goldenMeasuredValues []*types.MeasuredValue
|
||||
goldenPressures []*types.MeasuredValue
|
||||
goldenHumidites []*types.MeasuredValue
|
||||
goldenTemperatures []*types.MeasuredValue
|
||||
)
|
||||
|
||||
func load(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
d, err := goldenfiles.GetGoldenDevices(goldenDevicesFilePath)
|
||||
require.NoError(err)
|
||||
goldenDevices = d
|
||||
|
||||
s, err := goldenfiles.GetGoldenSensors(goldenSensorsFilePath)
|
||||
require.NoError(err)
|
||||
goldenSensors = s
|
||||
|
||||
hum, err := goldenfiles.GetGoldenMeasuredValues(goldenHumiditiesFilePath)
|
||||
require.NoError(err)
|
||||
goldenHumidites = hum
|
||||
|
||||
mv, err := goldenfiles.GetGoldenMeasuredValues(goldenMeasuredValuesFilePath)
|
||||
require.NoError(err)
|
||||
goldenMeasuredValues = mv
|
||||
|
||||
pres, err := goldenfiles.GetGoldenMeasuredValues(goldenPressuresFilePath)
|
||||
require.NoError(err)
|
||||
goldenPressures = pres
|
||||
|
||||
temp, err := goldenfiles.GetGoldenMeasuredValues(goldenTemperaturesFilePath)
|
||||
require.NoError(err)
|
||||
goldenTemperatures = temp
|
||||
|
||||
}
|
||||
|
||||
func TestPostgres(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
load(t)
|
||||
|
||||
db, err := db.New(db.DBOTypePostgres, postgresHost, postgresPort, postgresDatabase, postgresUser, postgresPassword)
|
||||
database = db
|
||||
require.Nil(err)
|
||||
|
||||
tests := []*test{
|
||||
&test{
|
||||
Name: "insertDevices",
|
||||
Test: testInsertDevices,
|
||||
},
|
||||
&test{
|
||||
Name: "insertSensors",
|
||||
Test: testInsertSensors,
|
||||
},
|
||||
&test{
|
||||
Name: "insertHumidity",
|
||||
Test: testInsertHumidity,
|
||||
},
|
||||
&test{
|
||||
Name: "insertPressure",
|
||||
Test: testInsertPressure,
|
||||
},
|
||||
&test{
|
||||
Name: "insertTemperatures",
|
||||
Test: testInsertTemperatures,
|
||||
},
|
||||
&test{
|
||||
Name: "deleteHumidities",
|
||||
Test: testDeleteHumidity,
|
||||
},
|
||||
&test{
|
||||
Name: "deletePressures",
|
||||
Test: testDeletePressures,
|
||||
},
|
||||
&test{
|
||||
Name: "deleteTemperatures",
|
||||
Test: testDeleteTemperatures,
|
||||
},
|
||||
&test{
|
||||
Name: "insertMeasuredValues",
|
||||
Test: testInsertMeasuredValues,
|
||||
},
|
||||
&test{
|
||||
Name: "deleteMeasuredValues",
|
||||
Test: testDeleteMeasuredValues,
|
||||
},
|
||||
&test{
|
||||
Name: "deleteSensors",
|
||||
Test: testDeleteSensors,
|
||||
},
|
||||
&test{
|
||||
Name: "deleteDevices",
|
||||
Test: testDeleteDevices,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.Name, test.Test)
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertDevices(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertDevices(ctx, goldenDevices)
|
||||
require.NoError(err)
|
||||
for _, goldenDevice := range goldenDevices {
|
||||
testDevice, err := database.SelectDeviceByID(ctx, goldenDevice.DeviceID)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, goldenDevice, testDevice)
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertSensors(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertSensors(ctx, goldenSensors)
|
||||
require.NoError(err)
|
||||
for _, goldenSensor := range goldenSensors {
|
||||
testSensor, err := database.SelectSensorByID(ctx, goldenSensor.SensorID)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, goldenSensor, testSensor)
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertHumidity(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertMeasuredValues(ctx, goldenHumidites)
|
||||
require.NoError(err)
|
||||
for _, goldenHumidity := range goldenHumidites {
|
||||
testHumidity, err := database.SelectHumidityByID(ctx, goldenHumidity.ID)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, []*types.MeasuredValue{testHumidity}, []*types.MeasuredValue{testHumidity})
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertMeasuredValues(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertMeasuredValues(ctx, goldenMeasuredValues)
|
||||
require.NoError(err)
|
||||
for _, goldenMeasuredValue := range goldenMeasuredValues {
|
||||
testMeasuredValue, err := database.SelectMeasuredValuesByIDAndType(ctx, goldenMeasuredValue.ID, goldenMeasuredValue.ValueType)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, []*types.MeasuredValue{goldenMeasuredValue}, []*types.MeasuredValue{testMeasuredValue})
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertPressure(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertMeasuredValues(ctx, goldenPressures)
|
||||
require.NoError(err)
|
||||
for _, goldenPressure := range goldenPressures {
|
||||
testPressure, err := database.SelectPressureByID(ctx, goldenPressure.ID)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, []*types.MeasuredValue{testPressure}, []*types.MeasuredValue{testPressure})
|
||||
}
|
||||
}
|
||||
|
||||
func testInsertTemperatures(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.InsertMeasuredValues(ctx, goldenTemperatures)
|
||||
require.NoError(err)
|
||||
for _, goldenTemperature := range goldenTemperatures {
|
||||
testTemperature, err := database.SelectTemperatureByID(ctx, goldenTemperature.ID)
|
||||
require.NoError(err)
|
||||
goldenfiles.CompareMeasuredValues(t, []*types.MeasuredValue{goldenTemperature}, []*types.MeasuredValue{testTemperature})
|
||||
}
|
||||
}
|
||||
|
||||
func testDeleteDevices(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteDevices(ctx, goldenDevices)
|
||||
require.NoError(err)
|
||||
for _, goldenDevice := range goldenDevices {
|
||||
_, err := database.SelectDeviceByID(ctx, goldenDevice.DeviceID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func testDeleteSensors(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteSensors(ctx, goldenSensors)
|
||||
require.NoError(err)
|
||||
for _, goldenSensor := range goldenSensors {
|
||||
_, err := database.SelectDeviceByID(ctx, goldenSensor.SensorID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func testDeleteHumidity(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteMeasuredValues(ctx, goldenHumidites)
|
||||
require.NoError(err)
|
||||
for _, goldenHumidity := range goldenHumidites {
|
||||
_, err := database.SelectHumidityByID(ctx, goldenHumidity.ID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func testDeleteMeasuredValues(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteMeasuredValues(ctx, goldenMeasuredValues)
|
||||
require.NoError(err)
|
||||
for _, goldenMeasuredValue := range goldenMeasuredValues {
|
||||
_, err := database.SelectPressureByID(ctx, goldenMeasuredValue.ID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func testDeletePressures(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteMeasuredValues(ctx, goldenPressures)
|
||||
require.NoError(err)
|
||||
for _, goldenPressure := range goldenPressures {
|
||||
_, err := database.SelectPressureByID(ctx, goldenPressure.ID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func testDeleteTemperatures(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
err := database.DeleteMeasuredValues(ctx, goldenTemperatures)
|
||||
require.NoError(err)
|
||||
for _, goldenTemperature := range goldenTemperatures {
|
||||
_, err := database.SelectTemperatureByID(ctx, goldenTemperature.ID)
|
||||
require.Error(err)
|
||||
}
|
||||
}
|
2
pkg/db/sql/psql/deleteDevice.sql
Normal file
2
pkg/db/sql/psql/deleteDevice.sql
Normal file
@ -0,0 +1,2 @@
|
||||
DELETE FROM devices
|
||||
WHERE device_id = $1;
|
2
pkg/db/sql/psql/deleteHumidity.sql
Normal file
2
pkg/db/sql/psql/deleteHumidity.sql
Normal file
@ -0,0 +1,2 @@
|
||||
DELETE FROM humidities
|
||||
WHERE humidity_id = $1;
|
2
pkg/db/sql/psql/deletePressure.sql
Normal file
2
pkg/db/sql/psql/deletePressure.sql
Normal file
@ -0,0 +1,2 @@
|
||||
DELETE FROM pressures
|
||||
WHERE pressure_id = $1;
|
2
pkg/db/sql/psql/deleteSensor.sql
Normal file
2
pkg/db/sql/psql/deleteSensor.sql
Normal file
@ -0,0 +1,2 @@
|
||||
DELETE FROM sensors
|
||||
WHERE sensor_id = $1;
|
2
pkg/db/sql/psql/deleteTemperature.sql
Normal file
2
pkg/db/sql/psql/deleteTemperature.sql
Normal file
@ -0,0 +1,2 @@
|
||||
DELETE FROM temperatures
|
||||
WHERE temperature_id = $1;
|
7
pkg/db/sql/psql/insertDevice.sql
Normal file
7
pkg/db/sql/psql/insertDevice.sql
Normal file
@ -0,0 +1,7 @@
|
||||
INSERT INTO devices (
|
||||
device_id,
|
||||
device_name,
|
||||
device_location,
|
||||
creation_date
|
||||
)
|
||||
VALUES ($1, $2, $3, $4);
|
10
pkg/db/sql/psql/insertHumidity.sql
Normal file
10
pkg/db/sql/psql/insertHumidity.sql
Normal file
@ -0,0 +1,10 @@
|
||||
INSERT INTO humidities (
|
||||
humidity_id,
|
||||
humidity_value,
|
||||
humidity_from_date,
|
||||
humidity_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7);
|
10
pkg/db/sql/psql/insertPressure.sql
Normal file
10
pkg/db/sql/psql/insertPressure.sql
Normal file
@ -0,0 +1,10 @@
|
||||
INSERT INTO pressures (
|
||||
pressure_id,
|
||||
pressure_value,
|
||||
pressure_from_date,
|
||||
pressure_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7);
|
14
pkg/db/sql/psql/insertSensor.sql
Normal file
14
pkg/db/sql/psql/insertSensor.sql
Normal file
@ -0,0 +1,14 @@
|
||||
INSERT INTO sensors (
|
||||
sensor_id,
|
||||
sensor_name,
|
||||
sensor_location,
|
||||
wire_id,
|
||||
i2c_bus,
|
||||
i2c_address,
|
||||
gpio_number,
|
||||
sensor_model,
|
||||
sensor_enabled,
|
||||
device_id,
|
||||
creation_date
|
||||
)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);
|
10
pkg/db/sql/psql/insertTemperature.sql
Normal file
10
pkg/db/sql/psql/insertTemperature.sql
Normal file
@ -0,0 +1,10 @@
|
||||
INSERT INTO temperatures (
|
||||
temperature_id,
|
||||
temperature_value,
|
||||
temperature_from_date,
|
||||
temperature_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7);
|
146
pkg/db/sql/psql/schema.sql
Normal file
146
pkg/db/sql/psql/schema.sql
Normal file
@ -0,0 +1,146 @@
|
||||
DROP TABLE IF EXISTS devices CASCADE;
|
||||
DROP TABLE IF EXISTS sensors CASCADE;
|
||||
DROP TABLE IF EXISTS humidities CASCADE;
|
||||
DROP TABLE IF EXISTS pressures CASCADE;
|
||||
DROP TABLE IF EXISTS temperatures CASCADE;
|
||||
|
||||
|
||||
-- +----------------------------------------+
|
||||
-- | TABLES |
|
||||
-- +----------------------------------------+
|
||||
CREATE TABLE IF NOT EXISTS devices(
|
||||
device_id CHAR(36) CONSTRAINT pk_devices PRIMARY KEY,
|
||||
device_name VARCHAR(32) NOT NULL,
|
||||
device_location VARCHAR(32),
|
||||
device_last_contact TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
creation_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sensors (
|
||||
sensor_id CHAR(36) CONSTRAINT pk_sensors PRIMARY KEY,
|
||||
sensor_name VARCHAR(32) NOT NULL,
|
||||
sensor_location VARCHAR(32) NOT NULL,
|
||||
wire_id VARCHAR(15),
|
||||
i2c_bus VARCHAR(255),
|
||||
i2c_address VARCHAR(12),
|
||||
gpio_number VARCHAR(6),
|
||||
sensor_model VARCHAR(16) NOT NULL,
|
||||
sensor_enabled BOOLEAN DEFAULT TRUE NOT NULL,
|
||||
sensor_last_contact TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
device_id CHAR(36),
|
||||
creation_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS humidities (
|
||||
humidity_id CHAR(36) CONSTRAINT pk_humidities PRIMARY KEY,
|
||||
humidity_value NUMERIC(9,3) NOT NULL,
|
||||
humidity_from_date TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||
humidity_till_date TIMESTAMP WITH TIME ZONE,
|
||||
sensor_id CHAR(36),
|
||||
creation_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
update_date TIMESTAMP WITH TIME ZONE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS pressures (
|
||||
pressure_id CHAR(36) CONSTRAINT pk_pressures PRIMARY KEY,
|
||||
pressure_value NUMERIC(10,3) NOT NULL,
|
||||
pressure_from_date TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||
pressure_till_date TIMESTAMP WITH TIME ZONE,
|
||||
sensor_id CHAR(36),
|
||||
creation_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
update_date TIMESTAMP WITH TIME ZONE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS temperatures (
|
||||
temperature_id CHAR(36) CONSTRAINT pk_temperatures PRIMARY KEY,
|
||||
temperature_value NUMERIC(5,3) NOT NULL,
|
||||
temperature_from_date TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||
temperature_till_date TIMESTAMP WITH TIME ZONE,
|
||||
sensor_id CHAR(36),
|
||||
creation_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
update_date TIMESTAMP WITH TIME ZONE
|
||||
);
|
||||
|
||||
-- +----------------------------------------+
|
||||
-- | FOREIGN-KEYS |
|
||||
-- +----------------------------------------+
|
||||
ALTER TABLE sensors
|
||||
ADD FOREIGN KEY (device_id)
|
||||
REFERENCES devices(device_id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE humidities
|
||||
ADD FOREIGN KEY (sensor_id)
|
||||
REFERENCES sensors(sensor_id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE pressures
|
||||
ADD FOREIGN KEY (sensor_id)
|
||||
REFERENCES sensors(sensor_id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE temperatures
|
||||
ADD FOREIGN KEY (sensor_id)
|
||||
REFERENCES sensors(sensor_id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE;
|
||||
|
||||
-- +----------------------------------------+
|
||||
-- | Trigger-Functions |
|
||||
-- +----------------------------------------+
|
||||
CREATE OR REPLACE FUNCTION device_last_contact()
|
||||
RETURNS trigger AS
|
||||
$BODY$
|
||||
BEGIN
|
||||
UPDATE devices
|
||||
SET device_last_contact = CURRENT_TIMESTAMP
|
||||
WHERE device_id = NEW.device_id;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$BODY$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sensor_last_contact()
|
||||
RETURNS trigger AS
|
||||
$BODY$
|
||||
BEGIN
|
||||
UPDATE sensors
|
||||
SET sensor_last_contact = CURRENT_TIMESTAMP,
|
||||
sensor_enabled = true
|
||||
WHERE sensor_id = NEW.sensor_id;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$BODY$ LANGUAGE plpgsql;
|
||||
|
||||
-- +----------------------------------------+
|
||||
-- | Trigger |
|
||||
-- +----------------------------------------+
|
||||
DROP TRIGGER IF EXISTS ai_humidities ON humidities;
|
||||
DROP TRIGGER IF EXISTS ai_pressure ON pressures;
|
||||
DROP TRIGGER IF EXISTS ai_temperatures ON temperatures;
|
||||
|
||||
CREATE TRIGGER au_sensors
|
||||
AFTER UPDATE
|
||||
ON sensors
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE device_last_contact();
|
||||
|
||||
CREATE TRIGGER ai_humidities
|
||||
AFTER INSERT
|
||||
ON humidities
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE sensor_last_contact();
|
||||
|
||||
CREATE TRIGGER ai_pressures
|
||||
AFTER INSERT
|
||||
ON pressures
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE sensor_last_contact();
|
||||
|
||||
CREATE TRIGGER ai_temperatures
|
||||
AFTER INSERT
|
||||
ON temperatures
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE sensor_last_contact();
|
8
pkg/db/sql/psql/selectDeviceByID.sql
Normal file
8
pkg/db/sql/psql/selectDeviceByID.sql
Normal file
@ -0,0 +1,8 @@
|
||||
SELECT
|
||||
device_id,
|
||||
device_name,
|
||||
device_location,
|
||||
creation_date
|
||||
FROM
|
||||
devices
|
||||
WHERE device_id = $1;
|
10
pkg/db/sql/psql/selectHumidities.sql
Normal file
10
pkg/db/sql/psql/selectHumidities.sql
Normal file
@ -0,0 +1,10 @@
|
||||
SELECT
|
||||
humidity_id,
|
||||
humidity_value,
|
||||
humidity_from_date,
|
||||
humidity_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
humidities;
|
12
pkg/db/sql/psql/selectHumidityByID.sql
Normal file
12
pkg/db/sql/psql/selectHumidityByID.sql
Normal file
@ -0,0 +1,12 @@
|
||||
SELECT
|
||||
humidity_id,
|
||||
humidity_value,
|
||||
humidity_from_date,
|
||||
humidity_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
humidities
|
||||
WHERE
|
||||
humidity_id = $1;
|
12
pkg/db/sql/psql/selectPressureByID.sql
Normal file
12
pkg/db/sql/psql/selectPressureByID.sql
Normal file
@ -0,0 +1,12 @@
|
||||
SELECT
|
||||
pressure_id,
|
||||
pressure_value,
|
||||
pressure_from_date,
|
||||
pressure_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
pressures
|
||||
WHERE
|
||||
pressure_id = $1;
|
10
pkg/db/sql/psql/selectPressures.sql
Normal file
10
pkg/db/sql/psql/selectPressures.sql
Normal file
@ -0,0 +1,10 @@
|
||||
SELECT
|
||||
pressure_id,
|
||||
pressure_value,
|
||||
pressure_from_date,
|
||||
pressure_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
pressures;
|
16
pkg/db/sql/psql/selectSensorByID.sql
Normal file
16
pkg/db/sql/psql/selectSensorByID.sql
Normal file
@ -0,0 +1,16 @@
|
||||
SELECT
|
||||
sensor_id,
|
||||
sensor_name,
|
||||
sensor_location,
|
||||
wire_id,
|
||||
i2c_bus,
|
||||
i2c_address,
|
||||
gpio_number,
|
||||
sensor_model,
|
||||
sensor_enabled,
|
||||
device_id,
|
||||
creation_date
|
||||
FROM
|
||||
sensors
|
||||
WHERE
|
||||
sensor_id = $1;
|
12
pkg/db/sql/psql/selectTemperatureByID.sql
Normal file
12
pkg/db/sql/psql/selectTemperatureByID.sql
Normal file
@ -0,0 +1,12 @@
|
||||
SELECT
|
||||
temperature_id,
|
||||
temperature_value,
|
||||
temperature_from_date,
|
||||
temperature_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
temperatures
|
||||
WHERE
|
||||
temperature_id = $1;
|
10
pkg/db/sql/psql/selectTemperatures.sql
Normal file
10
pkg/db/sql/psql/selectTemperatures.sql
Normal file
@ -0,0 +1,10 @@
|
||||
SELECT
|
||||
temperature_id,
|
||||
temperature_value,
|
||||
temperature_from_date,
|
||||
temperature_till_date,
|
||||
sensor_id,
|
||||
creation_date,
|
||||
update_date
|
||||
FROM
|
||||
temperatures;
|
23
pkg/internal/format/format.go
Normal file
23
pkg/internal/format/format.go
Normal file
@ -0,0 +1,23 @@
|
||||
package format
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"math"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
errorPraseTime = errors.New("Can not parse time")
|
||||
|
||||
TimeFormat = "2006-01-02T15:04:05.999999Z07:00"
|
||||
)
|
||||
|
||||
// FormatedTime returns a current timestamp without nano seconds. Postgres
|
||||
// currently does not support nanoseconds which is automatically include into
|
||||
// the go time object
|
||||
func FormatedTime() time.Time {
|
||||
t := time.Now()
|
||||
l, _ := time.LoadLocation("Europe/Berlin")
|
||||
return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), int(math.Round(float64(t.Nanosecond())/1000000)*1000000), l)
|
||||
|
||||
}
|
@ -7,6 +7,7 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
)
|
||||
|
||||
@ -50,7 +51,7 @@ func (cl *csvLogfile) Read() ([]*types.MeasuredValue, error) {
|
||||
// Times
|
||||
times := make([]time.Time, 0)
|
||||
for _, i := range []int{3, 4} {
|
||||
time, err := time.Parse(timeFormat, record[i])
|
||||
time, err := time.Parse(format.TimeFormat, record[i])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v %v: %v", errorParseTime, record[i], err)
|
||||
}
|
||||
@ -67,14 +68,14 @@ func (cl *csvLogfile) Read() ([]*types.MeasuredValue, error) {
|
||||
}
|
||||
|
||||
// Creation date
|
||||
creationDate, err := time.Parse(timeFormat, record[6])
|
||||
creationDate, err := time.Parse(format.TimeFormat, record[6])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v %v: %v", errorParseTime, record[6], err)
|
||||
}
|
||||
measuredValue.CreationDate = &creationDate
|
||||
measuredValue.CreationDate = creationDate
|
||||
|
||||
if record[7] != "null" {
|
||||
updateDate, err := time.Parse(timeFormat, record[7])
|
||||
updateDate, err := time.Parse(format.TimeFormat, record[7])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%v %v: %v", errorParseTime, record[7], err)
|
||||
}
|
||||
@ -106,19 +107,15 @@ func (cl *csvLogfile) Write(measuredValues []*types.MeasuredValue) error {
|
||||
measuredValue.ID,
|
||||
fmt.Sprintf("%v", measuredValue.ValueType),
|
||||
fmt.Sprintf("%v", measuredValue.Value),
|
||||
measuredValue.FromDate.Format(timeFormat),
|
||||
measuredValue.TillDate.Format(timeFormat),
|
||||
measuredValue.FromDate.Format(format.TimeFormat),
|
||||
measuredValue.TillDate.Format(format.TimeFormat),
|
||||
measuredValue.SensorID,
|
||||
}
|
||||
|
||||
if measuredValue.CreationDate != nil {
|
||||
record = append(record, measuredValue.CreationDate.Format(timeFormat))
|
||||
} else {
|
||||
record = append(record, "null")
|
||||
}
|
||||
record = append(record, measuredValue.CreationDate.Format(format.TimeFormat))
|
||||
|
||||
if measuredValue.UpdateDate != nil {
|
||||
record = append(record, measuredValue.UpdateDate.Format(timeFormat))
|
||||
record = append(record, measuredValue.UpdateDate.Format(format.TimeFormat))
|
||||
} else {
|
||||
record = append(record, "null")
|
||||
}
|
||||
|
@ -2,25 +2,27 @@ package logfile
|
||||
|
||||
import "errors"
|
||||
|
||||
var errorLogfileCreate = errors.New("Can not create logfile")
|
||||
var errorLogfileDecode = errors.New("Can not decode from reader")
|
||||
var errorLogfileEncode = errors.New("Can not encode from writer")
|
||||
var errorLogfileMarshal = errors.New("Can not marshal values")
|
||||
var errorLogfileNotFound = errors.New("Can not find logfile")
|
||||
var errorLogfileOpen = errors.New("Can not open logfile")
|
||||
var errorLogfileRead = errors.New("Can not read from given reader")
|
||||
var errorLogfileUnmarshal = errors.New("Can not unmarshal values")
|
||||
var errorLogfileWrite = errors.New("Can not write with given writer")
|
||||
var (
|
||||
errorLogfileCreate = errors.New("Can not create logfile")
|
||||
errorLogfileDecode = errors.New("Can not decode from reader")
|
||||
errorLogfileEncode = errors.New("Can not encode from writer")
|
||||
errorLogfileMarshal = errors.New("Can not marshal values")
|
||||
errorLogfileNotFound = errors.New("Can not find logfile")
|
||||
errorLogfileOpen = errors.New("Can not open logfile")
|
||||
errorLogfileRead = errors.New("Can not read from given reader")
|
||||
errorLogfileUnmarshal = errors.New("Can not unmarshal values")
|
||||
errorLogfileWrite = errors.New("Can not write with given writer")
|
||||
|
||||
var errorParseFloat = errors.New("Can not parse float")
|
||||
var errorParseMeasurementUnit = errors.New("Can not parse mesaurement unit")
|
||||
var errorParseTime = errors.New("Can not parse time")
|
||||
errorParseFloat = errors.New("Can not parse float")
|
||||
errorParseMeasurementUnit = errors.New("Can not parse mesaurement unit")
|
||||
errorParseTime = errors.New("Can not parse time")
|
||||
|
||||
var errorNoValidHumidityID = errors.New("No valid humidity id detected or available")
|
||||
var errorNoValidMesuredValue = errors.New("No mesured value detected or available")
|
||||
var errorNoValidSensorID = errors.New("No sensor id detected or available")
|
||||
var errorNoValidTemperatureID = errors.New("No valid temperature id detected or available")
|
||||
var errorNoValidTime = errors.New("No time detected or available")
|
||||
var errorNoValidTimePeriods = errors.New("No valid time periods")
|
||||
errorNoValidHumidityID = errors.New("No valid humidity id detected or available")
|
||||
errorNoValidMesuredValue = errors.New("No mesured value detected or available")
|
||||
errorNoValidSensorID = errors.New("No sensor id detected or available")
|
||||
errorNoValidTemperatureID = errors.New("No valid temperature id detected or available")
|
||||
errorNoValidTime = errors.New("No time detected or available")
|
||||
errorNoValidTimePeriods = errors.New("No valid time periods")
|
||||
|
||||
var errorTypeSwitch = errors.New("Can not detect type via type switch")
|
||||
errorTypeSwitch = errors.New("Can not detect type via type switch")
|
||||
)
|
||||
|
@ -4,13 +4,12 @@ import (
|
||||
"math"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
)
|
||||
|
||||
// var validUUID = regexp.MustCompile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$")
|
||||
var timeFormat = "2006-01-02T15:04:05.999999Z07:00"
|
||||
|
||||
// Append adds an array of several measured values to a logfile
|
||||
func Append(logfile Logfile, compression bool, round float64, measuredValues []*types.MeasuredValue) error {
|
||||
@ -56,7 +55,7 @@ func Compression(measuredValues []*types.MeasuredValue) []*types.MeasuredValue {
|
||||
return measuredValues[i].FromDate.Before(measuredValues[j].TillDate)
|
||||
})
|
||||
|
||||
now := time.Now()
|
||||
now := format.FormatedTime()
|
||||
|
||||
for _, measuredValue := range measuredValues {
|
||||
if _, ok := lastMeasuredValuesBySensors[measuredValue.SensorID]; !ok {
|
||||
@ -124,11 +123,10 @@ func New(logfile string) Logfile {
|
||||
|
||||
}
|
||||
|
||||
func writeCreationDate(measuredValues []*types.MeasuredValue) {
|
||||
now := time.Now()
|
||||
func writeCreationDate(measuredValues []*types.MeasuredValue) error {
|
||||
for _, measuredValue := range measuredValues {
|
||||
if measuredValue.CreationDate == nil {
|
||||
measuredValue.CreationDate = &now
|
||||
}
|
||||
now := format.FormatedTime()
|
||||
measuredValue.CreationDate = now
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -5,11 +5,11 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/d2r2/go-bsbmp"
|
||||
"github.com/d2r2/go-i2c"
|
||||
"github.com/d2r2/go-logger"
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
)
|
||||
@ -67,24 +67,24 @@ func (s *BME280) Read() ([]*types.MeasuredValue, error) {
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(humidityValue),
|
||||
ValueType: types.MeasuredValueTypeHumidity,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
&types.MeasuredValue{
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(pressureValue),
|
||||
ValueType: types.MeasuredValueTypePressure,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
&types.MeasuredValue{
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(temperatureValue),
|
||||
ValueType: types.MeasuredValueTypeTemperature,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
}
|
||||
|
@ -4,8 +4,8 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/go-flucky/go-dht"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
@ -49,16 +49,16 @@ func (s *DHT11) Read() ([]*types.MeasuredValue, error) {
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(humidityValue),
|
||||
ValueType: types.MeasuredValueTypeHumidity,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
&types.MeasuredValue{
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(temperatureValue),
|
||||
ValueType: types.MeasuredValueTypeTemperature,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
}
|
||||
|
@ -4,8 +4,8 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/go-flucky/go-dht"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
@ -49,16 +49,16 @@ func (s *DHT22) Read() ([]*types.MeasuredValue, error) {
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(humidityValue),
|
||||
ValueType: types.MeasuredValueTypeHumidity,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
&types.MeasuredValue{
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(temperatureValue),
|
||||
ValueType: types.MeasuredValueTypeTemperature,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
}
|
||||
|
@ -8,8 +8,8 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/format"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
)
|
||||
@ -55,8 +55,8 @@ func (s *DS18B20) Read() ([]*types.MeasuredValue, error) {
|
||||
ID: uuid.NewV4().String(),
|
||||
Value: float64(temperatureValue),
|
||||
ValueType: types.MeasuredValueTypeTemperature,
|
||||
FromDate: time.Now(),
|
||||
TillDate: time.Now(),
|
||||
FromDate: format.FormatedTime(),
|
||||
TillDate: format.FormatedTime(),
|
||||
SensorID: s.SensorID,
|
||||
},
|
||||
}
|
||||
|
@ -4,10 +4,10 @@ import "time"
|
||||
|
||||
// Device ...
|
||||
type Device struct {
|
||||
DeviceID string `json:"device_id" xml:"device_id"`
|
||||
DeviceName string `json:"device_name" xml:"device_name"`
|
||||
DeviceLocation *string `json:"device_location" xml:"device_location"`
|
||||
DeviceLastContact time.Time `json:"device_last_contact" xml:"device_last_contact"`
|
||||
Logfile string `json:"logfile" xml:"logfile"`
|
||||
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
|
||||
DeviceID string `json:"device_id" xml:"device_id"`
|
||||
DeviceName string `json:"device_name" xml:"device_name"`
|
||||
DeviceLocation *string `json:"device_location" xml:"device_location"`
|
||||
DeviceLastContact *time.Time `json:"device_last_contact" xml:"device_last_contact"`
|
||||
Logfile string `json:"logfile" xml:"logfile"`
|
||||
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ type MeasuredValue struct {
|
||||
FromDate time.Time `json:"from_date" xml:"from_date"`
|
||||
TillDate time.Time `json:"till_date" xml:"till_date"`
|
||||
SensorID string `json:"sensor_id" xml:"sensor_id"`
|
||||
CreationDate *time.Time `json:"creation_date" xml:"creation_date"`
|
||||
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
|
||||
UpdateDate *time.Time `json:"update_date" xml:"update_date"`
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@ type Sensor struct {
|
||||
GPIONumber *GPIO `json:"gpio_number" xml:"gpio_number"`
|
||||
SensorModel SensorModel `json:"sensor_model" xml:"sensor_model"`
|
||||
SensorEnabled bool `json:"sensor_enabled" xml:"sensor_enabled"`
|
||||
SensorLastContact time.Time `json:"sensor_last_contact" xml:"sensor_last_contact"`
|
||||
SensorLastContact *time.Time `json:"sensor_last_contact" xml:"sensor_last_contact"`
|
||||
DeviceID string `json:"device_id" xml:"device_id"`
|
||||
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
|
||||
}
|
||||
|
69
test/goldenfiles/goldenfiles.go
Normal file
69
test/goldenfiles/goldenfiles.go
Normal file
@ -0,0 +1,69 @@
|
||||
package goldenfiles
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func CompareMeasuredValues(t *testing.T, goldenInterface interface{}, testInterface interface{}) {
|
||||
require := require.New(t)
|
||||
|
||||
goldenBuffer := new(bytes.Buffer)
|
||||
testBuffer := new(bytes.Buffer)
|
||||
|
||||
jsonEncoder := json.NewEncoder(goldenBuffer)
|
||||
jsonEncoder.SetIndent("", " ")
|
||||
err := jsonEncoder.Encode(&goldenInterface)
|
||||
require.NoError(err)
|
||||
|
||||
jsonEncoder = json.NewEncoder(testBuffer)
|
||||
jsonEncoder.SetIndent("", " ")
|
||||
err = jsonEncoder.Encode(&testInterface)
|
||||
require.NoError(err)
|
||||
|
||||
// t.Log(goldenBuffer.String(), testBuffer.String())
|
||||
|
||||
require.Equal(goldenBuffer.String(), testBuffer.String(), "Expected are not equal with actual value")
|
||||
|
||||
}
|
||||
|
||||
func GetGoldenDevices(goldenFilePath string) ([]*types.Device, error) {
|
||||
file := string(MustAsset(goldenFilePath))
|
||||
reader := strings.NewReader(file)
|
||||
devices := make([]*types.Device, 0)
|
||||
jsonDecoder := json.NewDecoder(reader)
|
||||
err := jsonDecoder.Decode(&devices)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return devices, nil
|
||||
}
|
||||
|
||||
func GetGoldenMeasuredValues(goldenFilePath string) ([]*types.MeasuredValue, error) {
|
||||
f := string(MustAsset(goldenFilePath))
|
||||
r := strings.NewReader(f)
|
||||
measuredValues := make([]*types.MeasuredValue, 0)
|
||||
jsonDecoder := json.NewDecoder(r)
|
||||
err := jsonDecoder.Decode(&measuredValues)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return measuredValues, nil
|
||||
}
|
||||
|
||||
func GetGoldenSensors(goldenFilePath string) ([]*types.Sensor, error) {
|
||||
f := string(MustAsset(goldenFilePath))
|
||||
r := strings.NewReader(f)
|
||||
sensors := make([]*types.Sensor, 0)
|
||||
jsonDecoder := json.NewDecoder(r)
|
||||
err := jsonDecoder.Decode(&sensors)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return sensors, nil
|
||||
}
|
9
test/goldenfiles/json/goldenDevices.json
Normal file
9
test/goldenfiles/json/goldenDevices.json
Normal file
@ -0,0 +1,9 @@
|
||||
[
|
||||
{
|
||||
"device_id": "1efc3092-871e-4ac4-b0d4-ea5e5715460d",
|
||||
"device_name": "poseidon",
|
||||
"device_location": null,
|
||||
"device_last_contact": null,
|
||||
"creation_date": "2019-03-06T20:02:48.839308+01:00"
|
||||
}
|
||||
]
|
142
test/goldenfiles/json/goldenHumidities.json
Normal file
142
test/goldenfiles/json/goldenHumidities.json
Normal file
@ -0,0 +1,142 @@
|
||||
[
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "45",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401141+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347411+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "75",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401477+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "66",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401789+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "64.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401447+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "64.25",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.209117+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401447+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "64",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:26.169711+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049147+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401975+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347447+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "78",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:28.089+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401457+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "77",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:28.969711+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.96974+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401141+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "61",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:30.009741+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969711+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401668+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347446+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "55.25",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.407891+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347789+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "55",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401456+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347789+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "50",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401789+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "49.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401789+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "48.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.401221+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
}
|
||||
]
|
422
test/goldenfiles/json/goldenMeasuredValues.json
Normal file
422
test/goldenfiles/json/goldenMeasuredValues.json
Normal file
@ -0,0 +1,422 @@
|
||||
[
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "45",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "75",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "66",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "64.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "64.25",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.2091+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "64",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:26.169175+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049148+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "78",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:28.089115+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089116+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "77",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:28.969102+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.969104+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "61",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:30.009139+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969136+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "55.25",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "55",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "50",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "49.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "48.5",
|
||||
"value_type": "humidity",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
},
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "100146.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "100147.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "100144.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "100666.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "100612.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.2091+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "100550.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:26.169175+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049148+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "100609.750",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:28.089115+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089116+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "100609.250",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:28.969102+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.969104+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "100146.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:30.009139+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969136+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "100149.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "100114.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "100149.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "100166.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "100178.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
},
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.2091+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:26.169175+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049148+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:28.089115+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089116+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:28.969102+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.969104+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:30.009139+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969136+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
}
|
||||
]
|
142
test/goldenfiles/json/goldenPressures.json
Normal file
142
test/goldenfiles/json/goldenPressures.json
Normal file
@ -0,0 +1,142 @@
|
||||
[
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "100146.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "100147.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "100144.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "100666.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881587+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "100612.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.2091+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "100550.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:26.169175+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049148+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "100609.750",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:28.089115+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089116+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "100609.250",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:28.969102+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.969104+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "100146.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:30.009139+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969136+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "100149.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "100114.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "100149.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "100166.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "100178.500",
|
||||
"value_type": "pressure",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
}
|
||||
]
|
44
test/goldenfiles/json/goldenSensors.json
Normal file
44
test/goldenfiles/json/goldenSensors.json
Normal file
@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"sensor_name": "DS18B20-rechts",
|
||||
"sensor_location": "Wohnzimmer",
|
||||
"wire_id": "28-02131dbffeaa",
|
||||
"i2c_bus": null,
|
||||
"i2c_address": null,
|
||||
"gpio_number": "GPIO14",
|
||||
"sensor_model": "DS18B20",
|
||||
"sensor_enabled": false,
|
||||
"sensor_last_contact": null,
|
||||
"device_id": "1efc3092-871e-4ac4-b0d4-ea5e5715460d",
|
||||
"creation_date": "2019-03-06T20:02:48.839304+01:00"
|
||||
},
|
||||
{
|
||||
"sensor_id": "84eac248-6927-4db6-b6f9-7891ce2d301e",
|
||||
"sensor_name": "DS18B20-links",
|
||||
"sensor_location": "Wohnzimmer",
|
||||
"wire_id": "28-01131646f11d",
|
||||
"i2c_bus": null,
|
||||
"i2c_address": null,
|
||||
"gpio_number": "GPIO14",
|
||||
"sensor_model": "DS18B20",
|
||||
"sensor_enabled": false,
|
||||
"sensor_last_contact": null,
|
||||
"device_id": "1efc3092-871e-4ac4-b0d4-ea5e5715460d",
|
||||
"creation_date": "2019-03-06T20:03:08.215219+01:00"
|
||||
},
|
||||
{
|
||||
"sensor_id": "4c1a4549-483f-44de-9ce0-459b577e6244",
|
||||
"sensor_name": "BME280",
|
||||
"sensor_location": "",
|
||||
"wire_id": null,
|
||||
"i2c_bus": 1,
|
||||
"i2c_address": 118,
|
||||
"gpio_number": null,
|
||||
"sensor_model": "BME280",
|
||||
"sensor_enabled": true,
|
||||
"sensor_last_contact": null,
|
||||
"device_id": "1efc3092-871e-4ac4-b0d4-ea5e5715460d",
|
||||
"creation_date": "2019-06-30T13:42:24.089319+02:00"
|
||||
}
|
||||
]
|
142
test/goldenfiles/json/goldenTemperatures.json
Normal file
142
test/goldenfiles/json/goldenTemperatures.json
Normal file
@ -0,0 +1,142 @@
|
||||
[
|
||||
{
|
||||
"id": "f94bb22a-d896-4bf7-bb48-74acd9211698",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:20.409105+02:00",
|
||||
"till_date": "2019-08-23T20:38:21.369122+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.839308+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4bf1f15f-2175-454d-b711-7642600437e4",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:22.249136+02:00",
|
||||
"till_date": "2019-08-23T20:38:22.249137+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "8e7653a4-c9c6-418c-8acb-73e73023cad2",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:23.289123+02:00",
|
||||
"till_date": "2019-08-23T20:38:23.289124+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "4dd27ac3-ec52-4453-9391-2f8483574161",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:24.16919+02:00",
|
||||
"till_date": "2019-08-23T20:38:24.169192+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "0e5ccd47-3ca0-4fe1-875b-a248790d44df",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:25.209098+02:00",
|
||||
"till_date": "2019-08-23T20:38:25.2091+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "9de64ca1-b4bd-4a0b-a750-1f751eb36031",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:26.169175+02:00",
|
||||
"till_date": "2019-08-23T20:38:27.049148+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "8c952afc-6824-4b06-bfd0-16a0d8c5fc80",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:28.089115+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.089116+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "780c1008-fb17-494b-9c61-e0a34245d63c",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:28.969102+02:00",
|
||||
"till_date": "2019-08-23T20:38:28.969104+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "b206b39d-9f80-4ba8-bb6b-d171abc3c458",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:30.009139+02:00",
|
||||
"till_date": "2019-08-23T20:38:30.969136+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "4d381d84-a56c-4bc8-89c7-ea41b2432eaf",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:31.929108+02:00",
|
||||
"till_date": "2019-08-23T20:38:38.569141+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "07ce5f6c-d860-448e-98cd-b390bdcf63b3",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:39.529164+02:00",
|
||||
"till_date": "2019-08-23T20:38:40.569106+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:41:05.347223+02:00"
|
||||
},
|
||||
{
|
||||
"id": "18145034-237e-4066-a998-0dd1b4a0a3b4",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:41.529216+02:00",
|
||||
"till_date": "2019-08-23T20:38:41.529217+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "56794741-0758-401b-8697-e42998a53d2d",
|
||||
"value": "25",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:42.489113+02:00",
|
||||
"till_date": "2019-08-23T20:38:42.489114+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": null
|
||||
},
|
||||
{
|
||||
"id": "7dbf1aa5-a122-4ba7-8444-fc7aac22246f",
|
||||
"value": "25.5",
|
||||
"value_type": "temperature",
|
||||
"from_date": "2019-08-23T20:38:43.369131+02:00",
|
||||
"till_date": "2019-08-23T20:46:04.409158+02:00",
|
||||
"sensor_id": "efcd755e-82d1-4789-a50b-355b8735b8d8",
|
||||
"creation_date": "2019-08-23T20:41:05.40881+02:00",
|
||||
"update_date": "2019-08-23T20:46:05.341739+02:00"
|
||||
}
|
||||
]
|
Loading…
Reference in New Issue
Block a user