SerialPort.pm on OpenWrt Kamikaze trunk

910 views
Skip to first unread message

lord.ki...@googlemail.com

unread,
Jan 1, 2010, 11:59:28 AM1/1/10
to FHEM users
Hi!
Ich moechte fhem auf einem OpenWrt laufen lassen. Da fuer meine
Architektur keine Pakete vorhanden waren, habe ich das SerialPort.pm
selbst erstellt. Das war (fuer mich) schon eine Herausforderung, aber
nun hat es sich installiert. Leider funzt es nicht mit fhem:

CUL opening CUL device /dev/ttyACM0
Attempt to reload POSIX.pm aborted.
Compilation failed in require at /usr/lib/perl5/5.10/Device/
SerialPort.pm line 6, <$fh> line 26.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.10/Device/
SerialPort.pm line 6, <$fh> line 26.
Compilation failed in require at /usr/local/lib/FHEM/00_CUL.pm line
928, <$fh> line 26.

Zeile 6 in SerialPort.pm ist:
use POSIX qw(:termios_h);

Nun weiss ich nicht recht weiter. Habe termios.h nach /usr/include
geschoben, ohne Erfolg.

Vielleicht kann mir jemand helfen, ich kenne mich mit perl - bis auf
die fhz.cfg Kommandos - nicht aus. Ist vielleicht ganz einfach?

Gruesse
Felix

Rudolf Koenig

unread,
Jan 1, 2010, 2:09:38 PM1/1/10
to fhem-...@googlegroups.com
> Nun weiss ich nicht recht weiter. Habe termios.h nach /usr/include
> geschoben, ohne Erfolg.

Das ist natuerelich ... suboptimal. termios.h & co muss man mit h2ph
installieren, perl schaut nicht nach /usr/include, und C-Header liest er auch
ungern.

lord.ki...@googlemail.com

unread,
Jan 2, 2010, 6:34:02 AM1/2/10
to FHEM users
Hm. Danke. Wie gut, dass ich gefragt habe, da waere ich _niemals_
drauf gekommen.

Habe jetzt mit h2ph gespielt, die includes zusammengesammelt und
(tataa)

perl -e 'require "termios.ph"'; liefert keine Fehler mehr.

Aber: Er will das Objekt nicht laden:


CUL opening CUL device /dev/ttyACM0

Can't locate loadable object for module Device::SerialPort in @INC
(@INC contains: /usr/lib/perl5/5.10 .) at /usr/local/lib/FHEM/
00_CUL.pm line 928


perl /usr/lib/perl5/5.10/Device/SerialPort.pm
Can't locate loadable object for module Device::SerialPort in @INC
(@INC contains: /usr/lib/perl5/5.10 .) at /usr/lib/perl5/5.10/
DynaLoader.pm line 69
DynaLoader::croak('Can\'t locate loadable object for module
Device::SerialPort i...') called at /usr/lib/perl5/5.10/DynaLoader.pm
line 135
DynaLoader::bootstrap('Device::SerialPort', 1.002) called at /usr/lib/
perl5/5.10/XSLoader.pm line 97
XSLoader::bootstrap_inherit('Device::SerialPort', 1.002) called at /
usr/lib/perl5/5.10/Device/SerialPort.pm line 37

Zeile 37 ist XSLoader::load('Device::SerialPort', $VERSION);

Nun meine Anschlussfrage:
Ist die Abfrage (perl ...SerialPort.pm) ueberhaupt sinnvoll?
Laedt der sich in der Zeile selbst?
Die Header verweisen auf irgendwas / müssen irgendwo auch
implementiert sein. Wohl in einem KernelModul. Welches wuerde ich denn
benoetigen?

Habe das Gefuehl, ich bin auf dem Holzweg. Verstehe es einfach zu
wenig.
Angenommen, ich wuerde das CUN besorgen, dann kann ich auf dieses via
TCP/IP zugreifen. Wuerde das Modul 00_CUL.pm dann auf SerialPort.pm
verzichten?

Viele Gruesse
Felix


Rudolf Koenig

unread,
Jan 2, 2010, 7:20:23 AM1/2/10
to fhem-...@googlegroups.com
> Can't locate loadable object for module Device::SerialPort in @INC
> (@INC contains: /usr/lib/perl5/5.10 .) at /usr/local/lib/FHEM/
> 00_CUL.pm line 928

Vielleicht fehlt SerialPort.so? Ich habe es in
.../lib/site_perl/5.8.3/i686-linux/auto/Device/SerialPort/SerialPort.so


> Angenommen, ich wuerde das CUN besorgen, dann kann ich auf dieses via
> TCP/IP zugreifen. Wuerde das Modul 00_CUL.pm dann auf SerialPort.pm
> verzichten?

Ja, bei TCP/IP kann man darauf verzichten. Eigentlich kann man auf SerialPort
auch sonst verzichten, man muesste in 00_CUL.pm "nur" new/input/write/etc mit
open/sysread/syswrite/etc ersetzen, alle IO Funktionen sind in 4 Funktionen
zusammengefasst. Ich hatte das auch schon vor, weil mich die staendigen
SerialPort Probleme nerven, und das CUL Protokoll (genau deswegen) 7-bit ist.
Die Baudrate wird ausserdem ignoriert. Weiss jemand, ob das auch unter Windows
funktioniert?

Gruss,
Rudi

lord.ki...@googlemail.com

unread,
Jan 2, 2010, 10:58:55 AM1/2/10
to FHEM users

> Vielleicht fehlt SerialPort.so?

Scheint so :-)

