lese über COM mehrere M-Bus Wärmemengenzähler ein. Da ich unterschiedliche WMZ Typen einsetze ist das jeweilige Antworttelegramm unterschiedlich (auch unterschiedlich lang) vernüftige Trennzeichen gibt es leider nicht.
Erfolg hatte ich bislang mit den WMZ Typ 1 die eine 132 Zeichenantwort zurücksenden.
Com --> Cutter (Startzeichen 68H, Länge 132) --> Registervariable --> Auswertescript
Probleme habe ich jetzt mit dem Auslesen der WMZ Typ 2 die eine 79 Zeichenantwort zurücksenden.
Mit dem Cutter sehe ich durch die unterschiedlichen Längen und die fehlenden eindeutigen Synczeichen keine Lösung.
Das ganze mit „RegVar_GetBuffer“ habe ich nicht hinbekommen.
Vielleicht hat hierzu jemand ein Beispiel.
Das Programm müßte je WMZ einen Befehlsstring senden, warten bis die Antwort komplett empfangen ist und dann die Empfangsdaten per Script auswerten.
Ich habe ein ähnliches Problem. Wenn ich das an dieser Stelle poste hilft uns hoffentlich jemand mit dem Auslesen der Register Variable. IP-Symcon ist ja ein tolles Werkzeug:loveips:. Nur ist die Dokumentation für Nicht-Programmierer manchmal etwas knapp gehalten.
Ich habe in meiner Komfortlüftung einen CO2-Sensor, welcher via USB-Schnittstelle Daten herausgibt. Ich habe die nötigen Instanzen erzeugt und sehe im Debuger, dass die gewünschten Daten unter „Sendchunk“ vorliegen.
Nur - wie hole ich diese jetzt in einem Skript ab?
Mit der Dokumentation und einigen Hinweisen im Forum habe ich das Skript „gebastelt“, welches in der dritten Grafik angehängt ist. Da ich jedoch die Sache mit der Registervariable nicht ganz kapiere, kann ich mit der Fehlermeldung auch nichts anfangen.
Kann uns jemand an meinem einfachen Beispiel erläutern, wie man die Registervariable ausliest und in eine IPS-Variable (float) schreiben kann? Ich habe vor, diese dann mit dem DUG-Tool zu loggen und als Grafik auszugeben.
Und bei dem Skript nicht den „Ausführen“-Button drücken denn im Execute-Modus gibt es keine Systemvariable $IPS_VALUE, die ist nur vorhanden wenn das Skript durch ein Ereignis getriggert wird.
Im übrigen möchte ich daruf hinweisen, das Systemvariablen wie $IPS_VALUE nicht global existieren, sondern erst durch besimmte Ereignisse ins „leben“ gerufen werden.
Dies kann man durch:
Mit deiner Codevariante bleibt immer noch die folgende Warnung:
Warning: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\44895.ips.php on line 15
Die IPS-Variable „CO2_Wert“ wird trotz Warnmeldung wie gewünscht als float-Wert geschrieben und ich bin daran, mit dem DUG-Tool eine neue Grafik zu konfigurieren.
Werner & Thomas:
Danke für den Hinweis. Die Fehlermeldungen bezüglich "$IPS_Value " sind damit erklärt.
Vielen Dank euch allen für die speditive Hilfe.
Christoph
Der fertige Code zum Auslesen der Registervariablen sieht jetzt wie folgt aus:
<?
//Auslesen des COM-Ports mit CO2-Daten und Ausschreiben der Daten in eine IPS-Variable.
//Die Systemvariable $IPS_VALUE ist nur vorhanden, wenn das Skript durch ein Ereignis getriggert wird.
//Zur Verhinderung einer Fehlermeldung beim manuellen Ausführen des Skripts wird eine "leere" Variable erzeugt.
if (!isset($IPS_VALUE)) $IPS_VALUE ="";
//Auslesen der Systemvariablen in eine IPS-Variable
$buf = $IPS_VALUE;
SetValue(14890 /*[Lüftung\RegisterVariableCO2]*/, (float)$buf);
?>
Ich hoffe, dass die Bemerkungen verständlich sind.
Hat sich bei dieser „Register Variable“ Funktion eigentlich irgendetwas geändert in der 2.1er Version oder vorher? Ich habe bis jetzt via „WWWReader“ und „Register Variable“ den Eingangsstatus eines W&T Moduls abgefragt und diesen dann direkt via „Register Variable“ in eine String-Variable geschrieben, siehe Anhang. Mittlerweile funktioniert dies aber nicht mehr und ich kann die „Register Variable“ auch nicht mehr auf eine andere Variable verlinken sondern nur mehr in ein Script.
Das heisst ich muß mir jetzt ein Script ala chris_basi basteln um die Werte wieder in eine String-Variable schreiben zu können?
He ich hab wieder mal ein Script selbst hingebracht, war aber fast ausschliesslich Kopierarbeit, poste es trotzdem mal
<?
//Auslesen des WWWReader und Schreiben der Daten in eine IPS-Variable.
//Die Systemvariable $IPS_VALUE ist nur vorhanden, wenn das Skript durch ein Ereignis getriggert wird.
//Zur Verhinderung einer Fehlermeldung beim manuellen Ausführen des Skripts wird eine "leere" Variable erzeugt.
if (!isset($IPS_VALUE)) $IPS_VALUE ="";
//Auslesen der Systemvariablen in eine IPS-Variable
$buf = $IPS_VALUE;
SetValue(39547 /*[W&T Garage\Input0]*/, (string)$buf);
// Umwandeln der String-Ausgabe in Boolean-Variable
$Input0_0 = GetValueString("Input0");
$daten = explode(";", $Input0_0);
switch ($daten[1])
{
case "OFF":
SetValueBoolean("Input0_0" , false);
break;
case "ON":
SetValueBoolean("Input0_0" , true);
break;
}
?>
Ich glaube erklären brauche ich dazu nix oder? Die meisten hier werden mein Script wahrscheinlich besser verstehen als ich selbst. Ist ja auch nix besonderes, für mich allerdings schon Die String Variable kommt halt sekündlich von einem WWWReader der mir einen Eingangszustand via Register Variable in dieses Script schickt.
Oh Gott, ich habs befürchtet aber es funktioniert! Verstehe ja noch das ich statt der Variablennamen die ID’s nehmen kann, aber den Rest hab ich nicht verstanden bzw. kann ich mir natürlich nicht vorstellen wie man es anders lösen könnte!
Rainer meint Du köntest das ganze etwas abkürzen. Du brauchst den Text nicht erst in eine Variable schreiben, im nächsten Schritt diese Variable wieder einlesen und dann weiterverarbeiten. Ich habs mal zusammengekürzt.
Gruß
<?
$ID = 12345; // ID der Boolean Variablen
if (!isset($IPS_VALUE)) return();
$daten = explode(";", $IPS_VALUE);
SetValue($ID,$daten[1]=="ON");
?>