Probleme beim Schreiben auf Eltako-Bus unter Solaris, evt. Device::SerialPort

Begonnen von EisNerd, 19 Januar 2018, 18:19:13

Vorheriges Thema - Nächstes Thema

EisNerd

Moin,
ich habe gerade mit FHEM angefangen, da ich in ein mit Eltako EnOcean ausgestattetes Haus gezogen bin.
Da ich ohnehin einen Openindiana Server betreibe, würde ich dort gerne FHEM in einer Zone laufen lassen, dies funktioniert soweit recht gut, leider ist das Schreiben auf den Bus unzuverlässig, ich vermute, dass beim configure von Device::SerialPort was nachgebessert werden muss.

Wenn ich eine Schaltaktion mehrfach auslöse (mehrfaches klicken im Webinterface) funktioniert es, daher tippe ich darauf, dass das Flushen nicht funktioniert.

Leider habe ich Probleme FHEM zu debuggen.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

rudolfkoenig

Wie hast du TCM definiert?
Funktioniert es evtl. ausserhalb der Zone?
Kannst du mit strace/dtrace die Systemcalls protokollieren?

EisNerd

Zitat von: rudolfkoenig am 19 Januar 2018, 20:00:35
1. Wie hast du TCM definiert?
2. Funktioniert es evtl. ausserhalb der Zone?
3. Kannst du mit strace/dtrace die Systemcalls protokollieren?

zu 1.
defmod TCM_ESP2_0 TCM ESP2 /dev/term/0@57600
attr TCM_ESP2_0 alias Eltako FAM14
attr TCM_ESP2_0 comType RS485
attr TCM_ESP2_0 learningMode always
attr TCM_ESP2_0 sendInterval 100
attr TCM_ESP2_0 verbose 3

zu 2.
Nein, gleiches verhalten. Aber mit meinem Linux Laptop geht es, wenn ich alles rüberkopiere und den Dev-Name anpasse

zu 3.
könntest du mir da etwas auf die Sprünge helfen?
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

rudolfkoenig

Mit dtrace habe ich so meine Schwierigkeiten, bei strace heisst es "strace -ttt -o /tmp/xy -p <FHEM-PID>".
Dann die Schaltvorgaengen durchfuehren, und die Datei /tmp/xy hier anhaengen.

EisNerd

So ich habe truss genommen:


