Zuweisen von Werten aus einer "data.json"-Datei

Ich erhalte die Werte aus einer Url in Form einer Json-Datei.
Das Ergebnis sieht so aus:

{
[ul]
[li]"software_version": "NRZ-2018-103", [/li][li]"age": "39", [/li][li]"sensordatavalues": [[/li][LIST]
[li]{[/li][LIST]
[li]"value_type": "SDS_P1", [/li][li]"value": "8.13" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "SDS_P2", [/li][li]"value": "7.30" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "temperature", [/li][li]"value": "26.10" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "humidity", [/li][li]"value": "44.00" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "BME280_temperature", [/li][li]"value": "28.67" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "BME280_humidity", [/li][li]"value": "34.26" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "BME280_pressure", [/li][li]"value": "99551.61" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "samples", [/li][li]"value": "635610" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "min_micro", [/li][li]"value": "221" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "max_micro", [/li][li]"value": "1116184" [/li][/ul]
}, 
[li]{[/li][ul]
[li]"value_type": "signal", [/li][li]"value": "-63" [/li][/ul]
}   
[/LIST]
]   
[/LIST]
}

Mit dem folgenden Script speichere ich die Daten in die entsprechnenden Variablen.

$url = "Http://192.168.1.198/data.json";
$data = file_get_contents($url);
$data = json_decode($data,true);

//Speicherung der Werte in die entsprechenden Variablen 
SetValue(53432 /*[Feinstaub\Abfragen\SDS_P1]*/,                    $data['sensordatavalues'][0]['value']);
SetValue(52483 /*[Feinstaub\Abfragen\SDS_P2]*/,                    $data['sensordatavalues'][1]['value']);
SetValue(12544 /*[Feinstaub\Abfragen	emperature]*/,               $data['sensordatavalues'][2]['value']);
SetValue(32848 /*[Feinstaub\Abfragen\humidity]*/,                    $data['sensordatavalues'][3]['value']);
SetValue(55898 /*[Feinstaub\Abfragen\BME280_temperature]*/, $data['sensordatavalues'][4]['value']);
SetValue(12944 /*[Feinstaub\Abfragen\BME280_humidity]*/,      $data['sensordatavalues'][5]['value']);
SetValue(22570 /*[Feinstaub\Abfragen\BME280_pressure]*/,      $data['sensordatavalues'][6]['value']);
SetValue(50797 /*[Feinstaub\Abfragen\samples]*/,                    $data['sensordatavalues'][7]['value']);

Die Zuordnung erfolgt durch die Positionen in der Json-Datei.
Funktioniert ganz gut, es gibt aber ein Problem.
In der Programmierung des Feinstaubsensors sind die einzelen Werte an- und abschaltbar, sodass sich die Positionen in der Json-Datei ändern können.
Ich würde gerne anstelle „$data[‚sensordatavalues‘][0][‚value‘]“ die Zuordnung über „value_type“: „SDS_P1“ , usw. vornehmen.
Leider komme ich hier nicht weiter und bitte um einen Tip.

foreach($data['sensordatavalues'] as $dataset){
// $dataset["value_type"] ist dann z.b. SDS_P1
// $dataset["value"] ist der dazugehörige Wert
}

Reicht das ?
Michael

Danke für die schnelle Hilfe. Der Knoten ist geplatzt, ich denke damit komme ich klar.

<?

$url = "Http://192.168.1.198/data.json";
$data = file_get_contents($url);
$data = json_decode($data,true);

foreach($data['sensordatavalues'] as $dataset){
    $VarName = $dataset["value_type"];
    $VarID = @IPS_GetVariableIDByName($VarName, 12667 /*[Feinstaub\Abfragen]*/);
    if ($VarID === false)    {
        echo "Variable nicht gefunden!";
        // Anlegen einer Float-Variablen mit dem Namen in $VarName
        $VarID = IPS_CreateVariable(2);
        IPS_SetName($VarID, $VarName); // Variable benennen
        IPS_SetParent($VarID, 12667 /*[Feinstaub\Abfragen]*/); // Variable einsortieren
    }
Setvalue($VarID, $dataset["value"]);
}  

?>

Super :slight_smile:
Nun bist du aber an die Namen des JSON gebunden.
Wenn du es mit IPS_GetObjectIDByIdent und SetIdent umsetzt, bist du auch der den Namen der Variablen unabhängig vom JSON.
Michael

Da hakt es wieder bei mir aus.
Ich werde mir das mal in Ruhe ansehen (zum Lernen)

Du brauchst wirklich nur IPS_GetVariableIDByName ersetzen durch IPS_GetObjectIDByName und zusätzlich vor oder nach IPS_SetName auch IPS_SetIdent ergänzen.
Parameter sind identisch.
Michael

Danke Michael, habs problemlos ersetzt.