[vz-users] JSON parsen auf ESP8266 mit Arduino IDE

Frank Richter frank.richter83 at gmail.com
Sat Jul 22 01:59:41 CEST 2017


Na wenn du das brauchst morgens im Bad 😀

Lass doch erstmal die Sekunden weg, dass wird eh schwierig mit den Requests
dazwischen. Und ins Layout passen sie auch nicht richtig....

Weiter viel Erfolg!

Grüße
Frank

Am 22.07.2017 01:13 schrieb "Christian Wulff" <christianwulff at gmx.de>:

> Ich glaube ich habe jetzt alle Bausteine zusammen, für das was ich will.
>
> Nun wird’s aber aufwendig, denn ich muss alle Bausteine in einen Code
> zusammenbauen (das geht ja noch).
>
> Dann ist aber das Ziel, dass die Schleifen so durchlaufen, das die
> Sekundenanzeige sauber läuft und nebenbei immer alle angezeigten Kanäle
> aktualisiert werden.
>
> Aktuell sind es (siehe Anhang, die Displayschutzfolie ist auch noch drauf):
>
> Uhr, Wochentag, Datum und 7 Temperaturen in den Farben der Kanäle wie in
> der Datenbank. Die Namen der Kanäle werden allerdings im Code stehen, da
> die echten Kanalnamen zu lang fürs Display sind:
>
> Die Temperaturwerte sind natürlich noch nicht echt, die dienen nur zum
> Testen des Layouts, ob denn auch alle Anzeigen von z.B. -30.0° bis +50.0°C
> drauf passen. Gerade das Minuszeichen und die ein oder zweistellige Anzeige
> vor dem Komma (Punkt) sah erst nicht so toll aus. Da musste ich ne Weile
> basteln bis ich das so hin hatte wie es mir jetzt gefällt.
>
> Größe: 2,8“ mit 320x240 Pixeln.
>
> Wenn das mal läuft kommt ein 3,5“ Display mit 480x320 Pixeln und n
> bisschen mehr Grafik dran.
>
>
>
> Funktionieren soll das so:
>
> Morgens im Bad Licht einschalten, das Display hängt neben dem Spiegel, der
> ESP8266 bootet und nach 10 Sekunden stehen die Werte auf dem Display und
> die Uhr läuft, Licht wieder aus = ESP8266 und Display stromlos. Fertig J
>
>
>
> Liebe Grüße und gute Nacht,
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Samstag, 22. Juli 2017 00:24
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] JSON parsen auf ESP8266 mit Arduino IDE
>
>
>
> Aha, du hast es gefunden ;-)
>
>
>
> Wenn's mal rund läuft, darfst du das gerne ins Wiki stellen.
>
>
>
> Eins noch: in JSON gibts Objekte und Arrays, aber keine Variablen...
>
>
>
> Grüße
>
> Frank
>
>
>
> Am 22.07.2017 00:16 schrieb "Christian Wulff" <christianwulff at gmx.de>:
>
> ........ich bin auch ein Dödel.
>
> Sorry guys for disturbing you!
>
>
>
> Fehler gefunden, ich wollte Variablen einlesen, die es in der
> Beispieldatei gibt, aber nicht in meiner JSON Datei. Die Ausgabezeilen
> hatte ich editiert, aber nicht die Lesezeilen. Manchmal ist man leider
> blind.
>
> Ich glaube nun läuft es YEAH :-)
>
>
>
> Lieben Gruß und vielen Dank für Eure Hilfe und mentale Unterstützung!
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Samstag, 22. Juli 2017 00:11
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] JSON parsen auf ESP8266 mit Arduino IDE
>
>
>
> Hi Christian,
>
>
>
> du bist da nur beim Vorgeplänkel. Schau mal weiter unten: sowohl der
> Assistent als auch der Code geht noch weiter...
>
>
>
> Grüße
>
> Frank
>
>
>
> Am 21.07.2017 23:36 schrieb "Christian Wulff" <christianwulff at gmx.de>:
>
> Hallo Frank,
>
>
>
> den Assistenten hatte ich auch schon gefunden.
>
> Da hab ich das Beispiel JSON reinkopiert, und es kam genau die gleiche
> Expression „JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(9)“ dabei raus, wie ich
> sie bereits manuell herausbekommen habe.
>
> Die steht so auch schon im Code drin (bzw war im Beispiel noch etwas
> erweitert für zusätzlichen Platz):
>
> JSON_OBJECT_SIZE(2)    // the root object has 2 elements
>
>       + JSON_OBJECT_SIZE(9)  // the "entity" object has 5 elements
>
>       + MAX_CONTENT_SIZE;    // additional space for strings
>
>
>
> Damit dachte ich, dass das funktionieren müsste.
>
> Tuts aber nicht, und ich weiss nicht warum L
>
> Vielleicht ist aber auch noch irgendwo anders ein Bock drin. Nur wo?
>
> Die Beispieldatei hatte ich von Ethernet auf WLAN umgebaut. Die hat dann
> einwandfrei online funktioniert (Da wird auf eine Website zugegriffen und
> ein Beispiel geparst). Daran sollte es also nicht liegen.
>
>
>
> Lieben Gruß,
>
> Chris
>
>
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Freitag, 21. Juli 2017 13:17
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] JSON parsen auf ESP8266 mit Arduino IDE
>
>
>
> Den Link aus deinem Code solltest du dir auch mal anschauen:
> https://bblanchon.github.io/ArduinoJson/assistant/
>
>
>
> Grüße
>
> Frank
>
>
>
> Am 21.07.2017 12:05 schrieb "Christian Wulff" <christianwulff at gmx.de>:
>
> Hallo Frank,
>
>
>
> ja das weiss ich, das ist aber nur eine Variablendeklaration. Die stört
> nicht, oder?
>
> Der Buffer für das JSON ist bereits korrekt an das JSON angepasst.
>
> Aber dann geht’s irgendwie noch nicht weiter L
>
> Wäre gut, wenn das schon mal eine gemacht hat.
>
>
>
> Any idea?
>
>
>
> Lieben Gruß,
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Freitag, 21. Juli 2017 11:51
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] JSON parsen auf ESP8266 mit Arduino IDE
>
>
>
> Hallo Christian,
>
>
>
> ich hab das auch noch nie gemacht, aber du solltest deinen Code schon
> irgendwie an die gelieferte JSON-Struktur anpassen. "name" und "company"
> wirst du hier wohl kaum finden...
>
>
>
> Grüße
>
> Frank
>
>
>
> Am 21.07.2017 11:22 schrieb "Christian Wulff" <christianwulff at gmx.de>:
>
> Moin,
>
>
>
> Ich möchte auf einem kleinen Display mit WLAN Verbindung ein super einfach
> zu nutzendes Frontend bauen, das man überall platzieren kann und nur
> einschalten muss.
>
> Das Display kriege ich angesteuert und Datum und Zeit werden bereits per
> ntp eingelesen und auf dem Display angezeigt.
>
> Nun fehlen noch die Temperaturen auf dem Display.
>
> Die Daten sollen über WLAN per http Request und JSON eingelesen und
> ausgewertet werden.
>
> HTTP Request und JSON funktioniert, habe ich im Browser getestet und mir
> die Daten angesehen.
>
> Dann habe ich mir die Bibliothek ArduinoJson installiert und mir das
> Beispiel JsonHttpClient angesehen. Dies habe ich von Ethernet bereits auf
> WLAN umgestrickt.
>
>
>
> Ich glaube der HTTP Request funktioniert bereits, allerdings gibt es
> irgendein Problem beim parsen. Da komme ich auch nach einiger Recherche
> leider nicht weiter.
>
>
>
> Vielleicht kann hier jemand helfen?
>
>
>
> (Der Code ist noch nicht aufgeräumt, da sind noch Reste vom Beispiel drin,
> ich glaube aber nicht dass die das Problem verursachen)
>
>
>
> ************************************************************
> ************************************************************
> **************************************************************
>
> #include <ArduinoJson.h>
>
> #include <ESP8266WiFi.h>
>
> #include <WiFiClient.h>
>
> #include <WiFiUdp.h>
>
> WiFiClient client;
>
> const char WiFiSSID[] = "Chriss 123456";     //### your Router SSID
>
> const char WiFiPSK[]  = "1234567890132654"; //### your Router Password
>
> const char* server = "192.168.178.43";  // server's address
>
> const char* resource = "/middleware.php/channel/003321-9654-146-acf4-754654654.json";
> // http resource Kanalinfo Temperatur AUSSEN
>
> const unsigned long BAUD_RATE = 9600;                 // serial connection
> speed
>
> const unsigned long HTTP_TIMEOUT = 10000;  // max respone time from server
>
> const size_t MAX_CONTENT_SIZE = 512;       // max size of the HTTP response
>
> bool isConnected(long timeOutSec) {
>
>   timeOutSec = timeOutSec * 1000;  int z = 0;
>
>   while (WiFi.status() != WL_CONNECTED) {
>
>     delay(200);
>
>     Serial.print(".");
>
>     if (z == timeOutSec / 200) { return false; }
>
>     z++;  }  return true;}
>
>
>
> // The type of data that we want to extract from the page
>
> struct UserData {
>
>   char name[32];
>
>   char company[32];
>
>   char type[32];
>
>   char color[32];
>
>   char title[32];
>
> };
>
>
>
> // ARDUINO entry point #1: runs once when you press reset or power the
> board
>
> void setup() {
>
>   initSerial();
>
>   WiFi.mode(WIFI_STA);
>
>   WiFi.begin(WiFiSSID, WiFiPSK);
>
>   if (isConnected(30)) {
>
>     Serial.println(F("WLAN läuft"));     }}
>
>
>
> // ARDUINO entry point #2: runs over and over again forever
>
> void loop() {
>
>   if (connect(server)) {
>
>     if (sendRequest(server, resource) && skipResponseHeaders()) {
>
>       UserData userData;
>
>       if (readReponseContent(&userData)) {
>
>         printUserData(&userData);
>
>       }
>
>     }
>
>   }
>
>   disconnect();
>
>   wait();
>
> }
>
>
>
> // Initialize Serial port
>
> void initSerial() {
>
>   Serial.begin(BAUD_RATE);
>
>   while (!Serial) {
>
>     ;  // wait for serial port to initialize
>
>   }
>
>   Serial.println("Serial ready");
>
> }
>
>
>
> // Open connection to the HTTP server
>
> bool connect(const char* hostName) {
>
>   Serial.print("Connect to ");
>
>   Serial.println(hostName);
>
>   bool ok = client.connect(hostName, 80);
>
>   Serial.println(ok ? "Connected" : "Connection Failed!");
>
>   return ok;
>
> }
>
>
>
> // Send the HTTP GET request to the server
>
> bool sendRequest(const char* host, const char* resource) {
>
>   Serial.print("GET ");
>
>   Serial.println(resource);
>
>   client.print("GET ");
>
>   client.print(resource);
>
>   client.println(" HTTP/1.0");
>
>   client.print("Host: ");
>
>   client.println(host);
>
>   client.println("Connection: close");
>
>   client.println();
>
>   return true;
>
> }
>
>
>
> // Skip HTTP headers so that we are at the beginning of the response's body
>
> bool skipResponseHeaders() {
>
>   // HTTP headers end with an empty line
>
>   char endOfHeaders[] = "\r\n\r\n";
>
>   client.setTimeout(HTTP_TIMEOUT);
>
>   bool ok = client.find(endOfHeaders);
>
>   if (!ok) {
>
>     Serial.println("No response or invalid response!");
>
>   }
>
>   return ok;
>
> }
>
>
>
> // Parse the JSON from the input string and extract the interesting values
>
> // Here is the JSON we need to parse
>
> // {
>
> //   "id": 1,
>
> //   "name": "Leanne Graham",
>
> //   "username": "Bret",
>
> //   "email": "Sincere at april.biz",
>
> //   "address": {
>
> //     "street": "Kulas Light",
>
> //     "suite": "Apt. 556",
>
> //     "city": "Gwenborough",
>
> //     "zipcode": "92998-3874",
>
> //     "geo": {
>
> //       "lat": "-37.3159",
>
> //       "lng": "81.1496"
>
> //     }
>
> //   },
>
> //   "phone": "1-770-736-8031 x56442",
>
> //   "website": "hildegard.org",
>
> //   "company": {
>
> //     "name": "Romaguera-Crona",
>
> //     "catchPhrase": "Multi-layered client-server neural-net",
>
> //     "bs": "harness real-time e-markets"
>
> //   }
>
> // }
>
>
>
> // {
>
> //   "version": "0.3",
>
> //    "entity": {
>
> //      "uuid": "003321-9654-146-acf4-754654654",
>
> //      "type": "temperature",
>
> //      "active": false,
>
> //      "color": "#009933",
>
> //      "fillstyle": 0,
>
> //      "public": true,
>
> //      "style": "lines",
>
> //      "title": "T01 Aussen",
>
> //      "yaxis": "auto"
>
> //    }
>
> // }
>
>
>
>
>
> bool readReponseContent(struct UserData* userData) {
>
>   // Compute optimal size of the JSON buffer according to what we need to
> parse.
>
>   // See https://bblanchon.github.io/ArduinoJson/assistant/
>
>   const size_t BUFFER_SIZE =
>
>       JSON_OBJECT_SIZE(2)    // the root object has 2 elements
>
>       + JSON_OBJECT_SIZE(9)  // the "entity" object has 5 elements
>
>       + MAX_CONTENT_SIZE;    // additional space for strings
>
>
>
>   // Allocate a temporary memory pool
>
>   DynamicJsonBuffer jsonBuffer(BUFFER_SIZE);
>
>   JsonObject& root = jsonBuffer.parseObject(client);
>
>   if (!root.success()) {
>
>     Serial.println("JSON parsing failed!");
>
>     return false;
>
>   }
>
>
>
>   // Here were copy the strings we're interested in
>
>   strcpy(userData->name, root["name"]);
>
>   strcpy(userData->company, root["company"]["name"]);
>
>   // It's not mandatory to make a copy, you could just use the pointers
>
>   // Since, they are pointing inside the "content" buffer, so you need to
> make
>
>   // sure it's still in memory when you read the string
>
>   return true;
>
> }
>
>
>
> // Print the data extracted from the JSON
>
> void printUserData(const struct UserData* userData) {
>
>   Serial.print("Name = ");
>
>   Serial.println(userData->name);
>
>   Serial.print("Company = ");
>
>   Serial.println(userData->company);
>
> }
>
>
>
> // Close the connection with the HTTP server
>
> void disconnect() {
>
>   Serial.println("Disconnect");
>
>   client.stop();
>
> }
>
>
>
> // Pause for a 1 minute
>
> void wait() {
>
>   Serial.println("Wait 60 seconds");
>
>   delay(60000);
>
> }
>
> ************************************************************
> ************************************************************
> **************************************************************
>
>
>
>
>
>
>
> Als Fehler kommt da folgendes bei raus:
>
>
>
>
>
>
>
>
>
> ************************************************************
> ************************************************************
> **************************************************************
>
> Serial ready
>
> ...................................WLAN läuft
>
> Connect to 192.168.178.43
>
> Connected
>
> GET /middleware.php/channel/003321-9654-146-acf4-754654654.json
>
>
>
> Exception (28):
>
> epc1=0x4000bf0e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000
> depc=0x00000000
>
>
>
> ctx: cont
>
> sp: 3ffef9e0 end: 3ffefca0 offset: 01a0
>
>
>
> >>>stack>>>
>
> 3ffefb80:  3ffe8550 00000000 3fff05a8 402024d5
>
> 3ffefb90:  3ffefba4 3ffeeb28 3ffe0000 3ffefba4
>
> 3ffefba0:  3fffda0a 3ffe8550 3ffeeb28 3fff059c
>
> 3ffefbb0:  00000580 3ffe84d0 3ffeeb28 40201e03
>
> 3ffefbc0:  0a0d0a0d 00000000 3ffeec44 3ffeec70
>
> 3ffefbd0:  3fffdad0 00000000 3ffe836c 40202605
>
> 3ffefbe0:  ffffff00 43ffffff 73697268 39333720
>
> 3ffefbf0:  00000030 00000000 3ffeec44 401004d8
>
> 3ffefc00:  feefeffe 33000001 39303632 33353237
>
> 3ffefc10:  39383534 00000001 3ffe8715 4020391c
>
> 3ffefc20:  401051fc 002266eb 3ffeeb88 3ffeec70
>
> 3ffefc30:  3fffdad0 0000000b 3ffeec44 402032e1
>
> 3ffefc40:  3ffe8714 3ffeec70 40203638 3ffeec80
>
> 3ffefc50:  3ffefddc 0000000a 3ffeec44 4020330c
>
> 3ffefc60:  3fffdad0 00000000 3ffeec44 40203330
>
> 3ffefc70:  3fffdad0 00000000 3ffeeb50 40201d44
>
> 3ffefc80:  feefeffe feefeffe 3ffeec68 40203684
>
> 3ffefc90:  feefeffe feefeffe 3ffeec80 40100718
>
> <<<stack<<<
>
> ************************************************************
> ************************************************************
> **************************************************************
>
>
>
> Kann hier vielleicht  jemand weiterhelfen?
>
>
>
> Lieben Gruß und lieben Dank,
>
> Chris
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20170722/d21a32b0/attachment-0001.html>


More information about the volkszaehler-users mailing list