pollsys(0xFFFFFD7FFFDFF3F0, 8, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 8, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 8, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 8, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 8, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
accept(7, 0xFFFFFD7FFFDFF410, 0xFFFFFD7FFFDFF40C, SOV_DEFAULT, 0) = 76
ioctl(76, TCGETA, 0xFFFFFD7FFFDFF1B0)           Err#22 EINVAL
lseek(76, 0, SEEK_CUR)                          Err#29 ESPIPE
ioctl(76, TCGETA, 0xFFFFFD7FFFDFF1B0)           Err#22 EINVAL
lseek(76, 0, SEEK_CUR)                          Err#29 ESPIPE
fcntl(76, F_SETFD, 0x00000001)                  = 0
setsockopt(76, SOL_SOCKET, SO_KEEPALIVE, 0xFFFFFD7FFFDFF810, 4, SOV_DEFAULT) = 0
fcntl(76, F_GETFL)                              = 130
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(76, " P O S T   / f h e m ? c".., 1024)    = 555
time()                                          = 1516395106
stat("./www/pgm2/.js", 0x004126B8)              Err#2 ENOENT
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
write(16, " 2 0 1 8 - 0 1 - 1 9 _ 2".., 53)     = 53
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
write(4, " 2 0 1 8 . 0 1 . 1 9   2".., 57)      = 57
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
write(16, " 2 0 1 8 - 0 1 - 1 9 _ 2".., 42)     = 42
time()                                          = 1516395106
time()                                          = 1516395106
time()                                          = 1516395106
write(11, "A5 Z k0701\0\0\t\0\0\0\r".., 14)     = 14
pollsys(0xFFFFFD7FFFDFF670, 0, 0xFFFFFD7FFFDFF760, 0x00000000) = 0
nanosleep(0xFFFFFD7FFFDFF730, 0x00000000)       = 0
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 4
write(76, " H T T P / 1 . 1   2 0 0".., 164)    = 164
write(75, " [ " E n O _ W Z _ S t r".., 930)    = 930
read(11, "\0\0\0\0\0\0D3AD1D070202".., 255)     = 34
write(74, " < d i v   c l a s s = '".., 84)     = 84
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0", 255)         = 11
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "\017BE", 255)                         = 3
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14
pollsys(0xFFFFFD7FFFDFF3F0, 9, 0xFFFFFD7FFFDFF760, 0x00000000) = 1
read(11, "A5 ZABFC\0\0\0\0\0\0\0\0".., 255)     = 14

Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

EisNerd

Ich hab auch noch vergessen, dass ich noch versuche herauszufinden, ob das Verhalten eventuell mit der Zeile (DevIO.pm:427) zusammenhängen könnte, diese scheint aufgrund von Limitationen der natives hinter Device::SerialPort im aktuellen verwendeten Buld (CPAN straight forward) nicht zu funktionieren.

$po->handshake('none');


Führt zu:

PERL WARNING: TCGETX(22529) ioctl failed: Invalid argument at ./FHEM/DevIo.pm line 427.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

rudolfkoenig

Wg. truss: ich gehe davon aus, dass die Daten mit
write(11, "A5 Z k0701\0\0\t\0\0\0\r".., 14)     = 14
richtig geschrieben werden. Kannst du bitte mit stty -a < /dev/term/0 die Parameter auslesen?

Wg. Warning: ich dachte none koennen alle. Kannst du bitte vor Zeile 427 Folgendes einfuegen:
Log 1, join(",", $po->handshake);

und das Ergebnis hier anhaengen?
Ich kriege none,xoff,rts

EisNerd

Zitat von: rudolfkoenig am 20 Januar 2018, 22:45:02
Wg. truss: ich gehe davon aus, dass die Daten mit
write(11, "A5 Z k0701\0\0\t\0\0\0\r".., 14)     = 14
richtig geschrieben werden. Kannst du bitte mit stty -a < /dev/term/0 die Parameter auslesen?


speed 57600 baud;
rows = 0; columns = 0; ypixels = 0; xpixels = 0;
csdata ?
eucw 1:0:0:0, scrw 1:0:0:0
min = 0; time = 0;
intr = ^c; quit = ^\; erase = ^?; erase2 = ^h; kill = ^u;
eof = <undef>; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^q; stop = ^s; susp = ^z; dsusp = ^y;
rprnt = ^r; flush = ^o; werase = ^w; lnext = ^v;
status = ^t;
-parenb -parodd cs8 -cstopb -hupcl cread clocal -loblk -crtscts -crtsxoff -parext
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -iuclc
-ixon -ixany -ixoff imaxbel
-isig -icanon -xcase -echo -echoe -echok -echonl -noflsh
-tostop -echoctl -echoprt echoke -defecho -flusho -pendin -iexten
-opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel tab3



Zitat von: rudolfkoenig am 20 Januar 2018, 22:45:02
Wg. Warning: ich dachte none koennen alle. Kannst du bitte vor Zeile 427 Folgendes einfuegen:
Log 1, join(",", $po->handshake);

und das Ergebnis hier anhaengen?
Ich kriege none,xoff,rts


2018.01.20 23:56:24 3: Setting TCM_ESP2_0 serial parameters to 57600,8,N,1
2018.01.20 23:56:24 1: none,xoff,rts
2018.01.20 23:56:24 1: PERL WARNING: TCGETX(22529) ioctl failed: Invalid argument at ./FHEM/DevIo.pm line 428.


none wird auch unterstützt, aber teil von 'none' ist (Device/SerialPort.pm):

    763 sub handshake {
    764     my $self = shift;
    765     
    766     if (@_) {
    767         if ( $_[0] eq "none" ) {
    768             $self->{"C_IFLAG"} &= ~(IXON | IXOFF);
    769             $self->termiox(0) if ($IOCTL_VALUE_TERMIOXFLOW);
    770             $self->{"C_CFLAG"} &= ~CRTSCTS;
    771         }


    738 sub termiox {
    739     my $self = shift;
    740     return unless ($IOCTL_VALUE_TERMIOXFLOW);
    741     my $on = shift;
    742     my $rc;
    743
    744     $self->{'TERMIOX'}=$on ? $IOCTL_VALUE_TERMIOXFLOW : 0;
    745
    746     my $flags=pack('SSSS',0,0,0,0);
    747     return undef unless $self->ioctl('TCGETX', \$flags);
    748     #if (!($rc=ioctl($self->{HANDLE}, $tcgetx, $flags))) {
    749         #warn "TCGETX($tcgetx) ioctl: $!\n";
    750     #}
    751
    752     my @vals=unpack('SSSS',$flags);
    753     $vals[0]= $on ? $IOCTL_VALUE_TERMIOXFLOW : 0;
    754     $flags=pack('SSSS',@vals);
    755
    756     return undef unless $self->ioctl('TCSETX', \$flags);
    757     #if (!($rc=ioctl($self->{HANDLE}, $tcsetx, $flags))) {
    758         #warn "TCSETX($tcsetx) ioctl: $!\n";
    759     #}
    760     return 1;
    761 }
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

rudolfkoenig

Die stty Ausgabe schaut fuer mich ok aus, und bei dem WARNING steige ich aus, auch mangels OS.

Zusammengefasst: ich habe keine Ahnung, wo dein Problem herkommt.
Vielleicht kann jemand mit mehr Wissen uebernehmen.

EisNerd

Danke, für deine Hilfe, ich muss mal den stty output von meinem Laptop ziehen, wenn der angeschlossen ist, was mich auch noch stört ist das Geklapper auf dem Terminal, siehe truss output, reads auf fno 11. Evt. muss ich da mal Eltako fragen was das ist oder kennt das hier schon wer?
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

EisNerd

Moin,
so ich hab es heute endlich mal geschafft mit Linux mich anzuhängen und mit stty die Portkonfiguration auszulesen.
Eventuell hilft das, dass wer einen Hinweis geben kann.

stty -a <  /dev/ttyUSB3
speed 57600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 0; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl echoke
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

gadget

Hi,

Ich glaube Du tust Dir keinen Gefallen, da viel Zeit in das Debugging zu investieren. Selbst wenn Du das in der Solaris root-Zone zum laufen bekommst, ist es fraglich ob es dann in einer virtuellen Zone läuft. Ich würde die serielle Kommunikation auf einen Raspberry Pi auslagern und via ip redirection ansprechen (oder fhem gleich auf einem  Rasperry Pi laufen lassen).

Grüße, gadget

EisNerd

Zitat von: gadget am 24 Februar 2018, 10:48:56
Hi,

Ich glaube Du tust Dir keinen Gefallen, da viel Zeit in das Debugging zu investieren. Selbst wenn Du das in der Solaris root-Zone zum laufen bekommst, ist es fraglich ob es dann in einer virtuellen Zone läuft. ...

Grüße, gadget
Das Habe ich schon abgeklärt/getestet, ob root-Zone oder nicht ist egal, da man Device-Pfade für nicht root-Zonen freigeben kann.

Aktuell würde ich gerne das Serielledevice mit einem kleinen C-Programm ansprechen und die Daten RAW als Unix-Socket durchreichen und dann in FHEM den Socket als RAW-Dev nutzen.
Das wäre:
a) einfacher zu debuggen
b) eine Alternative zum fragwürdigen Perl Modul (SerialDevice, da hatte ich configure Warnungen)
c) günstiger als zusätzliche Hardware

