Ähm … verstehe ich das Problem jetzt nicht? (falls ich Blödsinn schreib, dann ignoriert mich einfach )
Das was ihr da einlesen wollt sind doch auch ASCII Daten, oder etwa nicht?
Ich denke die müssen doch erst noch in HEX Daten umgewandelt werden, bevor da irgendwelche Abfragen in IPS gemacht werden können…
@prof
Wie schon gescheireben ist die USF von Oktober 2006 und die FHZ 1300PC von Dezember letzen Jahres.
Ich kann dir leider nicht sagen, ob da was geändert wurde, habe nur beim testen hier gesehen, das da noch jemadn mitsendet und dann mal alle anderen ausgeschaltet, und siehe da, es war die USF.
@HJH
Mit dem Hase im Pfeffer meine ich, das dein Script nur an die ASCII-Folge eine 0 dranhängt, wie es in dem Bild vom debug-Fenster zu sehen ist. Oder, was sicherlich auch möglich ist, ich mache iregendwas falsch.
Wie schon geschrieben habe ich keine Ahnung von php, bedauerlicherweise.
Du hast sicherlich noch eine Variable in IPS vom Typ Integer angelegt? Dann mußt Du den Wert natürlich da auch noch eintragen. Die wird mit der SetValue Funktion gemacht. Hier nochmal das Script von HJH.
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Zisterne_1.ips.php
Trigger : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/
// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs
$z_data = $IPS_VALUE; // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4)) {
$fuellstand = ord($z_data[13]); // Füllstand an Position 13 extrahieren
// ab hier $fuellstand weiter verarbeiten
SetValue(12345,$fuellstand); // statt 12345 Deine ID eingeben!!
}
?>
Ich habe jetzt noch die Integer-Varible angelegt, in die der Fuellstand geschrieben werden soll.
Dabei kommt ein Fehlermeldung (siehe http://alphacars.de/Bilder/screen.jpg)
Ich denke mal, ich sollte das alles nochmal durchgehen.
Ich habe eine Register Variable, die den FTDI-Verkehr auf die Variable FTDIdate (string) schreibt.
Dann habe ich das Script von HJH, und eine neue Integervariable, in die das Ergebnis des Script geschrieben wird.
Und während ich hier antworte laufen die erste Werte richtig auf…ich kann es nicht fassen.
Die Werte springen etwas, da sicherlich nicht alle Zeichenketten vollständig ankommen, aber man kann die Hand über den Sensor bewegen und er erkennt den Abstand…
Ich bin beeindruckt…
Jetzt fehlt nur noch die Überprüfung, ob der String vollständig und in einer Sendung empfangen wurde…
Die Fehlermeldung kommt bestimmt von oirgendwelchen abgehackten Paketen…
Das ist doch erstmal ein krönender Abschluss des Abends…
bitte zeig uns doch einmal das von Dir verwendete Skript. Dann erfahren wir auch, was da in Zeile 21 steht.
Noch eine Bitte:
Bitte verwende für Screenshots die Funktion „Anhänge verwalten“. Und benutze das Datenformat .png oder .gif, aber nicht .jpg, da die Bilder durch die verlustbehaftete Kompression manchmal unleserlich werden. .jpg sollte ausschließlich für Fotos verwendet werden. Um Dein Skript hier einzubinden verwende bitte die PHP-Tags.
Übrigens: eine Version für unvollständige Datenpakete habe ich auch noch. Folgt später.
Ein bitte: Verwendet in Register Variable die Möglichkeit die Daten in ein Skript umzuleiten - nicht in die Variable! Das wird euch früher oder später viel Ärger ersparen.
Hier noch einmal das Script, wie es nun ohne Auswertung der Vollständigkeit der Datensätze bei mir läuft:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Zisterne_1.ips.php
Trigger : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/
// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs
$z_data = $IPS_VALUE; // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4))
$fuellstand = ord($z_data[13]); // Füllstand an Position 13 extrahieren
// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand); // statt 12345 Deine ID eingeben!!
?>
Wie schon gesagtkommen die Werte normalerweise gut an, ab und zu ist mal eine 0 oder eine 255 dazwischen.
Zeile 21 ist die SetValue-Zeile.
Ansonsten scheinen die Werte den Abstand in cm zu repräsentieren, so dass man nur noch einen Umrechnungsfaktor entsprechend seiner Zisterne hinzufügen muss. (Messung gestern Abend: Wert 171, Abstand 173cm)
Wie schon einmal möchte ich mich bei allen Helfern noch einmal bedanken und würde mich über eine vollständige Version (mit Unterscheidung der Datenlänge) oder sogar die Einbindung in IPS riesig freuen.
ich möchte in diesem Zusammenhang nocheinmal auf das „Cuttermodul“ hinweisen. Dieses sammelt die Daten, die Blockweise kommen, ein und gibt den kompletten Datensatz an die Registervariable . Auch gibt es hier schon die Möglichkeit Daten rauszufiltern die nicht relevant sind. Du gibst an, daß an den Stellen 5-9 folgende Daten von der USF gesendet werden: 01 01 A0 01 . Da dieser Bereich sich von den Daten der FHT unterscheidet , wäre es eine Möglichkeit gezielt danach zu suchen. Somit wird das Script auch nicht mehr durch die FHT getriggert und die Rechenlast wird verringert. Einstellungen siehe Bild. Dabei werden die ersten 4 Bytes weggeschnitten, deßwegen muß das Script wiefolgt angepasst werden:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Zisterne_1.ips.php
Trigger : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/
// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs
$z_data = $IPS_VALUE; // Daten aus "FTDIdata"
$fuellstand = ord($z_data[9]); // Füllstand an Position 9 extrahieren
// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand); // Deine ID eingeben!!
?>
da der ankommende Datenstring nur noch 10 Bytes groß ist. Weiterhin wäre eine Änderung in der Registervariable, wie von paresy beschrieben, sinvoll. Einfach „Benutze Skript“ aktivieren und da das Skript angeben.
Gruß
Attain
PS: Kurzform des Scripts:
<?
SetValue(38546 /*[Fuellstand1]*/,ord($IPS_VALUE{9})); // Deine ID eingeben!!
?>
Dein Skript muss leicht geändert werden. Der Wert darf natürlich nur dann abgespeichert werden, wenn die Bedingung erfüllt ist:
$z_data = $IPS_VALUE; // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4))
{
$fuellstand = ord($z_data[13]); // Füllstand an Position 13 extrahieren
// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand); // statt 12345 Deine ID eingeben!!
}
ich bin von einer konstanten Stringlänge ausgegangen. In diesem Fall 14 byte, sodaß ab der Abgefragten Position noch 10 byte kommen „müßten“. Zusätzlich kann man noch einen Timeout angeben, für den Fall das der Datenstring nicht komplett empfangen wird, damit in diesem Fall der nicht komplett empangene Teil verworfen wird.
paresy: ich gehe davon aus das der Timout in ms angegeben wird. Ist das korrekt?
Hallo Paresy,
Zitat:
Zitat von paresy Beitrag anzeigen
Ein bitte: Verwendet in Register Variable die Möglichkeit die Daten in ein Skript umzuleiten - nicht in die Variable!
das habe ich nicht verstanden. Könntest Du diese „Feature“ etwas näher erklären?
Bei dem Empfang der Daten wird das angegebene Script aufgerufen und der Wert in die lokale Variable „$IPS_VALUE“ übergeben.
habe das Script jetzt geändert und werde jetzt mal über einen Zeitraum von 24h die Variable Fuellstand mitschreiben , dann kann man ja die Sprünge sehen und die Genauigkeit abschätzen. Der Sensor liegt auf dem Schreibtisch und misst einen Abstand von ca. 170cm bis zur Decke.
Morgen nachmittag kann ich dann das Diagramm online stellen.
Du könntest Recht haben. Allerdings weiß ich nicht so recht, wie das Cuttermodul arbeitet. So bleibt unklar, was mit „Sync Zeichen“ gemeint ist, ebenso ob diese Zeichen in der „Eingabelänge“ enthalten sind.
Ich vermute, dass mit „Sync Zeichen“ die Startsequenz gemeint ist (hier: 01 01 0A 01).
Falls das so ist, könnte es tatsächlich funktionieren. Leider kann ich es nicht testen. Wir müssen das wohl Thilo überlassen. Aber der hat sicher ein großes Interesse daran.
ja das „Sync Zeichen“ ist hier die Startsequenz 01 01 0a 01 und dies ist in dem Ausgabestring enthalten. Getestet habe ich es mit den FHT Daten die mir ja dank Deiner Beschreibung (09 09 0a 01) bekannt sind. Und dann hab ich einfach im Debugfenster geschaut was passiert.
ich habe jetzt mal das neue Script und die Registervarible definiert und siehe da, es funktioniert auch.
Nur irgendwie kommt vor der richtigen Zahl immer noch ein anderer Wert auf die Variable Fuellstand1, die den realen Abstand Sensor - Decke markiert.
Ich habe mal Bilder angehängt, die das zeigen.
Gruß
Thilo
EDIT: Nach dem Neustart von IPS ist der Fehler verschwunden und es kommen nur noch die richtigen Werte.
Wahrscheinlich hat da das alte Script noch mit reingefunkt.
Also alles vorher geschriebene bitte ignorieren, es funktioniert.
im linken Bild sieht man, dass da noch „doppeltgemoppelt“ wird.
Der Event mit der ID 52023 ist jetzt natürlich nicht mehr nötig, da die Daten jetzt direkt von der Registervariable dem Skript zugeführt werden (benutze Skript). Die Variable „FTDIdata“ ist nun ebenfalls überflüssig.
Damit sollte es auch nicht mehr zu Mehrfach-Triggerung kommen.