Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. import sys
  2. import argparse
  3. import os.path
  4. import time
  5. from datetime import datetime
  6.  
  7. try:
  8. import paho.mqtt.client as mqtt
  9. except ImportError:
  10. print >> sys.stderr, "Please install paho-mqtt"
  11. sys.exit(1)
  12.  
  13. parser = argparse.ArgumentParser(description="Record sensor data to csv file")
  14. parser.add_argument("-b", "--broker", required=True, help="MQTT broker")
  15. parser.add_argument("-p", "--port", default=1883, type=int,
  16. help="Port of the MQTT broker")
  17. parser.add_argument("-s", "--sensor", required=True,
  18. help="Base topic of the sensor")
  19. parser.add_argument("-o", "--out", required=True, help="Output file")
  20. parser.add_argument("-u", "--user", default=None,
  21. help="Username for the MQTT broker")
  22. parser.add_argument("-pw", "--password", default=None,
  23. help="Password for the MQTT broker")
  24. parser.add_argument("-d", "--daily-file", action="store_true",
  25. help="Store records in separate files for each day (date will be appended to filename)")
  26. parser.add_argument("-v", "--verbose", action="store_true",
  27. help="Print all incoming messages")
  28.  
  29. if len(sys.argv) == 1:
  30. parser.print_help(sys.stderr)
  31. sys.exit(1)
  32.  
  33. args = parser.parse_args()
  34.  
  35. temperatureGroundTruthValues = []
  36. temperatureValues = []
  37. humidityValues = []
  38.  
  39.  
  40. def on_connect(client, userdata, flags, rc):
  41. print("Connected!")
  42. print("Subscribing to sensor at {}/...".format(args.sensor))
  43. mqttClient.subscribe(args.sensor + "/temperatureGroundTruth")
  44. mqttClient.subscribe(args.sensor + "/temperature")
  45. mqttClient.subscribe(args.sensor + "/humidity")
  46.  
  47.  
  48. def on_disconnect(client, userdata, rc):
  49. print("Disconnected!")
  50. exit(1)
  51.  
  52.  
  53. def on_message(client, userdata, msg):
  54. if args.verbose:
  55. print(msg.topic + " " + str(msg.payload))
  56. value = float(msg.payload)
  57. if msg.topic.endswith("/temperatureGroundTruth"):
  58. temperatureGroundTruthValues.append(value)
  59. elif msg.topic.endswith("/temperature"):
  60. temperatureValues.append(value)
  61. else: # "/humidity"
  62. humidityValues.append(value)
  63. if len(temperatureGroundTruthValues) > 0 and len(temperatureValues) > 0 and len(humidityValues) > 0:
  64. record = [temperatureGroundTruthValues.pop(
  65. 0), temperatureValues.pop(0), humidityValues.pop(0)]
  66. store_record(record)
  67.  
  68.  
  69. def store_record(record):
  70. if args.daily_file:
  71. create_records_file_if_not_exists()
  72. with open(get_filename(), "a") as file:
  73. file.write("{0},{1},{2},{3}\n".format(
  74. int(time.time()), record[0], record[1], record[2]))
  75.  
  76.  
  77. def get_filename():
  78. if args.daily_file:
  79. return args.out + "." + datetime.now().strftime("%Y-%m-%d")
  80. else:
  81. return args.out
  82.  
  83.  
  84. def create_records_file_if_not_exists():
  85. if not os.path.isfile(get_filename()):
  86. with open(get_filename(), "w+") as file:
  87. file.write(
  88. "timestamp,temperatureGroundTruth,temperature,humidity\n")
  89.  
  90.  
  91. if not args.daily_file:
  92. create_records_file_if_not_exists()
  93.  
  94. mqttClient = mqtt.Client()
  95. mqttClient.on_connect = on_connect
  96. mqttClient.on_message = on_message
  97. mqttClient.on_disconnect = on_disconnect
  98.  
  99. print("Connecting to {0}:{1}...".format(args.broker, args.port))
  100. mqttClient.username_pw_set(args.user, args.password)
  101. try:
  102. mqttClient.connect(args.broker, args.port)
  103. except:
  104. print >> sys.stderr, "Error! Could not connect to {0} on Port {1}".format(
  105. args.broker, args.port)
  106. exit(1)
  107. try:
  108. mqttClient.loop_forever()
  109. except KeyboardInterrupt:
  110. pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement