Browse Source

Order Handler added

master
caliskan 1 year ago
parent
commit
58bdd595d5

+ 1
- 1
.idea/projektarbeit_duelger_waldhauser_caliskan.iml View File

@@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (projektarbeit_duelger_waldhauser_caliskan)" jdkType="Python SDK" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

+ 33
- 12
software/backend/data_functions.py View File

@@ -7,41 +7,62 @@ Every function should return json format with the wanted data from the database
import paho.mqtt.client as mqtt
from plantdatabase import PlantDataBase
from software.defines import Topics
import json
import uuid


# Robot Channel Reactions

def data_sensordata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def data_sensordata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase, order_handler: list):
print("message received")
# TODO: Store data in database
pass
str_in = str(message.payload.decode("UTF-8"))
payload = json.loads(str_in)
print("Received data: ", json.dumps(payload))

order_handler.remove(payload['ActionID'])

def data_position(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
mydatabase.insert_measurement_data(plant_id=payload['PlantID'],
sensordata_temp=payload['AirTemperature'],
sensordata_humidity=payload['AirHumidity'],
sensordata_soil_moisture=payload['SoilMoisture'],
pest_infestation=0,
light_intensity=payload['Brightness'])


def data_position(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
# TODO: Forward to frontend in json format
pass
client.publish(Topics['BACKEND_DATA_POSITION'], message.payload.decode("utf-8"))


def data_battery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def data_battery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
# TODO: Forward to frontend in json format
pass
client.publish(Topics['BACKEND_DATA_BATTERY'], message.payload.decode("utf-8"))


# FrontEnd Channel Reactions

def action_drive(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def action_drive(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase, order_handler: list):
# TODO: ROBOT READY CHECK
client.publish(Topics['ROBOT_ACTION_DRIVE'], message.payload).decode("utf-8")
if len(order_handler) < 5:
order_handler.append(uuid.uuid4())
else:
# TODO: What to do when no place in order_list left
pass
client.publish(Topics['ROBOT_ACTION_DRIVE'], message.payload.decode("utf-8"))


def action_getposition(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def action_getposition(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
client.publish(Topics['ROBOT_ACTION_GETPOSITION'])


def action_getbattery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def action_getbattery(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
client.publish(Topics['ROBOT_ACTION_GETBATTERY'])


def action_getalldata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage):
def action_getalldata(client: mqtt.Client, userdata, message: mqtt.MQTTMessage, mydatabase: PlantDataBase):
# TODO: get data from database
pass
alldata = []
for i in range(1, 7):
alldata.append(mydatabase.get_latest_data(plant_id=i))
client.publish(Topics['BACKEND_DATA_SENSORDATAALL'], json.dumps(alldata))

+ 24
- 20
software/backend/main.py View File

@@ -16,47 +16,51 @@ import data_functions
# inits
mydatabase = PlantDataBase()
mydatabase.create_table()
order_handler = [] # will contain UUIDS with Order IDs


def on_connect(client: mqtt.Client, userdata, flags, rc):
def on_connect(_client: mqtt.Client, _userdata, _flags, _rc):
"""
This method gets called, when it connects to a mqtt broker.
It is used to subscribe to the specific topics
:param client: mqtt client object
:param userdata:
:param flags:
:param rc: connection flag
:param _client: mqtt client object
:param _userdata:
:param _flags:
:param _rc: connection flag
:return:
"""
if rc == 0:
if _rc == 0:
print("connected")

# TOPIC SUBSCRIPTIONS

# From Robot:
client.subscribe(Topics['ROBOT_DATA_SENSORDATA'])
client.message_callback_add(Topics['ROBOT_DATA_SENSORDATA'], data_functions.data_sensordata)
_client.subscribe(Topics['ROBOT_DATA_SENSORDATA'])
_client.message_callback_add(Topics['ROBOT_DATA_SENSORDATA'], lambda client, userdata, message: data_functions.
data_sensordata(client, userdata, message, mydatabase, order_handler))

client.subscribe(Topics['ROBOT_DATA_POSITION'])
client.message_callback_add(Topics['ROBOT_DATA_POSITION'], data_functions.data_position)
_client.subscribe(Topics['ROBOT_DATA_POSITION'])
_client.message_callback_add(Topics['ROBOT_DATA_POSITION'], data_functions.data_position)

client.subscribe(Topics['ROBOT_DATA_BATTERY'])
client.message_callback_add(Topics['ROBOT_DATA_BATTERY'], data_functions.data_sensordata)
_client.subscribe(Topics['ROBOT_DATA_BATTERY'])
_client.message_callback_add(Topics['ROBOT_DATA_BATTERY'], lambda client, userdata, message: data_functions.
data_battery(client, userdata, message, mydatabase))

# client.subscribe('Robot/Data/Picture')

# From FrontEnd:
client.subscribe(Topics['BACKEND_ACTION_DRIVE'])
client.message_callback_add(Topics['BACKEND_ACTION_DRIVE'], data_functions.action_drive)
_client.subscribe(Topics['BACKEND_ACTION_DRIVE'])
_client.message_callback_add(Topics['BACKEND_ACTION_DRIVE'], lambda client, userdata, message: data_functions.
action_drive(client, userdata, message, mydatabase, order_handler))

client.subscribe(Topics['BACKEND_ACTION_GETPOSITION'])
client.message_callback_add(Topics['BACKEND_ACTION_GETPOSITION'], data_functions.action_getposition)
_client.subscribe(Topics['BACKEND_ACTION_GETPOSITION'])
_client.message_callback_add(Topics['BACKEND_ACTION_GETPOSITION'], data_functions.action_getposition)

client.subscribe(Topics['BACKEND_ACTION_GETBATTERY'])
client.message_callback_add(Topics['BACKEND_ACTION_GETBATTERY'], data_functions.action_getbattery)
_client.subscribe(Topics['BACKEND_ACTION_GETBATTERY'])
_client.message_callback_add(Topics['BACKEND_ACTION_GETBATTERY'], data_functions.action_getbattery)

client.subscribe(Topics['BACKEND_ACTION_GETALLDATA'])
client.message_callback_add(Topics['BACKEND_ACTION_GETALLDATA'], data_functions.action_getalldata)
_client.subscribe(Topics['BACKEND_ACTION_GETALLDATA'])
_client.message_callback_add(Topics['BACKEND_ACTION_GETALLDATA'], data_functions.action_getalldata)

# END TOPIC SUBSCRIPTIONS
else:

+ 7
- 8
software/defines.py View File

@@ -33,15 +33,14 @@ Topics = {

}


# MQTT Messages:

# region Robot -> Backend
SENSORDATA = {
"AirTemperature": 0.0,
"AirHumidity" : 0.0,
"SoilMoisture" : 0.0,
"Brightness" : 0,
"AirHumidity": 0.0,
"SoilMoisture": 0.0,
"Brightness": 0,
"PlantID": 0,
"ActionID": 0
}
@@ -74,9 +73,9 @@ DRIVE = {

PLANTDATA = {
"AirTemperature": 0.0,
"AirHumidity" : 0.0,
"SoilMoisture" : 0.0,
"Brightness" : 0,
"AirHumidity": 0.0,
"SoilMoisture": 0.0,
"Brightness": 0,
"PlantID": 0,
"Timestamp": "",
"MeasurementID": 0
@@ -116,4 +115,4 @@ DRIVE = {

# GETALLDATA -> no message needed

# endregion
# endregion

+ 4
- 3
software/roboter/raspy/receive_json.py View File

@@ -1,11 +1,12 @@
import paho.mqtt.client as mqtt
import json


def on_message_json(client, userdata, message):
strIn = str(message.payload.decode("UTF-8"))
dataDict = json.loads(strIn)
print("Received data: ", json.dumps(dataDict))
print("Received data: ", type(dataDict))

mqttBroker = "mqtt.eclipseprojects.io"
client = mqtt.Client("Smartphone_temp")
@@ -17,4 +18,4 @@ client.message_callback_add("Robot/Data", on_message_json)
client.connect(mqttBroker)
client.subscribe("Robot/Data")

client.loop_forever()
client.loop_forever()

Loading…
Cancel
Save