HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen

Begonnen von mgernoth, 30 Mai 2013, 17:06:32

Vorheriges Thema - Nächstes Thema

marc2

Hallo Johann,

Du nutzt schon FritzOS 6. Auch wenn sich die Kernel Version nicht geändert hat kann sich da durchaus was geändert haben.
Ich habe mich noch nie darum gekümmert, was AVM hier für eine Strategie fährt, ich weiß nur, dass z.B. bei RHES die
Kernel-Version über ein gesamtes Major Release aus Gründen der Kompatiblität gleich bleibt, obwohl über Zeit unzählige
Backports einfließen. Anyway, die libusb-1 von mir ist definitiv auf Basis von FritzOS 5.52  gebaut worden, und dies könnte
im Zweifelsfall das Problem sein.

Gruß, Marc

mgernoth

Hallo Johann,

Zitat von: johann am 06 November 2013, 20:03:12
...das ist auch ein Unterschied. Bei der FB bleibt hmland hier hängen, wenn ich den Stick abziehe:

hmcfgusb_poll: Input/output error
Can't release interface: No such device (it may have been disconnected)


Mit welchen Optionen hast Du den hmland da gestartet?

Wenn es im "normalen" TCP-Modus war (also nicht interactive), hätte er da noch mindestens ein "Connection to xxx closed!" sagen müssen. Das einzige was da hängen kann ist das shutdown auf den Socket, d.h. der hmland konnte die Verbindung zu Fhem nicht sauber schliessen. Aber eigentlich dürfte dieser Systemcall auch nicht blockieren. Du hast nicht zufällig ein strace auf der FritzBox und kannst mit strace -p <pid des hmland> nachschauen, wo er hängt?

Zitat
Auf dem Ubuntu versucht er ständig den Stick wieder zu finden.

Ja, so sollte es auch sein.

Gruß
  Michael, der hoffentlich bald die Zeit findet eine README zu schreiben und dann Version 0.1 zu releasen

RalfP

die Optionen waren:
hmland -l 127.0.0.1 -p 1234 -d -r 0 -D

habe strace soeben probiert, geht aber leider nicht. Hätte theoretisch in /usr/bin/ sein können.

RalfP

#123
Hallo Michael,

habe eine strace mips Version gefunden. Die hat auch sehr viel ausgespuckt:


poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 6951) = 1 ([{fd=7, revents=POLLOUT}])
ioctl(7, USBDEVFS_REAPURBNDELAY, 0x7ff0fc40) = 0
clock_gettime(CLOCK_MONOTONIC, {66040, 383251179}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}, {fd=4, events=POLLIN}, {fd=3, events=POLLIN}], 4, 1000) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {66041, 385196766}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {66041, 386193688}) = 0
clock_gettime(CLOCK_MONOTONIC, {66041, 386695983}) = 0
ioctl(7, USBDEVFS_SUBMITURB, 0x416388)  = 0
clock_gettime(CLOCK_MONOTONIC, {66041, 387695389}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 5927) = 1 ([{fd=7, revents=POLLOUT}])
ioctl(7, USBDEVFS_REAPURBNDELAY, 0x7ff0fc40) = 0
clock_gettime(CLOCK_MONOTONIC, {66041, 407128630}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}, {fd=4, events=POLLIN}, {fd=3, events=POLLIN}], 4, 1000) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {66042, 409170226}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {66042, 410179136}) = 0
clock_gettime(CLOCK_MONOTONIC, {66042, 410671099}) = 0
ioctl(7, USBDEVFS_SUBMITURB, 0x416388)  = 0
clock_gettime(CLOCK_MONOTONIC, {66042, 411632418}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 4903) = 1 ([{fd=7, revents=POLLOUT}])
ioctl(7, USBDEVFS_REAPURBNDELAY, 0x7ff0fc40) = 0
clock_gettime(CLOCK_MONOTONIC, {66042, 431160373}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}, {fd=4, events=POLLIN}, {fd=3, events=POLLIN}], 4, 1000) = 1 ([{fd=7, revents=POLLOUT|POLLERR|POLLHUP}])
clock_gettime(CLOCK_MONOTONIC, {66043, 354046193}) = 0
poll([{fd=5, events=POLLIN}, {fd=7, events=POLLOUT}], 2, 0) = 1 ([{fd=7, revents=POLLOUT|POLLERR|POLLHUP}])
write(2, "Interrupt transfer not completed"..., 34) = 34
write(2, "Unknown error code 5 / 0x05", 27) = 27
write(2, "!\n", 2)                      = 2
write(2, "closing device-connection due to"..., 39) = 39
write(2, "5", 1)                        = 1
write(2, "\n", 1)                       = 1
write(2, "hmcfgusb_poll", 13)           = 13
write(2, ": ", 2)                       = 2
write(2, "Input/output error", 18)      = 18
write(2, "\n", 1)                       = 1
ioctl(7, SNDRV_CTL_IOCTL_ELEM_LIST or USBDEVFS_RELEASEINTERFACE, 0x7ff0fdd4) = -1 ENODEV (No such device)
write(2, "Can't release interface: ", 25) = 25
write(2, "No such device (it may have been"..., 46) = 46
write(2, "\n", 1)                       = 1
write(6, "\1", 1)                       = 1
read(5, "\1", 1)                        = 1
close(7)                                = 0
close(5)                                = 0
close(6)                                = 0
futex(0x416188, FUTEX_WAKE, 2147483647) = 0
futex(0x416118, FUTEX_WAIT_PRIVATE, 2147483647, NULLProcess 1658 detached
<detached ...>


Den Stick habe ich abgezogen, dann blieb auch das Logging stehen. Nach dem wieder Anstecken ging es nicht weiter. Ich hoffe es ist hilfreich.

Hier noch die selbe Passage von meinem Ubuntu, wo es ja läuft:

poll([{fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLOUT}], 3, 0) = 1 ([{fd=8, revents=POLLOUT}])
ioctl(8, USBDEVFS_REAPURBNDELAY or USBDEVFS_REAPURBNDELAY32, 0x7fff912739a8) = 0
timerfd_settime(7, 0, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
write(2, "Interrupt transfer not completed"..., 63) = 63
write(2, "closing device-connection due to"..., 41) = 41
write(2, "hmcfgusb_poll: Input/output erro"..., 34) = 34
ioctl(8, USBDEVFS_RELEASEINTERFACE, 0x7fff91273a3c) = 0
write(6, "\1", 1)                       = 1
read(5, "\1", 1)                        = 1
close(8)                                = 0
shutdown(4, 2 /* send and receive */)   = 0
close(4)                                = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2246, ...}) = 0
write(1, "2013-11-07 17:47:15.018312: Conn"..., 60) = 60
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, 0x7fff91273980)       = 0
accept(3, {sa_family=AF_INET, sin_port=htons(38969), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2246, ...}) = 0
write(1, "2013-11-07 17:47:16.020279: Clie"..., 56) = 56
openat(AT_FDCWD, "/sys/bus/usb/devices", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 8
getdents(8, /* 14 entries */, 32768)    = 384
open("/sys/bus/usb/devices/1-1/busnum", O_RDONLY) = 9
fstat(9, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4175fc8000
read(9, "1\n", 4096)                    = 2
close(9)                                = 0
munmap(0x7f4175fc8000, 4096)            = 0
open("/sys/bus/usb/devices/1-1/devnum", O_RDONLY) = 9
fstat(9, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4175fc8000
read(9, "2\n", 4096)                    = 2


Gruß
Ralf (so werde ich normalerweise gerufen, das mit den Nicknames ist schon manchmal blöd)

Alex

Hallo,

vielleicht ist das ein bisschen Off-topic. Mein server macht einen regelmäßigen reboot. Leider fällt hmland jedes mal dem reboot zum Opfer. Wie/wo muss ich bei Debian den Befehl eintragen damit der Dienst beim Neustart mit startet?

RalfP

Hallo,

bin ich einen Schritt weiter?


usb-transfer took 44ms!
2013-11-07 21:57:42.905373: LAN > K

USB < 0x0000: 4b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   K...............
USB < 0x0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
USB < 0x0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
USB < 0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................                                                 

USB > 0x0000: 48 09 48 4d 2d 55 53 42 2d 49 46 03 bc 0a 4a 45   H.HM-USB-IF...JE
USB > 0x0010: 51 30 35 33 35 33 32 37 1d b1 fc 42 42 42 00 b5   Q0535327...BBB..
USB > 0x0020: 0b ea 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
USB > 0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................                                                 
2013-11-07 21:57:42.960996: LAN < HHM-LAN-IF,03BC,JEQ0535327,1DB1FC,424242,00B50BEA,0000
usb-transfer took 53ms!
Interrupt transfer not completed: Unknown error code 5 / 0x05!
closing device-connection due to error 5
hmcfgusb_poll: Input/output error
Can't release interface: No such device (it may have been disconnected)
2013-11-07 21:57:49.708630: Connection to 127.0.0.1 closed!
2013-11-07 21:57:50.709127: Client 127.0.0.1 connected!
Can't find/open hmcfgusb!
Can't initialize HM-CFG-USB!
2013-11-07 21:57:50.745626: Connection to 127.0.0.1 closed!
2013-11-07 21:57:51.746804: Client 127.0.0.1 connected!
Can't find/open hmcfgusb!
Can't initialize HM-CFG-USB!
2013-11-07 21:57:51.747749: Connection to 127.0.0.1 closed!
2013-11-07 21:57:52.750342: Client 127.0.0.1 connected!
Can't find/open hmcfgusb!
Can't initialize HM-CFG-USB!
2013-11-07 21:57:52.751418: Connection to 127.0.0.1 closed!
2013-11-07 21:57:53.752007: Client 127.0.0.1 connected!
Can't find/open hmcfgusb!


Ich habe eine neu libusb mit der Toolchain für Freetz (FB7390) gebaut. Im Auswahlmenü konnte ich schon die neu 6er SW für die FB auswählen. Nach Installation und Auswahl des libusb Paketes im Menü, brauchte ich sie nur aus dem build heraus zu fischen. Jetzt entsteht das obige Log, wenn ich den Stick abziehe an der FB. Leider passiert aber nichts, wenn ich ihn wieder anstecke.  >:(

Müsste ich evtl. hmland darüber auch noch einmal bauen? Wenn ja, bräuchte ich dazu aber ein wenig Hilfe.

...schönen Abend noch

marc2

#126
Hi !

Ich habe beides mal für FritzOS 6 gebaut (libusb + hmland). Ohne Gewähr, da ich es nicht selber testen konnte ...

Wenn Du den hmland selber bauen willst ist das sehr einfach:

1) Source im Target Verzeichnis von Freetz kopieren, bei mir ist das dann z.B.

/shared/soft/src/fritzbox/7390/freetz-devel/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/hmcfgusb

2) Makefile so anpassen, dass  der Cross Compiler aus dem Toolchain genutzt wird. Das sieht bei mir
    wie folgt aus:

CFLAGS=-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
LDLIBS=-lusb-1.0
CC=/shared/soft/src/fritzbox/7390/freetz-devel/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc

HMLAN_OBJS=hmcfgusb.o hmland.o
HMSNIFF_OBJS=hmcfgusb.o hmsniff.o

OBJS=$(HMLAN_OBJS) $(HMSNIFF_OBJS)

all: hmland hmsniff

DEPEND=$(OBJS:.o=.d)
-include $(DEPEND)

hmland: $(HMLAN_OBJS)

hmsniff: $(HMSNIFF_OBJS)

clean:
rm -f $(HMLAN_OBJS) $(HMSNIFF_OBJS) $(DEPEND) hmland hmsniff

.PHONY: all clean


3) Dann "make" und fertig ist der hmland  :)