Eventuell da schon wer Erfahrungswerte oder schon Code, dann würde ich nicht bei null anfangen?
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

rudolfkoenig

ZitatAktuell würde ich gerne das Serielledevice mit einem kleinen C-Programm ansprechen und die Daten RAW als Unix-Socket durchreichen und dann in FHEM den Socket als RAW-Dev nutzen.
Alle FHEM Module, die DevIo verwenden, koennen die Daten gleichwertig vom seriellen Geraeten oder Netzwerk (TCP/IP) empfangen, der Benutzer kann /dev/cu.* oder rechner:port spezifizieren. Und fuer Seriell nach TCP gibt es diverse Loesungen wie socat, ser2net, etc.

EisNerd

Zitat von: rudolfkoenig am 25 März 2018, 10:54:37
Alle FHEM Module, die DevIo verwenden, koennen die Daten gleichwertig vom seriellen Geraeten oder Netzwerk (TCP/IP) empfangen, der Benutzer kann /dev/cu.* oder rechner:port spezifizieren. Und fuer Seriell nach TCP gibt es diverse Loesungen wie socat, ser2net, etc.
Danke für den Tipp.
Interessant ist vor allem die Verwendung von RAW, da ich dann kein zusätzliches Perl Modul für den IO verwendet wird.
Jemand schonmal socat für diesen Zweck verwendet, dann muss ich mir das nicht alles von Grund auf zusammen suchen.
Socat gibt es nativ aus der Paketverwaltung, hoffe dass es dann eventuell besser klarkommen sollte.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)


