Elster A1500 Seriell auslesen

Hallo,

ich habe IPS 4 auf eine Raspberry 3, dazu einen USB-Lesekopf von Udo.
Die Hardware Installation paßt und ist getestet.
Auf der Konsole des Raspi kann ich die Daten durch senden des Strings „/?!“ an /dev/ttyUSB0 den Zähler dazu bringen Daten zu senden. Mit cat /dev/ttyUSB0 bekomme ich diese dann auch angezeigt, sieht dann so aus (Auszug):
0.0.0(03227938)
0.9.1(205210)
0.9.2(130429)
0.1.203(1304010000)
0.1.2
02(1303010000)
0.1.2*01(13 02010000)

Jetzt komme ich in IPS nicht weiter.
Ich möchte die folgenden Werte weiterverarbeiten:

[ul]
[li]Gesamtverbrauch (1.8.0)
[/li][li]Gesamteinspeisung (2.8.0)
[/li][li]momentane Leistung (1.25)
[/li][li]momentaner Strom (31.25 / 51.25 / 71.25)
[/li][/ul]

Wie kann ich den String an die Serielle Schnittstelle senden und dann anschließend die empfangenen Daten den Variablen zuordnen?
Benötige ich einen Cutter?
Muss das Ganze in ein PHP-Script?

Kann mir jemand einen Tipp?

Vielen Dank für die Unterstützung.
Heiko

Schau mal hier: SPRT_SendText — IP-Symcon :: Automatisierungssoftware
Und Register Variable ist auch ein gutes Stichwort, um im Forum zu suchen.

paresy

Hallo paresy,

danke für den Tip.
ist wahrscheinlich das was ich benötige um die Daten anzufordern.

Aber wie verbinde ich das Script mit der Seriellen Schnittstelle, eine Instanz kann ich ja nicht auswählen?

NACHTRAG >> OK, hab es gerade heraus gefunden, die ID bei SPRT_send_Text ist die ID der I/O Instanz.

Gruß
Heiko

Hallo,

jetzt hab ich ein Script zum anfordern der Daten angelegt:


<?
SPRT_SendText(50617 /*[Lesekopf Elster]*/, "\x2F\x3F\x21\x0D\x0A");
?>

Dazu eine I/O Instanz wie folgt:
I_O.PNG

Wenn ich das Script ausführe wird die Anforderung an den Zähler gesendet.
Im Debug von der I/O-Instanz kann man das auch sehen, leider kommen
eber keine Daten vom Zähler bei der I/O Instanz an.
Debug.PNG
Wenn ich auf der Konsole ein cat /dev/ttyUSB0 laufen lasse, sehe ich die Antwort aber.
Konsole.PNG

Kann mir jemand hierzu einen Tipp geben, warum die Daten nicht ankommen?

Gruß
Heiko

Bist du dir bei der Baudraute ect. sicher? Das wäre zumindest ein guter Grund warum es nicht geht.

paresy

Hallo,

Problem ist gelöst, nach einem Reboot des Raspi kahmen dann auch Daten an.

Für alle hier meine Lösung:
I/O Instanz und Anforderungs Script siehe oben.
Das Script lasse ich jede Stunde einmal ausführen.

Hab dann noch einen Cutter eingerichtet, der nach einem CR+LF trennt:

Das ganze dann in eine Register Variable die dann das folgende Script aufruft:

<?

//Dateneingang von Registervariable
$string = $_IPS['VALUE'];

$header = strstr ($string , '(' , true );

if ($header == '1.8.0')
{
	$data = trim ( trim ( strstr ($string , '1.8.0(' , false ), ')' ), '1.8.0(' );
		SetValueFloat (58817 /*[Stromzähler\Hauptzähler\Verbrauch Gesamt 1.8.0]*/, $data);
}

if ($header == '2.8.0')
{
	$data = trim ( trim ( strstr ($string , '2.8.0(' , false ), ')' ), '2.8.0(' );
		SetValueFloat (59585 /*[Stromzähler\Hauptzähler\Einspeisung Gesamt 2.8.0]*/, $data);
}

?>

Gruß
Heiko

Hallo,

kann mir bitte mal einer helfen bezüglich des scriptes.
Versuch nun einen Zähler (MT174) mit d0 Ausgabe in IPS zu integrieren.
Leider kommt im Script immer folgende Fehlermeldung.

Parse error: syntax error, unexpected ‚$daten‘ (T_VARIABLE) in C:\IP-Symcon\scripts\28811.ips.php on line 11

das Script ist lediglich in der Variable von mir angepasst, sonst nix.

<? 

//Dateneingang von Registervariable 
$string = $_IPS['VALUE']; 

$header = strstr($string ,'(',true); 
//$daten  = trim(trim ( strstr ($string,'1.8.0(', false),')'),'1.8.0('); 

