[Neues Modul] BOSE SoundTouch

Begonnen von dominik, 05 Januar 2016, 22:28:40

Vorheriges Thema - Nächstes Thema

dominik

Hi Eisix,

der State des Hauptdevices bleibt immer auf "initialized". Unter "Unsorted" erscheinen dann die gefundenen Devices, prüfe dort mal ob neue Devices angelegt wurden.

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Eisix

Hallo,

nein da erscheint nur das BOSEST.
Autocreate ist aktiv

Gruß
Thorsten

dominik

Net::Bonjour ist installiert? Probier mal den Code in einem test.pl File mit "perl test.pl" auszuführen:
use Net::Bonjour;

my $res = Net::Bonjour->new('soundtouch');

$res->discover;

foreach my $entry ($res->entries) {
        printf "%s %s:%d\n", $entry->name, $entry->address, $entry->port;
}

Nach paar Sekunden sollten da die Boxen gelistet werden.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Eisix

wird nichts gelistet.

cpanm Net::Bonjour
Net::Bonjour is up to date. (0.96)

Das testscript mit dem Mojo gibt aber Daten zurück.


dominik

Ok, dann liegt es irgendwo am Netzwerk. Die Boxen sind sicher im gleichen Subnet wie FHEM? Keine Firewalls oder sonstige Ports auf der FHEM Maschine blockiert? Du kannst auch mal Wireshark am PC laufen lassen und dann das Testscript ausführen. Wenn du in Wireshark danach auf "mdns" filtertest, sollte die Suche nach _soundtouch und die Ergebnisse ersichtlich sein.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Eisix

Ist eine Soundtouch10 gleiches Subnet. Hab ein Ping über presence laufen und da ist die IP erreichbar. FW auf dem internen Interface sollte aus sein. Schaue mir das ganze nachher mit Wireshark an.

Welcher socket wird abgefragt? Dann kann ich mit Telnet testen.

Gruß
Eisix

dominik

Bonjour sendet einen UDP Broadcast an die IP 244.0.0.251 Port 5353. Die Devices antworten dann ebenfalls über einen UDP Broadcast an die gleiche IP und Port.

Kannst du die Box eigentlich aus dem gleichen Netzwerk wie FHEM mit der SoundTouch App steuern? Die verwendet nämlich auch nur Bonjour.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Eisix

Hallo,

hatte gestern Abend keine Zeit mehr.

Telnet auf 5353 wird rejected.

Wireshark zeigt nichts bzgl. mdns ausgehend vom Server. Eventuell ein Problem mit dem Bonjour Modul !?

Box läßt sich mit der App aus dem Netz steuern. Werde mal Wireshark mitlaufen lassen wenn ich über App ansteuere.

Gruß
Eisix

Eisix

Hallo,

Wireshark beim Bedienen mit der App zeigt wie erwartet die mdns UDP Pakete. An meinem Perl passt was nicht.
Fahre mal Updates.

Gruß
Eisix

Eisix

Hallo,

habe überall Updates eingespielt (Perl, Soundtouch,OS) 

Das einzige was ich mit Wireshark von meinem Server sehe ist

MDNS   86   Standard query response 0x0000  A, cache flush

Das Test script zeigt nur
#perl  test.pl
0 :0

use Net::Bonjour;

my $res = Net::Bonjour->new('_soundtouch._tcp.local');

$res->discover;

foreach my $entry ($res->entries) {
        printf "%s %s:%d\n", $entry->name, $entry->address, $entry->port;
}


Jemand noch eine Idee?

Gruß
Eisix

Eisix

Habe noch use diagnostics zugefügt.

Damit kriege ich

#perl test.pl
Use of uninitialized value in sprintf at
   /usr/lib/perl5/site_perl/5.18.2/Net/Bonjour.pm line 223 (#1)
    (W uninitialized) An undefined value was used as if it were already
    defined.  It was interpreted as a "" or a 0, but maybe it was a mistake.
    To suppress this warning assign a defined value to your variables.
   
    To help you figure out what was undefined, perl will try to tell you
    the name of the variable (if any) that was undefined.  In some cases
    it cannot do this, so it also tells you what operation you used the
    undefined value in.  Note, however, that perl optimizes your program
    anid the operation displayed in the warning may not necessarily appear
    literally in your program.  For example, "that $foo" is usually
    optimized into "that " . $foo, and the warning will refer to the
    concatenation (.) operator, even though there is no . in
    your program.
   
Use of uninitialized value $query in string eq at
   /usr/lib/perl5/site_perl/5.18.2/Net/Bonjour.pm line 233 (#1)
Use of uninitialized value in sprintf at
   /usr/lib/perl5/site_perl/5.18.2/Net/Bonjour/Entry.pm line 249 (#1)
Use of uninitialized value in printf at test.pl line 9 (#1)
0 :0


Jetzt bräuchte ich nur noch einen Perl Experten ;-)

Gruß
Eisix

Eisix

Wenn ich das ganze über avahi mache wird alles korrekt angezeigt.


avahi-browse -a -r -t


Net::Rendezvous::Publish::Backend::Avahi

Hat jemand sowas schon mal über Avahi implementiert?

Gruß
Eisix

dominik

Hallo Eisix,

die Avahi Perl Implementierung erlaubt leider nur ein Publish eine Services, aber keine Suche. Hast du auch schon mal libnet-bonjour-perl komplett neu installiert oder über cpanminus installiert? Glaub zwar nicht ganz das es daran liegt, aber einen Versuch ist es wert.

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Eisix

Hallo Dominik,

libnet-bonjour-perl für SuSE Leap habe ich keine gefunden, auch in anderen Namenskombinationen. Aber cpanminus geht natürlich. Eine Neuinstallation ändert aber nichts. Von dem Fehler ausgehend scheint Net::DNS::Resolver das eigentliche Problem zu sein. Dieses Modul läßt sich nur mit force installieren. Ich denke ich laufe da irgendwo in einen Bug.

Als Workaround: Könntest du mir die alte Version geben bei der man die IP noch angeben mußte? Mit der subroutine sollte dann zumindest der Rest funktionieren oder sehe ich das falsch?

Gruß
Eisix

Eisix

Mir ist noch eine quick & dirty Lösung für mich eingefallen.

Ich könnte den Bonjour Teil mit Shell avahi ersetzen


use Net::Bonjour;

my $res = Net::Bonjour->new('soundtouch');

$res->discover;

foreach my $entry ($res->entries) {
        printf "%s %s:%d\n", $entry->name, $entry->address, $entry->port;
}



my $bose = `avahi-browse -r -t _soundtouch._tcp`;

Der output sieht so aus


+   eth0 IPv4 Bose SoundTouch 6304CC                        _soundtouch._tcp     local
=   eth0 IPv4 Bose SoundTouch 6304CC                        _soundtouch._tcp     local
   hostname = [689e197305cc.local]
   address = [192.168.10.112]
   port = [8090]
   txt = ["MAC=689E197305CC"]

Und hier kommt wieder der Perl Guru ins Spiel der den output auf dein Format umsetzt.

Gruß
Eisix