Bin neu hier, wer kann mir helfen.

Hallo mkass,

warum so kompliziert?

Die Arrays und die explode()-Funktion sind ganz und gar überflüssig! Zwei Zeilen reichen völlig:

// Voraussetzung: $IPS_VALUE liefert z.B. "V0106027"
// die gewünschte Information steht ab Position 3 zur Verfügung
// die Länge der Nutzinformation beträgt 4
$temp1wert = (float) hexdec(substr ($IPS_VALUE, 3, 4))/100; // liefert einen Float-Zahlenwert
$temp1text = sprintf("%5f °C", $temp1wert);                 // liefert einen String mit 1 Nachkommastelle plus "°C"

// Export Variable nach IPSYMCON
SetValue(42740, $temp1wert);						 	   // abspeichern des Zahlenwertes
SetValue(12345, $temp1text);                                // abspeichern des formatierten Textes: "15.4 °C"

Gruß
HJH

Hallo zusammen,

ich habe auch ein Hygrosens-System im Einsatz bzw. will es über IPS in Betrieb nehmen.
Die bisherigen Script-Vorschläge sind Klasse und funktioniern auch, bis auf eine entscheidende Kleinigkeit:
Die Werte stehen immer auf „NULL“ bis auf ein kurzes Aufblinken alle paar Sekunden.
Ich triggere das Script mit einem zyklischen Ereignis. Mache ich hier was falsch? Wie komme ich zu einer Daueranzeige der Werte?

Gruß
khge

Hallo khge,

Ich triggere das Script mit einem zyklischen Ereignis. Mache ich hier was falsch? Wie komme ich zu einer Daueranzeige der Werte?

Du brauchst nichts zutriggern. Mit $IPS_VALUE werden die Daten eingelesen und stehen somit zur Verfügung.

Hallo RWN,

danke, habe ich gerade auch bemerkt. Allerdings stimmt mit meinem PC auch etwas nicht. Hatte Werte in der Anzeige die 3 Stunden alt waren, nach einem Neustart sieht es jetzt etwas besser aus.

Bei dem letzten vorgeschlagenen Script, das ich gerade verwende, werden mir die Daten nacheinander angezeigt, wie kann ich diese trennen und einzelnen Variablen zuweisen?

Gruß
khge

Hallo khge,

die Daten in einem Array aufsammeln. Sowie in dem anderen Script.
Man kann das ganze auch noch umbauen.
Da ja bis zu 20 Tempwerte ausgewertet werden, je nach Ausbau.

Hallo RWN,

das passt doch hiermit nicht zusammen?

warum so kompliziert?

Die Arrays und die explode()-Funktion sind ganz und gar überflüssig! Zwei Zeilen reichen völlig:
PHP-Code:
// Voraussetzung: $IPS_VALUE liefert z.B. „V0106027“
// die gewünschte Information steht ab Position 3 zur Verfügung
// die Länge der Nutzinformation beträgt 4
$temp1wert = (float) hexdec(substr ($IPS_VALUE, 3, 4))/100; // liefert einen Float-Zahlenwert
$temp1text = sprintf("%5f °C", $temp1wert); // liefert einen String mit 1 Nachkommastelle plus „°C“

// Export Variable nach IPSYMCON
SetValue(„42740“, $temp1wert); // abspeichern des Zahlenwertes
SetValue(„12345“, $temp1text); // abspeichern des formatierten Textes: „15.4 °C“
:

So langsam kenne ich mich nicht mehr aus.

Ich kann mit deinem vorgeschlagenen Script die Daten einsammeln. Ich bekomme sie jedoch nur kurze Zeit zur Ansicht (z.B. im Objektbaum), dann sind die Werte jedoch wieder auf Null, d.h. sie werden zyklisch dargestellt. Wie kann ich die Werte dauerhaft darstellen?

Gruß
khge

Hallo khge,

genau das wird wahrscheinlich der Fehler sein. Du darfst den Wert nicht zyklisch, also in einem festen Zeitraster, auslesen, sondern erst dann (und nur dann), wenn er zur Verfügung steht.