Habe nun eine "funktionierende" Version.

CUL opened /dev/ttyACM0 for MyCUL
Use of uninitialized value $ver in pattern match (m//) at /usr/local/
lib/FHEM/00_CUL.pm line 442, <$fh> line 26.

Zeile 442 in 00_CUL.pm
while($try++ < 3 && $ver !~ m/^V/) {
CUL_SimpleWrite($hash, "V");
($err, $ver) = CUL_ReadAnswer($hash, "Version", 0);
return "$name: $err" if($err && ($err !~ m/Timeout/ || $try ==
3)); <---442
}

Was <$fh> line 26 ist, faellt mir gerade nicht ein ;-)

Habe Version 4.8 und die aktuellen Quellen versucht. Die 4.8 ging
bislang auf meinem Ubuntu-System. Deshalb nehme ich an, es ist nicht
der Fehler der Zeile 442.
Kann ich davon ausgehen, dass ich alle Abhaengigkeiten erfuellt habe?

Gruesse
Felix

lord.ki...@googlemail.com

unread,
Jan 2, 2010, 12:52:36 PM1/2/10
to FHEM users
Ein Workaround:

ser2net (http://ser2net.sourceforge.net/)

Mit der Zeile:
27073:raw:300:/dev/ttyACM0:115200 NONE 1STOPBIT 7DATABITS
in ser2net.conf
und
define MyCUL CUL 127.0.0.1:27073 3333
in fhz.cfg

tut es prima. Supi eigentlich, leider tritt auf dem o.g. Router immer
noch der selbe Fehler auf:
CUL opened 127.0.0.1:27073 for MyCUL


Use of uninitialized value $ver in pattern match (m//) at /usr/local/

lib/FHEM/00_CUL.pm line 442, <$fh> line 27.


Use of uninitialized value $ver in pattern match (m//) at /usr/local/

lib/FHEM/00_CUL.pm line 442, <$fh> line 27.
2010.01.02 17:45:32 1: Cannot init 127.0.0.1:27073, ignoring it

Genau dieselben Einstellungen, habe nochmal dieselbe fhem 4.8
installiert.
Auf dem Router ist uebrigens Perl 5.10

Gruesse
Felix

lord.ki...@googlemail.com

unread,
Jan 2, 2010, 5:27:40 PM1/2/10
to FHEM users
Weitere Beobachtung:

Ich kann von meinem Rechner aus auf den ser2net port des Routers
zugreifen, und alles laeuft wie gehabt:

define MyCUL CUL 192.168.1.1:27073 3333

Es liegt also nicht am SerialPort.

Viele Gruesse
Felix

Rudolf Koenig

unread,
Jan 3, 2010, 5:43:43 AM1/3/10
to fhem-...@googlegroups.com
> tut es prima. Supi eigentlich, leider tritt auf dem o.g. Router immer
> noch der selbe Fehler auf:
[...]

> 2010.01.02 17:45:32 1: Cannot init 127.0.0.1:27073, ignoring it

Ich bin verwirrt. Tut es oder nicht?

Koenntest Du es wieder ohne ser2net mit maximalen loglevel (attr global verbose
5) versuchen, und dabei nach der ominoese Zeile 442 (nach CUL_ReadAnswer) die
Ergebnisse protokollieren mit sowas wie:

Log 0, "ERR: $err";
Log 0, "VER: $ver";

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 6:46:56 AM1/3/10
to FHEM users
Hi!
Bevor ich es vergesse: Vielen Dank fuer Deine Hilfe.

Es tut nicht. Nicht auf dem Router (Perl 5.10, 192.168.1.1) . Es
funktioniert auf dem Ubuntu Rechner, egal wo ich das CUL reinstoepsel,
per ser2net lokal und remote und auch (lokal) per SerialPort. Nur auf
dem Router funzt der code nicht. Weder ser2net noch SerialPort.

Ich denke, es ist ein Perl-Problem. Ich habe ein bisserl debuggt (kann
nix, nur Logeintraege).
Ich habe mit ngrep herausgefunden, dass V die Version auch
tatsaechlich zurückliefert. In der Zeile

my $nfound = select($rin, undef, undef, $to);

kommot $nfound als 0 zurueck. Folgerichtig springt er nach

return ("Timeout reading answer for get $arg", undef)

gilt fuer $arg = Clear und Version

Ich weiss leider nicht, wo select definiert ist, was es tut und warum
es 0 zurueckgibt.

Der obige Test gibt:
ERR: Timeout reading answer for get Version
VER ist leer.

Das selbe gilt fuer den Vesuch mit /dev/ttyACM0.
Ich finde merkwuerdig, dass das Log exakt genauso aussieht, wie beim
TCP Versuch.
vec($rin, $hash->{FD}, 1) = 1; Hat dieselben Werte ($rin konnte ich
nicht sehen), und $to in der select Anweisung ist auch gleich.

Rudolf Koenig

unread,
Jan 3, 2010, 7:12:05 AM1/3/10
to fhem-...@googlegroups.com
> Ich habe mit ngrep herausgefunden, dass V die Version auch tatsaechlich
> zur�ckliefert.

Koenntest Du "telnet CUL-Rechner ser2net-port" starten, und mit V<return>,
X21<return>, etc versuchen, CUL direkt zum Reden zu bringen? Danach kann man
gezielt weiter suchen.

> Ich weiss leider nicht, wo select definiert ist, was es tut und warum
> es 0 zurueckgibt.

Select ist "builtin" bzw. System-Call, und liefert 0 zurueck, wenn es auf
keinem der spezifizierten Kanaele (FileDescriptoren) innerhalb der angegebenen
Zeit was angekommen ist.

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 7:28:36 AM1/3/10
to FHEM users
> Koenntest Du "telnet CUL-Rechner ser2net-port" starten...

Ja, das geht. Alles. ngrep zeigt, dass es auch beim fhem init geht.

> Select ist "builtin" bzw. System-Call, und liefert 0 zurueck, wenn es auf
> keinem der spezifizierten Kanaele (FileDescriptoren) innerhalb der angegebenen
> Zeit was angekommen ist.

Hier liegt wohl der Hund begraben. Es liefert nix zurück.

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 7:43:38 AM1/3/10
to FHEM users
was ich auch merkwuerdig finde:

return "$name: $err" if($err && ($err !~ m/Timeout/ || $try == 3));

verwendet $ver gar nicht. Use of uninitialized value $ver in pattern
match (m//) ist doch Quark?

Rudolf Koenig

unread,
Jan 3, 2010, 7:59:02 AM1/3/10
to fhem-...@googlegroups.com
> Hier liegt wohl der Hund begraben. Es liefert nix zur�ck.

Ich wuerde das Problem nicht beim select suchen, das ist so elementar, der
"muss" funktionieren. Eher beim Verbindugsaufbau zum ser2net. Koenntest Du
ser2net auf dem FB und fhem auf einem anderen Rechner starten?

Rudolf Koenig

unread,
Jan 3, 2010, 8:00:14 AM1/3/10
to fhem-...@googlegroups.com
> verwendet $ver gar nicht. Use of uninitialized value $ver in pattern
> match (m//) ist doch Quark?

Eher ist der Zeilennummer Quark. Ich vermute die Meldung kommt aus dem
while(.., paar Zeilen hoeher.

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 8:12:49 AM1/3/10
to FHEM users

> ser2net auf dem FB und fhem auf einem anderen Rechner starten?

Habe ich schon. Mehrmals wechselseitig:

fhem auf ubuntu->CUL an OpenWrt geht
fhem auf ubuntu->CUL an ubuntu geht
fhem auf OpenWRT->CUL an Ubuntu geht nicht
fhem auf OpenWRT->CUL an OpenWRT geht nicht

Habe perl noch mal deinstalliert (wegen den o.g. h2ph Vesuchen), die /
usr/lib/perl5/... weggeworfen, neu installiert, selbes Ergebnis

Rudolf Koenig

unread,
Jan 3, 2010, 8:48:33 AM1/3/10
to fhem-...@googlegroups.com
> Habe ich schon. Mehrmals wechselseitig:

Hmm, dann ist wahrscheinlich perl@OpenWRT putt. Ich fuerchte da ist ernsthaftes
Perl-Debuggen notwendig.

Eine Anekdote in diesem Zusammenhang: Ich habe fuer den FB erst perl 5.8.8
uebersetzt, der hatte aber grundsaetzliche Probleme, deswegen habe ich dann
5.6.2 genommen. Kannst Du folgendes auf dem OpenWRT fhem im telnet Prompt
eingeben:
{ $x=3;; Log 0, "X is: ".$x }

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 9:02:24 AM1/3/10
to FHEM users
> { $x=3;; Log 0, "X is: ".$x }

Er gibt mir keinen prompt. telnet connected nicht. Das Log sagt:
Server started(...
Warum bekomme ich keinen telnet prompt?

Rudolf Koenig

unread,
Jan 3, 2010, 9:09:56 AM1/3/10
to fhem-...@googlegroups.com
> Er gibt mir keinen prompt. telnet connected nicht.
Was heisst das genau? Connection refused?

> Warum bekomme ich keinen telnet prompt?

Perl kaputt? Was sagt denn lokal auf OpenWRT

perl -e '$x=3; print "Hello " . $x . "\n"'

lord.ki...@googlemail.com

unread,
Jan 3, 2010, 9:39:32 AM1/3/10
to FHEM users
> Was heisst das genau? Connection refused?
sorry, nein, telnet bleibt einfach haengen.

> perl -e '$x=3; print "Hello " . $x . "\n"'

Hello 3

Perl geht scho, im log kommt er bis zum
: Server started (version =VERS= from =DATE= ($Id: fhem.pl,v 1.97
2010/01/01 15:18:09 rudolfkoenig Exp $), pid 6323)

Da geht mehr als Hallo Welt.

lord.ki...@googlemail.com

unread,
Feb 21, 2010, 8:39:23 AM2/21/10
to FHEM users
Habe nun alles noch mal kompiliert, aktuelle kernel version 2.6.32.8
und alle perl librarys. Das Problem ist immer noch das Selbe.

lord.ki...@googlemail.com

unread,
Mar 1, 2010, 11:56:18 AM3/1/10
to FHEM users
Durchbruch!
Ich habe aus den koeniglichen Quellen ein Testprogramm geschustert. Da
ich kein perl spreche, sieht es wild aus. Aber: Es funktioniert auch
auf dem Openwrt. Liegt wohl doch nicht am perl. Ich werde den
Quellcode anhängen, sobald ich rausgefunden habe, wie das geht.

On 21 Feb., 14:39, "lord.kilmarn...@googlemail.com"

lord.ki...@googlemail.com

unread,
Mar 1, 2010, 12:00:52 PM3/1/10
to FHEM users
Die Datei liegt in den Google Groops Dateien, heißt test.pl.

Die Antwort ist beides mal, also auf openwrt und ubuntu:

hier! >$test<simple write endfertig version: V 1.35 CUL868
fehler: Kein Fehler

Das Proggie greift auf ser2net auf port 27073 zu, wo das CUL lauscht.
Sorry fuer den schlechten Aufbau. Ich weiss jetzt auch nicht, wie ich
das in fhem einbaue. Und auch nicht, wo der Fehler eigentlich lag.
Vielleicht kann das ja hier jemand sagen, bitte.

lord.ki...@googlemail.com

unread,
Mar 1, 2010, 12:02:41 PM3/1/10
to FHEM users
Die Funktionen stammen alle aus 00_CUL.pm. Alles USB und WIN Zeug habe
ich rausgenommen.

lord.ki...@googlemail.com

unread,
Mar 1, 2010, 1:57:36 PM3/1/10
to FHEM users
Es liegt wohl daran, wie ich den socket oeffne. Wenn ich den socket
oeffnen code direkt reinarbeite, funktioniert er nicht, bzw. er baut
nicht auf. Kann es sein, dass das CUL einfach schneller antwortet, als
der Read Socket aufgebaut ist?
Ich stochere im Trueben, komme nicht weiter, bin gespannt auf Eure
Antwort.

Rudolf Koenig

unread,
Mar 1, 2010, 2:25:34 PM3/1/10
to fhem-...@googlegroups.com
> Wenn ich den socket oeffnen code direkt reinarbeite, funktioniert er nicht,
> bzw. er baut nicht auf.

Verstehe ich nicht...

> Kann es sein, dass das CUL einfach schneller antwortet, als
> der Read Socket aufgebaut ist?

Ja, das macht aber (theoretisch) nichts.

lord.ki...@googlemail.com

unread,
Mar 2, 2010, 2:24:27 AM3/2/10
to FHEM users
Ich habe es noch mal am Original 00_CUL.pm versucht: Mit 2 Aenderungen
empfaengt es:

1) aufruf von CUL_Clear raus

sub
CUL_DoInit($)
{
my $hash = shift;
my $name = $hash->{NAME};
my $err;
my $msg = undef;
# CUL_Clear($hash);

2) sub
CUL_ReadAnswer($$$)
{
...
# return ("Timeout reading answer for get $arg", undef)
# if($nfound == 0);
...

Warum, weiss ich nicht. Die Ausgabe von $buf ist ohne clear:

buf ist T0C6000A600F7
T585800A6FF1A
T0C6000A600F8
TDV 1.35 CUL868

im zweiten Aufruf
buf ist V 1.35 CUL868

oder er haengt noch mal was sinnloses dran.

Befehle empfaengt fhem bisher auch so nicht.

lord.ki...@googlemail.com

unread,
Mar 2, 2010, 2:37:28 AM3/2/10
to FHEM users
er initialisiert genau dann, wenn

in CUL_DoInit()
CUL_Clear($hash);

ausgetauscht wird und in

CUL_ReadAnswer

return ("Timeout reading answer for get $arg", undef)

if($nfound == 0);


auskommentiert wird.

Allerdings geht es dann auch noch nicht, dass fhem Befehle emfängt.

lord.ki...@googlemail.com

unread,
Mar 6, 2010, 6:48:22 AM3/6/10
to FHEM users
Probelauf:
CUL_ReadAnswer($$$)
...
Log 1, "nfound: $nfound Wenn nfound = 0 -> timeout. Timeout ist
gesetzt auf $to";
$buf = CUL_SimpleRead($hash);
Log 1, "buf: $buf";
...
ergibt:
ReadAnswer: Command: Version
nfound: 0 Wenn nfound = 0 -> timeout. Timeout ist gesetzt auf 0.5
2010.03.06 12:13:05 1: buf: V 1.35 CUL868

also ist nfound 0, der buffer aber voll.
wenn ich also den timeout ausschalte, faehrt der server hoch. Er
fuehr vorher sogar noch einmal CUL_ReadAnswer aus:

ReadAnswer: Command: FHTID
2010.03.06 12:13:05 1: nfound: 0 Wenn nfound = 0 -> timeout. Timeout
ist gesetzt auf 0.5
2010.03.06 12:13:05 1: buf: 3333

CUL_Clear habe ich auskommentiert.

Nach dem Hochfahren fuehrt
telnet localhost 7072 zwar dazu, dass telnet connected, er reagiert
aber nicht auf Kommandos. Genausowenig auf irgendwelche Befehle. Wenn
ich eine Taste drücke, sehe ich, dass der Befehl an fhem geschickt
wird, aber es reagiert nicht.

Warum ist nfound 0? Scheint genau das Problem zu sein: Daten kommen
an, aber fhem fängt sie nicht. Warum ist $buf gesetzt und $nfound 0?
Nix, gefunden, nur was es soll?
Kann das mit irdendwelchen Konsoleeinstellungen zu tun haben?

Rudolf Koenig

unread,
Mar 7, 2010, 3:33:22 AM3/7/10
to fhem-...@googlegroups.com
> nfound: 0 Wenn nfound = 0 -> timeout. Timeout ist gesetzt auf 0.5
> 2010.03.06 12:13:05 1: buf: V 1.35 CUL868
>
> also ist nfound 0, der buffer aber voll.

Mini-Zusammenfassung von "man 2 select":
select() kriegt eine Liste von Filedesriptoren (netzwerk/geraet/etc) und ein
Timeout. Es blockiert solange, bis auf einem der Descriptoren Daten anstehen
oder der Timeout abgelaufen ist. Wenn (im perl) der timeout undef ist (nicht
0!), dann ist die Timeout Funktionalitaet abgeschaltet.

Verstehe ich es richtig: select() meldet in deinem Fall nie, dass Daten
anstehen (nfound ist nie > 0), aber Daten sind da, man kann sie auslesen.

Wenn das stimmt, dann ist die select() Implementation in dem installierten
perl, libc oder linux-kernel kaputt (in dieser abnehmender Wahrscheinlichkeits-
Reihenfolge :). Falls man das debuggen moechte, dann waere interessant die
Parameter des select() Systemcalls (== libc -> kernel) zu sehen, z.Bsp. mit
strace.

Gruss,
Rudi

lord.ki...@googlemail.com

unread,
Mar 7, 2010, 4:58:47 AM3/7/10
to FHEM users
Ja, so ist es, nfound ist immer 0. Wenn nfound 0 ist, werden die Daten
dann mit sysread auch gefunden.

Ich kompiliere strace gerade und schaue dann mal, ob mir der output
etwas sagt.

Gäbe es einen Workaround um select? Immerhin liest sysread ja.

lord.ki...@googlemail.com

unread,
Mar 7, 2010, 6:27:22 AM3/7/10
to FHEM users
Habe strace nun durchlaufen lassen. Siehe log.txt.
Sagt mir aber gerade mal nix. Select sagt er nirgendwo. Kanns Du da
was sehen?
Message has been deleted

lord.ki...@googlemail.com

unread,
Mar 7, 2010, 7:09:47 AM3/7/10
to FHEM users
Sagt halt auch timeout
_newselect(0, NULL, NULL, NULL, {0,
1000})
= 0 (Timeout)

Rudolf Koenig

unread,
Mar 7, 2010, 1:09:21 PM3/7/10
to fhem-...@googlegroups.com
On Sun, Mar 07, 2010 at 03:27:22AM -0800, lord.ki...@googlemail.com wrote:
> Select sagt er nirgendwo. Kanns Du da was sehen?

Noe. Dieser fhem ist auch nicht hochgefahren wegen:
bind(5, ..., 16) = -1 EADDRINUSE (Address already in use)


> _newselect(8, [], NULL, NULL, {0, 0})

Schaut komisch aus. Mein "Produktions-fhem" schaut aus (kann man mit strace -p
<pid> beobachten):
select(24, [5 6 15 18 19 20 22], NULL, NULL, {205, 536666}
aber auch ein fhem mit Minimalkonfig hat wenigstens den "telnet" port (attr
global port 7072) im ersten [].
Kannst Du bitte verifizieren, ob ins select Aufruf was reingesteckt wird ($rin
ist nicht undef oder 0)?

lord.ki...@googlemail.com

unread,
Mar 7, 2010, 2:32:16 PM3/7/10
to FHEM users
> Kannst Du bitte verifizieren, ob ins select Aufruf was reingesteckt wird ($rin
> ist nicht undef oder 0)?

Wenn dies zum Erfolg fuehren wuerde:
Log 1, "rin ist undef" if(!defined($rin));

dann ist es irgendwas (keine Ausgabe):

Log 1, "nfound: $nfound timeleft: $timeleft Wenn nfound = 0 ->
timeout. Timeout ist gesetzt auf $to. rin ist >$rin<";
Log 1, "rin ist undef" if(!defined($rin));
ergibt
nfound: 0 timeleft: 0 Wenn nfound = 0 -> timeout. Timeout ist gesetzt
auf 0.5. rin ist ><

Habe noch mal die log.txt mit einem durchgefuehrten strace angehaengt.
Das mit dem telnet wundert mich nicht, da ich per telnet zwar
einloggen kann, er aber keinen muks auf Eingaben hin macht.

Rudolf Koenig

unread,
Mar 8, 2010, 2:28:45 AM3/8/10
to fhem-...@googlegroups.com
> Log 1, "nfound: $nfound timeleft: $timeleft Wenn nfound = 0 ->
> timeout. Timeout ist gesetzt auf $to. rin ist >$rin<";

$rin ist wahrscheinlich ein kleiner Zahl und damit ein Controlcharacter, was
man nicht so recht sieht. Deswegen sollte es statt "bla...>$rin<" eher "bla..."
. unpack("H*",$rin) . "<" sein. Ansonsten tippe ich auf ein Problem in Perl
oder evtl in libc.

lord.ki...@googlemail.com

unread,
Mar 8, 2010, 3:32:55 PM3/8/10
to FHEM users
Da ich weit ueber das Ende meines Lateins hinaus bin, wuerde ich gerne
das Problem bei OpenWRT publik machen. Muss wohl die test.pl noch mal
ueberarbeiten, damit sie auch ja nicht funktioniert. Wenn es die libc
ist, kann ich das von der Kommandozeile aus testen?

Rudolf Koenig

unread,
Mar 9, 2010, 2:27:30 AM3/9/10
to fhem-...@googlegroups.com
On Mon, Mar 08, 2010 at 12:32:55PM -0800, lord.ki...@googlemail.com wrote:
> Wenn es die libc ist, kann ich das von der Kommandozeile aus testen?

Mit folgendem C-Programm (selecttest.c):

=======
#include <fcntl.h>
#include <stdio.h>
#include <sys/select.h>

int
main(int ac, char *av[])
{
fd_set fdset;
int fd, ret;

fd = open(av[1], O_RDONLY);
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
printf("FD: %d, IN: %08x\n", fd, *((unsigned int *)&fdset));
ret = select(fd+1, &fdset, 0, 0, 0);
printf("RET: %d, OUT: %08x\n", ret, *((unsigned int *)&fdset));
return 0;
}
=======

Uebersetzen mit "cc -o selecttest selecttest.c", starten mit
./selecttest /dev/ttyUSB0

lord.ki...@googlemail.com

unread,
Mar 15, 2010, 10:06:11 AM3/15/10
to FHEM users

> Mit folgendem C-Programm (selecttest.c):
> ./selecttest /dev/ttyUSB0

Habe es kompiliert
1) auf ubuntu:
./selecttest /dev/ttyACM0
FD: 3, IN: 00000008

2) auf openwrt:
./selecttest /dev/ttyACM0
FD: 3, IN: 00000008

Nehme mal an, ich schicke ein falsches Kommando? Zumindest kommt kein
OUT:....

Rudolf Koenig

unread,
Mar 15, 2010, 10:17:07 AM3/15/10
to fhem-...@googlegroups.com
> Nehme mal an, ich schicke ein falsches Kommando? Zumindest kommt kein
> OUT:....

Wenn der CUL nichts zu sagen hat, dann kommt auch kein OUT. Man koennte es mit
einem
write(fd, "V\n", 2);
vor dem select() zum reden bringen.

lord.ki...@googlemail.com

unread,
Mar 15, 2010, 10:50:42 AM3/15/10
to FHEM users

>   write(fd, "V\n", 2);

sagt auch nix. ubuntu & openwrt.

lord.ki...@googlemail.com

unread,
Mar 15, 2010, 10:58:14 AM3/15/10
to FHEM users
Wenn ich ihn was sagen lasse (via perl), dann erscheint

./selecttest /dev/ttyACM0
FD: 3, IN: 00000008

RET: 1, OUT: 00000008

Merkwuerdigerweise erst nach mehreren Wiederholungen.
Ist das jetzt ein gutes Zeichen? Ist jetzt select() ok?

Rudolf Koenig

unread,
Mar 16, 2010, 4:59:13 AM3/16/10
to fhem-...@googlegroups.com
> Ist das jetzt ein gutes Zeichen? Ist jetzt select() ok?

Ja, was auch zu erwarten war. Und write() hat nicht funktioniert, da open mit
O_RDONLY durchgefuehrt wurde. Das Ganze also nochmal komplett:

======
#include <fcntl.h>
#include <stdio.h>
#include <sys/select.h>

int
main(int ac, char *av[])
{
fd_set fdset;
int fd, ret;

fd = open(av[1], O_RDWR);
FD_ZERO(&fdset);
FD_SET(fd, &fdset);


write(fd, "V\n", 2);

printf("FD: %d, IN: %08x\n", fd, *((unsigned int *)&fdset));
ret = select(fd+1, &fdset, 0, 0, 0);
printf("RET: %d, OUT: %08x\n", ret, *((unsigned int *)&fdset));
return 0;
}

========

% cc -o selecttest selecttest.c
% ./selecttest /dev/ttyACM0


FD: 3, IN: 00000008
RET: 1, OUT: 00000008

(getestet mit einem angeschlossenen CUL)

Es ueberrascht mich nicht, dass hier kein Fehler vorliegt, da select eine der
zentralen Funktionen ist. Mit perl hatte ich auf dem Fritzbox vor zwei Jahren
auch schon Probleme, deswegen bin ich damals von 5.8.9 auch 5.6.2
"umgestiegen".
Offensichtlich wird perl auf ucLibc Systemen nicht so gruendlich getestet, was
ich auch nachvollziehen kann.

Gruss,
Rudi

lord.ki...@googlemail.com

unread,
Mar 20, 2010, 6:36:02 AM3/20/10
to FHEM users
Danke, das funktioniert auf beiden Systemen.
Ich habe bereits versucht, perl in einer anderen Version zu
installieren, leider funktionieren dann die openwrt patches nicht
mehr. Ich werde den bug jetzt zusammen mit dem test.pl bei openwrt
melden und das Beste hoffen.

Gruesse
Felix

kawa0815

unread,
May 15, 2010, 2:23:54 PM5/15/10
to FHEM users
Hallo und Guten Tag,

Ich möchte mich mal hier mit meinem Problem anhängen da ich denke es
ist hier richtig.
Ich habe ieinen CUL_V2 und bekomme Fhem einfach nicht mit ihm zu
laufen.

Ich benutze das Ubuntu 10.04 mit perl 5.10.1.
Der CUL wird vom Betriebssystem erkannt und ist mit screen /dev/
ttyACM0 ansprechbar.
V meldet V 1.37 CUL868
Ich habe mit einem S555 getestet und der CUL liefert die Rohwerte.

Hier ist meine fehm.cfg:

#
# pgm2 / autocreate configfile. Take a look at the other examples for
more.
#
attr global logfile /var/log/fhem/fhem-%Y-%m.log
attr global modpath /usr/local/lib # where our FHEM
directory is
attr global port 7072 # our TCP/IP port (localhost
only)
attr global statefile /var/log/fhem/fhem.save # where to save the
state of the devices
attr global verbose 3 # "normal" verbosity (min 1,
max 5)



define WEB FHEMWEB 8084 global
attr WEB plotmode SVG
attr WEB plotsize 800,160


define CUL CUL /dev/ttyACM0 1234

# Fake logfile, to access the global log
define Logfile FileLog /var/log/fhem/fhem-%Y-%m.log fakelog

define autocreate autocreate
attr autocreate autosave
attr autocreate device_room %TYPE
attr autocreate filelog /var/log/fhem/%NAME-%Y.log
attr autocreate weblink
attr autocreate weblink_room Plots


In dieser Konfiguration startet fhem einfach nicht. Wenn ich die
Zeile: "define CUL CUL /dev/ttyACM0 1234" auskomentiere, funktioniert
es.

hier ist die fehm.log

2010.05.15 19:50:40 2: FHEMWEB port 8084 opened
2010.05.15 19:50:40 3: CUL opening CUL device /dev/ttyACM0
Can't locate Device/SerialPort.pm in @INC (@INC contains: /etc/perl /
usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /
usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/
site_perl .) at /usr/local/lib/FHEM/00_CUL.pm line 966, <$fh> line 17.

Danke
kawa0815

--
Sie haben diese Nachricht erhalten, da Sie der Google Groups-Gruppe FHEM users beigetreten sind.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an fhem-...@googlegroups.com.
Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an fhem-users+...@googlegroups.com.
Besuchen Sie die Gruppe unter http://groups.google.com/group/fhem-users?hl=de, um weitere Optionen zu erhalten.

revolin

unread,
May 15, 2010, 2:52:54 PM5/15/10
to FHEM users
Hallo kawa0815,

das Problem liegt daran, dass du das Perl-Module SerialPort.pm auf
deinem System
noch nicht installiert hast und daher kann fhem den seriellen Port
nicht oeffnen.
Screen hat hier keine Probleme, da es kein Perl-Prog. ist.

Unter Ubuntu kannst du das so nachinstallieren:

apt-get install libdevice-serialport-perl

schoene Gruesse
Gerald
> Besuchen Sie die Gruppe unterhttp://groups.google.com/group/fhem-users?hl=de, um weitere Optionen zu erhalten.

Rudolf Koenig

unread,
May 15, 2010, 2:55:22 PM5/15/10
to fhem-...@googlegroups.com
> Can't locate Device/SerialPort.pm in @INC (@INC contains: /etc/perl /

- Erste Zeile im HOWTO
"First install the Device::SerialPort (or Win32::SerialPort) perl module with
the command "cpan -i Device::SerialPort"
- fhem.html (a.k.a. fhem Homepage), Abschnitt Installation, erste Zeile:
# Make sure you have perl. Install the module Device::SerialPort with
# "cpan Device::SerialPort"

Ich glaube in der Wiki fehlt das noch. Eigentlich gehoert der Aufruf von cpan
direkt ins fhem :)

Dr. Boris Neubert

unread,
May 15, 2010, 3:02:34 PM5/15/10
to fhem-...@googlegroups.com
Hallo,

Am 15.05.2010 20:23, schrieb kawa0815:
> Ich benutze das Ubuntu 10.04 mit perl 5.10.1.

> 2010.05.15 19:50:40 3: CUL opening CUL device /dev/ttyACM0
> Can't locate Device/SerialPort.pm in @INC (@INC contains: /etc/perl /
> usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /
> usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/
> site_perl .) at /usr/local/lib/FHEM/00_CUL.pm line 966, <$fh> line 17.

Du mußt das Perl-Modul Device::SerialPort installieren:

cpan Device::SerialPort

Grüße,
Boris

kawa0815

unread,
May 15, 2010, 3:34:58 PM5/15/10
to FHEM users
Danke!
allen für die schnelle Hilfe!

Mit "apt-get install libdevice-serialport-perl" funktioniert der CUL
nun.

kawa
Reply all
Reply to author
Forward
0 new messages