Rest sensor: Lesen einer Liste von Werten ( array)

Moin liebe Kommunity.

Ich bin Anfänger in YAML und die Syntax ist schon etwas gruselig für mich :slight_smile:
Ich möchte ein Gerät via REST abfragen und dessen zurückgelieferten Werte als Sensoren nutzen. Folgenden Response bekomme ich:

{
“timestamp”: 1470917182,
“values”: \[
{ “obis”: “1.7.0”, “value”: 4242 },
{ “obis”: “1.8.0”, “value”: 123459637 },
{ “obis”: “1.8.1”, “value”: 0 },
{ “obis”: “1.8.2”, “value”: 0 },
{ “obis”: “2.8.0”, “value”: 123456 }
\]

Generell habe ich eine Ahnung wie ich das machen muss, jedoch scheitere ich an der Key/value Liste “values”. Wie extrahiere ich das mit value_json? Es fehlt ein Index jedoch fehlt mir die Syntax dazu. Vielleicht: json_value[0].values[0].obis und json_value[0].values[0].value für die ersten beiden Key/value paare in der Liste

Bisher: ( timestamp als sensor zählt bis 10 sec, anstatt das Datum alle 10 sec anzuzeigen, ist mir aber nicht wichtig )

rest:
  - resource: http://192.168.42.42/value
    method: GET
    scan_interval: 10
    headers:
      X-API-KEY: "42zaphod42"

    sensor:
      name: pwr_time
      device_class: timestamp
      value_template: '{{ value_json\["timestamp"\] | as_datetime | as_local }}'

Wie muss die Syntax für obige REST Antwort lauten?

Vieeelen Dank für eure Mühe
Karsten

die json scheint Fehlerhaft zu sein?!

{% set value_json =
{
  "timestamp": 1470917182,
  "values": [
    { "obis": "1.7.0", "value": 4242 },
    { "obis": "1.8.0", "value": 123459637 },
    { "obis": "1.8.1", "value": 0 },
    { "obis": "1.8.2", "value": 0 },
    { "obis": "2.8.0", "value": 123456 }
  ]
}

%}
{{ value_json.timestamp | as_datetime | as_local }}

Ergebnis:

Um den Wert 4242 zu extrahieren, sehe das template so aus.

{{ value_json['values'][0].value }}
[0] → "1.7.0" = 4242
[1] → "1.8.0" = 123459637
[2] → "1.8.1" = 0  
[3] → "1.8.2" = 0
[4] → "2.8.0" = 123456

Gruß Osorkon

Hi Osorkon,

Super vielen Dank.
Obiges Beispiel ist was der Web-server auf ein curl command zurück sendet. Es ist kein YAML code.

Die Dereferenzierung des zwei dimensionalen Array ar[5][2]
"values":[{ "obis": "1.7.0", "value": 4242 }, .... ]
nach value 4242 mit

{{ value_json['values'][0].value }}

sieht für mich komisch aus, aber ich probier es gleich mal aus.
Daaaaanke!!

:wink:

EDIT:
Wenn Du nicht die arrays über den index abfragen willst, sondern die zugehörigen Werte für z.B "1.7.0" ausgeben willst, dann kannst Du es auch so machen.

{{ value_json['values']
   | selectattr('obis', 'equalto', '1.7.0')
   | map(attribute='value')
   | list
   | first | int(0)
}}

Gruß Osorkon

Mega, läuft :slight_smile:

Jetzt noch nach int casten, default value auf 0 und durch 1000 teilen. Magst du mir dafür noch mal die Syntax nennen?

Ehrlich: In C programmieren ist ein Kinderspiel dagegen. ~30 keywords und los. Wahrscheinlich bin ich aber einfach zu alt für YAML. Sowieso: alles was nicht mit vi an einem VT100 Terminal editierbar ist, ist Teufelswerk :rofl:

{{ value_json['values'][0].value  | int(0) / 1000 }}

Gruß Osorkon

Krass danke!
Also wenn es endlich mal möglich wäre Bier via Mail zu verschicken würdest du jetzt eine Kiste lecker Flens im Postkasten finden.!
Suuuper vielen Danke!

1 „Gefällt mir“