Hallo zusammen,
für mein Projekt (Gebäudeautomatisierung, momentan Jalousien und Bewäserung) möchte ich gerne ein NodeMCU welches als "Master" fungiert und seriell mit dem Display kommuniziert (habe da ein Nextion Display in Aussicht) und mehrere weitere NodeMCUs (momentan 2) die als "Außenstellen" fungieren, einsetzen.
Dazu habe ich auch eine kleine Skizze gezeichnet, ich hoffe sie ist halbwegs verständlich.
Im oberen Bereich sieht man das Display und den "Master"-MCU. Display und MCU sollen wie gesagt seriell miteinander reden. Aktuelle Zeit sowie Wetter holt sich der Node übers Internet (funktioniert auch schon soweit) weiters soll der Node mit meiner MySQL Datenbank kommunizieren (aktuell wird damit ein Terminkalender realisiert, funktioniert ebenfalls).
Die restlichen NodeMCUs sind über WLAN (bestehendes WLAN vom Router) eingebunden.
Hier mal ein kleines Beispiel der Parameter die übertragen werden sollen:
Von Master zu Display
MySQL Daten (Termine)
Wetter
aktuelle Zeit
Status der Außenstellen
Von Display zu Master
Verschiedene Variablen
Manuelle Steuerung
Von Master zu Außenstelle:
Wetter
Verschiedene Variablen
Manuelle Steuerung
Von Außenstelle zu Master:
Aktuelle Sensorwerte
Status der Aktoren
sonstige Status
Ich frage mich jetzt, wie ich die Kommunikation am besten umsetzen kann. Ich habe mich ein bisschen mit HTTP_GET beschäftigt, allerdings scheint mir diese Methode ein bisschen zu umständlich zu sein, wenn es um mehrere Daten geht.
Es wäre theoretisch auch Möglich, dass sich die Außenstellen die Wetterinformationen selbstständig holen, allerdings müsste ich dann mehr darauf achten, die API nicht zu fluten.
Sensorwerte, Status und Manuelle Steuerung sollten möglichst verzögerungsfrei übertragen werden. Parameterliste reicht alle paar Minuten bzw. bei Änderung sofort. Wetter reicht alle 10 Minuten.
Habe mir überlegt die Kommunikation mit Json umzusetzen, außer ihr habt einen besseren Vorschlag.
Wie würdet ihr sowas umsetzen?
Wenn dir HTTP_GET zu kompliziert erscheint, befürchte ich, du baust da auf ein falsches Beispiel auf.
mit dem
ESP8266Webserver | HelloServer
ist es eigentlich sehr übersichtlich.
Grundsätzlich hättest du die Möglichkeit UDP oder TCP zu verwenden. HTTP ist ja dann "nur mehr eine Erweiterung" von TCP. Aber mit obigen Beispiel braucht man sich eigentlich nicht mehr um das darunter kümmern.
JSON ist ja dann nur mehr das Format mit dem die Daten ausgetauscht werden. Trotzdem brauchst du einen Transport-Layer - sei es via UDP oder TCP (oder eben HTTP on top).
Wenn du den obigen Webserver verwendest brauchst du aber nicht ein JSON zusammenbasteln. Wenn du deine Werte als Parameter übergibst, hast du sehr elegant einen Zugriff auf die einzelnen Werte und brauchst beim Empfänger auch kein JSON parsen.
Wenn du auf dem HTTP Weg bleiben willst, könntest du dir meine Seite über ESP webserver ansehen. Das Beispiel passt vieleicht nicht 100%ig - es erklärt aber, wie man Daten von einem ESP zu einem anderen mittels HTTP überträgt.
UDP Beispiele gabs die letzten Wochen hier im Forum auch ein paar. Einfach ein wenig suchen. Das kommt eh immer wieder, inkl. der herbeigeführten Diskussion ob UDP, TCP oder gar HTTP. In deinem Fall finde ich aber HTTP gar nicht so verkehrt: da kann man grundsätzlich mal jeden Node zunächst stand alone betrachten und sieht auch schon ein Ergebnis und am "Master" kommen halt nach und nach mehrere Daten hinzu. Ich finde das gut.
übrigens, karma+ für dein Übersichtsbild, da kann man sich ein gutes Bild machen was du vor hast.
Deine Frage kann ich leider mangels Erfahrung (noch) nicht beantworten, aber ich hangle mich derzeit durch Esp8266 und Esp32 - Programmierung mit Arduino IDE. JSON ist wegen der Nähe zu JavaScript für die Aktualisierung von Webseiten ganz angenehm zu handhaben. Es läßt sich zwecks Überprüfung auch gut in Text wandeln. Das ist aber nicht Dein Thema. Außerdem bin ich über ESP-NOW gestolpert.
@Off-Topic
Zumindest über PMs werde ich nicht mehr informiert.
Über Antworten hatte ich vor langer Zeit schon deaktiviert - da ich eh immer Alles lese und die Flut an sinnlosen Mails die Sache nicht besser macht.
ESPAsyncWebServer heißt die Lib mit der ich mich schon etwas (wirklich nur etwas) beschäftigt habe.
Wenn ich jetzt, zum Beispiel, Wetterinformationen zur Übertragung bereit stellen möchte, wären das sehr viele server.on Einträge.
Hier die aktuelle Variablenliste für die Infos von OWM:
Ich bin bei Kommunikation zwischen MC eher für UDP. Kleine Datenpakete, kein Overhead, aber auch keine Zugangskontrolle (das muss dann Dein Protokoll leisten - z.B. Antwort senden).
Spiele grade ein bisschen mit UDP rum. Bin aber noch ein wenig unschlüssig wie ich die Übergabe umsetzen soll.
Möglichkeit 1: Client schickt "GiveWeather" oÄ und Server schickt sämtliche Wetter Daten an den Client. Eine Variable pro Zeile.
Möglichkeit 2: Client schickt "Give_current_dt" und Server schickt nur current_dt an den Client.
Bei Möglichkeit 2 müsste es doch möglich sein, dass man die benötigte Variable anhand von "Give_current_dt" ermittelt indem Give_ weggeschnitten wird. Somit würde nur sehr wenig Code benötigt werden. Außer ich bin da völlig auf dem Holzweg.
Bei UDP nutzt man eher structs mit Binärdaten als Textzeilen, weil das den Vorteil von UDP (kleiner Overhead) wieder zunichte macht. Hier gibt es ein Beispiel dazu.
firefist235:
Möglichkeit 2: Client schickt "Give_current_dt" und Server schickt nur current_dt an den Client.
Bei Möglichkeit 2 müsste es doch möglich sein, dass man die benötigte Variable anhand von "Give_current_dt" ermittelt indem Give_ weggeschnitten wird. Somit würde nur sehr wenig Code benötigt werden. Außer ich bin da völlig auf dem Holzweg.
das ist ein Holzweg. Der Controller kennt kein "Give_current_dt", daher kann er auch nicht vorne Give_wegschneiden. Das steht so nur bei dir in der IDE ... das hat sozusagen nichts mit dem zu tun, was der Controller sieht.
Außerdem worum gehts dir jetzt, eine schlanke Übertragen, ein schlanker Code? Bei den paar Daten (ja das sind nur ein paar), dann würde ich weder auf pseudo schlanke Übertragung noch auf pseudo schlanken Code achten sondern etwas was ich in 6 Monaten auch noch verstehe und 5 neue Felder mit einfachem Aufwand hinzufügen kann.
Und du bist da ja auch nicht in einem Protokoll wo du eine Payload Beschränkung hast. Falls doch gib bescheid, hier haben sicher einige etwas platzsparendes in ihren Wühlkiste - einfach ist das aber dann nicht mehr.
Imho solltest du Ordnung in die Daten bringen, welche Daten werden in welcher Aktualität benötigt werden.
die aktuelle Temperatur wird sich öfters ändern, als irgendwelche Stundenwerte oder 8 Messpunkte oder gar der morgendliche Sonnenaufgang, weil der ist für 24h so konstant wie der abendliche Sonnenuntergang.
Bei diesem kunterbunt an Daten mögest du mir ansonsten erklären warum es wirklich für dich relevant ist, ob die Übertragung 100, 50 oder 5ms dauert nur damit du dann weist, dass der heutige Sonnenuntergang um 20:15:32 ist.
Danke euch beiden für die Hilfe
Werde einfach jeder Variable einen eigenen "Befehl" zuteilen.
Also 0x20 zB ist Anforderung current_dt, 0x21 Anforderung current_sunrise usw.