diff --git a/fhem/FHEM/70_ENIGMA2.pm b/fhem/FHEM/70_ENIGMA2.pm
index d73bc252b..88452a919 100644
--- a/fhem/FHEM/70_ENIGMA2.pm
+++ b/fhem/FHEM/70_ENIGMA2.pm
@@ -24,7 +24,7 @@
# along with fhem. If not, see .
#
#
-# Version: 1.4.4
+# Version: 1.4.5
#
# Major Version History:
# - 1.4.0 - 2014-11-27
@@ -83,7 +83,7 @@ sub ENIGMA2_Initialize($) {
$hash->{UndefFn} = "ENIGMA2_Undefine";
$hash->{AttrList} =
-"https:0,1 http-method:GET,POST http-noshutdown:1,0 disable:0,1 bouquet-tv bouquet-radio timeout remotecontrol:standard,advanced,keyboard lightMode:0,1 macaddr:textField "
+"https:0,1 http-method:GET,POST http-noshutdown:1,0 disable:0,1 bouquet-tv bouquet-radio timeout remotecontrol:standard,advanced,keyboard lightMode:0,1 macaddr:textField wakeupCmd:textField "
. $readingFnAttributes;
$data{RC_layout}{ENIGMA2_DreamMultimedia_DM500_DM800_SVG} =
@@ -123,7 +123,7 @@ sub ENIGMA2_GetStatus($;$) {
InternalTimer( gettimeofday() + $interval, "ENIGMA2_GetStatus", $hash, 0 );
return
- if ( defined( $attr{$name}{disable} ) && $attr{$name}{disable} == 1 );
+ if ( AttrVal( $name, "disable", 0 ) == 1 );
if ( !$update ) {
ENIGMA2_SendCommand( $hash, "powerstate" );
@@ -353,17 +353,27 @@ sub ENIGMA2_Set($@) {
elsif ( lc( $a[1] ) eq "on" ) {
if ( $hash->{READINGS}{state}{VAL} eq "absent" ) {
Log3 $name, 3, "ENIGMA2 set $name " . $a[1] . " (wakeup)";
+ my $wakeupCmd = AttrVal( $name, "wakeupCmd", "" );
+ my $macAddr =
+ AttrVal( $name, "macaddr", ReadingsVal( $name, "lanmac", "" ) );
- if (
- (
- defined( $hash->{READINGS}{lanmac}{VAL} )
- && $hash->{READINGS}{lanmac}{VAL} ne "-"
- )
- || ( defined( $attr{$name}{macaddr} )
- && $attr{$name}{macaddr} ne "" )
- )
- {
- $result = ENIGMA2_wake($hash);
+ if ( $wakeupCmd ne "" ) {
+ $wakeupCmd =~ s/\$DEVICE/$name/g;
+ $wakeupCmd =~ s/\$MACADDR/$macAddr/g;
+
+ if ( $wakeupCmd =~ s/^[ \t]*\{|\}[ \t]*$//g ) {
+ Log3 $name, 4,
+ "ENIGMA2 executing wake-up command (Perl): $wakeupCmd";
+ $result = eval $wakeupCmd;
+ }
+ else {
+ Log3 $name, 4,
+ "ENIGMA2 executing wake-up command (fhem): $wakeupCmd";
+ $result = fhem $wakeupCmd;
+ }
+ }
+ elsif ( $macAddr ne "" && $macAddr ne "-" ) {
+ $result = ENIGMA2_wake( $name, $macAddr );
return "wake-up command sent";
}
else {
@@ -2313,45 +2323,34 @@ sub ENIGMA2_Undefine($$) {
}
###################################
-sub ENIGMA2_wake ($) {
- my ($hash) = @_;
- my $name = $hash->{NAME};
- my $mac_addr =
- ( defined( $attr{$name}{macaddr} ) )
- ? $attr{$name}{macaddr}
- : $hash->{READINGS}{lanmac}{VAL};
+sub ENIGMA2_wake ($$) {
+ my ( $name, $mac_addr ) = @_;
my $address;
my $port;
- if ( $mac_addr ne "-" ) {
- if ( !defined $address ) { $address = '255.255.255.255' }
- if ( !defined $port || $port !~ /^\d+$/ ) { $port = 9 }
+ if ( !defined $address ) { $address = '255.255.255.255' }
+ if ( !defined $port || $port !~ /^\d+$/ ) { $port = 9 }
- my $sock = new IO::Socket::INET( Proto => 'udp' )
- or die "socket : $!";
- die "Can't create WOL socket" if ( !$sock );
+ my $sock = new IO::Socket::INET( Proto => 'udp' )
+ or die "socket : $!";
+ die "Can't create WOL socket" if ( !$sock );
- my $ip_addr = inet_aton($address);
- my $sock_addr = sockaddr_in( $port, $ip_addr );
- $mac_addr =~ s/://g;
- my $packet =
- pack( 'C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16 );
+ my $ip_addr = inet_aton($address);
+ my $sock_addr = sockaddr_in( $port, $ip_addr );
+ $mac_addr =~ s/://g;
+ my $packet =
+ pack( 'C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16 );
- setsockopt( $sock, SOL_SOCKET, SO_BROADCAST, 1 )
- or die "setsockopt : $!";
+ setsockopt( $sock, SOL_SOCKET, SO_BROADCAST, 1 )
+ or die "setsockopt : $!";
- Log3 $name, 4,
- "ENIGMA2 $name: Waking up by sending Wake-On-Lan magic package to "
- . $mac_addr;
- send( $sock, $packet, 0, $sock_addr ) or die "send : $!";
- close($sock);
- }
- else {
- Log3 $name, 3,
-"ENIGMA2 $name: Unknown MAC address. Please turn on device manually once.";
- }
+ Log3 $name, 4,
+ "ENIGMA2 $name: Waking up by sending Wake-On-Lan magic package to "
+ . $mac_addr;
+ send( $sock, $packet, 0, $sock_addr ) or die "send : $!";
+ close($sock);
- return 1;
+ return;
}
#####################################
@@ -3141,6 +3140,9 @@ sub ENIGMA2_GetRemotecontrolCommand($) {
timeout - Set different polling timeout in seconds (default=6)
+
+ wakeupCmd - Set a command to be executed when turning on an absent device. Can be an FHEM command or Perl command in {}. Available variables: ENIGMA2 device name -> $DEVICE, ENIGMA2 device MAC address -> $MACADDR (default=Wake-on-LAN)
+