if ($header=='1.8.0') 
{ 
   $daten  = trim(trim ( strstr ($string,'1.8.0(', false),')'),'1.8.0('); 
   SetValue(27161, $daten); 
} 

if ($header == '2.8.0') 
{ 
    $data = trim ( trim ( strstr ($string , '2.8.0(' ,false  ), ')' ), '2.8.0(' ); 
        SetValueFloat (59585 /*[Stromzähler\Hauptzähler\Einspeisung Gesamt 2.8.0]*/, $data); 
} 

?> 

Wo liegt der Fehler?

Dank Euch

Gruß Remo

Klammerfehler, würde ich mal sagen, ist auch rot.
Gruß Helmut

Hallo Helmut,

Danke für deine schnelle Antwort.
Aber gehört die „rote“ Klammer nicht zum Ausgabetext, bzw. zu den empfangenen Daten, also hat doch gar nix mit php zu tun. Oder bin ich da verkehrt?

Gruß Remo

PS: empfangende Daten : 1.8.0255(0016431.587kWh) - so kommt es in der RegVar an

Hast Recht, bei mir funktioniert Dein Script, Deine $header ausgabe ist aber nicht wie gewünscht, schätze ich.
Mach mal
echo $header;
rein.
Gruß Helmut

der schmeißt mir immer noch ein Fehler raus.
Hab mal den Header angepasst, da es ja in der RegVar anders ankommt, also (1.8.0*255).

Fehler: Parse error: syntax error, unexpected ‚$daten‘ (T_VARIABLE) in C:\IP-Symcon\scripts\28811.ips.php on line 11

Ich habe auf IPS 4.3 umgestellt. Seit dem habe ich Probleme auch mit kopieren von Scripten. Ich muss immer in die Zeilen reingehen, da er mir z.B. ein „if“ oder ein „true“ nicht erkennt.
Aber na gut … andere Geschichte.

echo $header; eingesetzt
Auf Grund des Fehlers führt er mir es allerdings nicht aus.

kurz um: bei dir funktioniert es :confused: ich verstehe es nicht.

mal anders gefragt: das kommt aus der RegVar: 1.8.0255(0016431.587kWh)
Für mich sind die Werte in den Klammern wichtig, die sollen in die Variable geschrieben werden.
Grundsätzlich ist doch das Script so i.O. , oder?

<? 

//Dateneingang*von*Registervariable 
$string = $_IPS['VALUE']; 

$header = strstr($string*,'(',true); 


if ($header=='1.8.0*255') 
{ 
***$daten  = trim(trim ( strstr ($string,'1.8.0*255(', false),')'),'1.8.0*255('); 
   SetValue(45889 /*[Testbereich\Zähler auslesen\1]*/, $daten ); 
   echo $header;
} 

if*($header*==*'2.8.0') 
{ 
****$data*=*trim*(*trim*(*strstr*($string*,*'2.8.0('*,false *),*')'*),*'2.8.0('*); 
********SetValueFloat*(59585*/*[Stromzähler\Hauptzähler\Einspeisung*Gesamt*2.8.0]*/,*$data); 
} 

?> 

Danke
Remo

Das Script ist voller * (Sterne ) statt Leerzeichen.
Vermutlich Copy & Paste Problem durch den Browser?
Michael

Hallo

ich schaue mir das gerade auf dem Handy an , Tatsache voller Sterne.
Im Edge Browser sieht man da nix , das gibt es doch nicht.
Sobald ich vor dem PC sitze , probieren ich da noch einmal mit einem anderen Browser.
Wenn das funktioniert werde ich verrückt.
Ich melde mich.

Gruß Remo

Hallo,

so , ausprobiert und siehe da, tatsächlich ein Problem beim kopieren.
So weit so gut, Danke dafür.

Allerdings habe ich immer noch Probleme mit dem Script. Die Ausgabe in die Variable funktioniert nicht.
Mit „echo $header“ bekomme ich kein Feedback. Bedeutet: der header wird so nicht erkannt bzw. läuft er durch ohne von der RegVar so wahrgenommen zu werden.

Ich stelle noch einmal die Ausgabe und das Script hierein, vielleicht hat jemand noch eine Idee.

Ausgabe der RegVar:
RegVar Text.PNG

Ausgabe als Hex
RegVar Hex.PNG

und das Script

<? 

//Dateneingang von Registervariable 
$string = $_IPS['VALUE']; 

$header = strstr ($string,'(',true); 

if ($header == '1.8.0') 
{ 
    $data = trim ( trim ( strstr ($string , '1.8.0*255(' , false ), ')' ), '1.8.0*255(' ); 
        SetValueFloat (45889 /*[Testbereich\Zähler auslesen\1]*/, $data); 
		echo$header;
} 

