Hallo Zusammen,
ich finde zu folgender Thematik leider keine Beispiele und hoffe daher auf hilfreiches Feedback von Euch:
Der ESP32 arbeitet in meinem Projekt als Server und Websocketserver. Die darauf gehostete html Seite enthält etwa 30 Eingabefelder. Der Benutzer, der die Seite aufruft, kann die in diesen Feldern voreingetragenen Werte ändern. Tut er das, erfolgt eine Übertragung des entsprechenden Json Schlüssel:Wert Paares an den Server, der die Wertänderung speichern soll.
Jetzt die Schwierigkeit: Alle Beispiele, die ich gefunden habe, gehen m.E. davon aus, dass bekannt ist, welche Paare übertragen werden, nämlich alle erwarteten.
In meinem Fall wird jedoch jeweils nur genau ein Schlüssel:Wert Paar übertragen. Wie kann ich denn beim Empfang des Paares überprüfen, welcher Schlüssel enthalten ist, so dass ich im nächsten Schritt den enthaltenen Wert auslesen und der richtigen Variable im RAM zuweisen kann?
Die Paare, die übertragen werden können sehen so aus, wie unten aufgelistet. Neben einfachen Schlüssel:Wert Paaren gibt es auch ein Array und zwei eingebettete Objekte.
{
"timeGateOpen": "07:00",
"timeGateClose": "23:00",
"gateModeFixedTime": true,
"tempShouseDay": 12,
"tempShouseNight": 10,
"timeTempTransSunrise": 60,
"timeTempTransSunset": 30,
"tempGhouse": 23,
"tempHystGhouse": 2,
"timeOffsetLampSunrise": 90,
"timeOffsetLampSunset": 90,
"timeOffsetGateSunrise": 0,
"timeOffsetGateSunset": 60,
"geopos": [
"N",
49.79762631,
"O",
9.92513869
],
"tempSensors": {
"sensorCountShouse": 2,
"sensorCountGhouse": 2,
"tempSensorTolSHouse": 0.7,
"tempModeSHouse": "AVG",
"tempModeGHouse": "MAX"
},
"tempSensorAddr": {
"sh1": "",
"sh2": "",
"gh1": "",
"gh2": "",
"acdc5v": "",
"acdc12v": ""
},
"dateLastChanges": "04.02.2025"
}
Es wird aber immer nur eins übertragen, also z.B. eines aus dem tempSensors Objekt:
tempSensors": "sensorCountShouse": 2
weil der Benutzer ja immer nur einen Wert auf der Webseite ändern kann und mit Return abschickt.
Verstehe ich das überhaupt richtig? Wird wirklich nur das eine Paar (oder eigentlich ja Triple) übertragen oder wird immer das komplette Objekt ab root übertragen, in diesem Fall also
"tempSensors": {
"sensorCountShouse": 2,
"sensorCountGhouse": 2,
"tempSensorTolSHouse": 0.7,
"tempModeSHouse": "AVG",
"tempModeGHouse": "MAX"
}
?
Welcher root Schlüssel übertragen wird, sollte ich laut https://arduinojson.org/v7/how-to/list-keys-in-a-jsondocument/ so herausfinden:
for (JsonPair kv : doc.as<JsonObject>()) {
Serial.println(kv.key().c_str());
}
Nun habe ich im Falle des tempSensors Objektes aber noch eine weitere eingebettete Ebene. Wie finde ich denn heraus, welcher Schlüssel auf der zweiten Ebene es ist, der übertragen wurde? Nur nach Kenntnis beider Schlüssel kann ich den folgenden Wert serverseitig der richtigen Variable zuweisen.
Im Voraus vielen Dank für Eure Tipps!
Werner