Benötige Hilfe bei IPS_GetConfiguration

Hallo zusammen,

ich benötige einen kleinen Denkanstoß bei der Benutzung von IPS_GetConfiguration. Wenn ich eine KNX-Instanz abfrage, bekomme ich folgendes Ergebnis:


{"GroupAddress1":2,"GroupAddress2":2,"GroupAddress3":0,"GroupMapping":"[{\"GroupAddress3\":0,\"GroupAddress2\":2,\"GroupAddress1\":0},{\"GroupAddress3\":0,\"GroupAddress2\":2,\"GroupAddress1\":1}]","GroupFunction":"DriveMove","GroupInterpretation":"Inverted","GroupCapabilityReceive":true,"GroupCapabilityRead":false,"GroupCapabilityTransmit":false,"GroupCapabilityWrite":true}

Hinter GroupMapping verbirgen sich die Gruppenadressen 0/2/0 und 1/2/0.

Ziel soll ein Script sein, welches erkennt, wieviele Rückmeldeadressen in der Instanz eingetragen sind und mir diese auflistet. Wie komme ich programmiertechnisch am geschicktesten an diese Informationen?

Kleine Frage nebenbei: Warum liefert die Funktion das Ergebnis als String? Wäre ein Array hier nicht besser, sinnvoller und logischer?

Freue mich auf Rückmeldungen!

Grüße,
Christoph

Das ganze ist JSON und ein Array, wenn Du dies bearbeiten willst kannst Du das entweder in ein Standardobjekt umwanden oder aber in ein Array was Dir lieber ist.


$json = '{"GroupAddress1":2,"GroupAddress2":2,"GroupAddress3":0,"GroupMapping":"[{\"GroupAddress3\":0,\"GroupAddress2\":2,\"GroupAddress1\":0},{\"GroupAddress3\":0,\"GroupAddress2\":2,\"GroupAddress1\":1}]","GroupFunction":"DriveMove","GroupInterpretation":"Inverted","GroupCapabilityReceive":true,"GroupCapabilityRead":false,"GroupCapabilityTransmit":false,"GroupCapabilityWrite":true}';
 $stdobj = json_decode($json);
var_dump($stdobj);
 $knxarray = json_decode($json, true);
 var_dump($knxarray);

$groupmapping = $stdobj->GroupMapping;
 $groupmapping = json_decode($groupmapping);
 $anzahl = count($groupmapping);
 echo "Anzahl :".$anzahl."
";
 foreach($groupmapping as $groupaddress)
 {
 	echo $groupaddress->GroupAddress1."/".$groupaddress->GroupAddress2."/".$groupaddress->GroupAddress3."
";
 }

Ausgabe:


Anzahl :2
0/2/0
1/2/0

Vermutlich weil es so 1:1 aus der Settings.json kommt.
Michael

Vielen Dank für die Hilfestellung!

Gruß,
Christoph

Habe zwar kein KNX, aber du kannst es vielleicht noch etwas einschränken.
Wenn du mit:


$GroupMapping = IPS_GetProperty(12345, "GroupMapping");

arbeitest, solltest du nur die Einstellungen des GroupMapping erhalten.

Michael

@NallChan
Vielen Dank für die Ergänzung. Das ist in der Tat hilfreich.

Jetzt habe ich noch ein einziges Problem beim automatischen Anlegen einer KNX ShutterInstanz.

<?

$newShutter = IPS_CreateInstance("{24A9D68D-7B98-4D74-9BAE-3645D435A9EF}");
IPS_SetParent($newShutter, 16679);
IPS_SetName($newShutter, "Test-Shutter");

$GA = array("GroupMoveAddress1" => 1, "GroupMoveAddress2" => 2, "GroupMoveAddress3" => 1);
$GA = json_encode($GA, JSON_FORCE_OBJECT);
IPS_SetConfiguration($newShutter, $GA);

$Mapping = json_encode(array("GroupAddress3" => 0, "GroupAddress2" => 2, "GroupAddress1" => 0),JSON_FORCE_OBJECT);
IPS_SetProperty($newShutter, "GroupMoveMapping", $Mapping);
IPS_ApplyChanges($newShutter);

?>

Das zuweisen der Eigenschaften mit IPS_SetProperty funktioniert nicht. Dieses Script läuft zwar ohne Fehler durch, wenn ich in der Shutter-Instanz bei Adresse auf/ab auf „mehr“ klicke, kommt eine Zugriffsverletzung. @paresy, ist es richtig, dass mir IPS_SetProperty keinen Fehler liefert, wenn ich anscheinend die Werte falsch übergebe?

Lese ich die Eigenschaften der frisch erstellten Instanz mit

IPS_GetProperty(12345, "GroupMoveMapping")

aus, so kommt dort:

string(55) "{"GroupAddress3":0,"GroupAddress2":2,"GroupAddress1":0}"

Korrekt wäre aber:

string(57) "[{"GroupAddress3":0,"GroupAddress2":2,"GroupAddress1":0}]"

Ich würde mich freuen, wenn wir jemand einen Wink geben könnte, wie ich IPS_SetProperty richtig verpacke, damit die Eigenschaft GroupMoveMapping richtig verpackt wird. Am Ende möchte ich dort mehrere Adressen eintragen.

Danke und Gruß,
Christoph

Da fehlt ein Array.


$Mapping = json_encode(array(array("GroupAddress3" => 0, "GroupAddress2" => 2, "GroupAddress1" => 0)),JSON_FORCE_OBJECT); 

Wie solltest du auch sonst mehrere Mappings eintragen können :wink:
Michael

Danke für die Rückmeldung.

Wenn ich den Befehl

$Mapping = json_encode(array(array("GroupAddress3" => 0, "GroupAddress2" => 2, "GroupAddress1" => 0)),JSON_FORCE_OBJECT);

nutze, ergibt ein

$temp = IPS_GetProperty(12345, "GroupMoveMapping");
var_dump($temp);

folgendes:

string(61) "{"0":{"GroupAddress3":0,"GroupAddress2":2,"GroupAddress1":0}}"

:(:confused:

Die Lösung ist:

$Mapping = json_encode(array(array("GroupAddress3" => 0, "GroupAddress2" => 2, "GroupAddress1" => 0)));  

Vielen Dank für die Unterstützung!