Daten vom Seriellen Port lesen, auswerten und in eine Variable schreiben

Hallo zusammen,
ich bin leider immer noch so unerfahren :wink: deswegen hoffe ich das mich jemand auf die Spur setzen kann…
Was will ich tun:
Ich habe einen Füllstandsmesser von Proteus, einen Ecometer Plus für unseren Öl Tank. Den würde ich gerne in IP Symcon einbinden.
Der Ecometer besteht aus 2 Geräten, einem Sensor und einem Display Device. Der Sensor sitzt auf dem Öltank und kommuniziert drahtlos mit dem Display. Das Display hat ein USB Netzteil und zeigt den augenblicklichen Füllstand an (und noch etwas mehr) Das Ding funktioniert übrigens tadellos…
Eigentlich wollte ich nur die Steckdose für das Netzteil sparen und habe der Einfachheit halber den USB Anschluss des Displays in meinen (IP SYMCON) Server gestöpselt und siehe: Es ist eine serielle Schnittstelle. (Oh…serielle Schnittstelle…da kann man doch bestimmt Daten auslesen und in IPS übernehmen und darstellen verarbeiten etc.).
Lange rede kurzer Sinn:
Ich habe in IPS ein Serial Port Instanz erstellt und mit 115200 baud, 8n1 No Parity geöffnet. Dann habe ich den Port Debugger gestartet und nun sehe ich das das Gerät ca. alle 30 Minuten ein 22 Byte großes Datagram schickt. Mittlerweile weis ich auch, dass Byte 17+18 die verfügbare Restmenge und Byte 19+20 die Gesamtkapazität ist.

Mein Problem ist: Ich habe keine Ahnung wie ich das nach IPS bekommen soll.
Es müsste also irgendwie:

  1. Der serielle Port geöffnet werden (der muss wahrscheinlich immer offen bleiben) und dann
  2. zyklisch geprüft werden ob ein Datagramm gekommen ist. Einmal pro Minute würde ja schon reichen. Das könnte ja über ein Script passieren. Im Script müssten dann die Daten gelesen und entsprechend verarbeitet werden.

Frage: Hat jemand eine Idee wie man das am schlausten macht?

Du erstellst eine Instanz der Registervariable und verbindest sie mit dem SerialPort als „Übergeordnete Instance“. Als nächstes erstellst Du die Variablen, die Du später sehen möchtest. Dann erstellst Du ein Script, mit dem Du die Daten auswertest und die Ergebnisse mit SetValue(<id>,$wert) in die vorher erstellten Zielvariablen schreibt. Das fertige Script weist Du der Registervariable-Instance als Ziel zu. Es wird nun immer ausgeführt, wenn Daten eintreffen. Das regelmäßige Ausführen des Scriptes über einen Timer entfällt damit.

Siehe auch die Hilfe zur Registervariable.

HTH
Tommi

Hallo Tommi…

vielen Dank für’s auf die Spur setzen…Ich hab es gestern Abend direkt ausprobiert und es klappt grundsätzlich. RegisterVariable erstellt, Comport als über geordnete Instanz zugewiesen, Script erstellt und das Script als Ziel der Registervariable definiert.
Im Augenblick habe ich nur eine Debug Ausgabe ins Log geschrieben…Die Auswertung der Werte kommt noch. Wenn das Script fertig ist, poste ich das dann hier noch.

Vielen Dank nochmal…

Benedikt

und Hier ist das fertige Script…wen es interessiert:


<?

// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
	echo "empfangene Daten von Proteus...
";
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data = $_IPS['VALUE'];
	if (strlen($data)==22) 
	{
	// Nur Auswerten wenn ein Standard 22 Zeichen Datagram gesendet wurde
	// Der CRC Wert wird derzeit nicht ausgewertet
	// Füllstand im Datagram ist Byte 17+18
	// Tankkapzität liest bei Byte 19+20
	// php strings sind zero based, deshalb liegen die position im array um eins reduziert
	
	$Level = ord($data[16])*256+ord($data[17]);
	$MaxLevel= ord($data[18])*256+ord($data[19]);
	$LevelPerCent = $Level/$MaxLevel*100;
	// Log Ausgabe
	echo "Öltank Pegel ".$Level." Liter
";
	echo "Öltank Kapazität ".$MaxLevel." Liter
";	
	echo "Füllstand: ".$LevelPerCent." %
";
	// Werte in IPS Vartiablen schreiben
	SetValueInteger(44118 /*[Heizung\Heizöl Tankinhalt]*/,$Level);
	SetValueFloat(28377 /*[Heizung\Heizöl Tankinhalt (%)]*/,$LevelPerCent);
	}
}

?>


Daten empfang von proteus funktioniert:
Register Variable öltank pegel 1622 liter
öltank kapazität 7800 liter
füllstand: 20.79… %
dann kommt allerdings warning: variable #44118 existiert nicht.
hier steh ich als blutiger anfänger an :wink:
muß ich dann jetzt noch variablen hinzufügen und meine objektid mit den skript variablen austauschen?
l.g. heinz
ps. wenn mann dann das ganze auch noch in einer grafik darstellen kann währ es super :slight_smile:

Willkommen im Forum.

Wenn du das Script bei dir einsetzen willst, musst du natürlich die beiden Variablen zunächst anlegen und die Ziel IDs (48118 Integer-Variable u. 28377 Float-Variable) durch deine ersetzen.

Vielleicht wäre es auch für dich ganz gut, mal im Handbuch ein wenig zu stöbern, denn da fehlt vermutlich noch einiges an Basiswissen.

Ergänzung:
Und wenn du dann bei der Erstellung der Variablen noch das Kästchen „alle Variablenänderungen aufzeichnen“ ankreuzt, kannst du ja über den Browser auch die Grafik bewundern.

wie vermutet muß man die objektid mit den skript variablen austauschen.
da mit den graven funktioniert auch.
fehlt nur mehr die temperatur, (bzw gibt es noch andere daten die ausgewertet werden können?).
jetzt müsste man nur mehr den litter preis eingeben können und man hat auch noch die kosten schön in der übersicht.
aber super arbeit von dir, war genau das was ich gebraucht habe :slight_smile:
l.g. heinz

hier hat sich gerade meine tippsel zeit mit deiner antwort überschnitten, angefangen zum tippen und baby hatte gerufen :wink:

Bitte mal die Tastatur reparieren, da stehen nur kleine Buchstaben :confused:

Gruß
Bruno

Hallo,

Ich habe mal was mehr zeit um mich mit Symcon zu beschaftigen.
Jetzt möchte ich mein Proteus auslesen.

COM port ist offen, debug lauft auch, und jede halbe stunde bekomme ich ein bericht.
Leider is es leer oder fast leer.

11:19 received 00
11:49 received 00 50 FF

Mein Proteus hat firmware version F29.

Bekommt mann nur daten bei eine Füllstands änderung oder soll man die immer bekommen?

Danke,
Chris