repository to manage all files related to the makeathon farm bot project (Software + Documentation).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

data_functions.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. """
  2. created by caliskan at 19.04.2023
  3. This file contains all functions, which handle the different cases.
  4. Every function should return json format with the wanted data from the database
  5. """
  6. import paho.mqtt.client as mqtt
  7. from plantdatabase import PlantDataBase
  8. from defines import Topics, MAX_PLANT_COUNT
  9. import json
  10. import uuid
  11. from typing import Union
  12. from datetime import datetime
  13. import logging
  14. from robot import Robot
  15. # Robot Channel Reactions
  16. def data_sensordata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
  17. robot: Robot):
  18. str_in = str(message.payload.decode("UTF-8"))
  19. payload = json.loads(str_in)
  20. logging.info("ROBOT_DATA_SENSORDATA Received data: " + json.dumps(payload))
  21. drive_data = {
  22. "PlantID": [payload['PlantID']],
  23. "ActionID": payload['ActionID']
  24. }
  25. try:
  26. print(drive_data)
  27. print(robot.order_handler)
  28. robot.delete_order(drive_data)
  29. mydatabase.insert_measurement_data(plant_id=payload['PlantID'],
  30. sensordata_temp=payload['AirTemperature'],
  31. sensordata_humidity=payload['AirHumidity'],
  32. sensordata_soil_moisture=payload['SoilMoisture'],
  33. sensordata_brightness=payload['Brightness'])
  34. logging.debug("Inserted to data base: " + json.dumps(payload))
  35. action_getalldata(client, userdata, message, mydatabase)
  36. except Exception as e:
  37. logging.error("Could not delete order: " + str(e))
  38. def data_sensordataall(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
  39. robot: Robot):
  40. str_in = str(message.payload.decode("UTF-8"))
  41. payload = json.loads(str_in)
  42. logging.info("ROBOT_DATA_SENSORDATAALL Received data: " + json.dumps(payload))
  43. plant_ids = []
  44. for i in payload['SensorData']:
  45. plant_ids.append(i["PlantID"])
  46. print("Plant Names:", str(plant_ids))
  47. drive_data = {
  48. "PlantID": plant_ids,
  49. "ActionID": payload['ActionID']
  50. }
  51. try:
  52. print(robot.order_handler)
  53. print(drive_data)
  54. robot.delete_order(drive_data)
  55. for i in payload['SensorData']:
  56. mydatabase.insert_measurement_data(plant_id=i['PlantID'],
  57. sensordata_temp=i['AirTemperature'],
  58. sensordata_humidity=i['AirHumidity'],
  59. sensordata_soil_moisture=i['SoilMoisture'],
  60. sensordata_brightness=i['Brightness'])
  61. logging.debug("Inserted to data base: " + json.dumps(payload))
  62. action_getalldata(client, userdata, message, mydatabase)
  63. except Exception as e:
  64. logging.error("Could not delete order: " + str(e))
  65. def data_position(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
  66. logging.info("ROBOT_DATA_POSITION Received data: " + json.dumps(message.payload.decode("UTF-8")))
  67. robot.store_position(json.loads(message.payload.decode("UTF-8"))["Position"])
  68. position_data = {
  69. "Position": robot.get_position(),
  70. "Timestamp": str(datetime.now())
  71. }
  72. client.publish(Topics['BACKEND_DATA_POSITION'], json.dumps(position_data))
  73. def data_battery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
  74. logging.info("ROBOT_DATA_BATTERY Received data: " + str(json.dumps(message.payload.decode("UTF-8"))))
  75. robot.store_battery(json.loads(message.payload.decode("UTF-8"))["Battery"])
  76. battery_data = {
  77. "Battery": robot.get_battery(),
  78. "Timestamp": str(datetime.now())
  79. }
  80. client.publish(Topics['BACKEND_DATA_BATTERY'], json.dumps(battery_data))
  81. client.publish(Topics['BACKEND_DATA_ROBOTREADY'], str(robot.get_robot_status()))
  82. def data_error(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
  83. robot.store_last_error(message.payload.decode("UTF-8"))
  84. logging.error("ROBOT_DATA_ERROR new error received from Robot: " + robot.get_last_error())
  85. client.publish(Topics['BACKEND_DATA_ERROR'], message.payload.decode("UTF-8"))
  86. def data_robotready(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
  87. robot.change_robot_status(message.payload.decode("UTF-8") == 'True')
  88. if robot.get_robot_status() is True and robot.get_order_number() >= 1:
  89. client.publish(Topics['ROBOT_ACTION_DRIVE'], json.dumps(robot.get_next_order()))
  90. logging.info("Waiting Order send to Robot")
  91. logging.info("ROBOT_DATA_ROBOTREADY status updated: " + str(robot.get_robot_status()))
  92. client.publish(Topics['BACKEND_DATA_ROBOTREADY'], str(robot.get_robot_status()))
  93. # FrontEnd Channel Reactions
  94. def action_drive(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
  95. robot: Robot):
  96. plant_id = mydatabase.get_plant_id(plant_name=json.loads(str(message.payload.decode("UTF-8"))))
  97. print(str(plant_id))
  98. action_id = str(uuid.uuid4())
  99. drive_data = {
  100. "PlantID": plant_id,
  101. "ActionID": action_id
  102. }
  103. if robot.get_order_number() < 6 and robot.get_robot_status() is True:
  104. robot.add_order({"PlantID": [plant_id], "ActionID": action_id})
  105. client.publish(Topics['ROBOT_ACTION_DRIVE'], json.dumps(drive_data))
  106. logging.info("BACKEND_ACTION_DRIVE Drive Command published: " + json.dumps(drive_data))
  107. else:
  108. if robot.get_order_number() < 6:
  109. robot.add_order(drive_data)
  110. logging.info("BACKEND_ACTION_DRIVE New data added to order list: " + str(drive_data))
  111. elif robot.get_order_number() >= 6:
  112. logging.error("Could not add Order to list. Order discarded")
  113. client.publish(Topics['BACKEND_DATA_ERROR'], "Could not add Order to list. Order discarded")
  114. def action_driveall(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
  115. robot: Robot):
  116. plant_names = mydatabase.get_plant_names()
  117. plant_ids = []
  118. print(plant_names)
  119. for names in plant_names:
  120. _id = mydatabase.get_plant_id(names[0])
  121. plant_ids.append(_id)
  122. action_id = str(uuid.uuid4())
  123. drive_data = {
  124. "PlantID": plant_ids,
  125. "ActionID": action_id
  126. }
  127. print(drive_data)
  128. if robot.get_order_number() < 6 and robot.get_robot_status() is True:
  129. robot.add_order(drive_data)
  130. client.publish(Topics['ROBOT_ACTION_DRIVEALL'], json.dumps(drive_data))
  131. logging.info("BACKEND_ACTION_DRIVEALL Drive Command published: " + json.dumps(drive_data))
  132. else:
  133. if robot.get_order_number() < 6:
  134. robot.add_order(drive_data)
  135. logging.info("BACKEND_ACTION_DRIVEALL New data added to order list: " + str(drive_data))
  136. elif robot.get_order_number() >= 6:
  137. client.publish(Topics['BACKEND_DATA_ERROR'], "Could not add Order to list. Order discarded")
  138. logging.error("Could not add Order to list. Order discarded")
  139. def action_getposition(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
  140. client.publish(Topics['ROBOT_ACTION_GETPOSITION'])
  141. logging.info("BACKEND_ACTION_GETPOSITION message forwarded to Robot")
  142. def action_getbattery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
  143. client.publish(Topics['ROBOT_ACTION_GETBATTERY'])
  144. logging.info("BACKEND_ACTION_GETBATTERY message forwarded to Robot")
  145. battery_data = {
  146. "Battery": 66,
  147. "Timestamp": str(datetime.now())
  148. }
  149. print(battery_data)
  150. client.publish(Topics['BACKEND_DATA_BATTERY'], json.dumps(battery_data))
  151. def action_getalldata(client: mqtt.Client, userdata, message: Union[mqtt.MQTTMessage, list], mydatabase: PlantDataBase):
  152. plant_names = mydatabase.get_plant_names()
  153. print("SUIII" + str(plant_names))
  154. alldata = []
  155. for i in plant_names:
  156. alldata.append(mydatabase.get_latest_data(plant_name=i[0]))
  157. client.publish(Topics['BACKEND_DATA_SENSORDATAALL'], json.dumps(alldata))
  158. logging.info("BACKEND_DATA_SENSORDATAALL got data from database:" + str(alldata))
  159. def action_newplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
  160. plant_data = json.loads(message.payload.decode("UTF-8"))
  161. mydatabase.insert_plant(plantname=plant_data["PlantName"], plant_id=plant_data["PlantID"])
  162. mydatabase.insert_measurement_data(plant_id=plant_data["PlantID"],
  163. sensordata_temp=plant_data["AirTemperature"],
  164. sensordata_humidity=plant_data["AirHumidity"],
  165. sensordata_soil_moisture=plant_data["SoilMoisture"],
  166. sensordata_brightness=plant_data["Brightness"])
  167. logging.info("BACKEND_ACTION_NEWPLANT new plant data received and inserted: " + str(plant_data))
  168. action_getalldata(client, userdata, message, mydatabase)
  169. def action_configureplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
  170. plant_data = json.loads(message.payload.decode("UTF-8"))
  171. mydatabase.configure_plant(plant_id=plant_data["PlantID"], plantname=plant_data["PlantName"])
  172. mydatabase.insert_measurement_data(plant_id=plant_data["PlantID"],
  173. sensordata_temp=plant_data["AirTemperature"],
  174. sensordata_humidity=plant_data["AirHumidity"],
  175. sensordata_soil_moisture=plant_data["SoilMoisture"],
  176. sensordata_brightness=plant_data["Brightness"])
  177. logging.info("BACKEND_ACTION_CONFIGUREPLANT configure plant data received and inserted: " + str(plant_data))
  178. action_getalldata(client, userdata, message, mydatabase)
  179. def action_deleteplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
  180. delete_plant = json.loads(message.payload.decode("UTF-8"))
  181. mydatabase.delete_plant(plant_id=delete_plant)
  182. logging.info("BACKEND_ACTION_DELETEPLANT delete plant data received and deleted: " + str(delete_plant))
  183. action_getalldata(client, userdata, message, mydatabase)
  184. def action_countplants(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
  185. count = mydatabase.plant_count()
  186. count_payload = {
  187. "CurrentCount": count,
  188. "MaxCount": MAX_PLANT_COUNT
  189. }
  190. client.publish(Topics["BACKEND_DATA_PLANTCOUNT"], json.dumps(count_payload))
  191. logging.info("BACKEND_DATA_PLANTCOUNT forwarded plant count to FrontEnd: " + str(count_payload))