Forum: Mikrocontroller und Digitale Elektronik Wie nested json mit arduinojson deserialisieren?


von Alt G. (altgr)


Lesenswert?

Davon möchte ich "Power" haben:
1
{"StatusSNS":{"Time":"2022-10-30T22:15:02","ENERGY":{"TotalStartTime":"2022-06-17T08:03:04","Total":283.896,"Yesterday":1.467,"Today":0.467,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage": 0,"Current":0.000}}}
Das problem ist das ist unter ["ENERGY"] verpackt. Das übliche
1
error = deserializeJson(doc, payload);
2
pwr = doc["Power"];
geht da nicht.

Wie komm ich da ran?

von J. S. (jojos)


Lesenswert?


von EAF (Gast)


Lesenswert?

Meine Glaskugel sagt:
1
pwr = doc["ENERGY"]["Power"];

Alles andere würde keinen Sinn machen.

von Alt G. (altgr)


Lesenswert?

1
pwr = doc["StatusSNS"]["ENERGY"]["Power"];

Ich danke für die hilfe !

Hier das nächste:
1
{"wifi_sta":{"connected":true,"ssid":"FSM","ip":"192.168.178.33","rssi":-55},"cloud":{"enabled":true,"connected":true},"mqtt":{"connected":false},"time":"22:23","unixtime":1667165039,"serial":194,"has_update":false,"mac":"E8DB84D32771","cfg_changed_cnt":0,"actions_stats":{"skipped":0},"relays":[{"ison":true,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"overpower":false,"source":"http"}],"meters":[{"power":0.68,"overpower":0.00,"is_valid":true,"timestamp":1667168639,"counters":[20.868, 0.369, 0.000],"total":46}],"inputs":[{"input":0,"event":"","event_cnt":0}],"temperature":26.73,"overtemperature":false,"tmp":{"tC":26.73,"tF":80.11, "is_valid":true},"temperature_status":"Normal","ext_sensors":{},"ext_temperature":{},"ext_humidity":{},"update":{"status":"idle","has_update":false,"new_version":"20220809-124723/v1.12-g99f7e0b","old_version":"20220809-124723/v1.12-g99f7e0b","beta_version":"20221014-091548/v1.12.1-rc1-gd2158aa"},"ram_total":51272,"ram_free":37456,"fs_size":233681,"fs_free":148592,"uptime":8531}

von EAF (Gast)


Lesenswert?

Alt G. schrieb:
> ["StatusSNS"]

Ja, den habe ich übersehen, mich nur auf deinen Text verlassen..

von Alt G. (altgr)


Lesenswert?

Den:
1
{
2
"wifi_sta":{"connected":true,"ssid":"FSM","ip":"192.168.178.33","rssi":-55},
3
"cloud":{"enabled":true,"connected":true},
4
"mqtt":{"connected":false},
5
"time":"22:08",
6
"unixtime":1667164089,
7
"serial":169,
8
"has_update":false,
9
"mac":"E8DB84D32771",
10
"cfg_changed_cnt":0,
11
"actions_stats":{"skipped":0},
12
"relays":[{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"overpower":false,"source":"http"}],
13
"meters":[{"power":0.00,"overpower":0.00,"is_valid":true,"timestamp":1667167689,"counters":[0.000, 0.000, 0.000],"total":25}],
14
"inputs":[{"input":0,"event":"","event_cnt":0}],
15
"temperature":25.89,
16
"overtemperature":false,
17
"tmp":{"tC":25.89,"tF":78.60, "is_valid":true},
18
"temperature_status":"Normal",
19
"ext_sensors":{},
20
"ext_temperature":{},
21
"ext_humidity":{},
22
"update":{"status":"idle","has_update":false,"new_version":"20220809-124723/v1.12-g99f7e0b","old_version":"20220809-124723/v1.12-g99f7e0b","beta_version":"20221014-091548/v1.12.1-rc1-gd2158aa"},
23
"ram_total":51272,
24
"ram_free":37264,
25
"fs_size":233681,
26
"fs_free":148592,
27
"uptime":7581
28
}

habe ich mit
1
pwr = doc["meters"]["power"];

geht aber nicht. Was bedeutet das [{ ?

von Alt G. (altgr)


Lesenswert?

1
pwr = doc["meters"][0]["power"];

Alles klar, Danke !

Ich wünschte mir der shelly 1PM hätte einen kürzeren http zugang zum 
power wert. Der 2.5 kann das.

von Alt G. (altgr)


Lesenswert?

Funktioniert.
So lese ich mit einem esp8266 einen shelly 1PM, einen shelly 2.5, und 
einen sonoff pow r2 aus:
1
enum devtype {Shelly1, Shelly251, Shelly252, SonoffPow};
2
3
String Shelly_1PM  = "192.168.178.33";
4
String Shelly_2p5  = "192.168.178.52";
5
String SonoffPowR2 = "192.168.178.41";
6
7
int http_getpow(enum devtype dev) 
8
{
9
  StaticJsonDocument<2000> doc;
10
  WiFiClient client;
11
  HTTPClient http;
12
  String getstr;
13
  int pwr;
14
15
  switch (dev)
16
  {
17
    case Shelly1:   getstr = "http://" + Shelly_1PM  + "/status";  break;
18
    case Shelly251: getstr = "http://" + Shelly_2p5  + "/meter/0"; break;
19
    case Shelly252: getstr = "http://" + Shelly_2p5  + "/meter/1"; break;
20
    case SonoffPow: getstr = "http://" + SonoffPowR2 + "/cm?cmnd=status%2010"; break;
21
  }
22
  if (http.begin(client, getstr)) 
23
  {  
24
    int httpCode = http.GET();
25
    if (httpCode > 0) 
26
    {
27
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) 
28
      {
29
        String payload = http.getString();
30
        //Serial.println(payload);
31
        DeserializationError error = deserializeJson(doc, payload);
32
        if (error) Serial.print(F("deserializeJson() failed: "));
33
        switch (dev)
34
        {
35
          case Shelly1  : pwr = doc["meters"][0]["power"];  break;
36
          case Shelly251: pwr = doc["power"]; break;
37
          case Shelly252: pwr = doc["power"]; break;
38
          case SonoffPow: pwr = doc["StatusSNS"]["ENERGY"]["Power"]; break;
39
        }
40
      }
41
    } 
42
    else Serial.printf("[HTTP] GET failed %s\n", http.errorToString(httpCode).c_str());
43
    http.end();
44
  } 
45
  else Serial.printf("[HTTP} Unable to connect\n");
46
  return pwr;
47
}

von Alt G. (altgr)


Angehängte Dateien:

Lesenswert?

Das ergibt dann sowas wie bild oben.
Das ist ertrag meiner micro-solar-WR.
Drei mal GDI und ein soyosorce (orange). Stark bewölkt.

Die spikes nach unten versteh ich nicht. Programmfehler?
Oder machen die WR zwischendurch mal pause?

von Uwe K. (ukhl)


Lesenswert?

Alt G. schrieb:
> geht aber nicht. Was bedeutet das [{ ?

https://www.json.org/json-de.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.