diff --git a/fhem/FHEM/90_at.pm b/fhem/FHEM/90_at.pm index 4100160fe..aff9dffe0 100755 --- a/fhem/FHEM/90_at.pm +++ b/fhem/FHEM/90_at.pm @@ -18,6 +18,7 @@ at_Initialize($) $hash->{StateFn} = "at_State"; $hash->{AttrList} = "disable:0,1 disabledForIntervals ". "skip_next:0,1 alignTime"; + $hash->{FW_detailFn} = "at_fhemwebFn"; } @@ -69,6 +70,10 @@ at_Define($$) $rel = "" if(!defined($rel)); $rep = "" if(!defined($rep)); $cnt = "" if(!defined($cnt)); + $hash->{RELATIVE} = ($rel ? "yes" : "no"); + $hash->{PERIODIC} = ($rep ? "yes" : "no"); + $hash->{TIMESPEC} = $tspec; + $hash->{COMMAND} = $command; my $ot = $data{AT_TRIGGERTIME} ? $data{AT_TRIGGERTIME} : gettimeofday(); $ot = int($ot) if(!$rel); # No way to specify subseconds @@ -132,8 +137,8 @@ at_Exec($) my $disable = IsDisabled($name); delete $attr{$name}{skip_next} if($skip); - my (undef, $command) = split("[ \t]+", $hash->{DEF}, 2); - $command = SemicolonEscape($command); + + my $command = SemicolonEscape($hash->{COMMAND}); my $ret = AnalyzeCommandChain(undef, $command) if(!$skip && !$disable); Log3 $name, 3, "$name: $ret" if($ret); @@ -246,6 +251,74 @@ at_State($$$$) return undef; } +######################### +sub +at_fhemwebFn($$$$) +{ + my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. + my $hash = $defs{$d}; + + my $ts = $hash->{TIMESPEC}; $ts =~ s/'/\\'/g; + my $isPerl = ($ts =~ m/^{(.*)}/); + $ts = $1 if($isPerl); + +return "
Timespec wizard:". +"".<<'EOF'; + + + + + + + + + + + + + +
Relative   Periodic  
Use perl function for timespec
Timespec
Timespec +
+ +EOF +} + 1; =pod diff --git a/fhem/FHEM/91_notify.pm b/fhem/FHEM/91_notify.pm index 63d8af961..ca98190ac 100755 --- a/fhem/FHEM/91_notify.pm +++ b/fhem/FHEM/91_notify.pm @@ -4,6 +4,7 @@ package main; use strict; use warnings; +use vars qw($FW_ME); # webname (default is fhem) ##################################### sub @@ -15,6 +16,8 @@ notify_Initialize($) $hash->{NotifyFn} = "notify_Exec"; $hash->{AttrFn} = "notify_Attr"; $hash->{AttrList} = "disable:0,1 disabledForIntervals forwardReturnValue:0,1 showTriggerTime:0,1 addStateEvent:0,1"; + $hash->{SetFn} = "notify_Set"; + $hash->{FW_detailFn} = "notify_fhemwebFn"; } @@ -39,6 +42,7 @@ notify_Define($$) eval { "Hallo" =~ m/^$re$/ }; return "Bad regexp: $@" if($@); $hash->{REGEXP} = $re; + $hash->{COMMAND} = $command; $hash->{STATE} = "active"; notifyRegexpChanged($hash, $re); @@ -74,14 +78,12 @@ notify_Exec($$) } if($found) { Log3 $ln, 5, "Triggering $ln"; - my (undef, $exec) = split("[ \t]+", $ntfy->{DEF}, 2); - my %specials= ( "%NAME" => $n, "%TYPE" => $t, "%EVENT" => $s ); - $exec= EvalSpecials($exec, %specials); + my $exec = EvalSpecials($ntfy->{COMMAND}, %specials); Log3 $ln, 4, "$ln exec $exec"; my $r = AnalyzeCommandChain(undef, $exec); @@ -111,6 +113,116 @@ notify_Attr(@) $defs{$a[1]}{STATE} = ($do == 1 ? "disabled" : "active"); return undef; } + +################################### + +sub +notify_Set($@) +{ + my ($hash, @a) = @_; + my $me = $hash->{NAME}; + + return "no set argument specified" if(int(@a) < 2); + my %sets = (addRegexpPart=>2, removeRegexpPart=>1); + + my $cmd = $a[1]; + return "Unknown argument $cmd, choose one of " # No dropdown in FHEMWEB + if(!defined($sets{$cmd})); + return "$cmd needs $sets{$cmd} parameter(s)" if(@a-$sets{$cmd} != 2); + + if($cmd eq "addRegexpPart") { + my %h; + my $re = "$a[2]:$a[3]"; + map { $h{$_} = 1 } split(/\|/, $hash->{REGEXP}); + $h{$re} = 1; + $re = join("|", sort keys %h); + return "Bad regexp: starting with *" if($re =~ m/^\*/); + eval { "Hallo" =~ m/^$re$/ }; + return "Bad regexp: $@" if($@); + $hash->{REGEXP} = $re; + $hash->{DEF} = "$re $hash->{COMMAND}"; + notifyRegexpChanged($hash, $re); + + } elsif($cmd eq "removeRegexpPart") { + my %h; + map { $h{$_} = 1 } split(/\|/, $hash->{REGEXP}); + return "Cannot remove regexp part: not found" if(!$h{$a[2]}); + return "Cannot remove last regexp part" if(int(keys(%h)) == 1); + delete $h{$a[2]}; + my $re = join("|", sort keys %h); + return "Bad regexp: starting with *" if($re =~ m/^\*/); + eval { "Hallo" =~ m/^$re$/ }; + return "Bad regexp: $@" if($@); + $hash->{REGEXP} = $re; + $hash->{DEF} = "$re $hash->{COMMAND}"; + notifyRegexpChanged($hash, $re); + + } + return undef; +} + + +######################### +sub +notify_fhemwebFn($$$$) +{ + my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. + my $hash = $defs{$d}; + + my $ret .= "
Regexp wizard"; + my $row=0; + $ret .= "
"; + my @ra = split(/\|/, $hash->{REGEXP}); + if(@ra > 1) { + foreach my $r (@ra) { + $ret .= ""; + my $cmd = "cmd.X= set $d removeRegexpPart&val.X=$r"; # =.set: avoid JS + $ret .= ""; + $ret .= FW_pH("$cmd&detail=$d", "removeRegexpPart", 1,undef,1); + $ret .= ""; + } + } + + my @et = devspec2array("TYPE=eventTypes"); + if(!@et) { + $ret .= FW_pH("$FW_ME/docs/commandref.html#eventTypes", + "To add a regexp an eventTypes definition is needed", + 1, undef, 1); + } else { + my %dh; + foreach my $l (split("\n", AnalyzeCommand(undef, "get $et[0] list"))) { + my @a = split(/[ \r\n]/, $l); + $a[1] = "" if(!defined($a[1])); + $a[1] =~ s/\.\*//g; + $a[1] =~ s/,.*//g; + next if(@a < 2); + $dh{$a[0]}{".*"} = 1; + $dh{$a[0]}{$a[1].".*"} = 1; + } + my $list = ""; my @al; + foreach my $dev (sort keys %dh) { + $list .= " $dev:" . join(",", sort keys %{$dh{$dev}}); + push @al, $dev; + } + $ret .= ""; + $ret .= ""; + } + $ret .= "
$r
"; + $ret .= FW_hidden("detail", $d); + $ret .= FW_hidden("dev.$d", "$d addRegexpPart"); + $ret .= FW_submit("cmd.$d", "set", "set"); + $ret .= "
 $d addRegexpPart 
