log.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package main
  2. import (
  3. "bufio"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "time"
  10. influx "github.com/influxdata/influxdb/client/v2"
  11. )
  12. var db *string
  13. var username *string
  14. var password *string
  15. var host *string
  16. var location *string
  17. var verbose *bool
  18. var test *bool
  19. func main() {
  20. db = flag.String("db", "temperature", "Influxdb database")
  21. username = flag.String("user", "", "Username")
  22. password = flag.String("password", "", "Password")
  23. host = flag.String("host", "http://localhost", "Host to connect to")
  24. location = flag.String("location", "room", "Name for the location")
  25. verbose = flag.Bool("verbose", false, "Make more verbose")
  26. test = flag.Bool("test", false, "Use a test input string")
  27. flag.Parse()
  28. var reader *bufio.Reader
  29. if *test {
  30. reader = bufio.NewReader(strings.NewReader(testString))
  31. } else {
  32. reader = bufio.NewReader(os.Stdin)
  33. }
  34. client, err := influx.NewHTTPClient(influx.HTTPConfig{
  35. Addr: *host,
  36. Username: *username,
  37. Password: *password,
  38. })
  39. if err != nil {
  40. fmt.Println("Could not connect")
  41. fmt.Println(err)
  42. return
  43. }
  44. _ = reader
  45. for {
  46. text, err := reader.ReadString('\n')
  47. if err != nil {
  48. return
  49. }
  50. if *verbose {
  51. fmt.Print(text)
  52. }
  53. fields := strings.Fields(text)
  54. for i := 0; i < len(fields); i++ {
  55. fields[i] = strings.ToLower(fields[i])
  56. }
  57. if len(fields) == 3 {
  58. if strings.Compare(fields[0], "temperature:") == 0 {
  59. temp, _ := strconv.ParseFloat(fields[1], 64)
  60. unit := fields[2]
  61. if strings.Compare(unit, "f") == 0 {
  62. temp = (temp - 32) * (5.0 / 9.0)
  63. }
  64. fmt.Println("temp is " + strconv.FormatFloat(temp, 'f', 6, 64))
  65. logTemp(temp, client)
  66. }
  67. }
  68. }
  69. }
  70. func logTemp(temp float64, client influx.Client) {
  71. bp, err := influx.NewBatchPoints(influx.BatchPointsConfig{
  72. Database: *db,
  73. Precision: "s",
  74. })
  75. if err != nil {
  76. fmt.Println("Could not log temperature")
  77. fmt.Println(err)
  78. return
  79. }
  80. tags := map[string]string{"location": *location}
  81. fields := map[string]interface{}{
  82. "temperature": temp,
  83. }
  84. pt, err := influx.NewPoint("temperature", tags, fields, time.Now())
  85. if err != nil {
  86. fmt.Println("Could not log temperature")
  87. fmt.Println(err)
  88. return
  89. }
  90. bp.AddPoint(pt)
  91. err = client.Write(bp)
  92. if err != nil {
  93. fmt.Println("Could not log temperature")
  94. fmt.Println(err)
  95. return
  96. }
  97. }
  98. const (
  99. testString = `
  100. Registering protocol [1] "Acurite 606TX Temperature Sensor"
  101. Registered 1 out of 101 device decoding protocols
  102. Found 1 device(s)
  103. trying device 0: Realtek, RTL2838UHIDIR, SN: 00000001
  104. Detached kernel driver
  105. Found Rafael Micro R820T tuner
  106. Using device 0: Generic RTL2832U OEM
  107. Exact sample rate is: 250000.000414 Hz
  108. [R82XX] PLL not locked!
  109. Sample rate set to 250000.
  110. Bit detection level set to 0 (Auto).
  111. Tuner gain set to Auto.
  112. Reading samples in async mode...
  113. Tuned to 433920000 Hz.
  114. 2018-04-07 21:51:13 : Acurite 606TX Sensor : -5
  115. Battery: OK
  116. Temperature: 25.3 C
  117. 2018-04-07 21:51:18 : Acurite 606TX Sensor : -5
  118. Battery: OK
  119. Temperature: 25.3 C
  120. 2018-04-07 21:51:20 : Acurite 606TX Sensor : -5
  121. Battery: OK
  122. Temperature: 25.3 C
  123. 2018-04-07 21:51:21 : Acurite 606TX Sensor : -5
  124. Battery: OK
  125. Temperature: 25.3 C
  126. 2018-04-07 21:51:51 : Acurite 606TX Sensor : -5
  127. Battery: OK
  128. Temperature: 25.7 C
  129. 2018-04-07 21:52:21 : Acurite 606TX Sensor : -5
  130. Battery: OK
  131. Temperature: 26.2 C
  132. 2018-04-07 21:52:53 : Acurite 606TX Sensor : -5
  133. Battery: OK
  134. Temperature: 26.3 C
  135. 2018-04-07 21:53:24 : Acurite 606TX Sensor : -5
  136. Battery: OK
  137. Temperature: 26.4 C
  138. `
  139. )