FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: Joe_D am 05 Januar 2020, 02:12:58

Titel: Obis Elster AS1440 Programm zum Auslesen
Beitrag von: Joe_D am 05 Januar 2020, 02:12:58
Hallo Zusammen,

anbei mein Programm mit dem ich die Obis-Daten meines Elster AS1440 Zähler per IR-Lesekopf auslese. Der AS1440 ist beim Timing etwas zickig, eventuell sind das ja andere Zähler auch. Versuche mit Perl- und Bash-Skripten aber auch mit anderen C-Progrämmchen führten irgendwie nicht so ganz zum gewünschten Erfolg. Ständig nudelte der Zähler seine Schwachsinns-Daten mit 300 Baud heraus. Zum Beispiel solch' einen Müll:
1-1:1.8.2(0000000.0*kWh)
1-1:1.8.2*05(0000000.0*kWh)
1-1:1.8.2*04(0000000.0*kWh)
1-1:1.8.2*03(0000000.0*kWh)
1-1:1.8.2*02(0000000.0*kWh)
1-1:1.8.2*01(0000000.0*kWh)
1-1:1.8.2*12(0000000.0*kWh)
1-1:1.8.2*11(0000000.0*kWh)
1-1:1.8.2*10(0000000.0*kWh)
1-1:1.8.2*09(0000000.0*kWh)
1-1:1.8.2*08(0000000.0*kWh)
1-1:1.8.2*07(0000000.0*kWh)
1-1:1.8.2*06(0000000.0*kWh)
1-1:1.8.3(0000000.0*kWh)
1-1:1.8.3*05(0000000.0*kWh)
1-1:1.8.3*04(0000000.0*kWh)
1-1:1.8.3*03(0000000.0*kWh)
1-1:1.8.3*02(0000000.0*kWh)
1-1:1.8.3*01(0000000.0*kWh)
1-1:1.8.3*12(0000000.0*kWh)
1-1:1.8.3*11(0000000.0*kWh)
1-1:1.8.3*10(0000000.0*kWh)
1-1:1.8.3*09(0000000.0*kWh)
1-1:1.8.3*08(0000000.0*kWh)
1-1:1.8.3*07(0000000.0*kWh)
1-1:1.8.3*06(0000000.0*kWh)
1-1:1.8.4(0000000.0*kWh)
1-1:1.8.4*05(0000000.0*kWh)
1-1:1.8.4*04(0000000.0*kWh)
1-1:1.8.4*03(0000000.0*kWh)
1-1:1.8.4*02(0000000.0*kWh)
1-1:1.8.4*01(0000000.0*kWh)
1-1:1.8.4*12(0000000.0*kWh)
1-1:1.8.4*11(0000000.0*kWh)
1-1:1.8.4*10(0000000.0*kWh)
1-1:1.8.4*09(0000000.0*kWh)
1-1:1.8.4*08(0000000.0*kWh)
1-1:1.8.4*07(0000000.0*kWh)
1-1:1.8.4*06(0000000.0*kWh)
1-1:1.9.2(0000000.0*kWh)
1-1:1.9.2*05(0000000.0*kWh)
1-1:1.9.2*04(0000000.0*kWh)
1-1:1.9.2*03(0000000.0*kWh)
1-1:1.9.2*02(0000000.0*kWh)
1-1:1.9.2*01(0000000.0*kWh)
1-1:1.9.2*12(0000000.0*kWh)
1-1:1.9.2*11(0000000.0*kWh)
1-1:1.9.2*10(0000000.0*kWh)
1-1:1.9.2*09(0000000.0*kWh)
1-1:1.9.2*08(0000000.0*kWh)
1-1:1.9.2*07(0000000.0*kWh)
1-1:1.9.2*06(0000000.0*kWh)
1-1:1.9.3(0000000.0*kWh)
1-1:1.9.3*05(0000000.0*kWh)
1-1:1.9.3*04(0000000.0*kWh)
1-1:1.9.3*03(0000000.0*kWh)
1-1:1.9.3*02(0000000.0*kWh)
1-1:1.9.3*01(0000000.0*kWh)
1-1:1.9.3*12(0000000.0*kWh)
1-1:1.9.3*11(0000000.0*kWh)
1-1:1.9.3*10(0000000.0*kWh)
1-1:1.9.3*09(0000000.0*kWh)
1-1:1.9.3*08(0000000.0*kWh)
1-1:1.9.3*07(0000000.0*kWh)
1-1:1.9.3*06(0000000.0*kWh)
1-1:1.9.4(0000000.0*kWh)
1-1:1.9.4*05(0000000.0*kWh)
1-1:1.9.4*04(0000000.0*kWh)
1-1:1.9.4*03(0000000.0*kWh)
1-1:1.9.4*02(0000000.0*kWh)
1-1:1.9.4*01(0000000.0*kWh)
1-1:1.9.4*12(0000000.0*kWh)
1-1:1.9.4*11(0000000.0*kWh)
1-1:1.9.4*10(0000000.0*kWh)
1-1:1.9.4*09(0000000.0*kWh)
1-1:1.9.4*08(0000000.0*kWh)
1-1:1.9.4*07(0000000.0*kWh)
1-1:1.9.4*06(0000000.0*kWh)
Da waren natürlich auch noch ein, zwei "richtige" Daten dabei - hat aber eben eine Ewigkeit gedauert bis die fast 4000 Bytes mit 300Baud durchgeschoben waren.

