2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-04 20:17:45 +00:00

39_Talk2Fhem.pm: Various bugfixes

git-svn-id: https://svn.fhem.de/fhem/trunk@16420 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Phill 2018-03-16 23:48:31 +00:00
parent 76a5e77c39
commit 9657ffbf7d
2 changed files with 205 additions and 107 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- update: 39_Talk2Fhem: Timephrases added, bugfixes and some changes
- bugfix: 74_AMADCommBridge: fix Commandref - bugfix: 74_AMADCommBridge: fix Commandref
- bugfix: 82_LGTV_WebOS: fix litte typos fix eval bug - bugfix: 82_LGTV_WebOS: fix litte typos fix eval bug
- update: 21_HEOS: fix Use of uninitialized value {repeat} - update: 21_HEOS: fix Use of uninitialized value {repeat}

View File

@ -98,30 +98,32 @@
# replace ; to ;; in timecommands # replace ; to ;; in timecommands
# Add 1 day if timecode is in past in hour phrases # Add 1 day if timecode is in past in hour phrases
# Added async warning if keywordlist is unkown # Added async warning if keywordlist is unkown
# 04.03.2018 0.4.6 # 04.03.2018 0.4.6
# Breacket decoding bug fixed # Breacket decoding bug fixed
# 04.02.2018 0.5.0 # 04.02.2018 0.5.0
# Feature: Object radiusing # Feature: Object radiusing
# 05.02.2018 0.5.1 # 05.02.2018 0.5.1
# Semicolon adding concretized # Semicolon adding concretized
# Problem with first letter umlaut in type modificator fixed # Problem with first letter umlaut in type modificator fixed
# Fixed problems Attributes not ready # Fixed problems Attributes not ready
# Matched/Unmatched corrected # Matched/Unmatched corrected
# Else in arraymodifikation expanded # Else in arraymodifikation expanded
# 17.03.2018 0.5.2
# Startup bug fixed
# && Regexp removes match from Command
# Time identification added
# Newlines in configuration now replaced by space
################################################################ ################################################################
# TODO: # TODO:
# #
# device verundung durch regexp klammern? eher durch try and error
# answerx # answerx
# #
# klammern in keywordlists sollen die $n nummerierung nicht beeinflussen # klammern in keywordlists sollen die $n nummerierung nicht beeinflussen
# in keywordlists sind vermutlich nur maximal eine klammerebene möglich direkte regex arrays sind endlos verschachtelbar # in keywordlists sind vermutlich nur maximal eine klammerebene möglich direkte regex arrays sind endlos verschachtelbar
# zusätzlich unmodifizierte zeit greifbar machen # zusätzlich unmodifizierte zeit greifbar machen
# timephrase kombies morgen früh um 9 uhr ist unzuverlässig. evtl order einführen, dann kann auch die splittung weg
# viertel zeitphrasen
# - regexp
#vordefinierte regex zu verfügung stellen #vordefinierte regex zu verfügung stellen
# (i[nm]|vor|auf|unter|hinter)? ?(de[rmn]|die|das)? ? # (i[nm]|vor|auf|unter|hinter)? ?(de[rmn]|die|das)? ?
# neue option notime: deaktiviert für diese Phrase die Zeitenerkennung
package main; package main;
@ -136,7 +138,7 @@ use Encode qw(decode encode);
my %Talk2Fhem_globals; my %Talk2Fhem_globals;
$Talk2Fhem_globals{version}="0.5.1"; $Talk2Fhem_globals{version}="0.5.2";
$Talk2Fhem_globals{EN}{erase} = ['\bplease\b', '\balso\b', '^msgtext:']; $Talk2Fhem_globals{EN}{erase} = ['\bplease\b', '\balso\b', '^msgtext:'];
$Talk2Fhem_globals{EN}{numbers} = { $Talk2Fhem_globals{EN}{numbers} = {
@ -219,10 +221,11 @@ $Talk2Fhem_globals{DE}{erase} = ['\bbitte\b', '\bauch\b','\bkann\b', '\bsoll\b']
# true => '^(ja|1|true|wahr|ein|eins.*|auf.*|öffnen|an.*|rauf.*|hoch.*|laut.*|hell.*)$', # true => '^(ja|1|true|wahr|ein|eins.*|auf.*|öffnen|an.*|rauf.*|hoch.*|laut.*|hell.*)$',
# false => '^(nein|0|false|falsch|aus.*|null|zu.*|schlie\S\S?en|runter.*|ab.*|leise.*|dunk.*)$', # false => '^(nein|0|false|falsch|aus.*|null|zu.*|schlie\S\S?en|runter.*|ab.*|leise.*|dunk.*)$',
$Talk2Fhem_globals{DE}{numbers} = { $Talk2Fhem_globals{DE}{numbers} = {
#ACHTUNG keine Klammern verwenden sonst ändert numberre die suchmuster positionen z.b. in get_time_by_phrase
'null' => 0 'null' => 0
,'(ein\S*|erste\S*)' => 1 ,'ein\S*|erste\S*' => 1
,'zwei\S*' => 2 ,'zwei\S*' => 2
,'(drei\S*|dritt\S*)' => 3 ,'drei\S*|dritt\S*' => 3
,'vier\S*' => 4 ,'vier\S*' => 4
,'fünf\S*' => 5 ,'fünf\S*' => 5
,'sechs\S*' => 6 ,'sechs\S*' => 6
@ -251,53 +254,118 @@ $Talk2Fhem_globals{DE}{pass} = {
word => '\b(\w{4,})\b', word => '\b(\w{4,})\b',
empty => '^\s*$' empty => '^\s*$'
}; };
$Talk2Fhem_globals{DE}{datephrase} = {
'morgen'=> {days=>1} $Talk2Fhem_globals{DE}{dtspec} = [
, 'übermorgen'=> {days=>2} # ---------------------------------- DATUMPHRASEN -----------------------------------------
, 'gestern'=> {days=>-1} {phr=>'morgen', dtmod=>{days=>1}},
, 'vorgestern'=> {days=>-2} {phr=>'übermorgen', dtmod=>{days=>2}},
, 'in ('.$Talk2Fhem_globals{DE}{numberre}.') woche\S?'=> {days=>'(7*$1)'} {phr=>'gestern', dtmod=>{days=>-1}},
, 'in ('.$Talk2Fhem_globals{DE}{numberre}.') monat(\S\S)?'=> {month=>'"$1"'} {phr=>'vorgestern', dtmod=>{days=>-2}},
, 'in ('.$Talk2Fhem_globals{DE}{numberre}.') jahr(\S\S)?'=> {year=>'"$1"'} {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') wochen?',
, 'nächste.? woche'=> {days=>7} dtmod=>{days=>'(7*$1)'}},
, 'nächste.? monat'=> {month=>1} {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') monat(en)?',
, 'nächste.? jahr'=> {year=>1} dtmod=>{month=>'"$1"'}},
, '(am )?sonntag'=> {wday=>0} {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') jahr(en)?',
, '(am )?montag'=> {wday=>1} dtmod=>{year=>'"$1"'}},
, '(am )?dienstag'=> {wday=>2} {phr=>'nächste.? woche', dtmod=>{days=>7}},
, '(am )?mittwoch'=> {wday=>3} {phr=>'nächste.? monat', dtmod=>{month=>1}},
, '(am )?donnerstag'=> {wday=>4} {phr=>'nächste.? jahr', dtmod=>{year=>1}},
, '(am )?freitag'=> {wday=>5} {phr=>'(am )?sonntag', dtmod=>{wday=>0}},
, '(am )?samstag'=> {wday=>6} {phr=>'(am )?montag', dtmod=>{wday=>1}},
, 'in ('.$Talk2Fhem_globals{DE}{numberre}.') tag(\S\S)?'=> {days=>'"$1"'} {phr=>'(am )?dienstag', dtmod=>{wday=>2}},
, 'am (\d\S*(\s\d+)?)'=> {date=>'"$1"'} {phr=>'(am )?mittwoch', dtmod=>{wday=>3}},
}; {phr=>'(am )?donnerstag', dtmod=>{wday=>4}},
# fc modify time. $_[0] = ermittelte zeit. Zugriff auf $1 $2 usw {phr=>'(am )?freitag', dtmod=>{wday=>5}},
$Talk2Fhem_globals{DE}{timephrase} = { {phr=>'(am )?samstag', dtmod=>{wday=>6}},
'(in|und|nach)? ('.$Talk2Fhem_globals{DE}{numberre}.') stunde.?' => {hour=>'"$2"'} {phr=>'in ('.$Talk2Fhem_globals{DE}{numberre}.') tag(en)?',
, '(in|und|nach)? ('.$Talk2Fhem_globals{DE}{numberre}.') minute.?' => {min=>'"$2"'} dtmod=>{days=>'"$1"'}},
, '(in|und|nach)? ('.$Talk2Fhem_globals{DE}{numberre}.') sekunde.?' => {sec=>'"$2"'} {phr=>'am (\d\S*(\s\d+)?)', dtmod=>{date=>'"$1"'}},
, 'gleich' => {min=>3} # ---------------------------------- ZEITPHRASEN -----------------------------------------
, 'nachher' => {min=>30} {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') stunden?',
, 'später' => {hour=>1} dtmod=>{hour=>'"$2"'}},
, 'jetzt' => {unix=>'time'} {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') minuten?',
, 'sofort' => {unix=>'time'} dtmod=>{min=>'"$2"'}},
, 'um (\d+\s?\:\s?\d+|'.$Talk2Fhem_globals{DE}{numberre}.') (uhr)?' => { {phr=>'(in|und|nach) ('.$Talk2Fhem_globals{DE}{numberre}.') sekunden?',
time=>'"$1"', dtmod=>{sec=>'"$2"'}},
fc=>sub () {(($_[0] + 3600) < time) ? ($_[0]+3600*24) : $_[0] } {phr=>'gleich', dtmod=>{min=>3}},
} {phr=>'nachher', dtmod=>{min=>30}},
, 'um ('.$Talk2Fhem_globals{DE}{numberre}.') uhr ('.$Talk2Fhem_globals{DE}{numberre}.')' => { {phr=>'später', dtmod=>{hour=>1}},
hour=>'"$1"', {phr=>'heute', dtmod=>{notime=>'"12:00"'}},
min=>'"$1"', {phr=>'nachts?', dtmod=>{notime=>'"03:00"',pm=>0}},
fc=>sub () {(($_[0] + 3600) < time) ? ($_[0]+3600*24) : $_[0] } {phr=>'früh', dtmod=>{notime=>'"09:00"',pm=>0}},
} ############ ZU TESTEN {phr=>'vormittags?', dtmod=>{notime=>'"10:30"',pm=>0}},
, 'früh' => {time=>'"09:00"'} {phr=>'abends?', dtmod=>{notime=>'"18:00"',pm=>1}},
, 'abends?' => {time=>'"18:00"'} {phr=>'nachmittags?', dtmod=>{notime=>'"16:00"',pm=>1}},
, 'nachmittags?' => {time=>'"16:00"'} {phr=>'mittags?', dtmod=>{notime=>'"12:00"',pm=>1}},
, 'vormittags?' => {time=>'"10:30"'} #!!!!!!!!!! heute nachmittag geht nicht bei den ersten 3
, 'mittags?' => {time=>'"12:00"'} # fc modify time. $_[0] = ermittelte zeit. Zugriff auf $1 $2 !unmodifiert! $_[1] = zeit der vorherigen erkennung $_[2] = phr $_[3] = dtmod !evaled! $_[4] = $pm
, 'heute' => {time=>'"12:00"'} # um 8:30 uhr um 8 : 30 uhr
}; {phr=>'um (\d+\s?\:\s?\d+)( uhr)?',
dtmod=>{
time=>'"$1"',
fc=>sub () {
my $res = (($_[0] + 3600) < $_[1]) ? ($_[0]+3600*24) : $_[0];
# Füge 12 hinzu wenn explicit pm und zeit nicht abends
$res += 12*3600 if (defined($_[4]) and $_[4] and $1 =~ /^(0?[0-9]|1[0-2])/);
return($res);
}
}},
#eventuell bei den beiden näcshten wenn es nachmittag ist nur 12 addieren
# um 8 uhr 30 um acht uhr zwölf
{phr=>'um ('.$Talk2Fhem_globals{DE}{numberre}.') uhr ('.$Talk2Fhem_globals{DE}{numberre}.')',
dtmod=>{
time=>'"$1:$2"',
fc=>sub () {
my $res = (($_[0] + 3600) < $_[1]) ? ($_[0]+3600*24) : $_[0];
# Füge 12 hinzu wenn explicit pm und zeit nicht abends
$res += 12*3600 if (defined($_[4]) and $_[4] and $_[3]{time} =~ /^(0?[0-9]|1[0-2])/);
return($res);
}
}},
# um 8 uhr um acht uhr
{phr=>'um ('.$Talk2Fhem_globals{DE}{numberre}.') uhr',
dtmod=>{
time=>'"$1:00"',
fc=>sub () {
my $res = (($_[0] + 3600) < $_[1]) ? ($_[0]+3600*24) : $_[0];
# Füge 12 hinzu wenn explicit pm und zeit nicht abends
$res += 12*3600 if (defined($_[4]) and $_[4] and $_[3]{time} =~ /^(0?[0-9]|1[0-2])/);
return($res);
}
}},
# um
{phr=>'um (halb|viertel vor|viertel nach|viertel|dreiviertel)? ?('.$Talk2Fhem_globals{DE}{numberre}.')',
dtmod=>{
time=>'"$2"',
fc=>sub () { my $res=$_[0];
my @evt = localtime($_[0]);
if ($evt[2] < 13) {
my @now = localtime($_[1]);
if ($_[0] < $_[1] or $now[2] > 12) {
$res += 3600*12;
}
if ($res < $_[1]) {
$res += 3600*12;
}
}
if ($1 eq "halb") {
$res -= 1800;
} elsif ($1 eq "viertel vor") {
$res -= 900;
} elsif ($1 eq "viertel nach") {
$res += 900;
} elsif ($1 eq "viertel") {
$res -= 2700;
} elsif ($1 eq "dreiviertel") {
$res -= 900;
}
$res += 12*3600 if (defined($_[4]) and $_[4] and $_[3]{time} =~ /^(0?[0-9]|1[0-2])/);
return($res);
}
}},
{phr=>'jetzt', dtmod=>{unix=>'time'}},
{phr=>'sofort', dtmod=>{unix=>'time'}},
];
sub Talk2Fhem_Initialize($); sub Talk2Fhem_Initialize($);
@ -568,9 +636,7 @@ sub Talk2Fhem_Set($@)
(return "\"set $name\" needs at least one argument") unless(scalar(@args)); (return "\"set $name\" needs at least one argument") unless(scalar(@args));
(return "Unknown argument ?, choose one of ! cleartriggers:noArg cleartimers:noArg") if($args[0] eq "?"); (return "Unknown argument ?, choose one of ! cleartriggers:noArg cleartimers:noArg") if($args[0] eq "?");
if ($hash->{STATE} ne "Ready") { if ($args[0] eq "cleartimers") {
#Fülle nur cmds array
} elsif ($args[0] eq "cleartimers") {
AnalyzeCommand($hash->{CL}, "delete at_".$name."_.*"); AnalyzeCommand($hash->{CL}, "delete at_".$name."_.*");
} elsif ($args[0] eq "cleartriggers") { } elsif ($args[0] eq "cleartriggers") {
@ -807,12 +873,12 @@ sub Talk2Fhem_Attr(@)
} }
#elsif ($attrName eq "T2F_filter") { #elsif ($attrName eq "T2F_filter")
#Log 1, "HALLO".$defs{global}{STATE}; #Log 1, "HALLO".$defs{global}{STATE};
#my $preattr = AttrVal($name, "T2F_filter", ""); #my $preattr = AttrVal($name, "T2F_filter", "");
#if ($preattr eq "") { #if ($preattr eq "") {
# $_[3] = join(",", @{$Talk2Fhem_globals{Talk2Fhem_language($name)}{erase}}).",".$attrValue; # $_[3] = join(",", @{$Talk2Fhem_globals{Talk2Fhem_language($name)}{erase}}).",".$attrValue;
#}} #
return undef; return undef;
} }
@ -874,7 +940,7 @@ sub Talk2Fhem_parseParams($)
foreach my $line (split("\n", $val)) { foreach my $line (split("\n", $val)) {
$line =~ s/#.*//; $line =~ s/#.*//;
$line = Talk2Fhem_realtrim($line); $line = Talk2Fhem_realtrim($line);
$r .= $line; $r .= ($r?" ":"").$line;
} }
if ( wantarray ) { if ( wantarray ) {
push(@res, {key => $key, val => $r}); push(@res, {key => $key, val => $r});
@ -917,10 +983,10 @@ my $list = (shift || AttrVal($hash->{NAME}, $type, ""));
# my $modlist = Talk2Fhem_parseParams(AttrVal($name, "T2F_modwordlist", ""));; # my $modlist = Talk2Fhem_parseParams(AttrVal($name, "T2F_modwordlist", ""));;
# return ("Error while parsing Modwordlist.\n$modlist" ) unless(ref($modlist) eq "HASH"); # return ("Error while parsing Modwordlist.\n$modlist" ) unless(ref($modlist) eq "HASH");
# foreach (keys %$modlist) { # foreach (keys %$modlist)
## $$modlist{$_} = Talk2Fhem_parseArray($$modlist{$_}); ## $$modlist{$_} = Talk2Fhem_parseArray($$modlist{$_});
# $hash->{helper}{modlist}{$_} = Talk2Fhem_parseArray($$modlist{$_}); # $hash->{helper}{modlist}{$_} = Talk2Fhem_parseArray($$modlist{$_});
# } #
} }
sub Talk2Fhem_language($) sub Talk2Fhem_language($)
@ -948,13 +1014,12 @@ return("define at_".$myname."_".$i."_".$d." at "
.":".sprintf("%02d", $ltevt[0])); .":".sprintf("%02d", $ltevt[0]));
} }
sub Talk2Fhem_exec($$$) { sub Talk2Fhem_exec($$$) {
my %assires; my %assires;
my %lastcmd; my %lastcmd;
sub Talk2Fhem_get_time_by_phrase($$$$$%); sub Talk2Fhem_get_time_by_phrase($$$$$@);
sub Talk2Fhem_addevt($$$$;$$); sub Talk2Fhem_addevt($$$$;$$);
sub Talk2Fhem_err($$$;$); sub Talk2Fhem_err($$$;$);
sub Talk2Fhem_filter($$); sub Talk2Fhem_filter($$);
@ -1009,12 +1074,10 @@ my @regtargets;
for (keys %{$me->{helper}{T2F_andwordlist}}) { push(@regtargets, \@{$me->{helper}{T2F_andwordlist}{$_}}) }; for (keys %{$me->{helper}{T2F_andwordlist}}) { push(@regtargets, \@{$me->{helper}{T2F_andwordlist}{$_}}) };
my $reg = '\b'.${art}.'('.join("|",map { @$_ } @regtargets).')\b'; my $reg = '\b'.${art}.'('.join("|",map { @$_ } @regtargets).')\b';
Log 1, $reg;
my @andlockinfo; #my @sets; my @andlockinfo; #my @sets;
for (@regtargets) { for (@regtargets) {
my $regtarget = join("|", @$_); my $regtarget = join("|", @$_);
Log 1, $regtarget;
# d Satzteil x Teilposition y cmds Position # d Satzteil x Teilposition y cmds Position
my $d=0; my $x=0; my $y=0; my $prepost; my $prepre; my $d=0; my $x=0; my $y=0; my $prepost; my $prepre;
@ -1104,8 +1167,9 @@ if ($lastevt and ($cmd =~ /\bwieder |^(dann|danach).*/i)) {
T2FL($myname, 5, "Word again found. Reusing timeevent. ".localtime($lastevt)); T2FL($myname, 5, "Word again found. Reusing timeevent. ".localtime($lastevt));
$time = $lastevt; $time = $lastevt;
} }
my $evtime = Talk2Fhem_get_time_by_phrase($myname, $time, $time, \$cmd, \$specials, %{$Talk2Fhem{datephrase}}); my $evtime = Talk2Fhem_get_time_by_phrase($myname, $time, $time, \$cmd, \$specials, @{$Talk2Fhem{dtspec}});
$evtime = Talk2Fhem_get_time_by_phrase($myname, $evtime, $time, \$cmd, \$specials, %{$Talk2Fhem{timephrase}}); #my $evtime = Talk2Fhem_get_time_by_phrase($myname, $time, $time, \$cmd, \$specials, %{$Talk2Fhem{datephrase}});
#$evtime = Talk2Fhem_get_time_by_phrase($myname, $evtime, $time, \$cmd, \$specials, %{$Talk2Fhem{timephrase}});
#T2FL($myname, 4, "Extracted Timephrase. '$$specials{timephrase}'") if $$specials{timephrase}; #T2FL($myname, 4, "Extracted Timephrase. '$$specials{timephrase}'") if $$specials{timephrase};
T2FL($myname, 4, "Extracted Timephrase. '$$specials{timephrase}'") if $$specials{timephrase}; T2FL($myname, 4, "Extracted Timephrase. '$$specials{timephrase}'") if $$specials{timephrase};
@ -1210,77 +1274,107 @@ unless (ref($filter) eq "ARRAY") {
return(Talk2Fhem_realtrim($cmd)); return(Talk2Fhem_realtrim($cmd));
} }
sub Talk2Fhem_get_time_by_phrase($$$$$%) { sub Talk2Fhem_get_time_by_phrase($$$$$@) {
my ($myname, $evt, $now, $cmd, $spec, %tp) = @_;
#$evt (@lt) = Zeit bei der wir uns gerade befinden
#$now (@now) = Grundlage bei Zeiten mit relativen Zeitangaben
my ($myname, $evt, $now, $cmd, $spec, @tp) = @_;
#T2FL($myname, 5, "get_time_by_phrase. Using eventtime: ".localtime($evt)." now: ".localtime($now)." command: ".$$cmd); #T2FL($myname, 5, "get_time_by_phrase. Using eventtime: ".localtime($evt)." now: ".localtime($now)." command: ".$$cmd);
return(0) unless ($evt); return(0) unless ($evt);
my @lt = localtime($evt); my @lt = localtime($evt);
my @now = localtime($now); my @now = localtime($now);
my $disu = AttrVal($myname, "T2F_disableumlautescaping", 0); my $disu = AttrVal($myname, "T2F_disableumlautescaping", 0);
my $pm; my $timeset;
foreach my $key (keys(%tp)) { foreach my $e (@tp) {
my $key = $$e{phr};
my %tf = %{$$e{dtmod}};
my $esckey = Talk2Fhem_escapeumlauts($key, $disu); my $esckey = Talk2Fhem_escapeumlauts($key, $disu);
my @opt = ($$cmd =~ /\b$esckey\b/i); my @opt = ($$cmd =~ /\b$esckey\b/i);
while ($$cmd =~ s/\b$esckey\b/ /i) { while ($$cmd =~ s/\b$esckey\b/ /i) {
$$$spec{timephrase} .= $&." "; $$$spec{timephrase} .= $&." ";
my %tf = %{$tp{$key}}; $pm = $tf{pm} if defined $tf{pm};
$timeset = $tf{notime} if defined $tf{notime};
# my %tf = %{$tp{$key}};
T2FL($myname, 4, "Timephrase found: =~ s/\\b$key\\b/"); T2FL($myname, 4, "Timephrase found: =~ s/\\b$key\\b/");
foreach my $datemod (keys(%tf)) { foreach my $datemod (keys(%tf)) {
next if $datemod eq "fc"; next if $datemod eq "fc";
next if $datemod eq "pm";
# Suche Ersetzungsvariablen # Suche Ersetzungsvariablen
my $dmstore = $tf{$datemod}; my $dmstore = $tf{$datemod};
while ($tf{$datemod} =~ /\$(\d+)/) { while ($tf{$datemod} =~ /\$(\d+)/) {
my $d=$1; my $d=$1;
my $v = $opt[($d-1)]; my $v = $opt[($d-1)];
if ($v !~ /^\d+$/) { if ($v !~ /^\d+$/) {
#Log 1, "KEINE Zahl ".$v; foreach ( keys %{$Talk2Fhem_globals{DE}{numbers}} ) {
foreach ( keys %{$Talk2Fhem_globals{DE}{numbers}} ) { my $tmp = Talk2Fhem_escapeumlauts($_, $disu);
my $tmp = Talk2Fhem_escapeumlauts($_, $disu); last if ($v =~ s/$tmp/$Talk2Fhem_globals{DE}{numbers}{$_}/i);
last if ($v =~ s/$tmp/$Talk2Fhem_globals{DE}{numbers}{$_}/i); }
} }
$tf{$datemod} =~ s/\$\d+/$v/;
} }
$tf{$datemod} =~ s/\$\d+/$v/; $tf{$datemod} = eval($tf{$datemod}); # Kalkulationen
} T2FL($myname, 5, "TIMEPHRASEDATA mod: '$datemod' raw: '$dmstore' result: '$tf{$datemod}' opt: '@opt' pm: '$pm'" );
$tf{$datemod} = eval($tf{$datemod});
T2FL($myname, 5, "TIMEPHRASEDATA mod: '$datemod' raw: '$dmstore' result: '$tf{$datemod}' opt: '@opt'");
if ($datemod eq "days") { if ($datemod eq "days") {
$evt = POSIX::mktime(0,0,12,($lt[3]+$tf{days}),$lt[4],$lt[5]) || 0; $evt = POSIX::mktime(0,0,0,($lt[3]+$tf{days}),$lt[4],$lt[5]) || 0;
$timeset = "12:00";
} elsif ($datemod eq "wday") { } elsif ($datemod eq "wday") {
$evt = POSIX::mktime(0,0,12,($lt[3]-$lt[6]+$tf{wday}+(( $tf{wday} <= $lt[6] )?7:0)),$lt[4],$lt[5]) || 0; $evt = POSIX::mktime(0,0,0,($lt[3]-$lt[6]+$tf{wday}+(( $tf{wday} <= $lt[6] )?7:0)),$lt[4],$lt[5]) || 0;
$timeset = "12:00";
} elsif ($datemod eq "year") { } elsif ($datemod eq "year") {
$evt = POSIX::mktime(0,0,12,$lt[3],$lt[4],($lt[5]+$tf{year})) || 0; $evt = POSIX::mktime(0,0,0,$lt[3],$lt[4],($lt[5]+$tf{year})) || 0;
$timeset = "12:00";
} elsif ($datemod eq "month") { } elsif ($datemod eq "month") {
$evt = POSIX::mktime(0,0,12,$lt[3],($lt[4]+$tf{month}),$lt[5]) || 0; $evt = POSIX::mktime(0,0,0,$lt[3],($lt[4]+$tf{month}),$lt[5]) || 0;
$timeset = "12:00";
} elsif ($datemod eq "sec") { } elsif ($datemod eq "sec") {
$evt = POSIX::mktime(($now[0]+$tf{sec}),$now[1],$now[2],$lt[3],$lt[4],$lt[5]) || 0; $evt = POSIX::mktime(($now[0]+$tf{sec}),$now[1],$now[2],$lt[3],$lt[4],$lt[5]) || 0;
$timeset = undef;
} elsif ($datemod eq "min") { } elsif ($datemod eq "min") {
$evt = POSIX::mktime($now[0],($now[1]+$tf{min}),$now[2],$lt[3],$lt[4],$lt[5]) || 0; $evt = POSIX::mktime($now[0],($now[1]+$tf{min}),$now[2],$lt[3],$lt[4],$lt[5]) || 0;
$timeset = undef;
} elsif ($datemod eq "hour") { } elsif ($datemod eq "hour") {
$evt = POSIX::mktime($now[0],$now[1],($now[2]+$tf{hour}),$lt[3],$lt[4],$lt[5]) || 0; $evt = POSIX::mktime($now[0],$now[1],($now[2]+$tf{hour}),$lt[3],$lt[4],$lt[5]) || 0;
$timeset = undef;
} elsif ($datemod eq "time") { } elsif ($datemod eq "time") {
my @t = map { s/\s//gr } split(":", $tf{time}); my @t = map { s/\s//gr } split(":", $tf{time});
$evt = POSIX::mktime($t[2] || 0,$t[1] || 0,$t[0],$lt[3],$lt[4],$lt[5]) || 0; $evt = POSIX::mktime($t[2] || 0,$t[1] || 0,$t[0],$lt[3],$lt[4],$lt[5]) || 0;
$timeset = undef;
} elsif ($datemod eq "date") { } elsif ($datemod eq "date") {
my @t = split(/\.|\s/, $tf{date}); my @t = split(/\.|\s/, $tf{date});
if ($t[1]) {$t[1]--} else {$t[1] = $now[4]+1} if ($t[1]) {$t[1]--} else {$t[1] = $now[4]+1}
if ($t[2]) {if (length($t[2]) eq 2) { $t[2] = "20".$t[2] }; $t[2]=$t[2]-1900} else {$t[2] = $now[5]} if ($t[2]) {if (length($t[2]) eq 2) { $t[2] = "20".$t[2] }; $t[2]=$t[2]-1900} else {$t[2] = $now[5]}
$evt = POSIX::mktime(0,0,12,$t[0], $t[1], $t[2]) || 0; $evt = POSIX::mktime(0,0,12,$t[0], $t[1], $t[2]) || 0;
$timeset = undef;
} elsif ($datemod eq "unix") { } elsif ($datemod eq "unix") {
$evt = localtime($tf{unix}); $evt = localtime($tf{unix});
} $timeset = undef;
}
@now = localtime($evt); @now = localtime($evt);
} }
@lt = localtime($evt); @lt = localtime($evt);
}
if ($tf{fc}) {
if ($tp{$key}{fc}) { if (ref $tf{fc} eq "CODE") {
if (ref $tp{$key}{fc} eq "CODE") { my $lock = $evt;
my $lock = $evt; $evt = &{$tf{fc}}($evt, $now, $key, \%tf, $pm);
$evt = &{$tp{$key}{fc}}($evt); T2FL($myname, 4, "Time modified by function. ".$lock." -> ".$evt) if $lock != $evt;
T2FL($myname, 4, "Time modified by function. ".$evt) if $lock != $evt; #notwendig wenn fc ohne zeitsetzer ode notime steht $timeset = undef;
}
}
$now = $evt;
} }
} }
}
#wenn keine Zeit gesetzt wurde setze $timeset.
if ($timeset) {
#Log 1, "TIMESET: $timeset";
my @t = split(":", $timeset);
my @lt = localtime($evt);
$evt = POSIX::mktime($t[2] || 0,$t[1] || 0,$t[0],$lt[3],$lt[4],$lt[5]) || 0;
};
return($evt); return($evt);
} }
@ -1310,7 +1404,7 @@ my @hitnokeylist = @{$$phr{hitnokeylist}};
my @fphrs = @{$$phr{regexps}}; my @fphrs = @{$$phr{regexps}};
my $pmatch; my $pmatch;
my $punmatch = $cmd; #my $punmatch = $cmd;
my @dir = ($$spec{origin}); my @dir = ($$spec{origin});
T2FL($myname, 5, "$myname Evaluate search:\n$cmd =~ /$$phr{key}/i") if ref $res; T2FL($myname, 5, "$myname Evaluate search:\n$cmd =~ /$$phr{key}/i") if ref $res;
@ -1318,6 +1412,7 @@ for my $fphr (@fphrs) {
# if (my @d = ($cmd =~ qr/$fphr/i)) # if (my @d = ($cmd =~ qr/$fphr/i))
if ($fphr =~ s/^\?//){ if ($fphr =~ s/^\?//){
my @d = ($cmd =~ /$fphr/i); my @d = ($cmd =~ /$fphr/i);
my $m = $&; my $m = $&;
#Log 1, "A: ".$fphr; #Log 1, "A: ".$fphr;
#Log 1, "A: ".Dumper $m; #Log 1, "A: ".Dumper $m;
@ -1335,15 +1430,15 @@ for my $fphr (@fphrs) {
next if $m eq "?"; next if $m eq "?";
$pmatch .= $m; $pmatch .= $m;
$punmatch =~ s/$m//gi; # $punmatch =~ s/$m//gi;
#$cmd =~ s/$m//gi; $cmd =~ s/$m//gi;
} elsif ($fphr =~ /^\!/) { } elsif ($fphr =~ /^\!/) {
return if (eval { $cmd =~ /$'/i }); return if (eval { $cmd =~ /$'/i });
} elsif (my @d = ($cmd =~ /$fphr/i ) ){ } elsif (my @d = ($cmd =~ /$fphr/i ) ){
my $m = $&; my $m = $&;
$pmatch .= $m; $pmatch .= $m;
$punmatch =~ s/$m//gi; # $punmatch =~ s/$m//gi;
#$cmd =~ s/$m//gi; $cmd =~ s/$m//gi;
# Klammerinhalt speichern wenn Klammer vorhanden # Klammerinhalt speichern wenn Klammer vorhanden
push(@dir, @d) if $fphr =~ /(?<!\\)\((?!\?)/; push(@dir, @d) if $fphr =~ /(?<!\\)\((?!\?)/;
# push(@dir, @d) if $fphr =~ /\((?!\?)/; # push(@dir, @d) if $fphr =~ /\((?!\?)/;
@ -1352,10 +1447,11 @@ for my $fphr (@fphrs) {
#T2FL($myname, 5, "$myname No hit with:\n$cmd =~ /$fphr/i"); #T2FL($myname, 5, "$myname No hit with:\n$cmd =~ /$fphr/i");
return; return;
} }
$cmd = Talk2Fhem_normalize($cmd);
} }
$$spec{match} = $pmatch; $$spec{match} = $pmatch;
$$spec{unmatch} = $punmatch; $$spec{unmatch} = $cmd;
return(1) unless ref $res; return(1) unless ref $res;
@ -1365,7 +1461,7 @@ T2FL($myname, 5, "Filled lists: ".Dumper @fphrs);
T2FL($myname, 5, "Words: ".Dumper @dir); T2FL($myname, 5, "Words: ".Dumper @dir);
#$pmatch=Talk2Fhem_realtrim($pmatch); #$pmatch=Talk2Fhem_realtrim($pmatch);
$punmatch=Talk2Fhem_realtrim($punmatch); my $punmatch=Talk2Fhem_realtrim($cmd);
T2FL($myname, 5, "Match: ".$pmatch); T2FL($myname, 5, "Match: ".$pmatch);
T2FL($myname, 5, "Unmatch: ".$punmatch); T2FL($myname, 5, "Unmatch: ".$punmatch);
@ -1679,8 +1775,8 @@ my %react;
#Log 1, Dumper @keywords; #Log 1, Dumper @keywords;
#wenn keine Liste in Klammer ist #wenn keine Liste in Klammer ist
my $err = T2FL($myname, 1, "Clipnumber $clipno includes no array or integer in '$$phr{key}!");
if ($#keywords == -1 and $else eq "") { if ($#keywords == -1 and $else eq "") {
my $err = T2FL($myname, 1, "Clipnumber $clipno includes no array or integer in '$$phr{key}!");
Talk2Fhem_err($myname, $err,$res,1); Talk2Fhem_err($myname, $err,$res,1);
return(0); return(0);
} }
@ -1798,6 +1894,7 @@ sub Talk2Fhem_escapeumlauts($;$) {
} }
} }
sub T2FL($$$) { sub T2FL($$$) {
Log3($_[0], $_[1], $_[2]); Log3($_[0], $_[1], $_[2]);
my $h = $_[0]; my $h = $_[0];