diff --git a/fhem/CHANGED b/fhem/CHANGED index 209c47cbc..8aa77d6e4 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -5,6 +5,9 @@ - change: integrated OWServer/OWDevice nonblocking and random start time patches (justme1968 & Boris) - feature: Add new module Dashboard + - change: ONKYO_AVR: transfer command database into separate packet + ONKYOdb.pm + - feature: ENIGMA2: bouquet support e.g. for named channels - feature: Add new module ONKYO_AVR - feature: SYSSTAT: allow (remote) monitoring via snmp, support for monitoring windows systems and synology system temperature diff --git a/fhem/FHEM/70_ENIGMA2.pm b/fhem/FHEM/70_ENIGMA2.pm index 8c3f7744e..2d76e09b0 100644 --- a/fhem/FHEM/70_ENIGMA2.pm +++ b/fhem/FHEM/70_ENIGMA2.pm @@ -24,9 +24,12 @@ # along with fhem. If not, see . # # -# Version: 1.1.0 +# Version: 1.2.0 # # Version History: +# - 1.2.0 - 2013-12-21 +# -- Add bouquet support e.g. for named channels +# # - 1.1.0 - 2013-12-16 # -- Improved logging & debugging # -- added default attributes for webCmd and devStateIcon @@ -63,12 +66,14 @@ sub ENIGMA2_RCmakenotify($$); sub ENIGMA2_Initialize($) { my ($hash) = @_; + Log3 $hash, 5, "ENIGMA2_Initialize: Entering"; + $hash->{GetFn} = "ENIGMA2_Get"; $hash->{SetFn} = "ENIGMA2_Set"; $hash->{DefFn} = "ENIGMA2_Define"; $hash->{UndefFn} = "ENIGMA2_Undefine"; - $hash->{AttrList} = "" . $readingFnAttributes; + $hash->{AttrList} = "https:0,1 disable:0,1 bouquet " . $readingFnAttributes; $data{RC_layout}{ENIGMA2_DreamMultimedia_DM500_DM800_SVG} = "ENIGMA2_RClayout_DM800_SVG"; @@ -104,10 +109,14 @@ sub ENIGMA2_GetStatus($;$) { my $eventinfo; my $signalinfo; my $vol; + my $services; + my $services_list; my $changecount = 0; + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_GetStatus()"; + $local = 0 unless ( defined($local) ); - if ( defined( $hash->{attr}{disable} ) && $hash->{attr}{disable} eq "1" ) { + if ( defined( $attr{$name}{disable} ) && $attr{$name}{disable} eq "1" ) { return $hash->{STATE}; } @@ -119,6 +128,84 @@ sub ENIGMA2_GetStatus($;$) { my $powerstate = ENIGMA2_SendCommand( $hash, "powerstate", "" ); if ( defined($powerstate) && ref($powerstate) eq "HASH" ) { + + # Cache bouquet information - get favorite bouquet + # if not available from helper + if ( !defined( $hash->{helper}{bouquet} ) + || !defined( $hash->{helper}{channels} ) ) + { + $services = ENIGMA2_SendCommand( $hash, "getservices", "" ) + if ( !defined( $attr{$name}{bouquet} ) ); + + # set FHEM device attribute if not available + # multiple + if ( ref($services) eq "HASH" + && defined( $services->{e2service} ) + && ref( $services->{e2service} ) eq "ARRAY" + && defined( $services->{e2service}[0]{e2servicereference} ) + && $services->{e2service}[0]{e2servicereference} ne "" ) + { + Log3 $name, 4, "ENIGMA2 $name: Adding attribute bouquet = " + . $services->{e2service}[0]{e2servicereference}; + + $attr{$name}{bouquet} = + $services->{e2service}[0]{e2servicereference}; + } + + # single + elsif (ref($services) eq "HASH" + && defined( $services->{e2service}{e2servicereference} ) + && $services->{e2service}{e2servicereference} ne "" ) + { + Log3 $name, 4, "ENIGMA2 $name: Adding attribute bouquet = " + . $services->{e2service}[0]{e2servicereference}; + + $attr{$name}{bouquet} = + $services->{e2service}{e2servicereference}; + } + + $services_list = ENIGMA2_SendCommand( $hash, "getservices", + "sRef=" . urlEncode( $attr{$name}{bouquet} ) ); + + my $i = 0; + if ( ref($services_list) eq "HASH" ) { + for ( keys $services_list->{e2service} ) { + my $channel = + $services_list->{e2service}[$_]{e2servicename}; + $channel =~ s/\s/_/g; + + # ignore markers + if ( $services_list->{e2service}[$_]{e2servicereference} =~ + "^1:64:" ) + { + Log3 $name, 4, "ENIGMA2 $name: Ignoring marker " + . $services_list->{e2service}[$_]{e2servicename}; + next; + } + + if ( $channel ne "" ) { + $hash->{helper}{bouquet}{$channel} = + { 'sRef' => $services_list->{e2service}[$_] + {e2servicereference} }; + + $hash->{helper}{channels}[$i] = $channel; + } + + $i++; + } + + Log3 $name, 4, "ENIGMA2 $name: Cached favorite channels: " + . join( ', ', @{ $hash->{helper}{channels} } ); + } + else { + Log3 $name, 4, + "ENIGMA2 $name: ERROR: Unable to read bouquet '" + . $attr{$name}{bouquet} + . "' from device"; + } + + } + if ( $powerstate->{e2instandby} eq "true" ) { $state = "off"; } @@ -132,7 +219,7 @@ sub ENIGMA2_GetStatus($;$) { $vol = ENIGMA2_SendCommand( $hash, "vol", "" ); # Read eventinfo - # multiple + # multiple if ( ref($serviceinfo) eq "HASH" && defined( $serviceinfo->{e2service} ) && ref( $serviceinfo->{e2service} ) eq "ARRAY" @@ -149,7 +236,7 @@ sub ENIGMA2_GetStatus($;$) { ); } - # single + # single elsif (ref($serviceinfo) eq "HASH" && defined( $serviceinfo->{e2service}{e2servicereference} ) && $serviceinfo->{e2service}{e2servicereference} ne "" ) @@ -166,6 +253,8 @@ sub ENIGMA2_GetStatus($;$) { } } elsif ( $hash->{helper}{AVAILABLE} == 1 ) { + Log3 $name, 2, "ENIGMA2 $name: ERROR: Undefined state of device"; + $state = "undefined"; } else { @@ -255,8 +344,10 @@ sub ENIGMA2_GetStatus($;$) { { readingsBulkUpdate( $hash, $reading, $boxinfo->{e2about}{$e2reading}, 1 ); - readingsBulkUpdate( $hash, "channel", - $boxinfo->{e2about}{$e2reading}, 1 ); + + my $channel = $boxinfo->{e2about}{$e2reading}; + $channel =~ s/\s/_/g; + readingsBulkUpdate( $hash, "channel", $channel, 1 ); } } else { @@ -269,7 +360,7 @@ sub ENIGMA2_GetStatus($;$) { } # HDD - # multiple + # multiple if ( defined( $boxinfo->{e2about}{e2hddinfo} ) && ref( $boxinfo->{e2about}{e2hddinfo} ) eq "ARRAY" ) { @@ -315,7 +406,7 @@ sub ENIGMA2_GetStatus($;$) { } - # single + # single elsif ( defined( $boxinfo->{e2about}{e2hddinfo} ) && ref( $boxinfo->{e2about}{e2hddinfo} ) eq "HASH" ) { @@ -355,7 +446,7 @@ sub ENIGMA2_GetStatus($;$) { if ( defined( $boxinfo->{e2about}{e2tunerinfo}{e2nim} ) ) { my %tuner = %{ $boxinfo->{e2about}{e2tunerinfo}{e2nim} }; - # single + # single if ( defined( $tuner{type} ) ) { my $tunerRef = \%tuner; my $tuner_name = lc( $$tunerRef{name} ); @@ -370,7 +461,7 @@ sub ENIGMA2_GetStatus($;$) { } - # multiple + # multiple else { for ( keys %tuner ) { my $tuner_name = lc($_); @@ -408,7 +499,7 @@ sub ENIGMA2_GetStatus($;$) { } # servicereference + input + currentMedia - # multiple + # multiple if ( ref($serviceinfo) eq "HASH" && defined( $serviceinfo->{e2service} ) && ref( $serviceinfo->{e2service} ) eq "ARRAY" ) @@ -426,7 +517,8 @@ sub ENIGMA2_GetStatus($;$) { my @servicetype = split( /:/, $serviceinfo->{e2service}[0]{e2servicereference} ); - if ( defined( $servicetype[2] ) && $servicetype[2] eq "2" ) { + if ( defined( $servicetype[2] ) && $servicetype[2] eq "2" ) + { readingsBulkUpdate( $hash, "input", "radio", 1 ); } else { @@ -440,7 +532,7 @@ sub ENIGMA2_GetStatus($;$) { } } - # single + # single elsif ( ref($serviceinfo) eq "HASH" && defined( $serviceinfo->{e2service} ) ) { @@ -454,10 +546,12 @@ sub ENIGMA2_GetStatus($;$) { readingsBulkUpdate( $hash, "currentMedia", $serviceinfo->{e2service}{e2servicereference}, 1 ); - my @servicetype = split( /:/, + my @servicetype = + split( /:/, $serviceinfo->{e2service}{e2servicereference} ); - if ( defined( $servicetype[2] ) && $servicetype[2] eq "2" ) { + if ( defined( $servicetype[2] ) && $servicetype[2] eq "2" ) + { readingsBulkUpdate( $hash, "input", "radio", 1 ); } else { @@ -570,7 +664,8 @@ sub ENIGMA2_GetStatus($;$) { } else { -# Set ENIGMA2 online-only readings to "-" in case box is in offline or in standby mode + # Set ENIGMA2 online-only readings to "-" in case box is in + # offline or in standby mode foreach ( 'servicename', 'servicenamespace', 'serviceaspect', 'serviceprovider', 'servicereference', 'videowidth', @@ -591,7 +686,8 @@ sub ENIGMA2_GetStatus($;$) { } } -# Set ENIGMA2 online-only readings to "-" in case box is in offline or in standby mode + # Set ENIGMA2 online-only readings to "-" in case box is in + # offline or in standby mode foreach ( 'acg', 'ber', 'snr', 'snrdb', ) { if ( !defined( $hash->{READINGS}{$_}{VAL} ) || $hash->{READINGS}{$_}{VAL} ne "0" ) @@ -610,8 +706,11 @@ sub ENIGMA2_GetStatus($;$) { ################################### sub ENIGMA2_Get($@) { my ( $hash, @a ) = @_; + my $name = $hash->{NAME}; my $what; + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_Get()"; + return "argument is missing" if ( int(@a) < 2 ); $what = $a[1]; @@ -653,42 +752,60 @@ sub ENIGMA2_Get($@) { } else { return -"Unknown argument $what, choose one of power:noArg input:noArg volume:noArg mute:noArg channel:noArg currentMedia:noArf currentTitle:noArg serviceprovider:noArg servicevideosize:noArg streamUrl:,mobile "; +"Unknown argument $what, choose one of power:noArg input:noArg volume:noArg mute:noArg channel:noArg currentMedia:noArg currentTitle:noArg serviceprovider:noArg servicevideosize:noArg streamUrl:,mobile "; } } ################################### sub ENIGMA2_Set($@) { my ( $hash, @a ) = @_; - my $name = $hash->{NAME}; - my $state = $hash->{STATE}; + my $name = $hash->{NAME}; + my $state = $hash->{STATE}; + my $channels = ""; + + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_Set()"; return "No Argument given" if ( !defined( $a[1] ) ); + # load channel list + if ( !defined( $hash->{helper}{bouquet} ) + || ! + defined( $hash->{helper}{bouquet}{ $hash->{READINGS}{channel}{VAL} } ) ) + { + $channels .= $hash->{READINGS}{channel}{VAL} . ","; + } + $channels .= join( ',', @{ $hash->{helper}{channels} } ) + if ( defined( $hash->{helper}{channels} ) + && ref( $hash->{helper}{channels} ) eq "ARRAY" ); + my $usage = "Unknown argument " . $a[1] - . ", choose one of statusRequest:noArg toggle:noArg on:noArg off:noArg reboot:noArg restartGui:noArg shutdown:noArg volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg mute:on,off msg remoteControl:UP,DOWN,LEFT,RIGHT,OK,MENU,EPG,ESC,EXIT,RECORD,RED,GREEN,YELLOW,BLUE,AUDIO channelUp:noArg channelDown:noArg play:noArg pause:noArg stop:noArg showText "; - $usage .= -" channel:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 input:tv,radio" - if ( $state eq "on" ); - $usage .= -" channel:-,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 input:-,tv,radio" + . ", choose one of statusRequest:noArg toggle:noArg on:noArg off:noArg reboot:noArg restartGui:noArg shutdown:noArg volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg mute:on,off msg remoteControl:UP,DOWN,LEFT,RIGHT,OK,MENU,EPG,ESC,EXIT,RECORD,RED,GREEN,YELLOW,BLUE,AUDIO channelUp:noArg channelDown:noArg play:noArg pause:noArg stop:noArg showText channel:" + . $channels; + $usage .= " input:-,tv,radio" if ( $state ne "on" ); + $usage .= " input:tv,radio" + if ( $state eq "on" ); + my $cmd = ''; my $result; # statusRequest if ( $a[1] eq "statusRequest" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 4, "ENIGMA2 $name: Clearing cache for bouquet and channels"; - # Will be executed anyway on the end of the function + $hash->{helper}{bouquet} = undef; + $hash->{helper}{channels} = undef; + + # actual statusRequest be executed anyway on the end of the function } # toggle elsif ( $a[1] eq "toggle" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{power}{VAL} eq "off" ) { return ENIGMA2_Set( $hash, $name, "on" ); @@ -701,7 +818,7 @@ sub ENIGMA2_Set($@) { # shutdown elsif ( $a[1] eq "shutdown" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { $cmd = "newstate=1"; @@ -736,7 +853,7 @@ sub ENIGMA2_Set($@) { # reboot elsif ( $a[1] eq "reboot" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { $cmd = "newstate=2"; @@ -749,7 +866,7 @@ sub ENIGMA2_Set($@) { # restartGui elsif ( $a[1] eq "restartGui" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { $cmd = "newstate=3"; @@ -762,7 +879,7 @@ sub ENIGMA2_Set($@) { # on elsif ( $a[1] eq "on" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "absent" ) { if ( defined( $hash->{READINGS}{lanmac}{VAL} ) @@ -796,7 +913,7 @@ sub ENIGMA2_Set($@) { # off elsif ( $a[1] eq "off" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { $cmd = "newstate=5"; @@ -821,7 +938,7 @@ sub ENIGMA2_Set($@) { # volume elsif ( $a[1] eq "volume" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; return "No argument given" if ( !defined( $a[2] ) ); @@ -848,7 +965,7 @@ sub ENIGMA2_Set($@) { # volumeUp/volumeDown elsif ( $a[1] =~ /^(volumeUp|volumeDown)$/ ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { if ( $a[1] eq "volumeUp" ) { @@ -866,9 +983,9 @@ sub ENIGMA2_Set($@) { # mute elsif ( $a[1] eq "mute" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; - return "No argument given, choose on of on off" + return "No argument given, choose one of on off" if ( !defined( $a[2] ) ); if ( $hash->{READINGS}{state}{VAL} eq "on" ) { @@ -905,7 +1022,7 @@ sub ENIGMA2_Set($@) { # msg elsif ( $a[1] eq "msg" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { return @@ -964,7 +1081,7 @@ sub ENIGMA2_Set($@) { # remoteControl elsif ( $a[1] eq "remoteControl" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { if ( !defined( $a[2] ) ) { @@ -1024,15 +1141,20 @@ sub ENIGMA2_Set($@) { ENIGMA2_Set( $hash, $name, "on" ); } - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; return - "No argument given, choose one of channelNumber servicereference " +"No argument given, choose one of channel channelNumber servicereference " if ( !defined( $a[2] ) ); if ( $hash->{READINGS}{state}{VAL} eq "on" ) { my $_ = $a[2]; - if (m/^(\d+):(.*):$/) { + if ( defined( $hash->{helper}{bouquet}{$_}{sRef} ) ) { + $result = + ENIGMA2_SendCommand( $hash, "zap", + "sRef=" . urlEncode( $hash->{helper}{bouquet}{$_}{sRef} ) ); + } + elsif (m/^(\d+):(.*):$/) { $result = ENIGMA2_SendCommand( $hash, "zap", "sRef=" . urlEncode($_) ); } @@ -1058,7 +1180,7 @@ sub ENIGMA2_Set($@) { # channelUp/channelDown elsif ( $a[1] =~ /^(channelUp|channelDown)$/ ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { if ( $a[1] eq "channelUp" ) { @@ -1087,7 +1209,7 @@ sub ENIGMA2_Set($@) { return "No argument given, choose one of tv radio " if ( !defined( $a[2] ) ); - Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1] . " " . $a[2]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { if ( $a[2] eq "tv" || $a[2] eq "TV" ) { @@ -1113,7 +1235,7 @@ sub ENIGMA2_Set($@) { # play / pause elsif ( $a[1] =~ /^(play|pause)$/ ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { $cmd = "command=" . ENIGMA2_GetRemotecontrolCommand("PLAYPAUSE"); @@ -1126,7 +1248,7 @@ sub ENIGMA2_Set($@) { # stop elsif ( $a[1] eq "stop" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} eq "on" ) { $cmd = "command=" . ENIGMA2_GetRemotecontrolCommand("STOP"); @@ -1139,7 +1261,7 @@ sub ENIGMA2_Set($@) { # showText elsif ( $a[1] eq "showText" ) { - Log3 $name, 3, "ENIGMA2 set $name " . $a[1]; + Log3 $name, 2, "ENIGMA2 set $name " . $a[1]; if ( $hash->{READINGS}{state}{VAL} ne "absent" ) { return "No argument given, choose one of messagetext " @@ -1186,6 +1308,8 @@ sub ENIGMA2_Define($$) { my @a = split( "[ \t][ \t]*", $def ); my $name = $hash->{NAME}; + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_Define()"; + if ( int(@a) < 3 ) { my $msg = "Wrong syntax: define ENIGMA2 [] [] []"; @@ -1213,10 +1337,10 @@ sub ENIGMA2_Define($$) { $hash->{helper}{PASSWORD} = $http_passwd if $http_passwd; # set default attributes - unless ( exists( $hash->{attr}{webCmd} ) ) { + unless ( exists( $attr{$name}{webCmd} ) ) { $attr{$name}{webCmd} = 'channel:input'; } - unless ( exists( $hash->{attr}{devStateIcon} ) ) { + unless ( exists( $attr{$name}{devStateIcon} ) ) { $attr{$name}{devStateIcon} = 'on:rc_GREEN:off off:rc_YELLOW:on absent:rc_STOP:on'; } @@ -1248,6 +1372,17 @@ sub ENIGMA2_SendCommand($$;$) { my $address = $hash->{helper}{ADDRESS}; my $port = $hash->{helper}{PORT}; + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_SendCommand()"; + + my $http_proto; + if ( $port eq "443" + || ( defined( $attr{$name}{https} ) && $attr{$name}{https} eq "1" ) ) + { + $http_proto = "https"; + } + else { + $http_proto = "http"; + } my $http_user = $hash->{helper}{USER} if ( defined( $hash->{helper}{USER} ) ); my $http_passwd = $hash->{helper}{PASSWORD} @@ -1265,7 +1400,7 @@ sub ENIGMA2_SendCommand($$;$) { if ( defined($http_user) && defined($http_passwd) ) { $URL = - "http://" + $http_proto . "://" . $http_user . ":" . $http_passwd . "@" . $address . ":" @@ -1275,7 +1410,7 @@ sub ENIGMA2_SendCommand($$;$) { } elsif ( defined($http_user) ) { $URL = - "http://" + $http_proto . "://" . $http_user . "@" . $address . ":" . $port . "/web/" @@ -1284,7 +1419,11 @@ sub ENIGMA2_SendCommand($$;$) { } else { $URL = - "http://" . $address . ":" . $port . "/web/" . $service . "?" . $cmd; + $http_proto . "://" + . $address . ":" + . $port . "/web/" + . $service . "?" + . $cmd; } Log3 $name, 5, "ENIGMA2 $name: GET " . urlDecode($URL); @@ -1355,6 +1494,9 @@ sub ENIGMA2_SendCommand($$;$) { ################################### sub ENIGMA2_Undefine($$) { my ( $hash, $arg ) = @_; + my $name = $hash->{NAME}; + + Log3 $name, 5, "ENIGMA2 $name: called function ENIGMA2_Undefine()"; # Stop the internal GetStatus-Loop and exit RemoveInternalTimer($hash); @@ -1907,6 +2049,8 @@ sub ENIGMA2_GetRemotecontrolCommand($) { 'BRIGHTNESSUP' => 225, 'MEDIA' => 226, 'UNKNOWN' => 240, + 'BTN_0' => 256, + 'BTN_1' => 257, 'OK' => 352, 'SELECT' => 353, 'GOTO' => 354, @@ -1976,9 +2120,7 @@ sub ENIGMA2_GetRemotecontrolCommand($) { 'INS_LINE' => 450, 'DEL_LINE' => 451, 'ASCII' => 510, - 'MAX' => 511, - 'BTN_0' => 256, - 'BTN_1' => 257 + 'MAX' => 511 }; if ( defined( $commands->{$command} ) ) { @@ -2039,7 +2181,7 @@ sub ENIGMA2_GetRemotecontrolCommand($) {
  • shutdown   -   turns the device in deepstandby mode
  • reboot   -  reboots the device
  • restartGui   -  restarts the GUI / ENIGMA2 process
  • -
  • channel 0...999,sRef   -   zap to specific channel or service reference
  • +
  • channel channel,0...999,sRef   -   zap to specific channel or service reference
  • channelUp   -   zap to next channel
  • channelDown   -   zap to previous channel
  • volume 0...100   -   set the volume level in percentage