if ($header == '2.8.0*255') 
{ 
    $data = trim ( trim ( strstr ($string , '2.8.0*255(' , false ), ')' ), '2.8.0*255(' ); 
        SetValueFloat (52986 /*[Testbereich\Zähler auslesen\2]*/, $data); 
		echo $header;
} 

?>

Ich danke Euch

Gruß Remo

Ich glaube du müsstest deine Überprüfung für den 1.8.0-Fall anpassen. Der empfangene Wert ist 1.8.0255(…) und mit strstr schneidest du die öffnende Klammer und alles dahinter weg. Dann bleibt allerdings 1.8.0255 zurück und nicht, wie in deiner Überprüfung, 1.8.0. Ich kenne das Protokoll jetzt nicht, aber so wie ich deinen Code lese kommt nach der 1.8.0 immer ein 255 also könntest du einfach prüfen ob $header == 1.8.0255. Dann sollte der Fall auch triggern und echo gibt die entsprechende Ausgabe.

Hallo,

Dank euch erst einmal.

das Script habe ich nochmal angepasst bzw. immer wieder die „Trennung“ verändert.Leider ohne Erfolg.

Die Überprüfung sollte so richtig sein, allerdings kommt kein echo bzw. wird die Variable gesetzt.

Da ich nicht der große php Experte bin, nur mal zur Verständigung:
mit

$string = $_IPS['VALUE']; 

und

$header = strstr ($string,'(',true); 

lege ich fest, dass ein string immer eine Zeile in der RegVar ist bzw. ein string ist immer eine Zeile. Ich hoffe man kann das so einfach formulieren :slight_smile:
Ist das so richtig von mir verstanden?

Gruß Remo

nochmals das angepasste Script

<? 
//Dateneingang von Registervariable 
$string = $_IPS['VALUE']; 

$header = strstr ($string,'(',true); 

if ($header == '1.8.0*255') 
{ 
    //$data = trim ( trim ( strstr ($string , '1.8.0*255(' , false ), ')' ), '1.8.0*255(' ); 
	$data = strstr ($string,'(',false);
    SetValue(27161 /*[Testbereich\Zähler auslesen\13]*/, $data); 
	echo$header;
} 

if ($header == '2.8.0*255') 
{ 
    $data = trim ( trim ( strstr ($string , '2.8.0*255(' , false ), ')' ), '2.8.0*255(' ); 
    SetValueFloat (52986 /*[Testbereich\Zähler auslesen\2]*/, $data); 
	echo $header;
} 

?>

Genau, IPS[‚Value‘] sollte die Zeile im Buffer enthalten, mit deinem Aufruf von strstr schneidest du alles ab der öffnenden Klammer (inklusive Klammer) weg. Siehe hier Systemvariablen — IP-Symcon :: Automatisierungssoftware und hier PHP: strstr - Manual

Hast du das echo sonst einfach mal aus den if-Blöcken gezogen? Dann siehst du in jedem Fall was darin steht und kannst mal schauen was eventuell nicht passt. Also einfach echo $header direkt nach $header = strstr(…)

na da war ich ja schon mal auf dem richtigen Weg.

was das mit dem echo angeht, nun ja, was soll ich sagen, es passiert überhaupt nichts.
Keine Ausgabe vorhanden.
Das Script wird bei jedem Datenempfang getriggert, allerdings scheint, das dass mit header nicht funktioniert.

nochmals das Script

<?  

//Dateneingang von Registervariable 
$string = $_IPS['VALUE']; 

$header = strstr ($string , '(' , true ); 
echo $header;
if ($header == '1.8.0*255') 
{ 
    $data = trim ( trim ( strstr ($string , '1.8.0*255(' , false ), ')' ), '1.8.0*255(' ); 
        SetValueFloat (45889 /*[Testbereich\Zähler auslesen\1]*/, $data); 
} 

if ($header == '2.8.0*255') 
{ 
    $data = trim ( trim ( strstr ($string , '2.8.0*255(' , false ), ')' ), '2.8.0*255(' ); 
        SetValueFloat (52986 /*[Testbereich\Zähler auslesen\2]*/, $data); 
} 

?>

ich weiß nicht weiter :confused::mad::frowning:

Grüße Remo

ps: hab mal noch dem dump der RegVar angehängt, vielleicht hilft es.
ich hatte es zwischen zeitlich mal mit den HEX Werten probiert, aber auch hier ohne Erfolg

dump.txt (76.6 KB)

Das echo von einer RegisterVariable landet im Message Log. Hast du da geschaut? Hast du das Modul korrekt eingerichtet? Siehe hier für Doku: RegisterVariable — IP-Symcon :: Automatisierungssoftware
Wird das Skript ausgeführt? Wird also die Zeit der letzten Ausführung regelmäßig hochgesetzt?