Client Socket auslesen und Werte für Graphen speichern?

Hallo,
befasse mich derzeit mit IPS auf der Banane und möchte einige Werte von einer funktionierenden Client Socket Verbindung in IPS speichern und später dann mit Graphen anzeigen. Da ich keinen Plan von IPS scripten habe bräuchte ich Eure Unterstützung.

  • IPS auf der Banane ist installiert und läuft
  • Client Socket Verbindung ist eingerichtet und liefert über Debug folgende Ausgabe:

08.02.2015 13:28:55.00 |             RECEIVED | MODBUS.serial.pv_energy.pv_power1=1210

08.02.2015 13:28:56.00 |             RECEIVED | MODBUS.serial.pv_energy.pv_power2=1480

08.02.2015 13:28:56.00 |             RECEIVED | MODBUS.serial.pv_energy.pv_power3=630

08.02.2015 13:28:56.00 |             RECEIVED | MODBUS.serial.pv_energy.pv_power_tot=2680

08.02.2015 13:29:00.00 |             RECEIVED | MODBUS.serial.Elsner_P03.sun.s=48

08.02.2015 13:29:01.00 |             RECEIVED | MODBUS.serial.Elsner_P03.temp=2

Wie bekomme ich jetzt diese Werte in eingelesen IPS und gespeichert? Es sind übrigens noch viel mehr Werte die aber immer gleich aufgebaut sind. Ich muss ja wohl jede einzeln in eine Float Variable speichern.

PS: die Client Socket Verbindung ist übrigens zu einem DOMIQ Base das LCN, Modbus und DMX koppelt.

Vielen Dank im voraus

Klaus

Hallo Klaus,

jetzt auch hier :

Der Weg ist im IPS:

  1. I/O Instanzen : „Client Socket“ anlegen, IP vom Base mit Port 4224
  2. Splitter Instanzen : „Cutter“ anlegen, und an Client Socket (Punkt1) binden
    –Dann sollten dort im Debug Fenster schon alle Channels eintrudeln.
  3. Unter dem Domiq „Cutter“ eine „Register Variable“ anlegen.
  4. Unter dem Domiq „Cutter“ ein Skript anlegen.
  5. In der „Register Variable“ - Konfiguration das „Skript“ auswählen.
  6. „Skript“ mit Inhalt füllen (ACHTUNG die IPS VAR’s müssen angelegt werden, und im Skript angepasst verden!)
    <?php
    if ($_IPS['SENDER'] == "RegisterVariable")
    {
        $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
        $data .= $_IPS['VALUE'];
    	$lcn_array=explode('=', $data);
    //	print_r ($lcn_array);
       SetValueString(41443 /*[Cutter Domiq\VAR Wert]*/   , $lcn_array[1]);
    	$typ=($lcn_array[0]);
    	if( $typ==="LCN.value.0.201.t" ) {
               $wert=intval($lcn_array[1]);
    	   SetValueInteger(24175 /*[Dummy Module DOMIQ\LCN.value.0.201.t]*/   , $wert);
    	}
    	if( $typ==="LCN.variable.0.202.2" ) {
    	   $wert=floatval($lcn_array[1]);
    	   $wert=(($wert-1000)/10);
    	   SetValueFloat(28362 /*[Dummy Module DOMIQ\LCN.variable.0.202.2]*/   , $wert);
    	}
    	SetValueString(54867 /*[Cutter Domiq\VarName]*/   , $typ);
    }
    ?>
  1. freuen, da man jetzt auch eine Messwertaufzeichnung im Webfront von IPS hat…

Du musst die IPS VAR’s von Hand anlegen.
z.B. „MODBUS.serial.pv_energy.pv_power1“, als float
Im skript dann :

	if( $typ==="LCN.variable.0.202.2" ) {
	   $wert=floatval($lcn_array[1]);
	   $wert=(($wert-1000)/10);
	   SetValueFloat(28362 /*[Dummy Module DOMIQ\LCN.variable.0.202.2]*/   , $wert);
	}

