diff --git a/documentation/Definitions.docx b/documentation/Definitions.docx index 4946448..87e559e 100644 Binary files a/documentation/Definitions.docx and b/documentation/Definitions.docx differ diff --git a/documentation/Kommunikation.mdj b/documentation/Kommunikation.mdj index 657e8a6..55dabf5 100644 --- a/documentation/Kommunikation.mdj +++ b/documentation/Kommunikation.mdj @@ -3504,7 +3504,8 @@ "_parent": { "$ref": "AAAAAAGHMigXUpG7rpw=" }, - "name": "Role1" + "name": "Role1", + "type": "" }, { "_type": "UMLAttribute", @@ -3512,7 +3513,8 @@ "_parent": { "$ref": "AAAAAAGHMigXUpG7rpw=" }, - "name": "Role2" + "name": "Role2", + "type": "" }, { "_type": "UMLAttribute", @@ -3520,7 +3522,242 @@ "_parent": { "$ref": "AAAAAAGHMigXUpG7rpw=" }, - "name": "Role3" + "name": "Role3", + "type": "" + } + ] + }, + { + "_type": "UMLModel", + "_id": "AAAAAAGHSvOnT6lLzLI=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "Model1", + "ownedElements": [ + { + "_type": "UMLClassDiagram", + "_id": "AAAAAAGHSvOnUKlMd1M=", + "_parent": { + "$ref": "AAAAAAGHSvOnT6lLzLI=" + }, + "name": "ClassDiagram1", + "ownedViews": [ + { + "_type": "UMLClassView", + "_id": "AAAAAAGHSvO0JalSVe0=", + "_parent": { + "$ref": "AAAAAAGHSvOnUKlMd1M=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAGHSvO0JalTHAU=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalSVe0=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAGHSvO0JalU/Lk=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalTHAU=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAGHSvO0JalVXXc=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalTHAU=" + }, + "font": "Arial;13;1", + "left": 637, + "top": 119, + "width": 190, + "height": 13, + "text": "RaspySensors" + }, + { + "_type": "LabelView", + "_id": "AAAAAAGHSvO0JalW0mo=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalTHAU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 80.9072265625, + "height": 13, + "text": "(from Model1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAGHSvO0JalXjv8=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalTHAU=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 632, + "top": 112, + "width": 200, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAGHSvO0JalU/Lk=" + }, + "nameLabel": { + "$ref": "AAAAAAGHSvO0JalVXXc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAGHSvO0JalW0mo=" + }, + "propertyLabel": { + "$ref": "AAAAAAGHSvO0JalXjv8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAGHSvO0JqlYsbg=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalSVe0=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "font": "Arial;13;0", + "left": 632, + "top": 137, + "width": 200, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAGHSvO0JqlZXW4=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalSVe0=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAGHSvPxiKl9u9A=", + "_parent": { + "$ref": "AAAAAAGHSvO0JqlZXW4=" + }, + "model": { + "$ref": "AAAAAAGHSvPxg6l6DOE=" + }, + "font": "Arial;13;0", + "left": 637, + "top": 152, + "width": 190, + "height": 13, + "text": "+measureAll(): Dictionary", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 632, + "top": 147, + "width": 200, + "height": 23 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAGHSvO0JqlauSU=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalSVe0=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAGHSvO0Jqlbl7Q=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalSVe0=" + }, + "model": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 632, + "top": 112, + "width": 200, + "height": 280, + "nameCompartment": { + "$ref": "AAAAAAGHSvO0JalTHAU=" + }, + "attributeCompartment": { + "$ref": "AAAAAAGHSvO0JqlYsbg=" + }, + "operationCompartment": { + "$ref": "AAAAAAGHSvO0JqlZXW4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAGHSvO0JqlauSU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAGHSvO0Jqlbl7Q=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAGHSvO0JalQDB0=", + "_parent": { + "$ref": "AAAAAAGHSvOnT6lLzLI=" + }, + "name": "RaspySensors", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAGHSvPxg6l6DOE=", + "_parent": { + "$ref": "AAAAAAGHSvO0JalQDB0=" + }, + "name": "measureAll", + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAGHSvSoBamCDuA=", + "_parent": { + "$ref": "AAAAAAGHSvPxg6l6DOE=" + }, + "type": "Dictionary", + "direction": "return" + } + ] + } + ] } ] } diff --git a/software/roboter/raspy/mainProg.py b/software/roboter/raspy/mainProg.py index 7122ab7..c835469 100644 --- a/software/roboter/raspy/mainProg.py +++ b/software/roboter/raspy/mainProg.py @@ -5,31 +5,86 @@ from raspySensors import RaspySensors #region global Varaibles sensors = RaspySensors() +sensorData = { + "Air Temperature [°C]" : 0, + "Air Humidity [%]" : 0, + "Earth Humidity [%]" : 0, + "Brightness [Lux]" : 0, + "Plant ID": 0, + "Action ID": 0 +} + +gpsPosition = { + "Position": 0, + "Action ID": 0 +} + +batteryStatus = { + "Battery": 0, + "Action ID": 0 +} + #endregion #region -def measureSendData(): - '''Measure Data via sensor class and send via MQTT''' +def measureSendData(plantID, actionID): + '''Measure data for one plant via sensor class and send via MQTT''' sensorData = sensors.readSensors() - client.publish("Robot/Data", json.dumps(sensorData, indent=4)) + sensorData["Plant_ID"] = plantID + sensorData["Action_ID"] = actionID + client.publish("Robot/Data/SensorData", json.dumps(sensorData, indent=4)) + #endregion #region MQTT callbacks + +#Testing def send_data_json(client, userdata, message): strIn = str(message.payload.decode("UTF-8")) dataDict = json.loads(strIn) print("Received data: ", json.dumps(dataDict)) -#Function for all Plants or one which changes according to request -def drive_plant_1(clients, userdata, message): - #TODO Start drive forward - print("Driving to plant 1") - measureSendData() - #TODO Start Drive Back Function + +def drive_plant(clients, userdata, message): + '''Function to drive to plant according to request''' + + #[ ]TODO handle MQTT message + print(f"Driving to plant {message}") + #[ ]TODO Start drive forward -> Thread + + print(f"Measuring data at Plant {message}") + measureSendData() # With threads not here + print("Driving back to start position") + #[ ]TODO Start Drive Back Function in Thread + + print("Back at starting Position") + + +def get_position(clients, userdata, message): + '''Callback function for GPS position request + Function to send actual GPS position via MQTT''' + + #[ ]TODO handle MQTT message + gpsPosition["Position"] = sensors.readPosition() + gpsPosition["Action_ID"] = message + client.publish("Robot/Data/Position", json.dumps(gpsPosition, indent=4)) + + + +def get_BatteryStatus(clients, userdata, message): + '''Callback function for battery status request + Function to read battery status from ev3 and send via MQTT''' + + #[ ]TODO handle MQTT message + batteryStatus["Battery"] = sensors.readBattery() + batteryStatus["Action ID"] = message + client.publish("Robot/Data/Battery", json.dumps(batteryStatus, indent=4)) + + batteryStatus() @@ -37,15 +92,22 @@ def drive_plant_1(clients, userdata, message): mqttBroker = "mqtt.eclipseprojects.io" -client = mqtt.Client("Smartphone_temp") +client = mqtt.Client("Robot") -dataDict = {} +dataDict = {} #Testing -client.message_callback_add("Robot/Data", send_data_json) -client.message_callback_add("Robot/Plant/1", drive_plant_1) +#Add callbacks +client.message_callback_add("Robot/Data", send_data_json) #Testing +client.message_callback_add("Robot/Action/Drive", drive_plant) +client.message_callback_add("Robot/Action/GetPosition", get_position) +client.message_callback_add("Robot/Action/GetBattery", get_BatteryStatus) client.connect(mqttBroker) -client.subscribe("Robot/Data") -client.subscribe("Robot/Plant/1") + +#Subscribe to topics +client.subscribe("Robot/Data") #Testing +client.subscribe("Robot/Action/Drive") +client.subscribe("Robot/Action/GetPosition") +client.subscribe("Robot/Action/GetBattery") client.loop_forever() \ No newline at end of file diff --git a/software/roboter/raspy/raspySensors.py b/software/roboter/raspy/raspySensors.py index ecdd333..5da4710 100644 --- a/software/roboter/raspy/raspySensors.py +++ b/software/roboter/raspy/raspySensors.py @@ -6,9 +6,10 @@ import json class RaspySensors: '''Class to handle all sensors''' + def __init__(self) -> None: '''Init all Sensors''' - #Message if Error + #[ ]TODO Message if Error #Air Temperature & Humidity @@ -22,7 +23,9 @@ class RaspySensors: "Air Temperature [°C]" : 0, "Air Humidity [%]" : 0, "Earth Humidity [%]" : 0, - "Brightness [Lux]" : 0 + "Brightness [Lux]" : 0, + "Plant ID": 0, + "Action ID": 0 } def readSensors(self): @@ -44,13 +47,21 @@ class RaspySensors: return self.sensorData + #[ ]TODO - take picture function def takePicture(self): '''Take picture and return image''' return self.image + #[ ]TODO def readPosition(self): '''Read and return Position''' return self.position + + #[ ]TODO + def readBattery(self): + '''Read and return battery of ev3''' + return self.battery + #for Testing only