Script für Instanz

Hallo zusammen,

ich brauchen einen kurzes Gedankenanstoß :slight_smile:

Meine Gedanken sind glaube ich etwas zu kompliziert.

Ich habe eine I/O Instanz die ein Gerät auf einen Port ausliest.
Dort kommen wenn keine Aktion erfolgt immer wieder so eine Art keep alive Daten an:

z.B. Call:0,"",0,0,0,0,0,0,0<LF>

Ich möchte gerne ein Script auslösen welches bei einem gewissen Event auftritt:

5TONE:26126<LF

Wenn ich diese Daten von der Schnittstelle erhalte soll das Script loslaufen.

Wie stelle ich denn sowas an?

Meine Gedanken drehen sich gerade um regex und sonstige wilde Geschichten :slight_smile:

Ich würde es mit Cutter und Registervariable lösen. Wenn es immer eine feststehende Zeichenfolge ist, welche das Event einleitet, dann passt das.

5TONE klingt nach Feuerwehr :slight_smile:

Bei der Feuerwehr ist doch alles digital :p, wer nutzt denn noch 5TONE analog Technik :eek:.

Du könntest die komplette Bearbeitung in einem Script machen, also ohne Cutter, den IO an die Registervariable, die das Script triggert.

Dann könntest du direkt den „keep alive“ zur Sicherheit der Funktion überwachen und ergänzend im Script filtern, wenn es ein 5TONE gibt und dort auch die AlarmID weiterverarbeiten.

Bayern alarmiert komplett analog :banghead:

puh jetzt muss ich aber passen, ich habe noch nie mit Register Variablen gearbeitet :frowning:

Was muss ich denn tun um solch eine Variable zu erstellen und wie kann ich den Ausdruck der 5-Ton Folge überprüfen?

Rechtsklick, neue Instanz erstellen und dort „RegisterVariable“ auswählen.

ich kann beim anlegen der Register Variable als Ziel nicht die I/O Instanz auswählen.
er meckert ungültiges Objekt ausgewählt.

Ziel ist das Script, IO muss als Ziel die Registervariable haben.

Die Daten, die über die RegisterVariable kommen, kannst Du im Zielskript verarbeiten.

Eine ausführliche Erklärung inklusive Beispiel-Script findest du in der Doku und wenn du Probleme mit der Zerlegung und Weiterverarbeitung im Script hast, „hier werden sie geholfen“ :D.

Die Anleitung ist nicht gerade das gelbe vom Ei.

Wie kann ich ich der I/O Instanz als Ziel die Registervariable geben?

Du öffnest die Eigenschaften der Register Variable. Im Hauptfenster steht dann „Ziel“, welches das PHP Script darstellt.
Oben steht „Gateway ändern“, dort kannst du den I/O auswählen.

und siehe es geht :slight_smile:
danke dafür.

Nach welchen Regeln kann ich jetzt im Script nach der speziellen Ausgabe filtern?

Nach allem, was PHP so hergibt. Oder einen Cutter zwischenschalten.

Wir sind immer daran interessiert unsere Doku zu verbessern. Hast du auf „Feedback senden“ geklickt und erörtert, was dir gefehlt hat? Wenn nein, könntest du das noch tun? Dann landet das bei unserem Kollegen für die Doku und er kann sich das mal anschauen. Besten Dank!

Willst du mir dann verraten welche Funktionen in PHP ich da verwenden kann?
Reicht eine reine if else Abfrage?

ist somit erledigt :slight_smile:

Du könntest im ersten Schritt dir die übergebenen Daten mal ins MessageLog schicken. Funktion

IPS_LogMessage("freier Name, z.B. Script 17 für 5TONE", $hierstehendieDaten);

Danach geht es dir darum herauszufinden, ob die gesendeten Daten identisch zu deinem Suchstring sind.
Hier gibt es ein kleines Problem bei RS232 Übertragung. Das Protokoll stellt für dich nicht sicher, dass alles gleichzeitig ankommt. Das heißt du speicherst solange die Werte im RegVar_Buffer (Info hierzu in den Beschreibungen der RegVar in der Online Doku).

Dann kannst du irgendwann prüfen, ob die angekommenen Daten auf „Linefeed“ also char(10) enden.
Tun sie das, überprüfe ob die gesammelten Daten deinem Wunschstring entsprechen. Dies ist dann die einfache If-Anweisung.

if($gesammelteDaten == "5TONE:26126
"){
 // Tue etwas
}

Habe das jetzt mal probiert, allerdings scheint da etwas nicht zu stimmen da ich im MessageLOG folgende Meldung bekomme

Das Script sieht dazu wie folgt aus:

<?php

IPS_LogMessage("5TON", $gesammelteDaten); 

if($gesammelteDaten == "5TONE:26126
"){
 SetValue(16448, true);

 $_IPS['VALUE'];

} 

Ja, da stimmt etwas nicht. Was ist Deine Frage dazu? Ich versuche mal, Deine nicht gestellte Frage zu beantworten:

Die Variable, welche die Fehlermeldung anmeckert, wird nicht definiert.

ok ich habe das script etwas umgeschrieben

<?php

if ($IPS_SENDER == "RegisterVariable") 
{
$gesammelteDaten .= $IPS_VALUE;

IPS_LogMessage("5TON", $gesammelteDaten); 

if($gesammelteDaten == "5TONE:26126
"){
 SetValue(16448, true);

 $_IPS['VALUE'];

}
} 

Die Fehlermeldung ist die gleiche.
Ich habe oben die Variable $gesammelteDaten definiert, so meine ich