[21_HEOSMaster,21_HEOSPlayer,21_HEOSGroup] Module für das Denon Multiroomsystem

Begonnen von CoolTux, 21 Januar 2017, 21:47:52

Vorheriges Thema - Nächstes Thema

grappa24

Zitat von: CoolTux am 04 Februar 2017, 19:22:47
Erstmal muss mein Junior wieder gesund werden.
gute Besserung.

Zitatoder wenn ferngesehen wird sieht man es im fernsehr als Anzeige.
Das hätt ich ja auch gern, das geht aber mit meinem Samsung  UE55ES8090 leider nit, obwohl der auch am LAN hängt ...  :(
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

grappa24

FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

grappa24

Ihr seht ja, bin fleißig am Spielen mit Visualisierung. Mir würde ein klickbares Icon für den HEOS-Player reichen, womit man play/stop togglen könnte. Am Einfachsten ginge das doch, wenn man state mit play/stop belegen würde anstelle mit on/off, spräche das was dagegen? Ein  klickbares dummy zu bauen, womit man play/stop togglen kann ist schon aufwändig, oder bin ich da auf dem falschen Weg?
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

CoolTux

Da wir uns bei der Entwicklung an AV Guidelines halten, müssen wir es so lassen wie es ist.
Du kannst aber versuchen ob Du was mit stateFormat und/oder webCmd machen kannst.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

hanseis

Hi,

hatte folgende Fehlermeldung im Log
Zitat
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Initialize redefined at ./FHEM/21_HEOSMaster.pm line 97, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Define redefined at ./FHEM/21_HEOSMaster.pm line 125, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Undef redefined at ./FHEM/21_HEOSMaster.pm line 165, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Attr redefined at ./FHEM/21_HEOSMaster.pm line 180, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Set redefined at ./FHEM/21_HEOSMaster.pm line 215, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Open redefined at ./FHEM/21_HEOSMaster.pm line 284, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Close redefined at ./FHEM/21_HEOSMaster.pm line 314, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_ReOpen redefined at ./FHEM/21_HEOSMaster.pm line 328, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Write redefined at ./FHEM/21_HEOSMaster.pm line 338, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_Read redefined at ./FHEM/21_HEOSMaster.pm line 362, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_PreResponseProsessing redefined at ./FHEM/21_HEOSMaster.pm line 388, <$fh> line 373.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSMaster_ResponseProcessing redefined at ./FHEM/21_HEOSMaster.pm line 429, <$fh> line 373.
2017.02.07 14:17:23 1: reload: Error:Modul 21_HEOSMaster deactivated:
Experimental each on scalar is now forbidden at ./FHEM/21_HEOSMaster.pm line 520, <$fh> line 373.

2017.02.07 14:17:23 0: Experimental each on scalar is now forbidden at ./FHEM/21_HEOSMaster.pm line 520, <$fh> line 373.

2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Initialize redefined at ./FHEM/21_HEOSPlayer.pm line 60, <$fh> line 378.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Define redefined at ./FHEM/21_HEOSPlayer.pm line 85, <$fh> line 378.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Undef redefined at ./FHEM/21_HEOSPlayer.pm line 164, <$fh> line 378.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Attr redefined at ./FHEM/21_HEOSPlayer.pm line 183, <$fh> line 378.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Set redefined at ./FHEM/21_HEOSPlayer.pm line 214, <$fh> line 378.
2017.02.07 14:17:23 1: PERL WARNING: Subroutine HEOSPlayer_Parse redefined at ./FHEM/21_HEOSPlayer.pm line 338, <$fh> line 378.
2017.02.07 14:17:23 1: reload: Error:Modul 21_HEOSPlayer deactivated:
Experimental each on scalar is now forbidden at ./FHEM/21_HEOSPlayer.pm line 445, <$fh> line 378.

2017.02.07 14:17:23 0: Experimental each on scalar is now forbidden at ./FHEM/21_HEOSPlayer.pm line 445, <$fh> line 378.

Meine Perl Version ist 5.24.0. Da gibt es wohl Probleme mit dem Feature. Ich hab es dann dadurch gelöst das ich folgenden Code in beiden Modulen ersetzt habe.


#while( ( $t, $v ) = each $readingsHash ) {
while( ( $t, $v ) = each(%{$readingsHash}) ) {


Vielleicht hilft es ja jemandem.  ;)
Ansonsten ist das ne saubere Arbeit! Ich warte schon gespannt auf die Gruppenfeature.
Vielleicht könnte man noch eine automatische Erkennung über UPNP eines HEOS genau wie beim SONOS Modul einbauen?

CoolTux

Hallo,

Vielen Dank für den Patchcode. Das ist in der Tat eine viel saubere Lösung.
Am Gruppenmodul bin ich dran. Dauert aber noch etwas.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

pataya

So, bin heute auch mal zum ersten testen gekommen.
Readings funktionieren soweit.

Gab allerdings ein paar Fehler im Log. Evtl. interessant für dich:
2017.02.07 18:36:22 1: PERL WARNING: each on reference is experimental at ./FHEM/21_HEOSMaster.pm line 520.
2017.02.07 18:36:22 3: HEOSMaster (HEOS_Soundbar) - defined with host 192.168.178.109
2017.02.07 18:36:35 1: PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/21_HEOSMaster.pm line 479.
2017.02.07 18:36:35 1: PERL WARNING: each on reference is experimental at ./FHEM/21_HEOSPlayer.pm line 445.
2017.02.07 18:43:31 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/21_HEOSMaster.pm line 252.


CoolTux

Zwei von den Meldungen sind in der Tat interessant. Weiß aber so schön was es ist, lach.
Wenn man einen Hash vergleicht sollte man vorher prüfen ob der auch wirklich existiert. Lach.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

hanseis

Hi,

hab auch noch etwas gespielt. :D
Wenn man in der HEOS_Player.pm unter der sub HEOSPlayer_Attr diesen Block hinzufügt ergibt das ein zusätzliches Attribut "mute2play":

if( $attrName eq "mute2play" ) {
    if( $cmd eq "set" and $attrVal eq "1" ) {
        readingsSingleUpdate ( $hash, "mute2play", "enable", 1 );
        Log3 $name, 3, "HEOSPlayer ($name) - mute2play enable";
    } elsif( $cmd eq "set" and $attrVal eq "0" or $cmd eq "del" ) {
        readingsSingleUpdate ( $hash, "mute2play", "disabled", 1 );
        Log3 $name, 3, "HEOSPlayer ($name) - mute2play disabled";
    }
}


Dann in der sub HEOSPlayer_PreProcessingReadings folgendes hinzufügen.

$buffer{'volume'}   = substr($value[1],6);
$buffer{'mute'}     = substr($value[2],5) if( $decode_json->{heos}{command} =~ /volume_changed/ );
if (defined($buffer{'mute'}) && AttrVal($name, 'mute2play', 0) == 1) {
IOWrite($hash,'setPlayState',"pid=$hash->{PID}&state=play") if $buffer{'mute'} eq "off";
IOWrite($hash,'setPlayState',"pid=$hash->{PID}&state=stop") if $buffer{'mute'} eq "on";
}


Damit lässt sich die Mute Taste an den Boxen wie bei SONOS Boxen benutzen. Beim auslösen von mute wird auch der Stream angehalten. 8)