In Deinem Fall musst Du auf OnChange (auf Variablenänderung) triggern.

Gruß
HJH

Hallo HDJ,

danke für deine Mühe, ich bekomme das Ding jedoch nicht zum laufen.

Egal was ich mache, die Daten sind kurz zu sehen und stehen dann längere Zeit wieder auf NULL. Ich kenne mich einfachzu wenig aus in der Programmierung.

Habe jetzt meinen alten PC-Datenlogger(Hygrosens) wieder in Betrieb genommen um mal wenigstens nach Wochen des Experimentierens und Lesens meine Pufferspeicher- und Solardaten wieder mal sehen zu können.

Gruß
khge

Hallo khge,

warum nimmst Du nicht einfach das Script von der ersten Seite.
Die Zeile ergänzen wie beschrieben, dann läuft es auch.

Hallo RWN,

so sieht mein Script derzeit aus:

<?
/*


IP-SYMCON Event Scripting


//File : Temp_Sensor_HY.ips.php
//Trigger : OnChange Temp_Sensoren_HY
//Interval :
*/

$buffer_temperatur1 = array();
$buffer_temperatur2 = array();
$buffer_temperatur3 = array();
$buffer_temperatur4 = array();

$separator_temperatur1 = „V01“;
$separator_temperatur2 = „V02“;
$separator_temperatur3 = „V03“;
$separator_temperatur4 = „V04“;

$rs232bus = $IPS_VALUE;
$buffer_temperatur1 = explode ($separator_temperatur1, $rs232bus, 2);
$buffer_temperatur2 = explode ($separator_temperatur2, $rs232bus, 2);
$buffer_temperatur3 = explode ($separator_temperatur3, $rs232bus, 2);
$buffer_temperatur4 = explode ($separator_temperatur4, $rs232bus, 2);

$ttemperatur1 = $buffer_temperatur1[1];
$ttemperatur2 = $buffer_temperatur2[1];
$ttemperatur3 = $buffer_temperatur3[1];
$ttemperatur4 = $buffer_temperatur4[1];

$temperatur1 = (float) hexdec(substr ($ttemperatur1, 0,4))/100;
$temperatur2 = (float) hexdec(substr ($ttemperatur2, 0,4))/100;
$temperatur3 = (float) hexdec(substr ($ttemperatur3, 0,3))/100;
$temperatur4 = (float) hexdec(substr ($ttemperatur4, 0,3))/100;

// Export Variable nach IPSYMCON
SetValueFloat („54161“, $temperatur1);
SetValueFloat („47171“, $temperatur2);
SetValueFloat („25587“, $temperatur3);
SetValueFloat („44120“, $temperatur4);

?>

Entspricht m.E. dem der ersten Seite. Zur Info, ich nutze die V2 von IPS. Einige Antwoten sehen mir nach V1 aus.

Wenn ich die drei Seiten dieses Beitrages durchlese sehe ich auch einige Widersprüche wie z.B.

  • Array wird benötigt bzw. doch nicht benötigt
  • Triggerung erfolgt automatisch oder es muss doch getriggert werden

Ich komme hier einfach nicht klar mit den unterschiedlichen Infos. Außerdem habe ich einfach zu wenig Programmierkenntnisse.

Gruß
khge

Hallo,

das passt doch. Du darfts nur nicht triggern. Kein Ereignis!
Dann bleiben auch deine Werte stehen. Die Werte kommen über $IPS_VALUE.

Was HJH gepostet hat, ist so wie es da steht nur für einen Wert.

Hallo RWN,

ich triggere nicht(mehr), ich habe es mit unterschiedlichen Ereignissen versucht und alle wieder gelöscht, den PC mehrmals neu gebootet. Ich denke, ich muss IPS mal neu installieren und es dann nocmals versuchen.

Gruß
khge

Hallo khge,

ich beziehe mich im Folgenden auf das von mir vorgestellte Skript im Beitrag #21.

