[vz-users] JSON parsen auf ESP8266 mit Arduino IDE
Christian Wulff
christianwulff at gmx.de
Sat Jul 22 01:13:39 CEST 2017
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/bc1621d4/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: VZ Display.png
Type: image/png
Size: 157304 bytes
Desc: not available
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20170722/bc1621d4/attachment-0001.png>
More information about the volkszaehler-users
mailing list