Script vergleicht Variable und IPS_Value nicht

Ich hoffe, das ich in dem Bereich richtig bin. Ansonsten bitte verschieben.

Zu meinem Problem:
Ich habe ein Sebury s-touch Codeschloss (siehe Bild) welches über einen Wiegand 26 Bus verfügt. Dieser ist mit einen Wiegand2Usb Konverter verbunden welcher die Eingabe am Codeschloss in ein 6 Zeichen Hexadezimalcode ausgibt (siehe Bild). Über eine Register Variable ist das Script „Test 1“ verbunden. Dieses soll den Code erkennen und zwischenspeichern. Einmal in eine Variable „lastRecive“ und soll über das Script außerdem vergleichen, ob eine Person mit diesem Code bereits angelegt ist, damit der Befehl weiterverarbeitet werden kann (Haustür öffnen). Soweit zu den Rahmenbedingungen. Und noch das Script:

<?

$data = $IPS_VALUE;
$Personen = GetValue(41668 /*[Test\Wiegand\Personen\User01]*/);

RegVar_SetBuffer($_IPS['INSTANCE'], $data);
SetValue(20287 /*[Test\Wiegand\lastRecive]*/, $IPS_VALUE);

if ($IPS_VALUE == $Person)
{
SetValueBoolean (47610 /*[Test\Wiegand\Richtig]*/, true);
}
else
{
SetValueBoolean (47610 /*[Test\Wiegand\Richtig]*/, false);
}

?>

Leider speichert die Register Variable zwar den Code in der Variable „lastRecive“ ab, aber anscheinend stimmt die Variable „User 1“ trotz identischer schreibweise nicht mit dem emfangenen Wert überein. Habt ihr evtl. eine Idee warum? Sehe ich den Wald vor lauter Bäumen nicht? Danke schon einmal für Eure Hilfe.

Gruß Andy

Wiegand2USB.JPG

Abend Andy!

1.) Bitte vom alten Schreibformat $IPS_VALUE in die neue Schreibweise $_IPS[‚VALUE‘] ändern

2.) Schau dir mal mit „var_dump($Person);“ und auch damit das $_IPS[‚VALUE‘] an. Vielleicht ist das eine ein Integer und das andere ein String oder sowas in der Richtung? Oder ein Leerzeichen? …?

Grüße,
Chris

die Variable $Person wird auch nirgends gesetzt :confused:

… ändere es mal auf $Personen …

:smiley: Gut gesehen! :smiley:

So „Fehler“ können einen richtig gut nerven und beschäftigen :eek: Aber vlt. kann man das var_dump danach trotzdem brauchen :smiley:

Grüße,
Chris

Das Setbuffer ist auch unnötig.
Und dann ist wirklich die Frage was für Werte und Typen du empfängst und vergleichst.
Was meinst du mit 6 Zeichen Hexadezimalcode ?
Er gibt dir also 3 Byte ? Welche du so auch im Debug der RegVar siehst ? Oder einen 6 Zeichen langen String welcher die 3Byte in Hexadezimaler Schreibweise darstellen ?
Nach deinem Screenshot zu urteilen wohl eher letzteres.
Wobei da ja die Werte vom Empfang und User eh nicht gleich sind…
Zusätzlich zum Person / Personen Problem.
Michael

Den IPSLogger finde ich ich in so Fällen auch immer recht hilfreich - da gibt es immer gleich eine schöne rote Fehlermeldung im Header :smiley:

Wow, das geht ja mal fix mit den Antworten!!

Danke für das viele Feedback.

Das $Person und $Personenproblem! Das versaut einem wirklich den Tag :mad:

  • wurde geändert.

@Bayaro
$_IPS[‚VALUE‘] nun in richtiger Schreibweise. Was macht der vorgeschlagene Befehl „var_dump“ und wie ist er genau zu verwenden?

@Nall chan
Stimmt Set Buffer ist unnötig. Hatte mit den Buffer vorher „herumgespielt“ um das Problem evtl zu fixen. Im Bild 3/3 in meinem 1. Post wird die Ausgabe des Wiegand2USB Controllers kurz beschrieben. Da stand 6h. Hab es nur so übernommen. Aber ja, ich denke es sind 3 Byte. Andere Variablentypen habe ich als „lastRecive“ mal angelegt und ausprobiert. Insbesondere Integer war interessant. Da hat er bei empfang aber nichts reingeschrieben. Nur bei einer String Variable schrieb/schreibt er was rein. Deswegen ging ich davon aus, das es ein String ist. Debug der RegVar ist im Screenshot. Das steht Länge 7. Was auch immer das zu heissen hat. :frowning:

Wieso sind die Werte von Empfang und User nicht gleich?

@brownson
IPS Logger ist auch ein guter Tip! Spukt aktuell aber nix aus.

Script sieht jetz so aus:

<?

$data = $_IPS['VALUE'];
$Personen = GetValue(41668 /*[Test\Wiegand\Personen\User01]*/);
$lastRecive = GetValue(20287 /*[Test\Wiegand\lastRecive]*/);

SetValue(20287 /*[Test\Wiegand\lastRecive]*/, $IPS_VALUE);

if ($lastRecive == $Personen)
{
SetValueBoolean (47610 /*[Test\Wiegand\Richtig]*/, true);
}
else
{
SetValueBoolean (47610 /*[Test\Wiegand\Richtig]*/, false);
}

?>

Das Problem besteht jedenfalls noch. Er vergleicht einfach die händisch eingegebene Variable „User 1“ mit IPS_Value nicht.

Gruß Andy

Deine Daten sind ein hexadezimale String. Du kannst also mit String ohne umrechnen arbeiten.
Dein Problem wird das Start oder Endzeichen sein, welches mitgesendet wird. Dies siehst du meistens nicht, weil es ein Steuerzeichen ist.
Schalt im Debug mal unten hex.
Und dann siehst du 7 x 2 Werte.
Jedes paar (Byte) steht für ein Zeichen.
Dann mal umrechnen und schauen wo du den String aus der Variable findest.
Das erste oder letzte Zeichen musst du also beim Vergleich von IPS_Value abziehen oder bei Personen besagtes Zeichen anhängen.
Michael

Moin!

Bzgl. „var_dump“ hier mal ein Beispiel-Script:

<?
$test1 = 1;
$test2 = 3.56;
$test3 = "Blabla";
$test4 = true;

var_dump($test1);
var_dump($test2);
var_dump($test3);
var_dump($test4);
?>

Ausgabe davon:

int(1)
float(3.56)
string(6) "Blabla"
bool(true)

Hier mal ein paar praktische Tipps zum Thema:

<?
$Test = "048759
";
echo "Hier sieht man den Zeilenumbruch nicht: ".$Test.PHP_EOL;
echo "Danach ein echo und man sieht den Zeilenumbruch in der Ausgabe, weil da eine Leerzeile ist.".PHP_EOL;

var_dump($Test);
echo "Mit var_dump sieht man den Zeilenumbruch auch. Und man sieht 6 Zahlen aber der String ist 7 Zeichen lang.".PHP_EOL;

$test2 = substr($Test, 0, -1);
echo "Letztes Zeichen abschneiden: ".$test2.PHP_EOL;

$test2 = str_replace("
", "", $Test);
echo "Oder bestimmten Kram im String ersetzen: ".$test2.PHP_EOL;
?>

Ausgabe davon:

Hier sieht man den Zeilenumbruch nicht: 048759

Danach ein echo und man sieht den Zeilenumbruch in der Ausgabe, weil da eine Leerzeile ist.
string(7) "048759
"
Mit var_dump sieht man den Zeilenumbruch auch. Und man sieht 6 Zahlen aber der String ist 7 Zeichen lang.
Letztes Zeichen abschneiden: 048759
Oder bestimmten Kram im String ersetzen: 048759

Grüße,
Chris

Vielen Dank. Ich glaube das war der Tipp, den ich benötigte. Es kommt bei jeder Eingabe eines Codes das Steuerzeichen CR (Hex: 0D) als Abschluß! Das ist der „Wagenrücklauf“. Den bekomme ich allerdings so nicht als Variable eingegeben.

Kann man beim Emfpang nicht das letzte Byte abschneiden?

Gruße Andy

Hab ich doch geschrieben wie das geht?!

Musst einfach von $_IPS[‚VALUE‘] hinten das „böse“ Zeichen abschneiden, in eine Variable „zwischenlagern“, dann vergleichen und fertig :wink:

Grüße,
Chris

Noch einfacher, lege einen Cutter zwischen IO und RegVar. Dann hast du auch immer eine saubere Trennung wenn viele Chips hintereinander gelesen werden. Und dein Script kann dann nur sauber getrennte Werte erhalten, ohne dass du noch was im Script beachten musst.
Michael

@ Michael & Chris,

beides super Vorschläge. Vielen Dank. Mit Hilfe der Suche und diesem Post habe ich es hinbekommen!! Es funktioniert! Ich wusste von dieser Funktion gar nichts… Ihr habt mein Wochenende gerettet (jetzt kann gearbeitet werden.) :smiley:

Grüße aus WW und Danke an alle die geholfen haben.

Andy