Die wenigen Zeilen beinhalten alles, was Du benötigst, um die Triggervariable auszulesen, den Wert an der richtigen Stelle zu extrahieren, ihn zu formatieren und als Text abzuspeichern. Die Kommentare im Code sollten Dir helfen die jeweilige Zeile zu verstehen.

Um die Werte abspeichern zu können, musst Du natürlich zuvor auch die im Skript verwendeten Variablen (1x Float und 1x String) angelegt haben. Die bei mir willkürlich gesetzten IDs musst Du dann durch die richtigen ersetzen.

Hier weitere Voraussetzungen, die erfüllt sein müssen:

  • der vom ComPort angelieferte String enthält einen Abschnitt von dieser Form: „V0106027D“, wobei „V01“ den Wert des Sensors mit der Nummer 1 kennzeichnet;
  • der Cutter ist eingestellt auf „Use fixed cutting“, „Input length“ = 9, „Sync chars“ = „V01“, „Parent Instance“ ist der ComPort;
  • eine Registervariable, deren „Parent Instance“ der Cutter ist und die mit Deinem Skript verbunden ist; durch diese Verbindung wird die Registervariable zur Triggervariable;

Wenn die Variable zwischendurch immer wieder auf Null gesetzt wird, deutet das darauf hin, dass Du entweder noch ein weiteres Ereignis definiert hast (z.B. einen Timer), oder dass der Cutter nicht korrekt eingerichtet ist und daher zwischendurch einen falschen String liefert.

Wenn das erst einmal läuft, kannst Du das Skript immer noch erweitern um mehrere Sensoren auszulesen.

Gruß
HJH

Hallo Hans-Jörg,

ich hab mal einen alten Shot von mir von 2/07 ausgegraben. Da siehst Du was ankommend drinnen steht.

temp_data_hygro.jpg

Hallo Rainer,

sehr schön, dann stimmt das ja, was ich geschrieben habe.

Damit kann khge den Sensor #01 auslesen. Wenn das funktioniert, ist es kein Problem die restlichen beiden auch noch zu erfassen.

Ich bezweifle nicht, dass Dein Skript ebenfalls läuft. Aber es ist gerade für einen Anfänger zu kompliziert und (leider) auch ziemlich umständlich. :frowning:

Gruß
HJH

Hallo zusammen,

habe gerade 2 Sensoren am laufen mit DAUERANZEIGE. Ich habe den Cutter umgestellt wie zuletzt von HJH beschrieben und verwende auch diese Script.

Somit habe ich jetzt:

  • einen Comport eingerichtet
  • zwei Cutter eingerichtet und mit dem Comport verbunden
  • zwei Registervariable eingerichtet und mit dem jeweiligen Cutter verbunden und das jeweilige Script zugeordnet.

Das heiß nach meinem (bescheidenen) Verständnis ich muss je Sensor:

  • einen Cutter einrichten
  • eine Registervariable einrichten und
  • ein Script einrichten?

Ist das so richtig oder kann man hier was vereinfachen?

Gruß
khge

Und vor allem Danke.

Hallo khge,

DAUERANZEIGE

Heißt das, es funktioniert?

Dann könnten wir im nächsten Schritt die anderen Sensoren in Betrieb nehmen (mit einem Cutter und einer Registervariablen).

Gruß
HJH

Hallo HJH,

ja es läuft, respektive die Anzeige bleibt stehen und verschwindet nicht immer wieder zu 0. :slight_smile:

Gruß
khge

Hallo khge,

mit diesem Skript kannst Du beliebig viele Sensoren auslesen und deren Werte abspeichern:

// hier werden die Konstanten für die IDs der Variablen definiert
// hier muss für jeden Sensor die ID der zugehörigen Float-Variablen hinterlegt werden
define("ID_S01", "123456");									// ID der Variablen für Sensor 1
define("ID_S02", "234567");									// ID der Variablen für Sensor 2
define("ID_S03", "345678");									// ID der Variablen für Sensor 3

// die Sensornummer steht ab Position 1 mit der Länge 2 zur Verfügung
$snw      = substr($IPS_VALUE, 1, 2);						  // liefert die Sensornummer z.B. "02" für Sensor 2
$snc      = constant("ID_S". $snw);                            // Sensornummer in den Namen der Konstanten für die ID einbauen, z.B. "ID_S02"

