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)