From 73f1cdca9e705d6cb3fac6eb5b736d88b10f367f Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 27 Jan 2017 22:22:30 +0100 Subject: [PATCH] auto enableEventChange --- 21_HEOSMaster.pm | 112 ++++++++++++++++++++-------------- 21_HEOSPlayer.pm | 152 ++++++++++++++++++++++++----------------------- 2 files changed, 146 insertions(+), 118 deletions(-) diff --git a/21_HEOSMaster.pm b/21_HEOSMaster.pm index eacbc04..1f36a6c 100644 --- a/21_HEOSMaster.pm +++ b/21_HEOSMaster.pm @@ -45,7 +45,7 @@ use JSON; use Net::Telnet; -my $version = "0.1.30"; +my $version = "0.1.33"; my %heosCmds = ( @@ -76,8 +76,9 @@ sub HEOSMaster_Attr(@); sub HEOSMaster_firstRun($); sub HEOSMaster_ResponseProcessing($$); sub HEOSMaster_WriteReadings($$); -sub HEOSMaster_GetPlayers($); sub HEOSMaster_PreResponseProsessing($$); +sub HEOSMaster_GetPlayers($); +sub HEOSMaster_EnableChangeEvents($); @@ -159,6 +160,8 @@ sub HEOSMaster_Undef($$) { HEOSMaster_Close($hash); delete $modules{HEOSMaster}{defptr}{$hash->{HOST}}; + Log3 $name, 3, "HEOSPlayer ($name) - device $name deleted; + return undef; } @@ -216,7 +219,8 @@ sub HEOSMaster_Set($@) { } elsif($cmd eq 'getPlayers') { return "usage: getPlayers" if( @args != 0 ); - HEOSMaster_GetPlayers($hash); + $heosCmd = 'getPlayers'; + $action = undef; return undef; @@ -224,7 +228,7 @@ sub HEOSMaster_Set($@) { return "usage: enableChangeEvents" if( @args != 1 ); $heosCmd = $cmd; - $action = join(' ',@args); + $action = $args[0]; } elsif($cmd eq 'eventSend') { return "usage: eventSend" if( @args != 0 ); @@ -249,29 +253,6 @@ sub HEOSMaster_send($) { } -sub HEOSMaster_firstRun($) { - - my $hash = shift; - my $name = $hash->{NAME}; - - - RemoveInternalTimer($hash); - - HEOSMaster_Open($hash) if( !IsDisabled($name) ); -} - -sub HEOSMaster_GetPlayers($) { - - my $hash = shift; - my $name = $hash->{NAME}; - - - RemoveInternalTimer($hash); - - HEOSMaster_Write($hash,'getPlayers',undef); - Log3 $name, 3, "HEOSMaster ($name) - getPlayers"; -} - sub HEOSMaster_Open($) { my $hash = shift; @@ -281,7 +262,7 @@ sub HEOSMaster_Open($) { my $timeout = 1; - Log3 $name, 3, "HEOSMaster ($name) - Baue Socket Verbindung auf"; + Log3 $name, 4, "HEOSMaster ($name) - Baue Socket Verbindung auf"; my $socket = new Net::Telnet ( Host=>$host, @@ -296,9 +277,10 @@ sub HEOSMaster_Open($) { readingsSingleUpdate($hash, 'state', 'connected', 1 ); - Log3 $name, 3, "HEOSMaster ($name) - Socket Connected"; + Log3 $name, 4, "HEOSMaster ($name) - Socket Connected"; HEOSMaster_GetPlayers($hash); + } sub HEOSMaster_Close($) { @@ -324,12 +306,12 @@ sub HEOSMaster_Write($@) { $string .= "${value}" if(defined($value) or $value ne '&'); $string .= "\r\n"; - Log3 $name, 3, "HEOSMaster ($name) - WriteFn called"; + Log3 $name, 4, "HEOSMaster ($name) - WriteFn called"; - return Log3 $name, 3, "HEOSMaster ($name) - socket not connected" + return Log3 $name, 4, "HEOSMaster ($name) - socket not connected" unless($hash->{CD}); - Log3 $name, 3, "HEOSMaster ($name) - $string"; + Log3 $name, 5, "HEOSMaster ($name) - $string"; syswrite($hash->{CD}, $string); return undef; } @@ -342,12 +324,12 @@ sub HEOSMaster_Read($) { my $len; my $buf; - Log3 $name, 3, "HEOSMaster ($name) - ReadFn gestartet"; + Log3 $name, 4, "HEOSMaster ($name) - ReadFn gestartet"; - $len = sysread($hash->{CD},$buf,4096); + $len = sysread($hash->{CD},$buf,1024); # die genaue Puffergröße wird noch ermittelt if( !defined($len) || !$len ) { - Log 1, "Länge? !!!!!!!!!!"; + Log 1, "unknown buffer length"; return; } @@ -357,12 +339,12 @@ sub HEOSMaster_Read($) { } if( $buf !~ m/^[\[{].*[}\]]$/ ) { - Log3 $name, 3, "HEOSMaster ($name) - invalid json detected. start preprocessing"; + Log3 $name, 4, "HEOSMaster ($name) - invalid json detected. start preprocessing"; HEOSMaster_PreResponseProsessing($hash,$buf); return; } - Log3 $name, 3, "HEOSMaster ($name) - Daten: $buf"; + Log3 $name, 5, "HEOSMaster ($name) - Daten: $buf"; HEOSMaster_ResponseProcessing($hash,$buf); } @@ -372,7 +354,7 @@ sub HEOSMaster_PreResponseProsessing($$) { my $name = $hash->{NAME}; - Log3 $name, 3, "HEOSMaster ($name) - pre processing respone data"; + Log3 $name, 4, "HEOSMaster ($name) - pre processing respone data"; my $len = length($response); my @letterArray = split("",$response); @@ -415,13 +397,13 @@ sub HEOSMaster_ResponseProcessing($$) { my $decode_json; - Log3 $name, 3, "HEOSMaster ($name) - JSON String: $json"; + Log3 $name, 5, "HEOSMaster ($name) - JSON String: $json"; return Log3 $name, 3, "HEOSMaster ($name) - empty answer received" unless( defined($json)); - Log3 $name, 3, "HEOSMaster ($name) - json detected: $json"; + Log3 $name, 5, "HEOSMaster ($name) - json detected: $json"; $decode_json = decode_json($json); return Log3 $name, 3, "HEOSMaster ($name) - decode_json has no Hash" @@ -431,7 +413,7 @@ sub HEOSMaster_ResponseProcessing($$) { if( (defined($decode_json->{heos}{result}) and defined($decode_json->{heos}{command})) or ($decode_json->{heos}{command} =~ /^system/) ) { HEOSMaster_WriteReadings($hash,$decode_json); - Log3 $name, 3, "HEOSMaster ($name) - call Sub HEOSMaster_WriteReadings"; + Log3 $name, 4, "HEOSMaster ($name) - call Sub HEOSMaster_WriteReadings"; } if( $decode_json->{heos}{command} =~ /^player/ or $decode_json->{heos}{command} =~ /^event\/player/ ) { @@ -444,7 +426,7 @@ sub HEOSMaster_ResponseProcessing($$) { $json .= '","heos": {"command": "player/get_players"}}'; Dispatch($hash,$json,undef); - Log3 $name, 3, "HEOSMaster ($name) - call Dispatcher"; + Log3 $name, 4, "HEOSMaster ($name) - call Dispatcher"; } @@ -453,19 +435,19 @@ sub HEOSMaster_ResponseProcessing($$) { } elsif( defined($decode_json->{payload}{pid}) ) { Dispatch($hash,$json,undef); - Log3 $name, 3, "HEOSMaster ($name) - call Dispatcher"; + Log3 $name, 4, "HEOSMaster ($name) - call Dispatcher"; return; } elsif( $decode_json->{heos}{message} =~ /^pid=/ ) { Dispatch($hash,$json,undef); - Log3 $name, 3, "HEOSMaster ($name) - call Dispatcher"; + Log3 $name, 4, "HEOSMaster ($name) - call Dispatcher"; return; } } - Log3 $name, 3, "HEOSMaster ($name) - no Match for processing data"; + Log3 $name, 4, "HEOSMaster ($name) - no Match for processing data"; } sub HEOSMaster_WriteReadings($$) { @@ -495,6 +477,46 @@ sub HEOSMaster_WriteReadings($$) { return undef; } +################### +### my little Helpers + +sub HEOSMaster_firstRun($) { + + my $hash = shift; + my $name = $hash->{NAME}; + + + RemoveInternalTimer($hash); + + HEOSMaster_Open($hash) if( !IsDisabled($name) ); +} + +sub HEOSMaster_GetPlayers($) { + + my $hash = shift; + my $name = $hash->{NAME}; + + + HEOSMaster_Write($hash,'getPlayers',undef); + Log3 $name, 4, "HEOSMaster ($name) - getPlayers"; + + InternalTimer( gettimeofday()+2, 'HEOSMaster_EnableChangeEvents', $hash, 0 ); +} + +sub HEOSMaster_EnableChangeEvents($) { + + my $hash = shift; + my $name = $hash->{NAME}; + + + RemoveInternalTimer($hash); + + HEOSMaster_Write($hash,'enableChangeEvents','on'); + Log3 $name, 3, "HEOSMaster ($name) - set enableChangeEvents on"; +} + + + diff --git a/21_HEOSPlayer.pm b/21_HEOSPlayer.pm index 694594e..245c682 100644 --- a/21_HEOSPlayer.pm +++ b/21_HEOSPlayer.pm @@ -33,7 +33,7 @@ use warnings; use JSON; -my $version = "0.1.30"; +my $version = "0.1.33"; @@ -46,8 +46,11 @@ sub HEOSPlayer_Attr(@); sub HEOSPlayer_Parse($$); sub HEOSPlayer_WriteReadings($$); sub HEOSPlayer_Set($$@); -sub HEOSPlayer_GetUpdate($); sub HEOSPlayer_PreProcessingReadings($$); +sub HEOSPlayer_GetPlayerInfo($); +sub HEOSPlayer_GetPlayState($); +sub HEOSPlayer_GetNowPlayingMedia($); + @@ -134,9 +137,13 @@ sub HEOSPlayer_Define($$) { if( $init_done ) { - HEOSPlayer_GetUpdate($hash); + InternalTimer( gettimeofday()+int(rand(2)), "HEOSPlayer_GetPlayerInfo", $hash, 0 ); + InternalTimer( gettimeofday()+int(rand(4)), "HEOSPlayer_GetPlayState", $hash, 0 ); + InternalTimer( gettimeofday()+int(rand(6)), "HEOSPlayer_GetNowPlayingMedia", $hash, 0 ); } else { - InternalTimer( gettimeofday()+15, "HEOSPlayer_GetUpdate", $hash, 0 ); + InternalTimer( gettimeofday()+15+int(rand(2)), "HEOSPlayer_GetPlayerInfo", $hash, 0 ); + InternalTimer( gettimeofday()+15+int(rand(4)), "HEOSPlayer_GetPlayState", $hash, 0 ); + InternalTimer( gettimeofday()+15+int(rand(6)), "HEOSPlayer_GetNowPlayingMedia", $hash, 0 ); } return undef; @@ -154,8 +161,9 @@ sub HEOSPlayer_Undef($$) { my $code = abs($pid); $code = $hash->{IODev}->{NAME} ."-". $code if( defined($hash->{IODev}->{NAME}) ); - Log3 $name, 3, "HEOSPlayer ($name) - device deleted with Code: $code"; delete($modules{HEOSPlayer}{defptr}{$code}); + + Log3 $name, 3, "HEOSPlayer ($name) - device $name deleted with Code: $code"; return undef; } @@ -221,19 +229,19 @@ sub HEOSPlayer_Set($$@) { return "usage: play" if( @args != 0 ); $heosCmd = 'setPlayState'; - $action = 'state=play'; + $action = "state=$cmd"; } elsif( $cmd eq 'stop' ) { return "usage: stop" if( @args != 0 ); $heosCmd = 'setPlayState'; - $action = 'state=stop'; + $action = "state=$cmd"; } elsif( $cmd eq 'pause' ) { return "usage: pause" if( @args != 0 ); $heosCmd = 'setPlayState'; - $action = 'state=pause'; + $action = "state=$cmd"; } elsif( $cmd eq 'mute' ) { return "usage: mute on/off" if( @args != 1 ); @@ -256,21 +264,7 @@ sub HEOSPlayer_Set($$@) { $string .= "&$action" if( defined($action)); IOWrite($hash,"$heosCmd","$string"); - Log3 $name, 3, "HEOSPlayer ($name) - IOWrite: $heosCmd${string} IODevHash=$hash->{IODev}"; - - return undef; -} - -sub HEOSPlayer_GetUpdate($) { - - my $hash = shift; - - - RemoveInternalTimer($hash); - - IOWrite($hash,'getPlayerInfo',"pid=$hash->{PID}"); - IOWrite($hash,'getPlayState',"pid=$hash->{PID}"); - IOWrite($hash,'getNowPlayingMedia',"pid=$hash->{PID}"); + Log3 $name, 4, "HEOSPlayer ($name) - IOWrite: $heosCmd${string} IODevHash=$hash->{IODev}"; return undef; } @@ -285,7 +279,7 @@ sub HEOSPlayer_Parse($$) { $decode_json = decode_json($json); - Log3 $name, 3, "HEOSPlayer ($name) - ParseFn wurde aufgerufen"; + Log3 $name, 4, "HEOSPlayer ($name) - ParseFn wurde aufgerufen"; @@ -299,7 +293,7 @@ sub HEOSPlayer_Parse($$) { if( my $hash = $modules{HEOSPlayer}{defptr}{$code} ) { my $name = $hash->{NAME}; HEOSPlayer_GetUpdate($hash); - Log3 $name, 3, "HEOSPlayer ($name) - find logical device: $hash->{NAME}"; + Log3 $name, 4, "HEOSPlayer ($name) - find logical device: $hash->{NAME}"; return $hash->{NAME}; @@ -321,7 +315,7 @@ sub HEOSPlayer_Parse($$) { } elsif ( $decode_json->{heos}{message} =~ /^pid=/ ) { my @pid = split('&', $decode_json->{heos}{message}); $pid = substr($pid[0],4); - Log3 $name, 3, "HEOSPlayer ($name) - PID[0]: $pid[0] and PID: $pid"; + Log3 $name, 4, "HEOSPlayer ($name) - PID[0]: $pid[0] and PID: $pid"; } @@ -332,7 +326,7 @@ sub HEOSPlayer_Parse($$) { if( my $hash = $modules{HEOSPlayer}{defptr}{$code} ) { my $name = $hash->{NAME}; HEOSPlayer_WriteReadings($hash,$decode_json); - Log3 $name, 3, "HEOSPlayer ($name) - find logical device: $hash->{NAME}"; + Log3 $name, 4, "HEOSPlayer ($name) - find logical device: $hash->{NAME}"; return $hash->{NAME}; @@ -358,34 +352,23 @@ sub HEOSPlayer_WriteReadings($$) { ############################ #### Aufbereiten der Daten soweit nötig (bei Events zum Beispiel) - my ($string) = HEOSPlayer_PreProcessingReadings($hash,$decode_json) + my $readingsHash = HEOSPlayer_PreProcessingReadings($hash,$decode_json) if( $decode_json->{heos}{message} =~ /^pid=/ ); - Log3 $name, 3, "HEOSPlayer ($name) - String: $string"; - ############################ #### schreiben der Readings readingsBeginUpdate($hash); ### Event Readings - if( defined($string) ) { + if( defined($readingsHash) ) { - Log3 $name, 3, "HEOSPlayer ($name) - response json string back from HEOSPlayer_PreProcessingReadings: $string"; - - - my @valuestring = split( '@@@@', $string ); - #my @valuestring = $string if( not defined($valuestring[0])); - my %buffer; - foreach( @valuestring ) { - my @values = split( '@@' , $_ ); - $buffer{$values[0]} = $values[1]; - } + Log3 $name, 4, "HEOSPlayer ($name) - response json Hash back from HEOSPlayer_PreProcessingReadings"; my $t; my $v; - while( ( $t, $v ) = each %buffer ) { + while( ( $t, $v ) = each $readingsHash ) { if( defined( $v ) ) { readingsBulkUpdate( $hash, $t, $v ); @@ -405,24 +388,27 @@ sub HEOSPlayer_WriteReadings($$) { readingsBulkUpdate( $hash, 'ip-address', $decode_json->{payload}{ip} ); ### playing Infos - readingsBulkUpdate( $hash, 'type', $decode_json->{payload}{type} ); - readingsBulkUpdate( $hash, 'song', $decode_json->{payload}{song} ); - readingsBulkUpdate( $hash, 'album', $decode_json->{payload}{album} ); - readingsBulkUpdate( $hash, 'artist', $decode_json->{payload}{artist} ); - readingsBulkUpdate( $hash, 'imageUrl', $decode_json->{payload}{image_url} ); - readingsBulkUpdate( $hash, 'mid', $decode_json->{payload}{mid} ); - readingsBulkUpdate( $hash, 'qid', $decode_json->{payload}{qid} ); - readingsBulkUpdate( $hash, 'sid', $decode_json->{payload}{sid} ); - readingsBulkUpdate( $hash, 'station', $decode_json->{payload}{station} ); + readingsBulkUpdate( $hash, 'currentMedia', $decode_json->{payload}{type} ); + readingsBulkUpdate( $hash, 'currentTitle', $decode_json->{payload}{song} ); + readingsBulkUpdate( $hash, 'currentAlbum', $decode_json->{payload}{album} ); + readingsBulkUpdate( $hash, 'currentArtist', $decode_json->{payload}{artist} ); + readingsBulkUpdate( $hash, 'currentImageUrl', $decode_json->{payload}{image_url} ); + readingsBulkUpdate( $hash, 'currentMid', $decode_json->{payload}{mid} ); + readingsBulkUpdate( $hash, 'currentQid', $decode_json->{payload}{qid} ); + readingsBulkUpdate( $hash, 'currentSid', $decode_json->{payload}{sid} ); + readingsBulkUpdate( $hash, 'currentStation', $decode_json->{payload}{station} ); + + readingsBulkUpdate( $hash, 'state', 'on' ); readingsEndUpdate( $hash, 1 ); Log3 $name, 5, "HEOSPlayer ($name) - readings set for $name"; return undef; } + ############### -## little Helpers +### my little Helpers sub HEOSPlayer_PreProcessingReadings($$) { @@ -431,36 +417,30 @@ sub HEOSPlayer_PreProcessingReadings($$) { my $reading; my $value; - my $string = ''; + my %buffer; - Log3 $name, 3, "HEOSPlayer ($name) - preprocessing readings"; + Log3 $name, 4, "HEOSPlayer ($name) - preprocessing readings"; - if ( $decode_json->{heos}{command} =~ /play_state/ ) { + if ( $decode_json->{heos}{command} =~ /play_state/ or $decode_json->{heos}{command} =~ /player_state_changed/ ) { - my @value = split('&', $decode_json->{heos}{message}); - $value = '@@'.substr($value[1],6); - $reading = 'state'; - - $string .= "$reading${value}"; + my @value = split('&', $decode_json->{heos}{message}); + $buffer{'playStatus'} = substr($value[1],6); } elsif ( $decode_json->{heos}{command} =~ /set_volume/ ) { - my @value = split('&', $decode_json->{heos}{message}); - $value = '@@'.substr($value[1],6); - $reading = 'volume'; - - $string .= "$reading${value}"; + my @value = split('&', $decode_json->{heos}{message}); + $buffer{'volume'} = substr($value[1],6); } elsif ( $decode_json->{heos}{command} =~ /volume_changed/ ) { - my @value = split('&', $decode_json->{heos}{message}); - $string .= 'volume'; - $string .= '@@'.substr($value[1],6); - $string .= '@@@@mute'; - $string .= '@@'.substr($value[2],5); + my @value = split('&', $decode_json->{heos}{message}); + $buffer{'volume'} = substr($value[1],6); + $buffer{'mute'} = substr($value[2],5); - $string .= "$reading${value}"; + } elsif ( $decode_json->{heos}{command} =~ /player_now_playing_changed/ ) { + + IOWrite($hash,'getNowPlayingMedia',"pid=$hash->{PID}"); } else { @@ -468,10 +448,36 @@ sub HEOSPlayer_PreProcessingReadings($$) { } - Log3 $name, 3, "HEOSPlayer ($name) - no match found"; - return $string; + Log3 $name, 4, "HEOSPlayer ($name) - Match found for decode_json"; + return \%buffer; } +sub HEOSPlayer_GetPlayerInfo($) { + + my $hash = shift; + + RemoveInternalTimer($hash,'HEOSPlayer_GetPlayerInfo'); + IOWrite($hash,'getPlayerInfo',"pid=$hash->{PID}"); + +} + +sub HEOSPlayer_GetPlayState($) { + + my $hash = shift; + + RemoveInternalTimer($hash,'HEOSPlayer_GetPlayState'); + IOWrite($hash,'getPlayState',"pid=$hash->{PID}"); + +} + +sub HEOSPlayer_GetNowPlayingMedia($) { + + my $hash = shift; + + RemoveInternalTimer($hash,'HEOSPlayer_GetNowPlayingMedia'); + IOWrite($hash,'getNowPlayingMedia',"pid=$hash->{PID}"); + +}