// der Wert steht ab Position 3 mit der Länge 4 zur Verfügung
$tempwert = (float) hexdec(substr ($IPS_VALUE, 3, 4))/100;	 // die 4 HEX-Stellen werden extrahier und dezimal gewandelt und danach durch 100 geteilt und als Float-Zahlenwert zugewiesen

// Export Variable nach IPSYMCON
SetValue($snc, $tempwert);							         // abspeichern des Zahlenwertes in die zugehörige Variable

Voraussetzung für dieses Skript: Die SyncChars des Cutters müssen geändert werden von „V01“ in „V“, denn jetzt sollen alle Werte übermittelt werden, nicht nur die des Sensors „01“. Die extrahierte Sensornummer bestimmt, in welche Variable der Wert abgespeichert wird.

Das Skript sollte funktionieren. Allerdings konnte ich es nicht testen.

Gruß
HJH

Hallo HJH,

habe es mit 15 Sensoren am laufen, die Temperaturwerte sind auch soweit plausibel.
Allerdings erhalte ich Fehlermeldungen im Script wenn ich auf „Ausführen“ klicke:

Warning: constant() [function.constant]: Couldn’t find constant ID_S in C:\IP-Symcon\scripts\59124.ips.php on line 27

Warning: ‚‘ is not a valid integer value in C:\IP-Symcon\scripts\59124.ips.php on line 35

Weiterhin musste ich im Script den Typ der Variablen mit angeben (z.B. SetValueFloat anstatt SetValue).

Hier das derzeit verwendete Script

<?

// hier werden die Konstanten für die IDs der Variablen definiert
// hier muss für jeden Sensor die ID der zugehörigen Float-Variablen hinterlegt werden

define("ID_S01", "54161");               // ID der Variablen für Sensor  1
define("ID_S02", "47171");               // ID der Variablen für Sensor  2
define("ID_S03", "25587");               // ID der Variablen für Sensor  3
define("ID_S04", "26164");               // ID der Variablen für Sensor  4
define("ID_S05", "44589");               // ID der Variablen für Sensor  5
define("ID_S06", "55093");               // ID der Variablen für Sensor  6
define("ID_S07", "57819");               // ID der Variablen für Sensor  7
define("ID_S08", "12938");               // ID der Variablen für Sensor  8
define("ID_S09", "14458");               // ID der Variablen für Sensor  9
define("ID_S0A", "55003");               // ID der Variablen für Sensor 10
define("ID_S0B", "51388");               // ID der Variablen für Sensor 11
define("ID_S0C", "58336");               // ID der Variablen für Sensor 12
define("ID_S0D", "30066");               // ID der Variablen für Sensor 13
define("ID_S0E", "34820");               // ID der Variablen für Sensor 14
define("ID_S0F", "29550");               // ID der Variablen für Sensor 15
//define("ID_S0F", "00000");               // ID der Variablen für Sensor 16

// die Sensornummer steht ab Position 1 mit der Länge 2 zur Verfügung
$snw = substr($IPS_VALUE, 1, 2);                          // liefert die Sensornummer z.B. "02" für Sensor 2
setvalueString("10404", $snw);

$snc      = constant("ID_S". $snw);       // Sensornummer in den Namen der Konstanten für die ID einbauen, z.B. "ID_S02"
setvalueString("25713", $snc);

// der Wert steht ab Position 3 mit der Länge 4 zur Verfügung
$tempwert = (float) hexdec(substr ($IPS_VALUE, 3, 4))/100;     // die 4 HEX-Stellen werden extrahier und dezimal gewandelt und danach durch 100 geteilt und als Float-Zahlenwert zugewiesen
SetValueFloat ("53366",$tempwert);

// Export Variable nach IPSYMCON
SetValueFloat($snc, $tempwert);          // abspeichern des Zahlenwertes in die zugehörige Variable


?>

Kannst du mir hierzu die Ursache nennen?

Gruß
khge