Gruß, Marc

RalfP

Hallo Marc,

vielen Dank. Gestern Abend habe ich mir noch die fhem Installation zerschossen, weil ich eine Datei zu viel gelöscht hatte. Ein vorher gezogenes Backup hätte wohl geholfen es schnell zu finden - aber wie es so ist im Leben ist, ich durfte noch mal installieren. Man wird immer nur schlauer dabei  ::)

Kurzer Test ergab - deine Binaries funktionieren. Zumindest überlebt es nun einen "Shutdown Reset" von fhem. Leider aber noch nicht das Ab- und Anstecken des Sticks.

Werde ich heute noch mal eingehend untersuchen, muss aber erst einmal meine Brötchen verdienen  :-\

Auch Danke für die Tipps mit dem Makefile. Werde ich probieren. Es macht langsam richtig Spaß...

einen schönen Tag wünsche ich
Gruß
Ralf 

RalfP

#128
Hallo,

auf Grund von Marc's Hilfe, kann ich nun mittlerweile hmland übersetzen und für's Debug verändern.

Wie gesagt, das Abziehen und und Anstecken funktioniert nicht.


USB < 0x0000: 54 1a 0f ee ff 04 00 00 00 00 00 00 00 00 00 00   T...............
USB < 0x0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
USB < 0x0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
USB < 0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................                                                 
usb-transfer took 55ms!
Interrupt transfer not completed: Unknown error code 5 / 0x05!
closing device-connection due to error 5
hmcfgusb_poll: Input/output error
Can't release interface: No such device (it may have been disconnected)
2013-11-08 20:50:58.149743: Connection to 127.0.0.1 closed!
2013-11-08 20:50:59.151563: Client 127.0.0.1 connected!
Vendor:Device = 058f:6366
Vendor:Device = 1d6b:0001
Vendor:Device = 1d6b:0002
Vendor:Device = 058f:6366
Vendor:Device = 1d6b:0001
Vendor:Device = 1d6b:0002
Can't find/open hmcfgusb!
Can't initialize HM-CFG-USB!
2013-11-08 20:50:59.198200: Connection to 127.0.0.1 closed!
2013-11-08 20:51:00.198724: Client 127.0.0.1 connected!
Vendor:Device = 058f:6366
Vendor:Device = 1d6b:0001
Vendor:Device = 1d6b:0002
Vendor:Device = 058f:6366
Vendor:Device = 1d6b:0001
Vendor:Device = 1d6b:0002
Can't find/open hmcfgusb!
Can't initialize HM-CFG-USB!