Ich habe deshalb ein wenig experimentiert um auf 9600Baud umzuschalten und habe es dann schließlich geschafft. Komischerweise kann ich aber nur auf 9600Baud umschalten, jede andere Baudrate funktioniert irgendwie nicht??

Nunja, herausgekommen ist mein Programm zum fortlaufenden Auslesen von einzelnen Obis-Daten, dazu wird zuerst auf 9600Baud umgeschaltet, danach in den "Programming Mode" geschaltet und mit R5-Befehlen einzelne Obis-Werte geholt.

Die Werte werden dann auf der Konsole ausgegeben und das sieht dann z.B. so aus:
32.7.0  229.6
52.7.0  230.2
72.7.0  230.2
31.7.0  1.447
51.7.0  0.888
71.7.0  0.816
Interessanterweise braucht der Zähler für die Stromwerte recht lange (im Gegensatz z.B. zu den Zählerständen 1.8.0) bis er diese liefert, musste hierfür den Timeout erhöhen...

Aufgerufen werden kann das Programm folgendermaßen:
as1440 -F /dev/ttyUSB5 -v -O 52.7.0:72.7.0:31.7.0:51.7.0:71.7.0 -n
Das liest die oberen Werte einmal aus und hängt keine Einheiten (-n) an.

Ich selbst verwende das Tool folgendermaßen, die Daten werden in einen FIFO geschrieben, dazu muss zuerst der FIFO erstellt werden:
mkfifo /mnt/as1440

Danach die Daten fortlaufend hineinschreiben:
as1440 -F /dev/ttyUSB5 -O 52.7.0:72.7.0:31.7.0:51.7.0:71.7.0 -n -e >> /mnt/as1440 &

In FHEM eingelesen wird das dann mit meinem FIFO-Modul: https://forum.fhem.de/index.php/topic,106334.msg1001935.html#msg1001935 (https://forum.fhem.de/index.php/topic,106334.msg1001935.html#msg1001935)

Aus leidvoller Erfahrung habe ich das Programm ziemlich robust gegen Störungen gemacht, das Wegziehen des Lesekopfs und Wiederanbringen führt nun nur zu einer kleinen Unterbrechung bis das Programm sich wieder berappelt. Genauso kann der USB-Stecker abgezogen werden, nach dem Wiederanschließen geht es wieder weiter. Das sieht dann so aus (bei rot abgezogen, bei grün wieder verbunden):

Zitatopening /dev/as1440
init tty
init tty ok
init
init ok
change baudrate to B9600
change baudrate to B9600 ok
sendpwd
sendpwd ok
readack
readack ok
1.7.0   0.626
1.8.0   0013034.2
32.7.0  230.1
52.7.0  230.2
72.7.0  231.3
31.7.0  1.484
timeout waiting for answer
write: Input/output error
hangup
write: Input/output error
waiting 30 seconds
opening /dev/as1440
init tty
init tty ok
init
timeout waiting for init response
waiting 30 seconds
init tty
init tty ok
init
init ok
change baudrate to B9600
change baudrate to B9600 ok
sendpwd
sendpwd ok
readack
readack ok
1.7.0   0.626
1.8.0   0013034.2
32.7.0  229.6
52.7.0  230.2
72.7.0  230.2
31.7.0  1.447
51.7.0  0.888
71.7.0  0.816

Infos habe ich von hier: https://www.yumpu.com/en/document/read/10406473/a1500-a2500-firmware-version-4xx-protocol-definition-bimaq (https://www.yumpu.com/en/document/read/10406473/a1500-a2500-firmware-version-4xx-protocol-definition-bimaq)

Gruß

   Jochen

Edit: Aktualisierte Version hochgeladen
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: KölnSolar am 05 Januar 2020, 06:11:09
Hallo Jochen,
Hochachtung für Dein Engagement.

Aber hast Du möglicherweise übersehen, dass wir das OBIS-Modul haben, welches meines Wissens auch problemlos mit einem AS1440 und Umschaltung der Baudrate funktioniert ?

Grüße Markus
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: Joe_D am 05 Januar 2020, 11:55:06
Hallo Markus,

