167 lines
7.8 KiB
Python
167 lines
7.8 KiB
Python
"""
|
|
created by caliskan at 19.04.2023
|
|
|
|
This file contains all functions, which handle the different cases.
|
|
Every function should return json format with the wanted data from the database
|
|
"""
|
|
import paho.mqtt.client as mqtt
|
|
from plantdatabase import PlantDataBase
|
|
from defines import Topics, MAX_PLANT_COUNT
|
|
import json
|
|
import uuid
|
|
from typing import Union
|
|
from datetime import datetime
|
|
import logging
|
|
from robot import Robot
|
|
|
|
|
|
# Robot Channel Reactions
|
|
|
|
def data_sensordata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
|
|
robot: Robot):
|
|
str_in = str(message.payload.decode("UTF-8"))
|
|
payload = json.loads(str_in)
|
|
logging.info("ROBOT_DATA_SENSORDATA Received data: " + json.dumps(payload))
|
|
drive_data = {
|
|
"PlantID": payload['PlantID'],
|
|
"ActionID": payload['ActionID']
|
|
}
|
|
|
|
try:
|
|
robot.delete_order(drive_data)
|
|
except Exception as e:
|
|
logging.error("Could not delete order: " + str(e))
|
|
|
|
mydatabase.insert_measurement_data(plant_id=payload['PlantID'],
|
|
sensordata_temp=payload['AirTemperature'],
|
|
sensordata_humidity=payload['AirHumidity'],
|
|
sensordata_soil_moisture=payload['SoilMoisture'],
|
|
sensordata_brightness=payload['Brightness'])
|
|
logging.debug("Inserted to data base: " + json.dumps(payload))
|
|
|
|
|
|
def data_position(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
|
|
logging.info("ROBOT_DATA_POSITION Received data: " + json.dumps(message.payload.decode("UTF-8")))
|
|
robot.store_position(json.loads(message.payload.decode("UTF-8"))["Position"])
|
|
position_data = {
|
|
"Position": robot.get_position(),
|
|
"Timestamp": str(datetime.now())
|
|
}
|
|
client.publish(Topics['BACKEND_DATA_POSITION'], json.dumps(position_data))
|
|
|
|
|
|
def data_battery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
|
|
logging.info("ROBOT_DATA_BATTERY Received data: " + str(json.dumps(message.payload.decode("UTF-8"))))
|
|
robot.store_battery(json.loads(message.payload.decode("UTF-8"))["Battery"])
|
|
battery_data = {
|
|
"Battery": robot.get_battery(),
|
|
"Timestamp": str(datetime.now())
|
|
}
|
|
client.publish(Topics['BACKEND_DATA_BATTERY'], json.dumps(battery_data))
|
|
|
|
|
|
# FrontEnd Channel Reactions
|
|
|
|
def action_drive(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
|
|
robot: Robot):
|
|
plant_id = mydatabase.get_plant_id(plant_name=json.loads(message.payload.decode("UTF-8"))["PlantName"])
|
|
action_id = str(uuid.uuid4())
|
|
drive_data = {
|
|
"PlantID": plant_id,
|
|
"ActionID": action_id
|
|
}
|
|
|
|
if robot.get_order_number() < 6 and robot.get_robot_status() is True:
|
|
robot.add_order(drive_data)
|
|
client.publish(Topics['ROBOT_ACTION_DRIVE'], json.dumps(drive_data))
|
|
logging.info("BACKEND_ACTION_DRIVE Drive Command published: " + json.dumps(drive_data))
|
|
else:
|
|
if robot.get_order_number() < 6:
|
|
robot.add_order(drive_data)
|
|
logging.info("BACKEND_ACTION_DRIVE New data added to order list: " + str(drive_data))
|
|
elif robot.get_order_number() >= 6:
|
|
logging.error("Could not add Order to list. Order discarded")
|
|
client.publish(Topics['BACKEND_DATA_ERROR'], "Could not add Order to list. Order discarded")
|
|
|
|
|
|
def action_driveall(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase,
|
|
robot: Robot):
|
|
|
|
client.publish(Topics['ROBOT_ACTION_DRIVEALL'])
|
|
|
|
|
|
def action_getposition(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
|
|
client.publish(Topics['ROBOT_ACTION_GETPOSITION'])
|
|
logging.info("BACKEND_ACTION_GETPOSITION message forwarded to Robot")
|
|
|
|
|
|
def action_getbattery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
|
|
client.publish(Topics['ROBOT_ACTION_GETBATTERY'])
|
|
logging.info("BACKEND_ACTION_GETBATTERY message forwarded to Robot")
|
|
|
|
|
|
def action_getalldata(client: mqtt.Client, userdata, message: Union[mqtt.MQTTMessage, list], mydatabase: PlantDataBase):
|
|
plant_names = mydatabase.get_plant_names()
|
|
alldata = []
|
|
for i in plant_names:
|
|
alldata.append(mydatabase.get_latest_data(plant_name=i[0]))
|
|
client.publish(Topics['BACKEND_DATA_SENSORDATAALL'], json.dumps(alldata))
|
|
logging.info("BACKEND_DATA_SENSORDATAALL got data from database:" + str(alldata))
|
|
|
|
|
|
def action_newplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
|
|
plant_data = json.loads(message.payload.decode("UTF-8"))
|
|
mydatabase.insert_plant(plantname=plant_data["PlantName"], plant_id=plant_data["PlantID"])
|
|
mydatabase.insert_measurement_data(plant_id=plant_data["PlantID"],
|
|
sensordata_temp=plant_data["AirTemperature"],
|
|
sensordata_humidity=plant_data["AirHumidity"],
|
|
sensordata_soil_moisture=plant_data["SoilMoisture"],
|
|
sensordata_brightness=plant_data["Brightness"])
|
|
logging.info("BACKEND_ACTION_NEWPLANT new plant data received and inserted: " + str(plant_data))
|
|
action_getalldata(client, userdata, message, mydatabase)
|
|
|
|
|
|
def action_configureplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
|
|
plant_data = json.loads(message.payload.decode("UTF-8"))
|
|
mydatabase.configure_plant(plant_id=plant_data["PlantID"], plantname=plant_data["PlantName"])
|
|
mydatabase.insert_measurement_data(plant_id=plant_data["PlantID"],
|
|
sensordata_temp=plant_data["AirTemperature"],
|
|
sensordata_humidity=plant_data["AirHumidity"],
|
|
sensordata_soil_moisture=plant_data["SoilMoisture"],
|
|
sensordata_brightness=plant_data["Brightness"])
|
|
logging.info("BACKEND_ACTION_CONFIGUREPLANT configure plant data received and inserted: " + str(plant_data))
|
|
action_getalldata(client, userdata, message, mydatabase)
|
|
|
|
|
|
def action_deleteplant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
|
|
delete_plant = json.loads(message.payload.decode("UTF-8"))
|
|
mydatabase.delete_plant(plant_id=delete_plant)
|
|
logging.info("BACKEND_ACTION_DELETEPLANT delete plant data received and deleted: " + str(delete_plant))
|
|
action_getalldata(client, userdata, message, mydatabase)
|
|
|
|
|
|
def action_countplants(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
|
|
count = mydatabase.plant_count()
|
|
count_payload = {
|
|
"CurrentCount": count,
|
|
"MaxCount": MAX_PLANT_COUNT
|
|
}
|
|
client.publish(Topics["BACKEND_DATA_PLANTCOUNT"], json.dumps(count_payload))
|
|
logging.info("BACKEND_DATA_PLANTCOUNT forwarded plant count to FrontEnd: " + str(count_payload))
|
|
|
|
|
|
def data_error(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
|
|
robot.store_last_error(message.payload.decode("UTF-8"))
|
|
logging.error("ROBOT_DATA_ERROR new error received from Robot: " + robot.get_last_error())
|
|
client.publish(Topics['BACKEND_DATA_ERROR'], message.payload.decode("UTF-8"))
|
|
|
|
|
|
def data_robotready(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, robot: Robot):
|
|
robot.change_robot_status(message.payload.decode("UTF-8") == 'True')
|
|
if robot.get_robot_status() is True and robot.get_order_number() >= 1:
|
|
client.publish(Topics['ROBOT_ACTION_DRIVE'], json.dumps(robot.get_next_order()))
|
|
logging.info("Waiting Order send to Robot")
|
|
|
|
logging.info("ROBOT_DATA_ROBOTREADY status updated: " + str(robot.get_robot_status()))
|
|
client.publish(Topics['BACKEND_DATA_ROBOTREADY'], message.payload.decode("UTF-8"))
|