2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

Mediaportal: Added errorhandling according wrong plugins, add feature PositionPercent

git-svn-id: https://svn.fhem.de/fhem/trunk@14031 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Reinerlein 2017-04-18 20:44:59 +00:00
parent be5daa0bd5
commit f81d9e515d

View File

@ -5,7 +5,7 @@
# #
# $Id$ # $Id$
# #
# Changed, adopted and new copyrighted by Reiner Leins (Reinerlein), (c) in March 2017 # Changed, adopted and new copyrighted by Reiner Leins (Reinerlein), (c) in April 2017
# Original Copyright by Andreas Kwasnik (gemx) # Original Copyright by Andreas Kwasnik (gemx)
# #
# Fhem is free software: you can redistribute it and/or modify # Fhem is free software: you can redistribute it and/or modify
@ -23,6 +23,10 @@
# #
######################################################################################## ########################################################################################
# Changelog # Changelog
# 18.04.2017
# Es gibt ein neues Reading "PositionPercent", welches die aktuelle Postion als Prozentangabe enthält
# Bei einem Disconnect wird nun 3x versucht eine neue Verbindung aufzubauen
# Es wurde ein Fehlerhandling eingebaut, wenn keine Plugins geladen werden konnten.
# 12.03.2017 # 12.03.2017
# Es gibt einen neuen Getter "plugins", der das Reading "Plugins" mit den aktuell verfügbaren Plugins und deren WindowIds belegt # Es gibt einen neuen Getter "plugins", der das Reading "Plugins" mit den aktuell verfügbaren Plugins und deren WindowIds belegt
# Es gibt einen neuen Setter "window" der als Parameter eine WindowId oder einen Pluginnamen (URL-Encoded mit %20 für Leerzeichen!) erhält # Es gibt einen neuen Setter "window" der als Parameter eine WindowId oder einen Pluginnamen (URL-Encoded mit %20 für Leerzeichen!) erhält
@ -66,6 +70,7 @@ sub MEDIAPORTAL_Set($@);
sub MEDIAPORTAL_Log($$$); sub MEDIAPORTAL_Log($$$);
my $MEDIAPORTAL_HeartbeatInterval = 15; my $MEDIAPORTAL_HeartbeatInterval = 15;
my $MEDIAPORTAL_MaxGraceRetries = 3;
######################################################################################## ########################################################################################
# #
@ -113,7 +118,7 @@ sub MEDIAPORTAL_Define($$) {
$hash->{STATE} = 'disconnected'; $hash->{STATE} = 'disconnected';
my $ret = undef; my $ret = undef;
$ret = DevIo_OpenDev($hash, 0, 'MEDIAPORTAL_DoInit') if AttrVal($hash->{NAME}, 'disable', 0); $ret = DevIo_OpenDev($hash, 0, 'MEDIAPORTAL_DoInit') if (!AttrVal($hash->{NAME}, 'disable', 0));
return $ret; return $ret;
} }
@ -192,6 +197,7 @@ sub MEDIAPORTAL_DoInit($) {
readingsSingleUpdate($hash, 'state', 'Connecting...', 1); readingsSingleUpdate($hash, 'state', 'Connecting...', 1);
$hash->{helper}{buffer} = ''; $hash->{helper}{buffer} = '';
$hash->{helper}{LastStatusTimestamp} = time(); $hash->{helper}{LastStatusTimestamp} = time();
$hash->{GraceRetries} = 0;
# Versuch, die MAC-Adresse des Ziels selber herauszufinden... # Versuch, die MAC-Adresse des Ziels selber herauszufinden...
if (AttrVal($hash->{NAME}, 'macaddress', '') eq '') { if (AttrVal($hash->{NAME}, 'macaddress', '') eq '') {
@ -267,9 +273,19 @@ sub MEDIAPORTAL_GetStatus($) {
sub MEDIAPORTAL_GetIntervalStatus($) { sub MEDIAPORTAL_GetIntervalStatus($) {
my ($hash) = @_; my ($hash) = @_;
return undef if (ReadingsVal($hash->{NAME}, 'state', 'disconnected') eq 'disconnected'); # Heartbeat-Prüfung nur machen, wenn es auch gewünscht wurde...
return undef if (!AttrVal($hash->{NAME}, 'HeartbeatInterval', $MEDIAPORTAL_HeartbeatInterval)); return undef if (!AttrVal($hash->{NAME}, 'HeartbeatInterval', $MEDIAPORTAL_HeartbeatInterval));
# Ein "Disconnected" wird erst nach einigen Fehlversuchen hingenommen...
if (ReadingsVal($hash->{NAME}, 'state', 'disconnected') eq 'disconnected') {
$hash->{GraceRetries}++;
return undef if ($hash->{GraceRetries} > $MEDIAPORTAL_MaxGraceRetries);
# Reconnect veranlassen...
MEDIAPORTAL_Set($hash, ($hash->{NAME}, 'reconnect'));
InternalTimer(gettimeofday() + AttrVal($hash->{NAME}, 'HeartbeatInterval', $MEDIAPORTAL_HeartbeatInterval), 'MEDIAPORTAL_GetIntervalStatus', $hash, 0);
}
# Prüfen, wann der letzte Status zugestellt wurde... # Prüfen, wann der letzte Status zugestellt wurde...
if (time() - $hash->{helper}{LastStatusTimestamp} > (2 * $MEDIAPORTAL_HeartbeatInterval + 5)) { if (time() - $hash->{helper}{LastStatusTimestamp} > (2 * $MEDIAPORTAL_HeartbeatInterval + 5)) {
MEDIAPORTAL_Log $hash->{NAME}, 3, 'GetIntervalStatus hat festgestellt, dass Mediaportal sich seit '.(time() - $hash->{helper}{LastStatusTimestamp}).'s nicht zurückgemeldet hat. Die Verbindung wird neu aufgebaut!'; MEDIAPORTAL_Log $hash->{NAME}, 3, 'GetIntervalStatus hat festgestellt, dass Mediaportal sich seit '.(time() - $hash->{helper}{LastStatusTimestamp}).'s nicht zurückgemeldet hat. Die Verbindung wird neu aufgebaut!';
@ -337,6 +353,11 @@ sub MEDIAPORTAL_Set($@) {
if ($macaddress ne '') { if ($macaddress ne '') {
MEDIAPORTAL_Wakeup($macaddress); MEDIAPORTAL_Wakeup($macaddress);
$hash->{GraceRetries} = 0;
MEDIAPORTAL_Set($hash, ($hash->{NAME}, 'reconnect'));
InternalTimer(gettimeofday() + AttrVal($hash->{NAME}, 'HeartbeatInterval', $MEDIAPORTAL_HeartbeatInterval), 'MEDIAPORTAL_GetIntervalStatus', $hash, 0);
return 'WakeUp-Signal sent!'; return 'WakeUp-Signal sent!';
} else { } else {
return 'No MacAddress set! No WakeUp-Signal sent!'; return 'No MacAddress set! No WakeUp-Signal sent!';
@ -410,7 +431,10 @@ sub MEDIAPORTAL_Set($@) {
} }
$cmd = "{\"Type\":\"window\",\"Window\":$param}\r\n"; $cmd = "{\"Type\":\"window\",\"Window\":$param}\r\n";
} else { } else {
my %plugins = %{eval(ReadingsVal($hash->{NAME}, 'Plugins', '{}'))}; my %plugins = ();
eval {
%plugins = %{eval(ReadingsVal($hash->{NAME}, 'Plugins', '{}'))};
};
return "Unknown command '$cname', choose one of wakeup:noArg sleep:noArg connect:noArg reconnect:noArg command:".join(',', split(/ /, $mpcommands))." key Volume:slider,0,1,100 powermode:".join(',', split(/ /, $powermodes))." playfile playchannel playradiochannel playlist window".((scalar(keys(%plugins)) != 0) ? ':'.join(',', map { s/ /%20/g; $_; } sort(keys(%plugins))) : ''); return "Unknown command '$cname', choose one of wakeup:noArg sleep:noArg connect:noArg reconnect:noArg command:".join(',', split(/ /, $mpcommands))." key Volume:slider,0,1,100 powermode:".join(',', split(/ /, $powermodes))." playfile playchannel playradiochannel playlist window".((scalar(keys(%plugins)) != 0) ? ':'.join(',', map { s/ /%20/g; $_; } sort(keys(%plugins))) : '');
} }
@ -436,6 +460,7 @@ sub MEDIAPORTAL_Read($) {
return undef if AttrVal($hash->{NAME}, 'disable', 0); return undef if AttrVal($hash->{NAME}, 'disable', 0);
$hash->{GraceRetries} = 0;
MEDIAPORTAL_Log $hash->{NAME}, 5, "RAW MSG: $buf"; MEDIAPORTAL_Log $hash->{NAME}, 5, "RAW MSG: $buf";
# Zum Buffer hinzufügen # Zum Buffer hinzufügen
@ -533,6 +558,11 @@ sub MEDIAPORTAL_ProcessMessage($$) {
readingsBulkUpdate($hash, 'Duration', MEDIAPORTAL_ConvertSecondsToTime($json->{Duration})); readingsBulkUpdate($hash, 'Duration', MEDIAPORTAL_ConvertSecondsToTime($json->{Duration}));
readingsBulkUpdate($hash, 'Position', MEDIAPORTAL_ConvertSecondsToTime($json->{Position})); readingsBulkUpdate($hash, 'Position', MEDIAPORTAL_ConvertSecondsToTime($json->{Position}));
if ($json->{Duration}) {
readingsBulkUpdate($hash, 'PositionPercent', $json->{Position} / $json->{Duration});
} else {
readingsBulkUpdate($hash, 'PositionPercent', 0);
}
readingsBulkUpdate($hash, 'File', $json->{File}); readingsBulkUpdate($hash, 'File', $json->{File});
readingsBulkUpdate($hash, 'Title', ''); readingsBulkUpdate($hash, 'Title', '');
@ -592,11 +622,16 @@ sub MEDIAPORTAL_ProcessMessage($$) {
MEDIAPORTAL_Log $hash->{NAME}, 4, 'DIALOG received.'; MEDIAPORTAL_Log $hash->{NAME}, 4, 'DIALOG received.';
} elsif ($json->{Type} eq "plugins") { } elsif ($json->{Type} eq "plugins") {
MEDIAPORTAL_Log $hash->{NAME}, 1, 'Plugins received.'; MEDIAPORTAL_Log $hash->{NAME}, 1, 'Plugins received.';
eval {
my %plugins = (); my %plugins = ();
foreach (@{$json->{Plugins}}) { foreach (@{$json->{Plugins}}) {
$plugins{$_->{Name}} = $_->{WindowId}; $plugins{$_->{Name}} = $_->{WindowId};
} }
readingsSingleUpdate($hash, 'Plugins', MEDIAPORTAL_Dumper(\%plugins), 1); readingsSingleUpdate($hash, 'Plugins', MEDIAPORTAL_Dumper(\%plugins), 1);
};
if ($@) {
MEDIAPORTAL_Log $hash->{NAME}, 1, "Error during processing of plugins: $@";
}
} else { } else {
MEDIAPORTAL_Log $hash->{NAME}, 1, "Unhandled message received: MessageType '$json->{Type}'"; MEDIAPORTAL_Log $hash->{NAME}, 1, "Unhandled message received: MessageType '$json->{Type}'";
} }
@ -774,7 +809,7 @@ sub MEDIAPORTAL_Dumper($) {
######################################################################################## ########################################################################################
# #
# MEDIAPORTAL_Log - Log to the normal Log-command with the prefix 'SONOSPLAYER' # MEDIAPORTAL_Log - Log to the normal Log-command with the prefix 'MEDIAPORTAL'
# #
######################################################################################## ########################################################################################
sub MEDIAPORTAL_Log($$$) { sub MEDIAPORTAL_Log($$$) {