du meinst 47_OBIS.pm? Das habe ich mir schon angeschaut:

Die Zeile schaltet den AS1440 in den Modus für die Listenausgabe:
"AS1440"    =>      ["/2!".chr(13).chr(10),    600,    chr(6)."0".$hash->{helper}{SPEED}."0".chr(13).chr(10)]

Also zuerst "/2!\r\n" (Listenmode AS1440), danach "<Ack>050\r\n" (Data readout mode, 9600 Baud) für das Auslesen der Daten.
Das lässt im Endeffekt eine komplette Liste raus, wo auch jede Menge "Leerdaten" mitgeliefert werden. Zudem ist das ziemlich langsam.

Ich war vor allem an den 3 Strom + 3 Spannungswerten (zusätzlich zum Gesamtzählerstand und aktuellem Verbrauch) interessiert.
Das sind nur 8 Werte. In der Listenausgabe werden aber 138 Werte geliefert, für mich also 130 zuviel ;)

Zusätzliche Schwierigkeit: Der AS1440 liefert zwei Listen, wenn man nach dem Init wartet, eine mit "/?!\r\n" und die andere mit "/2!\r\n".
In der ersten Liste ist z.B. der aktuelle Verbrauch drin (1.7.0) aber keine Strom/Spannungswerte (32.7.0, 31.7.0, ..). 
In der zweiten Liste sind die Strom/Spannungswerte drin aber kein aktueller Verbrauch  :o

Deshalb schicke ich an den AS1440 zuerst "/?!\r\n" (Standard-Abfrage-Mode), danach "<Ack>051\r\n" (Programming mode, 9600Baud).
Nach dem senden eines optionalen Passworts können dann mit R5 einzelne Werte abgefragt werden. Die purzeln dann bei 9600Baud ziemlich
fix aus dem AS1440 heraus. Und das solange man will...

Gruß

  Jochen

Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: alkazaa am 03 Februar 2020, 19:41:11
Hallo Marcus,
Du schriebst:
Zitat von: KölnSolar am 05 Januar 2020, 06:11:09...
Aber hast Du möglicherweise übersehen, dass wir das OBIS-Modul haben, welches meines Wissens auch problemlos mit einem AS1440 und Umschaltung der Baudrate funktioniert ?
Wie muss man es denn anstellen, die Baudrate auf z.B. 9600 zu erhöhen? Ich habe zwar einen Weidmann Lesekopf als OBIS device mit 300 baud am AS 1440 zum Laufen bekommen, aber ein einfaches Ersetzen von 300 durch 9600 bringt's bei mir nicht.

