mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 14:13:18 +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:
parent
76a5e77c39
commit
9657ffbf7d
@ -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}
|
||||||
|
@ -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 ($tp{$key}{fc}) {
|
if ($tf{fc}) {
|
||||||
if (ref $tp{$key}{fc} eq "CODE") {
|
if (ref $tf{fc} eq "CODE") {
|
||||||
my $lock = $evt;
|
my $lock = $evt;
|
||||||
$evt = &{$tp{$key}{fc}}($evt);
|
$evt = &{$tf{fc}}($evt, $now, $key, \%tf, $pm);
|
||||||
T2FL($myname, 4, "Time modified by function. ".$evt) if $lock != $evt;
|
T2FL($myname, 4, "Time modified by function. ".$lock." -> ".$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];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user