ändern in:
if( $typ===„MODBUS.serial.pv_energy.pv_power1“ ) {
$wert=floatval($lcn_array[1]);
SetValueFloat( [DEINE IPS VAR /[MODBUS.serial.pv_energy.pv_power1]/ , $wert);
}

so habe ich es bei UweR probiert, und es geht.
$wert=(($wert-1000)/10); war die Umrechnung LCN Wert in Temperatur, da kannst du auch was anderes einbauen.

Da ich kein DOMIQ mehr habe, muss ich das leider Online machen, wenn mir ein DOMIQ zur Verfügung steht.

lg Thomas

Hi Thomas,
Die /xyz… / sind nur Kommentare und nicht relevant oder?

Danke
Klaus

Das sind nur Kommentare, die erstellt IPS automatisch, abhängig von den fünfstelligen IDs.

Hi Klaus,

Ralf hat ja schon…:slight_smile:

Berichte mal, ob es klappt.

Hallo zusammen,

so ganz klappt’s noch nicht…
hier mal das angepasste script:

  <?php
    if ($_IPS['SENDER'] == "RegisterVariable")
    {
        $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
        $data .= $_IPS['VALUE'];
        
        $DOMIQ_array=explode( '=' , $data );
        
     // print_r ($DOMIQ);
        SetValueString( 23975 /*[Cutter DOMIQ\VAR Wert]*/   , $DOMIQ_array[1] );
        $typ=( $DOMIQ_array[0] );
        SetValueString( 49730 /*[Cutter DOMIQ\VAR Name]*/ , $typ );


			if( $typ==="MODBUS.serial.pv_energy.pv_power1" )
   		 {
			$wert=floatval( $DOMIQ_array[1] );
			SetValueFloat( 21958 /*[Cutter DOMIQ\DOMIQ script\MODBUS.serial.pv_energy.pv_power1]*/ , $wert );
			}

    }
    ?>

Die ‚VAR Wert‘ wird mit den richtigen Werten nach dem ‚=‘ gefüllt. Aber alle ‚VAR Name‘ ($typ) Inhalte haben vor dem eigentlichen Text immer noch 1.668089292921 und Zeilenumbruch vorne anstehen. Das sieht so aus:

1.668089292921
MODBUS.serial.pv_energy.pv_power1

Im Debug von Client socket oder Cutter ist nichts von 1.668089292921 zu sehen

Das letzte if Stück funktioniert daher auch nicht…

Was ist das? Wie bekomme ich den Müll weg?

danke Klaus

Hm Klaus,

ohne BASE hier, wird es bei mier nicht gehen.

lg Thomas - mail kommt

Hallo,
heute habe ich mal wieder mal wieder etwas Zeit gefunden. Und siehe da… dieser 1.668089292921 Müll ist auf einmal weg ohne das ich das Script nochmals verändert hatte.
Einzig hatte ich diese Woche ein Spannungsreset am Banana Pi und dem DOMIQ Base durchgeführt :smiley:

O.K. jetzt kanns weitergehen…

Hallo,

ich habe ein ähnliches Problem. Meine neue Wetterstation liefert via RS485 Adapter (ID 44523) an den Raspi. Es kommen auch Daten an (siehe Debug)

"TXT: 26.01.2019, 12:04:36 | RECEIVED | W+19.4000000J00000.5N???
HEX: 26.01.2019, 12:04:36 | RECEIVED | 57 2B 31 39 2E 34 30 30 30 30 30 30 4A 30 30 30 30 30 2E 35 4E 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F
TXT: 26.01.2019, 12:04:36 | RECEIVED | ???1995<ETX>
HEX: 26.01.2019, 12:04:36 | RECEIVED | 3F 3F 3F 31 39 39 35 03
TXT: 26.01.2019, 12:04:38 | RECEIVED | W+19.4000000J00000.4N???
HEX: 26.01.2019, 12:04:38 | RECEIVED | 57 2B 31 39 2E 34 30 30 30 30 30 30 4A 30 30 30 30 30 2E 34 4E 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F
TXT: 26.01.2019, 12:04:38 | RECEIVED | ???1994<ETX>
HEX: 26.01.2019, 12:04:38 | RECEIVED | 3F 3F 3F 31 39 39 34 03 "

Wie bekomme ich die nun in eine Variable und entsprechend geschnitten (relevant wäre der Inhalt jeweils hinter TXT:)

Ich habe schon mal versucht eine Variable (ID 38013) vom Typ String zu erstellen und darunter ein Skript (17781), aber woher weiß die Variable, von welcher ID es sich die Daten holen soll?

Mit den Beispielen komme ich leider aktuell nicht weiter

Hat keiner eine Idee? Denke, wenn die Basis erst mal gelegt ist, dann sollte es danach einfacher gehen.

IP Symcon 5.0 Raspberry

Hast du dir die Doku zu RegisterVariable angesehen?

paresy

Ja, habe ich. Problematik ist jedoch die, ich habe eine IO Instanz mit der ID s.o., dann noch eine String Variable angelegt, nur wie ich nun die IO Instanz (im Debug werden sie ja angezeigt) in die String Variable respektive gecuttet bekomme, da komme ich nicht dahinter.
$_IPS habe ich gelesen, doch wie bekommt er die ID der IO Instanz mit?

IP Symcon 5.0 Raspberry

Die ID brauchst Du nicht, denn wie es auch in der Doku steht, wird der Registervariablen-Instance als Parent(Gateway) die IO-Instance zugewiesen. Damit bekommt sie die Daten vom IO direkt angeliefert. Das Script zum Parsen wird dann der Registervariablen-Instance Ziel zugewiesen und mit $data=$_IPS[‚VALUE‘] hast Du die Daten

also folgendes habe ich durchgeführt

  1. die IO Instanz angelegt. Im Debug kommen auch die Daten an.
  2. Cutter-Instanz angelegt und mit der IO Instanz verbunden, Im Debug kommen auch die Daten an.
  3. wie bekomme ich ich nun die RegisterVariable dem Parent Gateway zugewiesen?

kann hier keine einen Tipp geben?

In der Webkonsole die Konfigurationsseite der Register-Variable aufrufen. Oben im Menu der Instanz-Konfiguration in der rechten Hälfte „Gateway ändern“ anklicken, Parent-Instance auswählen.oder neu erzeugen und bestätigen

Tommi

Hallo Tommy,

Das hat sehr geholfen. Ich hatte ein grundlegendes Problem, dass ich eine normale Variable angelegt habe und hier ständig rum versucht.
Mit einer neuen Instanz und dann Register Variable kommen jetzt hier die Daten rein und ich kann mich weiter versuchen.

Danke!!!

IP Symcon 5.0 Raspberry

so, ich bin fast am Ziel und ich kann fast allen Variablen die richtigen Werte zuweisen, außer beim Regen misslingt es mir (von $data die 21. Stelle):

<?
$data=$_IPS[‚VALUE‘];
SetValueString(14489,$data);
SetValueFloat(59670,FloatVal(substr($data, 2, 5)));
SetValueInteger(10971, IntVal(substr($data, 7,2)));
SetValueInteger(23670, IntVal(substr($data, 9,2)));
SetValueInteger(35174, IntVal(substr($data, 11,2)));
SetValueBoolean(24382, substr($data,13,1));
SetValueInteger(15216, IntVal(substr($data,14,3)));
SetValueFloat(33242,FloatVal(substr($data, 17, 4)));
if(substr($data, 21,4) = „J“) {
SetValueBoolean(45066, „TRUE“);
} else {
SetValueBoolean(45066, „FALSE“);
}
?>

Geliefert wird entweder ein J oder N. Wie kann ich das an die Variable 45066 vom Typ Boolean übergeben?

Viele Grüße

Patrick

Der Vergleich (if) muss mit == erfolgen.
Und True oder false dürfen nicht in den Anführungszeichen stehen.
Michael

top danke, hat funktioniert.