Browse Source

Docu small changes and MQTT topics added to robot

master
waldluis 1 year ago
parent
commit
6e66611e06

BIN
documentation/Definitions.docx View File


+ 240
- 3
documentation/Kommunikation.mdj View File

"_parent": { "_parent": {
"$ref": "AAAAAAGHMigXUpG7rpw=" "$ref": "AAAAAAGHMigXUpG7rpw="
}, },
"name": "Role1"
"name": "Role1",
"type": ""
}, },
{ {
"_type": "UMLAttribute", "_type": "UMLAttribute",
"_parent": { "_parent": {
"$ref": "AAAAAAGHMigXUpG7rpw=" "$ref": "AAAAAAGHMigXUpG7rpw="
}, },
"name": "Role2"
"name": "Role2",
"type": ""
}, },
{ {
"_type": "UMLAttribute", "_type": "UMLAttribute",
"_parent": { "_parent": {
"$ref": "AAAAAAGHMigXUpG7rpw=" "$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"
}
]
}
]
} }
] ]
} }

+ 77
- 15
software/roboter/raspy/mainProg.py View File

#region global Varaibles #region global Varaibles
sensors = RaspySensors() 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 #endregion


#region #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() 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 #endregion


#region MQTT callbacks #region MQTT callbacks

#Testing
def send_data_json(client, userdata, message): def send_data_json(client, userdata, message):
strIn = str(message.payload.decode("UTF-8")) strIn = str(message.payload.decode("UTF-8"))
dataDict = json.loads(strIn) dataDict = json.loads(strIn)
print("Received data: ", json.dumps(dataDict)) 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") 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()








mqttBroker = "mqtt.eclipseprojects.io" 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.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() client.loop_forever()

+ 13
- 2
software/roboter/raspy/raspySensors.py View File



class RaspySensors: class RaspySensors:
'''Class to handle all sensors''' '''Class to handle all sensors'''

def __init__(self) -> None: def __init__(self) -> None:
'''Init all Sensors''' '''Init all Sensors'''
#Message if Error
#[ ]TODO Message if Error


#Air Temperature & Humidity #Air Temperature & Humidity
"Air Temperature [°C]" : 0, "Air Temperature [°C]" : 0,
"Air Humidity [%]" : 0, "Air Humidity [%]" : 0,
"Earth Humidity [%]" : 0, "Earth Humidity [%]" : 0,
"Brightness [Lux]" : 0
"Brightness [Lux]" : 0,
"Plant ID": 0,
"Action ID": 0
} }


def readSensors(self): def readSensors(self):


return self.sensorData return self.sensorData
#[ ]TODO - take picture function
def takePicture(self): def takePicture(self):
'''Take picture and return image''' '''Take picture and return image'''
return self.image return self.image
#[ ]TODO
def readPosition(self): def readPosition(self):
'''Read and return Position''' '''Read and return Position'''
return self.position return self.position
#[ ]TODO
def readBattery(self):
'''Read and return battery of ev3'''
return self.battery




#for Testing only #for Testing only

Loading…
Cancel
Save