Hilfe bei Instanzverwaltung

Hallo zusammen,

ich versuche mich an einem Script, welches aus IPS View heraus gestartet wird.

Im verlauf des Scriptes möchte ich nun andere Variablen referenzieren, aus IPS View kann ich nur 3 mitgeben.

Mittels „IPS_GetInstanceIDByName“ möchte ich eine Variable suchen, da meine Namensgebung immer gleich ist, sollen nun die ersten 2 Teile, getrennt durch Bindestriche, erhalten bleiben, den letzten Teil setzte ich im Script ein.

So weit, so gut. Mein Problem ist allerdings, das „IPS_GetInstanceIDByName“ einen direkt eingegebenen String perfekt erkennt, eine frische Variable die nur den String enthält auch, aber mein mit explode zusammengebauter String funktioniert nicht!

Ich habe mit gettype geprüft, das beides Strings sind, und mit strcmp das sie Identisch sind, dennoch funktioniert der zusammengesetzte nicht.
Wo ist hier mein geistiger Hänger? :disappointed_relieved:

Anbei der php Schnipsel:

<?php

if(isset($_IPS['SENDER']) && isset($_IPS['VARIABLE']) && isset($_IPS['VALUE'])){

// Umgebungsvariablen
$parent_id = IPS_GetParent($_IPS['SENDER']); // Lese Parent ID aus
$RolladenName = IPS_GetName($_IPS['SENDER']); // Lese Rolladenname aus
$explRolladenName = explode("-", $RolladenName); // Rolladenname am Bindestrich trennen


$zusammensetztenfuerVerfahrstatusAB = $explRolladenName[0]." - ".$explRolladenName[1]." - VERFAHRSTATUS AB";    // Mit dieser Zeichenkette führt "IPS_GetInstanceIDByName" NICHT zum Erfolg
$test = "EG - Rollade Abstellkammer Fenster - VERFAHRSTATUS AB";                                                // Mit dieser Zeichenkette führt "IPS_GetInstanceIDByName" zum Erfolg

echo gettype($test)."<br>";                                                                                     // String
echo gettype($zusammensetztenfuerVerfahrstatusAUF)."<br>";                                                      // String

$test = "EG - Rollade Abstellkammer Fenster - VERFAHRSTATUS AB";
if(strcmp($test, $zusammensetztenfuerVerfahrstatusAUF) === 1) echo "gleich<br>";                                // Ausgabe "gleich", Strings sind Identisch


$moveup_id = @IPS_GetInstanceIDByName($zusammensetztenfuerVerfahrstatusAUF, $parent_id);                        // Funktioniert so nicht, mit der Variable "$test" schon, Funktioniert auch mit $RolladenName


}else echo"Es wurde keine Rolladen ID angegeben!";

Deine Variable heißt einmal

$zusammensetztenfuerVerfahrstatusAB

und dann

$zusammensetztenfuerVerfahrstatusAUF

Vielleicht ein Schreibfehler?

Hi, danke für deine Antwort :slight_smile:

Japp, das war ein Schreibfehler, allerdings nur durch mein vieles hin und herprobieren …
die dann nochmal angehängte korrigierte Fassung tuts auch nicht, ich kann nicht verstehen, warum es mit allen „fixen“ Werten, oder auch extra Variablen funktioniert, nur mit der zusammengesetzten nicht :unamused:

<?php

if(isset($_IPS['SENDER']) && isset($_IPS['VARIABLE']) && isset($_IPS['VALUE'])){

// Umgebungsvariablen
$parent_id = IPS_GetParent($_IPS['SENDER']); // Lese Parent ID aus
$RolladenName = IPS_GetName($_IPS['SENDER']); // Lese Rolladenname aus
$explRolladenName = explode("-", $RolladenName); // Rolladenname am Bindestrich trennen


$zusammensetztenfuerVerfahrstatusAB = $explRolladenName[0]." - ".$explRolladenName[1]." - VERFAHRSTATUS AB";    // Mit dieser Zeichenkette führt "IPS_GetInstanceIDByName" NICHT zum Erfolg
$test = "EG - Rollade Abstellkammer Fenster - VERFAHRSTATUS AB";                                                // Mit dieser Zeichenkette führt "IPS_GetInstanceIDByName" zum Erfolg

echo gettype($test)."<br>";                                                                                     // String
echo gettype($zusammensetztenfuerVerfahrstatusAB)."<br>";                                                      // String

$test = "EG - Rollade Abstellkammer Fenster - VERFAHRSTATUS AB";
if(strcmp($test, $zusammensetztenfuerVerfahrstatusAB) === 1) echo "gleich<br>";                                // Ausgabe "gleich", Strings sind Identisch

$moveup_id = @IPS_GetInstanceIDByName($zusammensetztenfuerVerfahrstatusAB, $parent_id);                        // Funktioniert so nicht, mit der Variable "$test" schon, Funktioniert auch mit $RolladenName

echo $zusammensetztenfuerVerfahrstatusAB."-->". $moveup_id;

}else echo"Es wurde keine Rolladen ID angegeben!";
1 „Gefällt mir“

strcmp liefert bei Gleichheit eine 0, nicht 1

Dessen bist du dir bewusst?

Dein delimiter bei explode() ist „-“, aber die Zeichenkette ist ja in Wahrheit durch " - " (mit Leerzeichen) getrennt. Das heißt, du hast als Tokens dann Strings mit ggf führenden oder nachfolgenden Leerzeichen. Beim Zusammenfügen packst du weitere Leerzeichen dazwischen, so dass die resultierenden Strings nicht gleich sind.

Also z.B. bei explode() ein " - " als delimiter angeben sollte helfen.

Hallo ihr beiden,

da laust mich doch der Affe, Lesen bildet, sry.
Ihr habt ja beide so recht, ich dachte, Gleichheit wäre 1, und nicht 0.
Den delimiter auf " - " gebracht, mein 1 und 0 Test korrigiert, und siehe da, alles Funktioniert.

Vielen dank euch zwei, ihr habt mir das Brett vom Kopf genommen :face_with_spiral_eyes:

1 „Gefällt mir“

Es war ein schönes Suchspiel :slight_smile:

Dabei habe ich den strcmp() kennen gelernt. Keine Ahnung wofür man den braucht. Normalerweise vergleicht man mit

if($test === $zusammensetztenfuerVerfahrstatusAB)

Da werden Typ und Inhalt auf Gleichheit geprüft , ohne eine extra Funktion :thinking:

Die meisten Standard C Funktionen für C-Strings gibt es auch in PHP.
Vermutlich auch historisch, brauchen tut man die wenigsten in php.
In C ist das aber noch, gerne bei kleinen Mirkocontroller, häufiger anzutreffen.
https://cplusplus.com/reference/cstring/strcmp/
Michael

Ai ja, stimmt schon, aber ich wollte auf meinem Weg durch die Käfer die Tests halt einzeln machen, das ich dabei ne Null nich von ner Eins unterscheiden konnte, hätte ich nicht gedacht :roll_eyes: