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?

: Bearbeitet durch User
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}

: Bearbeitet durch User
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 [{ ?

: Bearbeitet durch User
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.

: Bearbeitet durch User
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?

: Bearbeitet durch User
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.