Code: Alles auswählen
{"Sensor":1,"Temperature":22.80,"Humidity":41.20,"Voltage"V:523.00}
Code: Alles auswählen
global ESP_TOPIC
# werte vom mqtt server holen
ESP_TOPIC = "ESP_01"
def mqtt_read() :
client = mqtt.Client() #mqtt client aktivieren
client.on_connect = on_connect # prüfen ob verbindung besteht
client.on_message = on_message # message funktion aktivieren
client.connect("localhost", 1883, 60) # serverdaten festlegen
client.loop_start() # abfrageschleife starten
time.sleep(1) # kurz warten
esp_01=""
msg = list() # msg leeren
if not q1.empty(): # und falls etwas drinnen steht
esp_01 = q1.get() # text aus Queue holen und zerlegen
# Format: {"Sensor":1,"Temperature":22.80,"Humidity":41.20,"Voltage"V:523.00}
msg = ["S:", esp_01[esp_01.find('Sensor') + 8 : esp_01.find('Temperature')-2],
"T:", esp_01[esp_01.find('Temperature') + 13 : esp_01.find('Humidity')-2],
",H:", esp_01[esp_01.find('Humidity') + 10 : esp_01.find('Voltage')-2],
",V:", esp_01[esp_01.find('Voltage') + 10 : esp_01.find('}')-1]]
with q1.mutex: # queue nach auslesen wieder löschen
q1.queue.clear()
client.loop_stop() # schleife anhalten
return(msg) # und als Liste ausgeben Format: ['T:', '22.80', ',H:', '41.10', ',V:', '525.0']
def on_connect(client, userdata, flags, rc): # MQTT Server prüfen
#print(ESP_TOPIC) #print("Connected with result code " + str(rc))
client.subscribe(ESP_TOPIC) # Topic festlegen
def on_message(client, userdata, message): # Nachricht vom Server lesen
# print(msg.topic + " " + str(msg.payload))
q1.put(("{'" + str(message.payload) + "', " + str(message.topic) + "}")) # in Queue schreiben
Code: Alles auswählen
def_main():
while True :
# mqtt ESP01 client abrufen
esp_return = mqtt_read()
if esp_return:
sensor = float(esp_return[1])
if sensor == 1 : #sensor 1
esp_01_values[0] = float(esp_return[3])
esp_01_values[1] = float(esp_return[5])
esp_01_values[2] = ((1024-float(esp_return[7]))/10) # in % umgerechnet aus 0-1024
esp_01_feedback = esp_01_feedback + 1
elif sensor == 2 : #sensor 2
esp_02_values[0] = float(esp_return[3])
esp_02_values[1] = float(esp_return[5])
esp_02_values[2] = ((1024-float(esp_return[7]))/10)
esp_02_feedback = esp_02_feedback + 1
......
usw.
Die Sensor Nummer mit zu übertragen ist eigentlich nicht notwendig, dafür hat mqtt ja die Kanäle die man einzeln auslesen kann.
Durch Setzen der globalen Variablen ESP_TOPIC kann man vor jeder Abfrage den Kanal festlegen. Nur mit der Zuordnung der Queue
scheitert es, da ich keine Ahnung habe wie ich die Queue in der Unter_Funktion beim Aufruf ändern und anschließend löschen kann.
Ohne Queue zu arbeiten geht leider nicht, da die mqtt_read Funktion aus einer Schliefe aufgerufen wird und ohne den Zwischenspeicher
der Queue Daten verloren gehen.
Am Ende hängen etwa 20 ESP's am Mosquittoserver, dann kommt es zu Kollisionen, wenn alle auf demselben Kanal senden.
Hat jemand eine Idee wie man die Queue_Nr relativ übergeben kann, da sie ja in der Unterfunktion on_message nur angesprochen wird ?
Der optimale Aufruf wäre:
Code: Alles auswählen
esp_return = mqtt_read(ESP_CHANNEL, QUEUE_NO) # jeweils als globale Vars
und Rückgabe mit
mqtt_read.....
return(ESP_CHANNEL, values)