CoolTux

Cool Sache. Vielen Dank für den Code.
Ich werde ihn vorerst mal so übernehmen. Vorerst deswegen, weil ich das ausführen einer Aktion innerhalb einer Auswertungsroutine zum setzen von Readings deplaziert finde.
Das hat nichts mit Deinem Code zu tun, der ist toll, sondern einzig mit meinen persönlichen Ansprüchen an strukturierten Code.
Persönlich denke ich wäre das Auswerten eines Readings und einer damit verbundenen Aktion in der NotifyFn Routine besser aufgehoben.


Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Mir ist da gerade etwas eingefallen. Wie verhält es sich wenn ein Livestream kommt, also Radio hören? Wird der dann auch gestoppt?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

hanseis

Ja, benutze ich gerade ausgiebig. Bei nochmaligem Druck startet der HEOS die letzte Quelle.
Das funktioniert selbst wenn der HEOS per App oder FHEM gestoppt wurde. Dann drückt man zweinal auf mute und der Stream startet wieder da sich das mute beim ersten Druck auf die Taste erstmal synchronisieren muss.

CoolTux

Ich habe nach Rücksprache mit einem anderen Entwickler entschieden das wir es doch so lassen wie Du es gemacht hast. Das NotifyFn wäre zwar strukturiert aber nicht ganz effizient. Daher übernehme ich es genau so.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