EisNerd

Läuft soweit alles recht gut, nur scheinen die Optionen für socat noch nicht zustimmen, zumindest geht aktuell gar nichts raus und ob was brauchbares gelesen wird, versuche ich noch herauszufinden.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

EisNerd

Moin,
mal ne dumme Frage, socat und ioDev für enOcean wären schon duplex fähig, also würde auch das Schreiben auf den Bus erlauben?

Da jetzt weniger funktioniert als vorher.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)

connormcl

Auf der oben verlinkten Seite zu FHEM und allgemein im Internet liest man von verschiedenen möglichen Problemen bei Socat in Bezug auf die konkret verwendete Version. Da funktioniert manches nicht oder die Syntax hat sich mal geändert.

Was viele hier benutzen und was normalerweise auch funktioniert ist ser2net (wenn die Umgebung sonst stimmt: Firewall/Zugriffsrechte/Konfiguration der Kommunikationsparameter)

EisNerd

So, da sind wir.
Also FHEM unter Openindiana (Opensolaris Nachfolger) läuft prima in einer Zone. Das Kommunikations- / Stbilitätsproblem ist Eltako bekannt, der FAM14 ist halt nicht als USB Gateway zum Bus gedacht, eher zufälliges Abfallprodukt. Warum es unter Solaris problematischer war als unter Linux wird wohl nicht aufzuklären sein.
Ich habe jetzt einen FGW14-USB angeschafft und siehe, jetzt bekomme ich stabil Telegramme vom Bus und auch auf den Bus.
Rückmeldung von den FSB scheint auch zu funktionieren, ich kann zumindest einen teil-geschlossenen Rollladen per Taster einen Teil hochfahren und in FHEM wird die Position entsprechend angepasst. Falls da Fragen sind bitte im Entsprechend Thread nochmal angehen.

Unterm Strich mit FGW14-USB läuft FHEM unter Solaris in einer Zone, TOP, genau was ich haben wollte!

Zusätzlich habe ich herausgefunden, dass man beim FGW14-USB die IDs der Geräte nicht zum Schalten nehmen kann, also für das Gerät 00000012 kann man 00000012 nicht als Sender ID für FHEM nehmen, die werden anscheinend ausgefiltert. Nimmt man z.b. 01000012 geht es.
Openindiana Server FHEM in Zone via FGW14-USB an FAM14 mit Eltako RS485 Aktoren (FSB14 und FSR14-2x und 4x)