1
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-07 22:29:19 +00:00

99_msg: advanced parameters control for FHEM modules

git-svn-id: https://svn.fhem.de/fhem/trunk@9446 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2015-10-12 22:18:10 +00:00
parent 7a0a2eaa88
commit 342f2bcfff

View File

@ -36,6 +36,7 @@ package main;
use strict; use strict;
use warnings; use warnings;
use Time::HiRes qw(time); use Time::HiRes qw(time);
use Data::Dumper;
no if $] >= 5.017011, warnings => 'experimental::smartmatch'; no if $] >= 5.017011, warnings => 'experimental::smartmatch';
@ -139,56 +140,156 @@ sub CommandMsg($$;$$) {
"Usage: msg [<type>] [<\@device>|<e-mail address>] [<priority>] [|<title>|] <message>"; "Usage: msg [<type>] [<\@device>|<e-mail address>] [<priority>] [|<title>|] <message>";
} }
# default commands # FHEM module command schema definitions
my %defaults; my $cmdSchema = {
'audio' => {
$defaults{audio}{Normal} = "set \$DEVICE Speak 40 de |\$TITLE| \$MSG"; 'SONOSPLAYER' => {
$defaults{audio}{ShortPrio} = "set \$DEVICE Speak 30 de |\$TITLE| Achtung!"; 'Normal' => 'set %DEVICE% Speak %VOLUME% %LANG% |%TITLE%| %MSG%',
$defaults{audio}{Short} = "set \$DEVICE Speak 30 de |\$TITLE|"; 'ShortPrio' => 'set %DEVICE% Speak %VOLUME% %LANG% |%TITLE%| %MSGSH%',
'Short' => 'set %DEVICE% Speak %VOLUME% %LANG% |%TITLE%| %MSGSH%',
'defaultValues' => {
'Normal' => {
'VOLUME' => 38,
'LANG' => 'de',
},
'ShortPrio' => {
'VOLUME' => 33,
'LANG' => 'de',
'MSGSH' => 'Achtung!',
},
'Short' => {
'VOLUME' => 28,
'LANG' => 'de',
'MSGSH' => '',
},
},
},
$defaults{light}{Normal} = },
"{my \$state=ReadingsVal(\"\$DEVICE\",\"state\",\"off\"); fhem \"set \$DEVICE blink 2 1\"; fhem \"sleep 4;set \$DEVICE:FILTER=state!=\$state \$state\"}";
$defaults{light}{High} =
"{my \$state=ReadingsVal(\"\$DEVICE\",\"state\",\"off\"); fhem \"set \$DEVICE blink 10 1\"; fhem \"sleep 20;set \$DEVICE:FILTER=state!=\$state \$state\"}";
$defaults{light}{Low} = "set \$DEVICE alert select";
$defaults{mail}{Normal} = 'light' => {
"{system(\"echo '\$MSG' | /usr/bin/mail -s '\$TITLE' -t '\$RECIPIENT'\")}";
$defaults{mail}{High} =
"{system(\"/bin/echo '\$MSG' | /usr/bin/mail -s '\$TITLE' -t '\$RECIPIENT' -a 'MIME-Version: 1.0' -a 'Content-Type: text/html; charset=UTF-8' -a 'X-Priority: 1 (Highest)' -a 'X-MSMail-Priority: High' -a 'Importance: high'\")}";
$defaults{mail}{Low} =
"{system(\"/bin/echo '\$MSG' | /usr/bin/mail -s '\$TITLE' -t '\$RECIPIENT' -a 'MIME-Version: 1.0' -a 'Content-Type: text/html; charset=UTF-8' -a 'X-Priority: 5 (Lowest)' -a 'X-MSMail-Priority: Low' -a 'Importance: low'\")}";
$defaults{push}{Normal} = 'HUEDevice' => {
"set \$DEVICE msg '\$TITLE' '\$MSG' '' \$PRIORITY ''"; 'Normal' => '{my \$state=ReadingsVal("%DEVICE%","state","off"); fhem "set %DEVICE% blink 2 1"; fhem "sleep 4;set %DEVICE%:FILTER=state!=$state $state"}',
$defaults{push}{High} = 'High' => '{my \$state=ReadingsVal("%DEVICE%","state","off"); fhem "set %DEVICE% blink 10 1"; fhem "sleep 20;set %DEVICE%:FILTER=state!=$state $state"}',
"set \$DEVICE msg '\$TITLE' '\$MSG' '' \$PRIORITY '' 120 600"; 'Low' => 'set %DEVICE% alert select',
$defaults{push}{Low} = },
"set \$DEVICE msg '\$TITLE' '\$MSG' '' \$PRIORITY ''";
},
$defaults{screen}{Normal} = "set \$DEVICE msg info 8 \$MSG"; 'mail' => {
$defaults{screen}{High} = "set \$DEVICE msg attention 12 \$MSG";
$defaults{screen}{Low} = "set \$DEVICE msg message 8 \$MSG";
# default forwards 'fhemMsgMail' => {
my %forwards; 'Normal' => '{system("echo \'%MSG%\' | /usr/bin/mail -s \'%TITLE%\' -t \'%DEVICE%\' -a \'MIME-Version: 1.0\' -a \'Content-Type: text/html; charset=UTF-8\'")}',
$forwards{screen}{gwUnavailable} = "light"; 'High' => '{system("echo \'%MSG%\' | /usr/bin/mail -s \'%TITLE%\' -t \'%DEVICE%\' -a \'MIME-Version: 1.0\' -a \'Content-Type: text/html; charset=UTF-8\' -a \'X-Priority: 1 (Highest)\' -a \'X-MSMail-Priority: High\' -a \'Importance: high\'")}',
$forwards{light}{gwUnavailable} = "audio"; 'Low' => '{system("echo \'%MSG%\' | /usr/bin/mail -s \'%TITLE%\' -t \'%DEVICE%\' -a \'MIME-Version: 1.0\' -a \'Content-Type: text/html; charset=UTF-8\' -a \'X-Priority: 5 (Lowest)\' -a \'X-MSMail-Priority: Low\' -a \'Importance: low\'")}',
$forwards{audio}{gwUnavailable} = "text"; },
$forwards{push}{gwUnavailable} = "mail";
},
$forwards{screen}{emergency} = "light"; 'push' => {
$forwards{light}{emergency} = "audio";
$forwards{audio}{emergency} = "text";
$forwards{push}{emergency} = "mail";
$forwards{screen}{highPrio}{residentGone} = "light"; 'Pushover' => {
$forwards{light}{highPrio}{residentGone} = "audio"; 'Normal' => 'set %DEVICE% msg \'%TITLE%\' \'%MSG%\' \'%PUSHDEVICE%\' %PRIORITY% \'\' %RETRY% %EXPIRE% %URLTITLE% %ACTION%',
$forwards{audio}{highPrio}{residentGone} = "text"; 'High' => 'set %DEVICE% msg \'%TITLE%\' \'%MSG%\' \'%PUSHDEVICE%\' %PRIORITY% \'\' %RETRY% %EXPIRE% %URLTITLE% %ACTION%',
'Low' => 'set %DEVICE% msg \'%TITLE%\' \'%MSG%\' \'%PUSHDEVICE%\' %PRIORITY% \'\' %RETRY% %EXPIRE% %URLTITLE% %ACTION%',
'defaultValues' => {
'Normal' => {
'PUSHDEVICE' => '',
'RETRY' => '',
'EXPIRE' => '',
'URLTITLE' => '',
'ACTION' => '',
},
'High' => {
'PUSHDEVICE' => '',
'RETRY' => '120',
'EXPIRE' => '600',
'URLTITLE' => '',
'ACTION' => '',
},
'Low' => {
'PUSHDEVICE' => '',
'RETRY' => '',
'EXPIRE' => '',
'URLTITLE' => '',
'ACTION' => '',
},
},
},
$forwards{screen}{highPrio}{residentAbsent} = "light"; },
$forwards{light}{highPrio}{residentAbsent} = "audio";
$forwards{audio}{highPrio}{residentAbsent} = "text"; 'screen' => {
'ENIGMA2' => {
'Normal' => 'set %DEVICE% msg %TYPE% %TIMEOUT% %MSG%',
'High' => 'set %DEVICE% msg %TYPE% %TIMEOUT% %MSG%',
'Low' => 'set %DEVICE% msg %TYPE% %TIMEOUT% %MSG%',
'defaultValues' => {
'Normal' => {
'TYPE' => 'info',
'TIMEOUT' => 8,
},
'High' => {
'TYPE' => 'attention',
'TIMEOUT' => 12,
},
'Low' => {
'TYPE' => 'message',
'TIMEOUT' => 8,
},
},
},
},
};
# default settings
my $settings = {
'audio' => {
'typeEscalation' => {
'gwUnavailable' => 'text',
'emergency' => 'text',
'residentGone' => 'text',
'residentAbsent' => 'text',
},
'title' => 'Announcement',
},
'light' => {
'typeEscalation' => {
'gwUnavailable' => 'audio',
'emergency' => 'audio',
'residentGone' => 'audio',
'residentAbsent' => 'audio',
},
'title' => 'Announcement',
},
'mail' => {
'title' => 'System Message',
},
'push' => {
'typeEscalation' => {
'gwUnavailable' => 'mail',
'emergency' => 'mail',
},
'title' => 'System Message',
},
'screen' => {
'typeEscalation' => {
'gwUnavailable' => 'light',
'emergency' => 'light',
'residentGone' => 'light',
'residentAbsent' => 'light',
},
'title' => 'Info',
},
};
################################################################ ################################################################
### extract message details ### extract message details
@ -197,7 +298,8 @@ sub CommandMsg($$;$$) {
my $types = ""; my $types = "";
my $recipients = ""; my $recipients = "";
my $priority = ""; my $priority = "";
my $title = ""; my $title = "-";
my $advanced = "";
my $priorityCat = ""; my $priorityCat = "";
@ -230,6 +332,19 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
$title = $1; $title = $1;
} }
# check for advanced options
if ( $msg =~ s/[\s\t]*O(\[\{.*\}\])[\s\t]*$// )
{
# Use JSON module if possible
eval 'use JSON qw( decode_json ); 1';
if ( !$@ ) {
$advanced = decode_json( Encode::encode_utf8($1) );
Log3 "global", 5, "msg: Advanced options\n" . Dumper($advanced);
} else {
Log3 "global", 3, "msg: To use advanced options, please install Perl::JSON.";
}
}
################################################################ ################################################################
### command queue ### command queue
### ###
@ -340,8 +455,8 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
if ( $testMode ne "1" ); if ( $testMode ne "1" );
my $regex1 = my $regex1 =
"\s*!?@?" . $device . "[,|]"; # at the beginning "\\s*!?@?" . $device . "[,|]"; # at the beginning
my $regex2 = "[,|]!?@?" . $device . "\s*"; # at the end my $regex2 = "[,|]!?@?" . $device . "\\s*"; # at the end
my $regex3 = my $regex3 =
",!?@?" . $device . ","; # in the middle with comma ",!?@?" . $device . ","; # in the middle with comma
my $regex4 = my $regex4 =
@ -349,10 +464,10 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
. $device . $device
. "[\|,]"; # in the middle with pipe and/or comma . "[\|,]"; # in the middle with pipe and/or comma
$recipients =~ s/^$regex1//; $recipients =~ s/^$regex1//gi;
$recipients =~ s/$regex2$/|/g; $recipients =~ s/$regex2$/|/gi;
$recipients =~ s/$regex3/,/g; $recipients =~ s/$regex3/,/gi;
$recipients =~ s/$regex4/|/g; $recipients =~ s/$regex4/|/gi;
next; next;
} }
@ -617,39 +732,17 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
################################################################ ################################################################
### given device name is already a gateway device itself ### given device name is already a gateway device itself
### ###
my $deviceType2 = defined($defs{$device}) ? $defs{$device}{TYPE} : "";
if ( if (
$gatewayDevs eq "" $gatewayDevs eq ""
&& defined( $defs{$device} ) && $deviceType2 ne ""
&& ( && (
$type[$i] eq "screen" ( $type[$i] eq "audio" && defined($cmdSchema->{ $type[$i] }{$deviceType2}) ) ||
&& ( $defs{$device}{TYPE} eq "ENIGMA2" ( $type[$i] eq "light" && defined($cmdSchema->{ $type[$i] }{$deviceType2}) ) ||
|| $defs{$device}{TYPE} eq "STV" ) ( $type[$i] eq "push" && defined($cmdSchema->{ $type[$i] }{$deviceType2}) ) ||
( $type[$i] eq "screen" && defined($cmdSchema->{ $type[$i] }{$deviceType2}) )
|| ( $type[$i] eq "light"
&& $defs{$device}{TYPE} eq "HUEDevice" )
|| (
$type[$i] eq "audio"
&& (
$defs{$device}{TYPE} eq "SONOSPLAYER"
|| $defs{$device}{TYPE} eq "SB_PLAYER"
|| $defs{$device}{TYPE} eq "Text2Speech"
|| ( $defs{$device}{TYPE} eq "CUL_HM"
&& AttrVal( $device, "model", "" ) eq
"HM-OU-CFM-PI" )
)
)
|| (
$type[$i] eq "push"
&& ( $defs{$device}{TYPE} eq "PushNotifier"
|| $defs{$device}{TYPE} eq "Pushalot"
|| $defs{$device}{TYPE} eq "Pushbullet"
|| $defs{$device}{TYPE} eq "Pushover"
|| $defs{$device}{TYPE} eq "yowsup"
|| $defs{$device}{TYPE} eq "Jabber" )
)
) )
) )
{ {
@ -1340,81 +1433,6 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
} }
} }
my $defTitle = "System Message";
$defTitle = "Announcement" if ( $type[$i] eq "audio" );
$defTitle = "Announcement" if ( $type[$i] eq "light" );
$defTitle = "Info" if ( $type[$i] eq "screen" );
# use title from device, global or internal default
my $loopTitle;
$loopTitle = $title if ( $title ne "" );
$loopTitle =
# look for direct high
AttrVal(
$device, "msgTitle$typeUc$priorityCat",
# look for indirect high
AttrVal(
AttrVal( $device, "msgRecipient$typeUc", "" ),
"msgTitle$typeUc$priorityCat",
#look for indirect general high
AttrVal(
AttrVal( $device, "msgRecipient", "" ),
"msgTitle$typeUc$priorityCat",
# look for global direct high
AttrVal(
"global", "msgTitle$typeUc$priorityCat",
# look for global indirect high
AttrVal(
AttrVal(
"global", "msgRecipient$typeUc",
""
),
"msgTitle$typeUc$priorityCat",
#look for global indirect general high
AttrVal(
AttrVal(
"global", "msgRecipient",
""
),
"msgTitle$typeUc$priorityCat",
# default
$defTitle
)
)
)
)
)
) if ( $title eq "" );
my $loopMsg = $msg;
if ( $catchall == 1 ) {
$loopTitle = "Fw: $loopTitle";
if ( $type[$i] eq "mail" ) {
$loopMsg .=
"\n\n-- \nMail forwarded from device $device due to catchall";
}
else {
$loopMsg .= " ### (from device $device)";
}
}
# correct message format
#
$loopMsg =~ s/((|(\d+)| )\|\w+\|( |))/\n\n/g
if ( $type[$i] ne "audio" ); # Remove Sonos Speak commands
if ( $type[$i] eq "mail" && $priorityCat ne "" ) {
$loopTitle = "[$priorityCat] $loopTitle";
$loopMsg =~ s/\n/<br \/>/g;
}
# get resident presence information # get resident presence information
# #
my $residentDevState = ""; my $residentDevState = "";
@ -1636,23 +1654,51 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
elsif ( elsif (
$type[$i] ne "mail" $type[$i] ne "mail"
&& ( && (
AttrVal( $gatewayDev, "disable", "0" ) eq ReadingsVal(
$gatewayDev, "power",
"on"
) eq "off"
|| ReadingsVal(
$gatewayDev, "presence",
"present"
) eq "absent"
|| ReadingsVal(
$gatewayDev, "presence",
"appeared"
) eq "disappeared"
|| ReadingsVal(
$gatewayDev, "state",
"present"
) eq "absent"
|| ReadingsVal(
$gatewayDev, "state",
"connected"
) eq "unauthorized"
|| ReadingsVal(
$gatewayDev, "state",
"connected"
) eq "disconnected"
|| ReadingsVal(
$gatewayDev, "state",
"reachable"
) eq "unreachable"
|| ReadingsVal(
$gatewayDev, "available",
"1" "1"
|| ReadingsVal( $gatewayDev, "power", "on" ) ) eq "0"
eq "off" || ReadingsVal(
|| ReadingsVal( $gatewayDev, "presence", $gatewayDev, "available",
"present" ) eq "absent" "yes"
|| ReadingsVal( $gatewayDev, "presence", ) eq "no"
"appeared" ) eq "disappeared" || ReadingsVal(
|| ReadingsVal( $gatewayDev, "state", $gatewayDev, "reachable",
"present" ) eq "absent" "1"
|| ReadingsVal( $gatewayDev, "state", ) eq "0"
"reachable" ) eq "unreachable" || ReadingsVal(
|| ReadingsVal( $gatewayDev, "reachable",
$gatewayDev, "reachable", "1" "yes"
) eq "0" ) eq "no"
|| ReadingsVal( $gatewayDev, "reachable",
"yes" ) eq "no"
) )
) )
{ {
@ -1715,12 +1761,92 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
$routeStatus .= "+LOCATION"; $routeStatus .= "+LOCATION";
} }
# use command from device, global or internal default
my $defCmd; my $gatewayType = $type[$i] eq "mail" ? "fhemMsgMail" : $defs{$gatewayDev}{TYPE};
$defCmd = $defaults{ $type[$i] }{$priorityCat}
if ( $priorityCat ne "" ); my $defTitle = defined($settings->{ $type[$i] }{title}) ? $settings->{ $type[$i] }{title} : "System Message";
$defCmd = $defaults{ $type[$i] }{Normal} $defTitle = $cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{$priorityCat}{TITLE}
if ( $priorityCat eq "" ); if ( defined($cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{$priorityCat}{TITLE}) && $priorityCat ne "" );
$defTitle = $cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{Normal}{TITLE}
if ( defined($cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{Normal}{TITLE}) && $priorityCat eq "" );
# use title from device, global or internal default
my $loopTitle;
$loopTitle = $title if ( $title ne "-" );
$loopTitle =
# look for direct high
AttrVal(
$device, "msgTitle$typeUc$priorityCat",
# look for indirect high
AttrVal(
AttrVal( $device, "msgRecipient$typeUc", "" ),
"msgTitle$typeUc$priorityCat",
#look for indirect general high
AttrVal(
AttrVal( $device, "msgRecipient", "" ),
"msgTitle$typeUc$priorityCat",
# look for global direct high
AttrVal(
"global", "msgTitle$typeUc$priorityCat",
# look for global indirect high
AttrVal(
AttrVal(
"global", "msgRecipient$typeUc",
""
),
"msgTitle$typeUc$priorityCat",
#look for global indirect general high
AttrVal(
AttrVal(
"global", "msgRecipient",
""
),
"msgTitle$typeUc$priorityCat",
# default
$defTitle
)
)
)
)
)
) if ( $title eq "-" );
if ( $type[$i] eq "mail" && $priorityCat ne "" ) {
$loopTitle = "[$priorityCat] $loopTitle";
}
my $loopMsg = $msg;
if ( $catchall == 1 ) {
$loopTitle = "Fw: $loopTitle";
if ( $type[$i] eq "mail" ) {
$loopMsg .=
"\n\n-- \nMail catched from device $device";
}
else {
$loopMsg .= " ### (Catched from device $device)";
}
}
# correct message format
#
$loopMsg =~ s/\n/<br \/>/gi;
$loopMsg =~ s/((|(\d+)| )\|\w+\|( |))/\n\n/gi
if ( $type[$i] ne "audio" ); # Remove Sonos Speak commands
# use command from device, global or internal default
my $defCmd = "";
$defCmd = $cmdSchema->{ $type[$i] }{$gatewayType}{$priorityCat}
if ( defined($cmdSchema->{ $type[$i] }{$gatewayType}{$priorityCat}) && $priorityCat ne "" );
$defCmd = $cmdSchema->{ $type[$i] }{$gatewayType}{Normal}
if ( defined($cmdSchema->{ $type[$i] }{$gatewayType}{Normal}) && $priorityCat eq "" );
my $cmd = my $cmd =
# gateway device # gateway device
@ -1779,15 +1905,78 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
) )
); );
$cmd =~ s/\$RECIPIENT/$gatewayDev/g; if ($cmd eq "") {
$cmd =~ s/\$DEVICE/$gatewayDev/g; Log3 $logDevice, 4, "$gatewayDev: Unknown command schema for gateway device type $gatewayType. Use manual definition by userattr msgCmd*";
$cmd =~ s/\$PRIORITY/$loopPriority/g; $return .= "$gatewayDev: Unknown command schema for gateway device type $gatewayType. Use manual definition by userattr msgCmd*\n";
$cmd =~ s/\$TITLE/$loopTitle/g; next;
$cmd =~ s/\$MSG/$loopMsg/g; }
$cmd =~ s/%DEVICE%/$gatewayDev/gi;
$cmd =~ s/%PRIORITY%/$loopPriority/gi;
$cmd =~ s/%TITLE%/$loopTitle/gi;
$cmd =~ s/%MSG%/$loopMsg/gi;
# advanced options from message
if (ref($advanced) eq "ARRAY") {
for my $item (@$advanced) {
for my $key (keys(%$item)) {
my $val = $item->{$key};
$cmd =~ s/%$key%/$val/gi;
}
}
}
# advanced options from command schema hash
if ($priorityCat ne "" && defined( $cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{$priorityCat} )) {
for my $item ($cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{$priorityCat}) {
for my $key (keys(%$item)) {
my $val = $item->{$key};
$cmd =~ s/%$key%/$val/gi;
}
}
}
elsif ($priorityCat eq "" && defined( $cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{Normal} )) {
for my $item ($cmdSchema->{ $type[$i] }{$gatewayType}{defaultValues}{Normal}) {
for my $key (keys(%$item)) {
my $val = $item->{$key};
$cmd =~ s/%$key%/$val/gi;
}
}
}
$sentCounter++; $sentCounter++;
if ( $routeStatus =~ /^OK\w*/ ) { if ( $routeStatus =~ /^OK\w*/ ) {
my $error = 0;
# run command
undef $@;
if ( $cmd =~ s/^[ \t]*\{|\}[ \t]*$//gi ) {
$cmd =~ s/@\w+/\\$&/gi;
Log3 $logDevice, 5,
"msg $device: $type[$i] route command (Perl): $cmd";
eval $cmd;
if ( $@ ) {
$error = 1;
$return .= "$gatewayDev: $@\n";
}
}
else {
Log3 $logDevice, 5,
"msg $device: $type[$i] route command (fhem): $cmd";
fhem $cmd;
if ( $@ ) {
$error = 1;
$return .= "$gatewayDev: $@\n";
}
}
$routeStatus = "ERROR" if ($error == 1);
Log3 $logDevice, 3, Log3 $logDevice, 3,
"msg $device: ID=$messageID.$sentCounter TYPE=$type[$i] ROUTE=$gatewayDev STATUS=$routeStatus PRIORITY=$loopPriority($priorityCat) TITLE='$loopTitle' MSG='$msg'" "msg $device: ID=$messageID.$sentCounter TYPE=$type[$i] ROUTE=$gatewayDev STATUS=$routeStatus PRIORITY=$loopPriority($priorityCat) TITLE='$loopTitle' MSG='$msg'"
@ -1796,22 +1985,9 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
"msg $device: ID=$messageID.$sentCounter TYPE=$type[$i] ROUTE=$gatewayDev STATUS=$routeStatus PRIORITY=$loopPriority TITLE='$loopTitle' MSG='$msg'" "msg $device: ID=$messageID.$sentCounter TYPE=$type[$i] ROUTE=$gatewayDev STATUS=$routeStatus PRIORITY=$loopPriority TITLE='$loopTitle' MSG='$msg'"
if ( $priorityCat eq "" ); if ( $priorityCat eq "" );
# run command $messageSent = 1 if ($error == 0);
if ( $cmd =~ s/^[ \t]*\{|\}[ \t]*$//g ) { $messageSentDev = 1 if ($error == 0);
$cmd =~ s/@\w+/\\$&/g; $gatewaysStatus{$gatewayDev} = $routeStatus;
Log3 $logDevice, 5,
"msg $device: $type[$i] route command (Perl): $cmd";
eval $cmd;
}
else {
Log3 $logDevice, 5,
"msg $device: $type[$i] route command (fhem): $cmd";
fhem $cmd;
}
$messageSent = 1;
$messageSentDev = 1;
$gatewaysStatus{$gatewayDev} = $routeStatus;
} }
elsif ($routeStatus eq "UNAVAILABLE" elsif ($routeStatus eq "UNAVAILABLE"
|| $routeStatus eq "UNDEFINED" ) || $routeStatus eq "UNDEFINED" )
@ -1862,9 +2038,9 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
readingsBeginUpdate($readingsDev); readingsBeginUpdate($readingsDev);
readingsBulkUpdate( $readingsDev, "fhemMsg" . $typeUc, readingsBulkUpdate( $readingsDev, "fhemMsg" . $typeUc,
$loopMsg ); $msg );
readingsBulkUpdate( $readingsDev, readingsBulkUpdate( $readingsDev,
"fhemMsg" . $typeUc . "Title", $loopTitle ); "fhemMsg" . $typeUc . "Title", $title );
readingsBulkUpdate( $readingsDev, readingsBulkUpdate( $readingsDev,
"fhemMsg" . $typeUc . "Prio", "fhemMsg" . $typeUc . "Prio",
$loopPriority ); $loopPriority );
@ -1906,9 +2082,9 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
scalar( grep { defined $_ } @recipientsOr ) ) scalar( grep { defined $_ } @recipientsOr ) )
{ {
my $regex1 = my $regex1 =
"\s*!?@?" . $device . "[,|]"; # at the beginning "\\s*!?@?" . $device . "[,|]"; # at the beginning
my $regex2 = my $regex2 =
"[,|]!?@?" . $device . "\s*"; # at the end "[,|]!?@?" . $device . "\\s*"; # at the end
my $regex3 = my $regex3 =
",!?@?" ",!?@?"
. $device . $device
@ -1919,9 +2095,9 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
. "[\|,]"; # in the middle with pipe and/or comma . "[\|,]"; # in the middle with pipe and/or comma
$recipients =~ s/^$regex1//; $recipients =~ s/^$regex1//;
$recipients =~ s/$regex2$/|/g; $recipients =~ s/$regex2$/|/gi;
$recipients =~ s/$regex3/,/g; $recipients =~ s/$regex3/,/gi;
$recipients =~ s/$regex4/|/g; $recipients =~ s/$regex4/|/gi;
} }
next; next;
@ -2019,18 +2195,15 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
if ( $residentDevPresence ne "" if ( $residentDevPresence ne ""
|| $residentDevState ne "" ); || $residentDevState ne "" );
my $fw_gwUnavailable = my $fw_gwUnavailable = defined($settings->{ $type[$i] }{typeEscalation}{gwUnavailable}) ? $settings->{ $type[$i] }{typeEscalation}{gwUnavailable} : "";
$forwards{ $type[$i] }{gwUnavailable}; my $fw_emergency = defined($settings->{ $type[$i] }{typeEscalation}{emergency}) ? $settings->{ $type[$i] }{typeEscalation}{emergency} : "";
my $fw_emergency = $forwards{ $type[$i] }{emergency}; my $fw_residentAbsent = defined($settings->{ $type[$i] }{typeEscalation}{residentAbsent}) ? $settings->{ $type[$i] }{typeEscalation}{residentAbsent} : "";
my $fw_residentAbsent = my $fw_residentGone = defined($settings->{ $type[$i] }{typeEscalation}{residentGone}) ? $settings->{ $type[$i] }{typeEscalation}{residentGone} : "";
$forwards{ $type[$i] }{highPrio}{residentAbsent};
my $fw_residentGone =
$forwards{ $type[$i] }{highPrio}{residentGone};
# Forward message # Forward message
# if no gateway device for this type was available # if no gateway device for this type was available
if ( $messageSentDev == 0 if ( $messageSentDev == 0
&& defined($fw_gwUnavailable) && $fw_gwUnavailable ne ""
&& !( $fw_gwUnavailable ~~ @type ) && !( $fw_gwUnavailable ~~ @type )
&& $routes{$fw_gwUnavailable} == 1 ) && $routes{$fw_gwUnavailable} == 1 )
{ {
@ -2048,7 +2221,7 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
# Forward message # Forward message
# if emergency priority # if emergency priority
if ( $loopPriority >= $msgFwPrioEmergency if ( $loopPriority >= $msgFwPrioEmergency
&& defined($fw_emergency) && $fw_emergency ne ""
&& !( $fw_emergency ~~ @type ) && !( $fw_emergency ~~ @type )
&& $routes{$fw_emergency} == 1 ) && $routes{$fw_emergency} == 1 )
{ {
@ -2067,7 +2240,7 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
# if high priority and residents are constantly not at home # if high priority and residents are constantly not at home
if ( $residentDevPresence eq "absent" if ( $residentDevPresence eq "absent"
&& $loopPriority >= $msgFwPrioGone && $loopPriority >= $msgFwPrioGone
&& defined($fw_residentGone) && $fw_residentGone ne ""
&& !( $fw_residentGone ~~ @type ) && !( $fw_residentGone ~~ @type )
&& $routes{$fw_residentGone} == 1 ) && $routes{$fw_residentGone} == 1 )
{ {
@ -2087,7 +2260,7 @@ s/^[\s\t]*\|([\w\süöäß^°!"§$%&\/\\()<>=?´`"+\[\]#*@€]+)\|[\s\t]+//
# are not at home but nearby # are not at home but nearby
if ( $residentDevState eq "absent" if ( $residentDevState eq "absent"
&& $loopPriority >= $msgFwPrioAbsent && $loopPriority >= $msgFwPrioAbsent
&& defined($fw_residentAbsent) && $fw_residentAbsent ne ""
&& !( $fw_residentAbsent ~~ @type ) && !( $fw_residentAbsent ~~ @type )
&& $routes{$fw_residentAbsent} == 1 ) && $routes{$fw_residentAbsent} == 1 )
{ {