hanseis

Prima  :)

Mir ist aufgefallen das beim neu definieren der Slider für die  Lautstärke diese nicht korrekt anzeigt. Da wäre ein Aufruf von GetVolume in HEOSPlayer_Define recht hilfreich.

    if( $init_done ) {
        InternalTimer( gettimeofday()+int(rand(5)), "HEOSPlayer_GetPlayerInfo", $hash, 0 );
        InternalTimer( gettimeofday()+int(rand(10)), "HEOSPlayer_GetPlayState", $hash, 0 );
        InternalTimer( gettimeofday()+int(rand(15)), "HEOSPlayer_GetNowPlayingMedia", $hash, 0 );
        InternalTimer( gettimeofday()+int(rand(20)), "HEOSPlayer_GetPlayMode", $hash, 0 );
InternalTimer( gettimeofday()+int(rand(25)), "HEOSPlayer_GetVolume", $hash, 0 );

   } else {
        InternalTimer( gettimeofday()+15+int(rand(5)), "HEOSPlayer_GetPlayerInfo", $hash, 0 );
        InternalTimer( gettimeofday()+15+int(rand(10)), "HEOSPlayer_GetPlayState", $hash, 0 );
        InternalTimer( gettimeofday()+15+int(rand(15)), "HEOSPlayer_GetNowPlayingMedia", $hash, 0 );
        InternalTimer( gettimeofday()+15+int(rand(20)), "HEOSPlayer_GetPlayMode", $hash, 0 );
InternalTimer( gettimeofday()+15+int(rand(25)), "HEOSPlayer_GetVolume", $hash, 0 );

    }


Die Sub sieht dann so aus.

sub HEOSPlayer_GetVolume($) {

    my $hash        = shift;
   
    RemoveInternalTimer($hash,'HEOSPlayer_GetVolume');
    IOWrite($hash,'getVolume',"pid=$hash->{PID}");
   
}


Damit das dann auch empfangen wird, muß noch diese Zeile in HEOSPlayer_PreProcessingReadings geändert werden.

} elsif ( $decode_json->{heos}{command} =~ /volume_changed/ or $decode_json->{heos}{command} =~ /set_volume/ or $decode_json->{heos}{command} =~ /get_volume/) {


und im HEOS_Master dann den getVolume Befehl mit aufnehmen.

my %heosCmds = (
    'enableChangeEvents'        => 'system/register_for_change_events?enable=',
    'checkAccount'              => 'system/check_account',
    'signAccountIn'             => 'system/sign_in?',
    'signAccountOut'             => 'system/sign_out',
    'reboot'                           => 'system/reboot',
    'getMusicSources'           => 'browse/get_music_sources',
    'browseSources'             => 'browse/browse?',
    'getPlayers'                    => 'player/get_players',
    'getPlayerInfo'               => 'player/get_player_info?',
    'getPlayState'                => 'player/get_play_state?',
    'getPlayMode'                => 'player/get_play_mode?',
    'setPlayState'                => 'player/set_play_state?',
    'setPlayMode'                => 'player/set_play_mode?',
    'setMute'                       => 'player/set_mute?',
    'playNext'                      => 'player/play_next?',
    'playPrev'                      => 'player/play_prev?',
    'setVolume'                   => 'player/set_volume?',
    'getVolume'                   => 'player/get_volume?',
    'volumeUp'                    => 'player/volume_up?',
    'volumeDown'               => 'player/volume_down?',
    'getNowPlayingMedia'  => 'player/get_now_playing_media?',
    'eventChangeVolume'  => 'event/player_volume_changed'
);


fettisch :D