auto enableEventChange

This commit is contained in:
Marko Oldenburg 2017-01-27 22:22:30 +01:00
parent b098e86fdd
commit 73f1cdca9e
2 changed files with 146 additions and 118 deletions

View File

@ -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";
}

View File

@ -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}");
}