Hier mein device listing:
Internals:
   CHANGED   
   DEF        /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9078004-if00-port0@300,7,E,1 AS1440
   DeviceName /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9078004-if00-port0@300,7,E,1
   FD         14
   FUUID      5e3277ae-f33f-a50b-f3d9-4ef9d6ce4ac82511
   MeterType  AS1440
   NAME       E_Zaehler
   NR         83
   PARTIAL   
   STATE      opened
   TYPE       OBIS
   Helper:
     DBLOG:
       power:
         logdb:
           TIME       1580754629.92682
           VALUE      0.416
   READINGS:
     2020-02-03 19:30:28   0.0.0           4235885
     2020-02-03 19:28:31   0.0.1           00!! ]a1.7.0(0.415*kW
     2020-02-03 19:30:47   0.2.2           0
     2020-02-03 19:30:27   0.9.1           193011
     2020-02-03 19:30:28   0.9.2           200203
     2020-02-03 19:30:30   1.8.0           3170.2
     2020-02-03 19:30:31   1.8.1           3170.2
     2020-02-03 19:30:32   1.8.2           0
     2020-02-03 19:30:33   1.8.3           0
     2020-02-03 19:30:33   1.8.4           0
     2020-02-03 19:30:34   1.8.5           0
     2020-02-03 19:30:35   1.8.6           0
     2020-02-03 19:30:36   1.8.7           0
     2020-02-03 19:30:37   1.8.8           0
     2020-02-03 19:30:38   1.9.0           48
     2020-02-03 19:28:04   2.8.0           139.5
     2020-02-03 19:30:40   2.8.1           139.5
     2020-02-03 19:30:41   2.8.2           0
     2020-02-03 19:30:41   2.8.3           0
     2020-02-03 19:30:42   2.8.4           0
     2020-02-03 19:30:43   2.8.5           0
     2020-02-03 19:30:44   2.8.6           0
     2020-02-03 19:30:45   2.8.7           0
     2020-02-03 19:30:46   2.8.8           0
     2020-02-03 19:30:46   2.9.0           0.3
     2020-02-03 19:28:20   Version         2!
     2020-02-03 19:30:50   current_L1      2.435
     2020-02-03 19:30:50   current_L2      0.478
     2020-02-03 19:30:51   current_L3      0.713
     2020-02-03 19:30:38   feed_L1         0
     2020-02-03 19:30:29   power           0.416
     2020-02-03 19:30:08   state           opened
     2020-02-03 19:30:48   voltage_L1      234.7
     2020-02-03 19:30:48   voltage_L2      234.5
     2020-02-03 19:30:49   voltage_L3      234.9
   helper:
     BUFFER     D
     EoM        0
     SPEED      0
     SPEED2     0
     TRIGGERTIME 1580754644.99644
     Channels:
     DEVICES:
       /2!

       300
       000

Attributes:
   DbLogInclude power
   event-on-change-reading power, 1.*, 2.*
   interval   300
   room       HWR


Beste Grüße
Franz
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: KölnSolar am 04 Februar 2020, 08:16:25
Hallo Franz,
das kann ich Dir nicht sagen. Aber frag mal im OBIS-Thread. Da werden sich hoffentlich AS1440-User finden u. antworten.
Grüße Markus
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: Joe_D am 08 Februar 2020, 10:41:47
Hallo Franz,

das ist IMHO im OBIS-Modul nicht implementiert.

Gruß

   Jochen
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: FunkOdyssey am 08 Februar 2020, 11:41:21
Ich meine wohl:

defmod obis_heizung OBIS /dev/serial/by-id/usb-FTDI_FT232Rxxx-if00-port0@300,7,E,1 VSM102


Hier steckt definitiv ein AS1440 hinter. Man achte aufs VSM102!
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: Joe_D am 08 Februar 2020, 14:10:25
ZitatHier steckt definitiv ein AS1440 hinter. Man achte aufs VSM102!

Und? VSM102 sendet anstatt dem Listenmodus "/2!" eben den Standardmodus "/?!" - damit müssten dann ebenfalls 138 Werte mit 300 Baud rauspurzeln, was gefühlt "ewig" dauert.

Franz fragte nach der Baudratenumschaltung von 300->9600, und die habe ich im Modul 47_OBIS.pm nicht gefunden. Nur einen ziemlich großen, auskommentierten Bereich:

# if ($hash->{helper}{SpeedChange2} eq "")
# {
# Log3 $hash,4,"Part 1";
## $hash->{helper}{SPEED}=$bd{$value};
# DevIo_SimpleWrite($hash,$hash->{helper}{DEVICES}[2],undef) ;
# Log3 $hash,4,"Writing ".$hash->{helper}{DEVICES}[2];
# $hash->{helper}{SpeedChange2}="1";
# } elsif ($hash->{helper}{SpeedChange2} eq "1")
# {
# if ($buf ne hex(15)) {
# Log3 $hash,4,"Part 2";
#     my $sp=$hash->{helper}{SPEED};
# my $d=$hash->{DeviceName};
# my $repl=$sp;
# Log3 $hash,4,"Old Dev: $d";
# $d=~/(.*@)(\d*)(.*)/;
# my $d2=$1.$hash->{helper}{SpeedChange}.$3;
# # $d=~s/(.*@)(\d*)(.*)/$repl$2/ee;
#
# Log3 $hash,4, "Replaced dev: $d2";
# RemoveInternalTimer($hash); 
# DevIo_CloseDev($hash) if $hash->{DeviceName} ne "none";
# $hash->{DeviceName} = $d2;
# $hash->{helper}{EoM}=-1;
#   Log3 $hash,5,"OBIS ($name) - Opening device...";
# my $t=OBIS_adjustAlign($hash,AttrVal($name,"alignTime",undef),$hash->{helper}{DEVICES}[1]);
#     Log3 ($hash,5,"OBIS ($name) - Internal timer set to ".FmtDateTime($t)) if ($hash->{helper}{DEVICES}[1]>0);
# InternalTimer($t, "GetUpdate", $hash, 0) if ($hash->{helper}{DEVICES}[1]>0);
#   DevIo_OpenDev($hash, 1, "OBIS_Init");
# } else
# {
# Log3 $hash,4,"Recieved NAK from Meter";
# }
# $hash->{helper}{SpeedChange2}="";
# $hash->{helper}{SpeedChange}="";   
# Log3 $hash,4, "Cleared helper\r\n";    
# }


Gruß

   Jochen
Titel: Antw:Obis Elster AS1440 Programm zum Auslesen
Beitrag von: alkazaa am 14 Juli 2020, 15:11:55
Zitat von: Joe_D am 08 Februar 2020, 10:41:47
Hallo Franz,

das ist IMHO im OBIS-Modul nicht implementiert.

Gruß

   Jochen

Inzwischen ist es implementiert, allerdings noch nicht in dem per update verteilten offiziellen 47_OBiS.pm Modul, siehe hier:
https://forum.fhem.de/index.php/topic,51948.msg1072152.html#msg1072152