In hmcfgusb_find habe ich die Vendor  und Device ID ausgeben lassen. Man sieht, das nach dem Anstecken der Stick mit Vendor:Device = 1b1f:c00f nicht wieder auftaucht. Erst wenn ich hmland beende und wieder starte steht er gleich an erster Stelle. Es scheint das die Liste nicht aktualisiert wird.


for (i = 0; i < cnt; i++){
struct libusb_device_descriptor desc;

err = libusb_get_device_descriptor(list[i], &desc);

fprintf(stderr, "Vendor:Device = %04x:%04x\n", desc.idVendor, desc.idProduct);

if (err)
continue;

if ((desc.idVendor == vid) && (desc.idProduct == pid)) {
libusb_device *dev = list[i];


mmh ???


Nachtrag: Habe das Logging der libusb aktiviert. Wenn ich den Stick wieder anschließe bekomme ich:

libusbx: error [_open_sysfs_attr] open /sys/bus/usb/devices/2-1/descriptors failed ret=-1 errno=2


Ist übrigens libusbx-1.0.17.

Wieder mmh ??? - ein Rechteproblem?

Gruß
Ralf

hyman

Hallo Alex,

Zitat von: Alex am 07 November 2013, 21:27:26
Wie/wo muss ich bei Debian den Befehl eintragen damit der Dienst beim Neustart mit startet?

Ich habe XBian, das ist auch eine Art Debian. Daher sollte das bei Dir genau so gehen, wie ich das weiter oben im Thread beschriebe habe.

Grüße von Horst

RalfP

Hallo Michael,

...hab ich evtl. eine Lösung gefunden?


struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data)
{
libusb_device_handle *devh = NULL;
const struct libusb_pollfd **usb_pfd = NULL;
struct hmcfgusb_dev *dev = NULL;
struct hmcfgusb_cb_data *cb_data = NULL;
int bootloader = 0;
int err;
int i;

err = libusb_init(NULL);
if (err != 0) {
fprintf(stderr, "Can't initialize libusb: %s\n", usb_strerror(err));
return NULL;
}

libusb_set_debug(NULL, 3); //Ralf: set verbosity level to 3, as suggested in the documentation

devh = hmcfgusb_find(ID_VENDOR, ID_PRODUCT);
if (!devh) {
devh = hmcfgusb_find(ID_VENDOR, ID_PRODUCT_BL);
if (!devh) {
fprintf(stderr, "Can't find/open hmcfgusb!\n");
libusb_exit(NULL); //Ralf
return NULL;
}
bootloader = 1;
}

dev = malloc(sizeof(struct hmcfgusb_dev));
if (!dev) {
perror("Can't allocate memory for hmcfgusb_dev");
return NULL;
}


Es scheint zu funktionieren. Ich kann den Stick abziehen und wieder anstecken oder ein Reboot auslösen, er ist wieder ansprechbar. Nach dem der Stick nicht in der Liste gefunden wurde, habe ich ein libusb_exit(NULL); "Deinitialize libusb" eingefügt. Damit wird die libusb deinitialisiert und mit jedem init wieder frisch initialisiert. War bestimmt nicht so gedacht, brachte mich aber weiter. Ich hätte auch gedacht, das die Liste sich aktualisiert, was sie aber nicht tat.

Was sagst du dazu? Ist dies der richtige Weg?

Gruß
Ralf


mgernoth

#131
Hallo Ralf,

Zitat von: johann am 10 November 2013, 20:49:00
Es scheint zu funktionieren. Ich kann den Stick abziehen und wieder anstecken oder ein Reboot auslösen, er ist wieder ansprechbar. Nach dem der Stick nicht in der Liste gefunden wurde, habe ich ein libusb_exit(NULL); "Deinitialize libusb" eingefügt.

Klasse! Ja, das wird es sein.
Irgendwie rufe ich libusb_exit() fast nirgends auf, das muss noch an mehreren Stellen rein. Ich fixe das jetzt mal und committe dann ins git.

EDIT: Änderungen sind ins GIT gepushed, Version ist jetzt 0.091-git.

Danke & Gruß
  Michael

Thisoft

Hallo Michael,

mal eine gaaanz vorsichtige, total ketzerische Frage ;) :
Wäre eine Portierung dieses feinen Tools in die Windows-Welt denkbar? Ich könnte mich da vielleicht auch ein wenig mit einbringen. Die C-Sourcen kann ich ja auch mit Visual-Studio bearbeiten. Das erste Problem entsteht da aber mit der "libusb". Ich habe jetzt kein Windows-Pendant dafür gefunden...

Vielleicht schlagt Ihr mich hier aber auch schon für dieses Ansinnen :-[ In dem Fall sag ich dann einfach "duck und wech.."

Gruß Thilo

kud

Ich habe nun die 9 Seiten durchgelesen und habe keine passende Lösung gefunden.
Wie starte und stoppe ich hmland auf einem RasbPi am elegantesten ?
In der /etc/init.d/fhem ? (Start/Stop-Parameter)


ItsMe57

Hilfe!  :P

Auf der 7390 läuft nun FHEM.
Mit FTP habe ich die  libusb-1.0.so.0.1.0, etc nach fhem/tools kopieren können.

Wie aber erhalte ich root oder admin Zugriff um nun LD_LIBRARY_PATH zu setzen?

Der telnet auf 7072 führt ja nur zum FHEM Prompt.

FW 6.0