writer.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package temperature
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. influx "github.com/influxdata/influxdb/client/v2"
  7. )
  8. // Writer is used to write out measurements
  9. type Writer interface {
  10. Write(Measurement) error
  11. }
  12. type influxWriter struct {
  13. locations map[int]string
  14. db string
  15. client influx.Client
  16. }
  17. func (i influxWriter) Write(measurement Measurement) error {
  18. bp, err := influx.NewBatchPoints(influx.BatchPointsConfig{
  19. Database: i.db,
  20. Precision: "s",
  21. })
  22. if err != nil {
  23. fmt.Println("Could not log temperature")
  24. fmt.Println(err)
  25. return err
  26. }
  27. var tags = map[string]string{}
  28. if val, ok := i.locations[measurement.ID]; ok {
  29. tags["location"] = val
  30. } else {
  31. tags["location"] = "id:" + strconv.FormatInt(int64(measurement.ID), 10)
  32. }
  33. var batteryState int
  34. if measurement.BatteryGood {
  35. batteryState = 1
  36. } else {
  37. batteryState = 0
  38. }
  39. fields := map[string]interface{}{
  40. "temperature": measurement.Temperature,
  41. "battery_good": batteryState,
  42. }
  43. pt, err := influx.NewPoint("temperature", tags, fields, time.Now())
  44. if err != nil {
  45. fmt.Println("Could not log temperature")
  46. fmt.Println(err)
  47. return err
  48. }
  49. bp.AddPoint(pt)
  50. err = i.client.Write(bp)
  51. if err != nil {
  52. fmt.Println("Could not log temperature")
  53. fmt.Println(err)
  54. return err
  55. }
  56. fmt.Println("Wrote measurement successfully")
  57. return nil
  58. }
  59. // NewInfluxWriter creates an influxdb writer
  60. func NewInfluxWriter(db string, host string, username string, password string, locations map[int]string) (Writer, error) {
  61. client, err := influx.NewHTTPClient(influx.HTTPConfig{
  62. Addr: host,
  63. Username: username,
  64. Password: password,
  65. })
  66. if err != nil {
  67. return nil, err
  68. }
  69. return &influxWriter{db: db, client: client, locations: locations}, nil
  70. }