Registervariable... ich kapier es nicht

Hallo,

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.

Gruß
zkra

Hallo zkra

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.

Vielen Dank
Christoph

SetValue(12345, $IPS_VALUE);

Besser wäre es gewesen deinen Code hier zu posten, anstatt einen Shot zumachen.

Hallo Rainer

Dein Wunsch ist mir Befehl. Habe Deinen Hinweis schon korrigiert:

<?

//Auslesen des COM-Ports mit CO2-Daten und Ausschreiben der Daten in eine IPS-Variable.

$buf = RegVar_GetBuffer(41034 /*[Lüftung\RegisterVariableCO2]*/);
$buf .= $IPS_VALUE;

//verarbeiten ...

RegVar_SetBuffer(41034 /*[Lüftung\RegisterVariableCO2]*/, $buf); //Restpuffer zurückschreiben

SetValue(14890 $IPS_VALUE );

?>

Ich bekomme aber immer noch die folgende Fehlermeldung:

Parse error: parse error, unexpected T_VARIABLE in [Lüftung.AuswertungCO2] on line 12

Christoph

Warum ignorierst Du immer das KOMMA! ,

SetValue(14890 ,$IPS_VALUE ); 

Hast Du auch das Script der Registervariable zugewiesen, sonst kommen die Daten nicht, nachdem Du deinen Fehler behoben hast.

Nimm mal diesen Code

   <? 
 $buf = $IPS_VALUE; 
 SetValue(14890, $buf); 
 
?>    

Danke Rainer!

Wir Schweizer sind eben manchmal etwas langsam… Jetzt funktioniert das Skript. Der Wert wird in die IPS-Variable übernommen.

Ich bekomme aber noch folgende Warnungen:

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\44895.ips.php on line 6

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\44895.ips.php on line 12

Warning: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\44895.ips.php on line 12

Christoph

siehe oben ich hab dir den Code hingeschrieben.

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:


if (!isset($IPS_VALUE)) 	$IPS_VALUE ="";

vermeiden.

P.S. Werner war schneller.:wink:

Hallo Thomas,

dafür ist deine Zeile genial um in einem solchen Skript auch mal mit Execute testen zu können.

Vielen Dank, wieder etwas hinzugelern.

Rainer:

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

probier es mal so.

SetValue(14890, (float)$buf);

Bitte in Zukunft Forenrichtlinien beachten.

Bei Problemen mit PHP etc. poste Codebestandteile und kennzeichne die Zeile in der sich der Fehler befindet!

Warning: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\44895.ips.php on line 15

fällt mir grad auf, warum in Zeile 15, ich hab doch nur 2 geschrieben :confused:

Volltreffer! Das wars!

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.

Christoph

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 :smiley:

<?

//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 :stuck_out_tongue: Die String Variable kommt halt sekündlich von einem WWWReader der mir einen Eingangszustand via Register Variable in dieses Script schickt.

:confused: was machst Du da…

SetValueBoolean("Input0_0" , false); 

entweder

SetValueBoolean(12345, false); 

oder

SetValueBoolean($Input0_0, false); 

zumal man das ganze anderst lösen kann. Die Daten stehen in $IPS_VALUE das kannst Du auch exploden.

Oh Gott, ich habs befürchtet :frowning: 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!

Hallo hofimax,

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");
?>