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
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
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
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
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
Hallo Franz,
das ist IMHO im OBIS-Modul nicht implementiert.
Gruß
Jochen
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!
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
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