"; + $list =~ s/(['"])/./g; + $ret .= FW_select("","arg.$d",\@al, undef, "set", + "FW_selChange(this.options[selectedIndex].text,'$list','val.$d')"); + $ret .= FW_textfield("val.$d", 30, "set"); + $ret .= ""; + $ret .= "
"; + + return $ret; +} + 1; =pod @@ -221,7 +333,27 @@ notify_Attr(@) - Set
+ Set + +
+ Get
@@ -395,7 +527,23 @@ notify_Attr(@) - Set
+ Set + +
Get
diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm index aaabde09c..35f8ee791 100755 --- a/fhem/FHEM/92_FileLog.pm +++ b/fhem/FHEM/92_FileLog.pm @@ -9,7 +9,7 @@ use IO::File; # This block is only needed when FileLog is loaded bevore FHEMWEB sub FW_pO(@); sub FW_pH(@); -use vars qw($FW_ME); # webname (default is fhem), needed by 97_GROUP +use vars qw($FW_ME); # webname (default is fhem) use vars qw($FW_RET); # Returned data (html) use vars qw($FW_RETTYPE); use vars qw($FW_cmdret); # error msg forwarding from toSVG @@ -183,7 +183,6 @@ FileLog_Attr(@) } ################################### - sub FileLog_Set($@) { @@ -1259,26 +1258,22 @@ FileLog_sampleDataFn($$$$$)
  • addRegexpPart <device> <regexp> -
  • + Fügt ein regexp Teil hinzu, der als device:regexp aufgebaut ist. + Die Teile werden nach Regexp-Regeln mit | getrennt. Achtung: durch + hinzufügen können manuell erzeugte Regexps ungültig + werden. +
  • removeRegexpPart <re> -
  • + Entfernt ein regexp Teil. Die Inkonsistenz von addRegexpPart / + removeRegexPart-Argumenten hat seinen Ursprung in der Wiederverwendung + von Javascript-Funktionen. +
  • absorb secondFileLog - -
  • +

    diff --git a/fhem/FHEM/98_SVG.pm b/fhem/FHEM/98_SVG.pm index 283564438..8adb867d3 100755 --- a/fhem/FHEM/98_SVG.pm +++ b/fhem/FHEM/98_SVG.pm @@ -39,6 +39,7 @@ sub SVG_substcfg($$$$$$); sub SVG_time_align($$); sub SVG_time_to_sec($); sub SVG_openFile($$$); +sub SVG_doShowLog($$$$;$$); my %SVG_devs; # hash of from/to entries per device @@ -809,7 +810,7 @@ SVG_showLog($) } sub -SVG_doShowLog($$$$$$) +SVG_doShowLog($$$$;$$) { my ($wl, $d, $type, $file, $styleW, $styleH) = @_; my $pm = AttrVal($wl,"plotmode",$FW_plotmode); diff --git a/fhem/www/pgm2/fhemweb.js b/fhem/www/pgm2/fhemweb.js index d20ec2826..d32a755d2 100644 --- a/fhem/www/pgm2/fhemweb.js +++ b/fhem/www/pgm2/fhemweb.js @@ -146,7 +146,7 @@ FW_longpoll() } } if(filter == "") { - var sa = document.location.search.substring(1).split("&"); + var sa = location.search.substring(1).split("&"); for(var i = 0; i < sa.length; i++) { if(sa[i].substring(0,5) == "room=") filter=sa[i]; @@ -172,7 +172,7 @@ FW_longpoll() if(iP != null) filter = filter +";iconPath="+iP; - var query = document.location.pathname+"?XHR=1"+ + var query = location.pathname+"?XHR=1"+ "&inform=type=status;filter="+filter+ "×tamp="+new Date().getTime(); query = addcsrf(query); @@ -292,7 +292,7 @@ FW_queryValue(cmd, qFn, qArg) eval(qFn.replace("%", qResp)); delete qConn; } - var query = document.location.pathname+"?cmd="+cmd+"&XHR=1" + var query = location.pathname+"?cmd="+cmd+"&XHR=1" query = addcsrf(query); qConn.open("GET", query, true); qConn.send(null); diff --git a/fhem/www/pgm2/fhemweb_time.js b/fhem/www/pgm2/fhemweb_time.js index 264d66c20..0ad7b9e55 100644 --- a/fhem/www/pgm2/fhemweb_time.js +++ b/fhem/www/pgm2/fhemweb_time.js @@ -20,7 +20,9 @@ FW_timeCreate(el,cmd) if(brOff > 0) { par.innerHTML = par.innerHTML.substring(0, brOff).replace('"-"','"+"'); if(cmd) { - if(typeof FW_pollConn != "undefined") + if(typeof cmd == "function") + cmd(v); + else if(typeof FW_pollConn != "undefined") FW_cmd(cmd.replace('%',v)+"&XHR=1"); else window.location = addcsrf(cmd.replace('%',v));