Elster A1500 Seriell auslesen

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?

Hallo Dr.Niels

jetzt überforderst du mich :confused:

also unter Meldungen sieht das so aus, da hatte ich noch garn nicht rein geschaut-- man lernt nie aus.

da bringt er einen Fehler genau bei den Daten die ich haben will, aber warum?
Er soll mir die Daten doch 1-1 in die Variable schreiben, wieso Cannot auto-convert?

Gruß Remo

ps: das Script wird bei jedem Datenempfang ausgeführt.

Ich werde verrückt

hab mal ne String Variable genommen und siehe da, der Wert steht drin. :):):slight_smile:

Ich bin happy.

Ich denke jetzt komm ich weiter, das Problem wird sein, das der Wert z.B. (93.503*kwh) ist.
Damit kann eine Float nichts anfangen bzw. kann sie es nicht wiedergeben. Richtig?

Jetzt muss ich noch (*kwh) weg bekommen, dann passt alles.

Aber wieso funktioniert das nicht mit dem echo?

Grüße Remo

Hätte ich schreiben sollen, dass ich $string = $_IPS[‚VALUE‘]; geremmt habe um die Schleife zu testen ;-(
Dann sieht man auch beim Aufruf des Scriptes die Echo- Anweisung.
Sorry
Nutzt Du den Cutter? Wenn ja nimm doch das Sternchen als rechten Trenner * und für den linken Trenner *255(

Edit: sehe gerade, Du hast 2 Geräte, dann muß der rechte Trenner das Sternchen sein und der linke Trenner bleibt leer
Dann die Auswahl im Script anpassen.

Und String in Float geht so:

$float_value_of_string = floatval($header);

in $float_value_of_string steht der String, in $Header der Float - Wert
Mußt naturlemang auch eine Floatvariable haben in der Du das Ergebniss reinschreibst.
Gruß Helmut

Perfekt,

dank euch für die Unterstützung.

@Helmut: alles gut, liegt an mir, das Verständnis wächst bei mir,ist aber noch im Babystadium :slight_smile:

Ich werde das spätestens morgen mal erweitern bzw. für mich fertig machen.
Dann stell ich es hier rein, der Zähler ist ja nicht so selten. Da wird es schon einen geben der die selben Probleme hat :).

Vielleicht bin ja aber auch der Einzige :smiley:

bis dann und einen schönen Abend

Grüße Remo

Ich bin auch nicht der PHP-Kenner. Du packst Das :wink: Try and Fehler
Gruß Helmut

Das klingt doch so, als würde es gut voran gehen. Sehr schön :slight_smile:

Das echo funktioniert genau so wie gedacht. Innerhalb von IP-Symcon gibt echo die Ausgabe immer an den Aufrufenden weiter. Wenn du beispielsweise einfach auf Ausführen klickst, dann bist du das und die Nachricht kommt per Pop-Up. Aber bei einem Aufruf via RegisterVariable kommt der Aufruf von innerhalb. Daher wird die Ausgabe im Nachrichtenlog gespeichert. Stell dir mal vor, du wärst weg und in der Zwischenzeit werden jede Menge Nachrichten über RegisterVariable ausgewertet. Dann möchtest du nicht nach Hause kommen und 100 Pop-Ups wegklicken, sondern das ganze bestimmt viel lieber geordnet im Log lesen.

Hallo

Ich habe in diesem Thema Forum noch etwas gefunden, um den Zähler auszulesen.
Obis Elster AS1440 Programm zum Auslesen
Er hat ein Script das die Auslesezeit viel schneller macht.
Einloggen
Kann man sowas in IPS umsetzen oder auf dem Raspi laufen lassen und sich die Daten abgreifen?
(„Ja kann man“ Antwort hilft mir leider nicht, da ich so etwas nicht kann.
Daher wäre eine weiterführende Hilfe sehr willkommen.

Bernd

Hallo
Der Weg

Das Script 1440.c ist ein C-Programm, das zuerst kompiliert werden muss.
Am Raspi einloggen und „gcc“ eingeben.
Wenn folgendes kommt ist das schonmal gut:
gcc: fatal error: no input files
compilation terminated.

Bei folgendem sieht es dann eher schlecht aus:
-bash: gcc: command not found

Ich gehe mal davon aus, das das erstere kam, dann das 1440.c kompilieren.
Dies habe ich direkt ins /var/lib/symcon Verzeichniss gelegt, damit es auch mit gesichert wird.

Das geht mit
gcc as1440.c -o as1440
Danach sollte nach Aufruf von as1440 im selben Verzeichnis mit
./as1440
folgendes rauspurzeln:
usage: ./as1440 -F device -O obisval1[:obisval2…] [-p password ]
[-v]
[-n] [-e]
-v verbose
-t left trim zeros
-n don’t add units
-e endless loop (end with ctrl-c)

Wenn einn Lesekopf am Raspi ist, folgendes probieren:
./as1440 -F /dev/ttyUSB0 -O 1.7.0:1.8.0 -v

In IPS als Script einbauen


<?php

$data = shell_exec('/var/lib/symcon/as1440 -F /dev/ttyUSB0 -O 2.8.0:1.8.0:2.7.0:1.7.0 -v -n -t'); 
//echo $data;

//print_r ($data);
$werte = preg_split("/[\s,]+/", $data);
//print_r($werte);
$temp = ($werte[1]);
$Out180 = trim ($temp, 'notfound');
        SetValue (57421 /*[Energie\Hausanschluß Haus 16\Strom\As1440\Bezug Zählerstand 1.8.0]*/, $Out180); 
$temp = ($werte[3]);
$In280 = trim ($temp, 'notfound');
        SetValue (25607 /*[Energie\Hausanschluß Haus 16\Strom\As1440\Einspeisung Zählerstand 2.8.0]*/, $In280); 
$temp = ($werte[5]);
$Out170 = trim ($temp, 'notfound');
        SetValue (14160 /*[Energie\Hausanschluß Haus 16\Strom\As1440\Wirkleistung (Out) 1.7.0]*/, $Out170); 
$temp = ($werte[7]);
$In270 = trim ($temp, 'notfound');
        SetValue (18970 /*[Energie\Hausanschluß Haus 16\Strom\As1440\Wirkleistung (In) 2.7.0]*/, $In270); 
?>

Nicht schön, aber läuft.
Bernd

Hi Hbartel,

Ich hab Deinen Thread zur Verbindung eines A1500 von Elster mit einem Hichi Lesekopf gelesen und habe ein passendes Skript in mein Tasmota eingelesen.
Hast Du denn am A1500 noch irgendwas machen müssen, um den dazu zu bewegen, Daten rauszurücken?
Ich hab bei dem Netzbetreiber nachgefragt, der sagte, es gäbe keinen Pin, weil es ein Wandlerzähler sei. Gibt es denn im Menü noch irgend einen Punkt, an dem man die optische Schnittstelle aktivieren kann?
Bei mir kommen keine Daten
Gruß Rainer