diff --git a/fhem/FHEM/00_OWX.pm b/fhem/FHEM/00_OWX.pm index 074088377..8c821eb16 100644 --- a/fhem/FHEM/00_OWX.pm +++ b/fhem/FHEM/00_OWX.pm @@ -85,11 +85,11 @@ use vars qw{%owg_family %gets %sets $owx_version $owx_debug}; "qstatus" => "P" ); -#-- These occur in a pulldown menu as settable values for the bus master +#-- These occur in a pulldown menu as settable values for the bus master +# (expert mode: all, standard mode: only reopen) %sets = ( "close" => "c", - "open" => "o", - "closeopen" => "co" , + "open" => "O", "reopen" => "R", "discover" => "C", "detect" => "T", @@ -98,7 +98,7 @@ use vars qw{%owg_family %gets %sets $owx_version $owx_debug}; ); #-- some globals needed for the 1-Wire module -$owx_version="7.06"; +$owx_version="7.08"; #-- debugging now verbosity, this is just for backward compatibility $owx_debug=0; @@ -130,6 +130,7 @@ sub OWX_Initialize ($) { $hash->{AttrFn} = "OWX_Attr"; $hash->{AttrList}= "asynchronous:0,1 dokick:0,1 ". "interval timeout opendelay expert:0_def,1_detail ". + "IODev ". $readingFnAttributes; } @@ -1045,41 +1046,30 @@ sub OWX_Set($@) { my $name = shift @a; my $res = 0; - #-- for the selector: which values are possible + #-- for the selector: all values are possible for expert, otherwise only reopen return ( (AttrVal($name,"expert","") eq "1_detail") ? join(":noArg ", sort keys %sets).":noArg" : "reopen:noArg") if(!defined($sets{$a[0]})); return "OWX_Set: With unknown argument $a[0], choose one of " . ( (AttrVal($name,"expert","") eq "1_detail") ? join(" ", sort keys %sets) : "reopen") if(!defined($sets{$a[0]})); - - #-- Set reopen - if( $a[0] eq "reopen" ){ - DevIo_OpenDev($hash, 1, undef); - $res = 0; - } - - #-- expert mode - #-- Set closedev - if( $a[0] eq "close" ){ - OWX_WDBGL($name,1,"====> CLOSING DEVICE",main::DevIo_CloseDev($hash)); - $res = 0; - } - - #-- Set opendev + + my $owx = $hash->{OWX}; + + #-- Set open if( $a[0] eq "open" ){ - OWX_WDBGL($name,1,"====> OPENING DEVICE",main::DevIo_OpenDev($hash,0,undef)); + $owx->Open(); + $res = 0; + } + + #-- Set close + if( $a[0] eq "close" ){ + $owx->Close(); $res = 0; - } - - #-- Set closeopendev - if( $a[0] eq "closeopen" ){ - OWX_WDBGL($name,1,"====> CLOSING DEVICE",main::DevIo_CloseDev($hash)); - OWX_WDBGL($name,1," OPENING DEVICE",main::DevIo_OpenDev($hash, 0, undef)); } #-- Set reopen if( $a[0] eq "reopen" ){ - OWX_WDBGL($name,1,"====> REOPENING DEVICE",main::DevIo_OpenDev($hash, 1, undef)); + $owx->Reopen(); $res = 0; } @@ -1697,7 +1687,7 @@ sub OWX_WDBGL($$$$) {
  • set <name> reopen -
    re-opens the interface ans re-initializes the 1-Wire bus. +
    re-opens the interface and re-initializes the 1-Wire bus.

  • diff --git a/fhem/FHEM/95_Babble.pm b/fhem/FHEM/95_Babble.pm index 6679d9fcb..014eeffa0 100644 --- a/fhem/FHEM/95_Babble.pm +++ b/fhem/FHEM/95_Babble.pm @@ -53,7 +53,7 @@ if (eval {require RiveScript;1;} ne 1) { my $babblelinkname = "babbles"; # link text my $babblehiddenroom = "babbleRoom"; # hidden room my $babblepublicroom = "babble"; # public room -my $babbleversion = "1.1"; +my $babbleversion = "1.2"; my %babble_transtable_EN = ( "ok" => "OK", @@ -83,10 +83,11 @@ my %babble_transtable_EN = ( "verb" => "Verb", "target" => "Target", "result" => "Result", + "unknown" => "unknown", "infinitive" => "Infinitive", "conjugations" => "Conjugations and Variations", "helptext" => "Help Text", - "speak" => "Speak", + "speak" => "Please speak", "followedby" => "followed by", "placespec" => "a place specification", "dnu" => "Sorry, I did not understand this", @@ -136,10 +137,11 @@ my %babble_transtable_EN = ( "verb" => "Verb", "target" => "Ziel", "result" => "Ergebnis", + "unknown" => "unbekannt", "infinitive" => "Infinitiv", "conjugations" => "Konjugationen und Variationen", "helptext" => "Hilfetext", - "speak" => "Sprich", + "speak" => "Bitte sprich", "followedby" => "gefolgt von", "placespec" => "einer Ortsangabe", "dnu" => "Es tut mir leid, das habe ich nicht verstanden", @@ -181,7 +183,7 @@ sub Babble_Initialize ($) { #$hash->{AttrFn} = "Babble_Attr"; my $attst = "lockstate:locked,unlocked helpFunc noChatBot:0,1 testParm0 testParm1 testParm2 testParm3 ". "remoteFHEM0 remoteFHEM1 remoteFHEM2 remoteFHEM3 remoteFunc0 remoteFunc1 remoteFunc2 remoteFunc3 remoteToken0 remoteToken1 remoteToken2 remoteToken3 ". - "babbleIds babbleDevices babblePlaces babbleNotPlaces babbleVerbs babbleVerbParts babblePrepos babbleQuests babbleArticles babbleStatus babbleWrites babbleTimes"; + "babbleIds babblePreSubs babbleDevices babblePlaces babbleNotPlaces babbleVerbs babbleVerbParts babblePrepos babbleQuests babbleArticles babbleStatus babbleWrites babbleTimes"; $hash->{AttrList} = $attst; if( !defined($babble_tt) ){ @@ -443,6 +445,7 @@ sub Babble_save($) { my $jhash0 = eval{ $json->encode( $hash->{DATA} ) }; if( ReadingsVal($name,"lockstate","locked") ne "locked" ){ my $error = FileWrite("babbleFILE",$jhash0); + Log3 $name, 1, " ".Dumper($jhash0); #Log3 $name,1,"[Babble_save] error=$error"; }else{ Log3 $name, 1, "[Babble] attempt to save data failed due to lockstate"; @@ -623,17 +626,16 @@ sub Babble_Normalize($$){ #-- normalize special phrases my $sentmod = $sentence; - $sentmod =~ s/we((ck)|g) ?zeit/wecker/; - $sentmod =~ s/wecken um/stelle den wecker auf/; - $sentmod =~ s/^wecker/den wecker/; - $sentmod =~ s/beleuchtung/licht/; - $sentmod =~ s/\szimmer/_zimmer/; - $sentmod =~ s/(((zur?)|(von))\s)?(\w+)\sliste/$5_liste/; - $sentmod =~ s/\ssichern/ zusichern/; - $sentmod =~ s/unscharf\s?/aus/; - $sentmod =~ s/scharf\s?/ein/; - $sentmod =~ s/wider\s/wider/; - + my $pairs = AttrVal($name,"babblePreSubs",undef); + if( $pairs ){ + my @subs=split(' ',$pairs); + for( my $i=0; $i{DATA}{"re_verbsi"}\s// ){ + }elsif( $reserve =~ s/^$hash->{DATA}{"re_verbsi"}\s?// ){ $subsubcat = 6; $verb = $1; $reading = $reserve; @@ -949,16 +946,10 @@ sub Babble_Normalize($$){ } } #-- normalize devices - $device = "golf" - if( $device =~/golfplatz/); $device = "haus" if( $device =~/hauses/); - $device = "haustür" - if( $device =~/hauseingangstür/); $device = "wecker" if( $device =~/we((ck)|g).*/); - $device = "alarm" - if( $device =~/alarm.*/); $place = "wohnzimmer" if( ($device eq "licht") && ($place eq "")); if( $device eq "außenlicht" ){ @@ -985,6 +976,14 @@ sub Babble_Normalize($$){ $value=substr($sentmod,index($sentmod,"auf")+4) if( ($reading && $reading eq "auf") || ($reserve && $reserve eq "auf") ); + $value=substr($sentmod,index($sentmod,"hinzufügen")+11) + if( $reserve && $reserve =~ /hinzufügen (.*)/ ); + + if( $verb && $verb eq "entfernen" ){ + $value = $reading; + $reading = "ent"; + } + if( $value =~ /.*uhr.*/ ){ $value = Babble_timecorrector($value); } @@ -1083,9 +1082,9 @@ sub Babble_TestIt{ my $hash = $defs{$name}; my ($device,$verb,$reading,$value,$article,$reserve,$place,$cat) = Babble_Normalize($name,$sentence); - $verb = "" + $verb = "none" if( !$verb ); - $reading = "" + $reading = "none" if( !$reading ); my $str="[Babble_Normalize] ".$babble_tt->{"input"}.": $sentence\n". @@ -1093,13 +1092,16 @@ sub Babble_TestIt{ $babble_tt->{"device"}."=$device ".$babble_tt->{"place"}."=$place ". $babble_tt->{"verb"}."=$verb ".$babble_tt->{"target"}."=$reading / $value"; - my $cmd = $hash->{DATA}{"command"}{$device}{$place}{$verb}{$reading}; - my $res = ""; + my $cmd = $hash->{DATA}{"command"}{$device}{$place}{$verb}{$reading}; + my $res = ""; + my $star = ""; - #-- no - but maybe we have an alias device ? + #-- not directly - but maybe we have an alias device ? if( (!defined($cmd) || $cmd eq "") && defined($device) ){ my $alidev = $device; + #-- remove trailing numbers $alidev =~s/_\d+$//g; + #-- number of real devices for this alias device my $numalias = (defined($hash->{DATA}{"devsalias"}{$alidev})) ? int(@{$hash->{DATA}{"devsalias"}{$alidev}}) : 0; for (my $i=0;$i<$numalias ;$i++){ my $ig = $hash->{DATA}{"devsalias"}{$alidev}[$i]; @@ -1114,10 +1116,31 @@ sub Babble_TestIt{ } } } + + #-- not directly - but maybe we have a device which is an extension of an alias device + if( (!defined($cmd) || $cmd eq "") && defined($device) ){ + my $realdev = $device; + foreach my $stardev (keys $hash->{DATA}{"devsalias"}){ + if(index($stardev,'*')!=-1){ + my $starrexp = $stardev; + $starrexp =~ s/\*/\(\.\*\)/; + if( $realdev =~ /$starrexp/ ){ + $star = $1; + $cmd = $hash->{DATA}{"command"}{$stardev}{$place}{$verb}{$reading}; + if( defined($cmd) && $cmd ne "" ){ + $device = $stardev; + last; + } + } + } + } + } + #-- command found, execute if permitted if( defined($cmd) && $cmd ne "" ){ #-- substitution $cmd =~ s/\$DEV/$device/g; + $cmd =~ s/\$STAR/$star/g; $cmd =~ s/\$VALUE/$value/g; for( my $i=0;$i<4;$i++){ $parms[$i] = AttrVal($name,"testParm".$i,undef) @@ -1224,10 +1247,15 @@ sub Babble_DoIt{ my $hash = $defs{$name}; my ($device,$verb,$reading,$value,$article,$reserve,$place,$cat) = Babble_Normalize($name,$sentence); + $verb = "none" + if( !$verb ); + $reading = "none" + if( !$reading ); my $cmd = $hash->{DATA}{"command"}{$device}{$place}{$verb}{$reading}; my $res = ""; + my $star= ""; - #-- no - but maybe we have an alias device ? + #-- not directly - but maybe we have an alias device ? if( !defined($cmd) || $cmd eq "" ){ my $alidev = $device; $alidev =~s/_\d+$//g; @@ -1246,6 +1274,25 @@ sub Babble_DoIt{ } } + #-- not directly - but maybe we have a device which is an extension of an alias device + if( (!defined($cmd) || $cmd eq "") && defined($device) ){ + my $realdev = $device; + foreach my $stardev (keys $hash->{DATA}{"devsalias"}){ + if(index($stardev,'*')!=-1){ + my $starrexp = $stardev; + $starrexp =~ s/\*/\(\.\*\)/; + if( $realdev =~ /$starrexp/ ){ + $star = $1; + $cmd = $hash->{DATA}{"command"}{$stardev}{$place}{$verb}{$reading}; + if( defined($cmd) && $cmd ne "" ){ + $device = $stardev; + last; + } + } + } + } + } + if( defined($cmd) && $cmd ne "" ){ #-- substitution $cmd =~ s/\$DEV/$device/g; @@ -1509,9 +1556,8 @@ sub Babble_RemCmd($$$$$){ $target="none" if( $target eq ""); - Log 1,"[Babble_RemCmd] Deleting from hash: $bdev.$place.$verb.$target"; + Log3 $name, 1,"[Babble_RemCmd] Deleting from hash: $bdev.$place.$verb.$target => ".$hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target}; delete($hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target}); - } ######################################################################################### @@ -1811,6 +1857,7 @@ sub Babble_getverbs($$$) { #-- just do something with the current list }elsif( $type eq "html" ){ my @verbsi=@{$hash->{DATA}{"verbsi"}}; + my $fnd = 0; #-- output if( !defined($sel) ){ return ""; @@ -1818,9 +1865,17 @@ sub Babble_getverbs($$$) { my $ret = ($sel eq "none") ? ''; for( my $i=0;$i' : ''; } + #if( $fnd==0 ){ + # $ret .= ''; + #} return $ret; } @@ -2081,7 +2136,11 @@ sub Babble_Html($) $rot .= ""; $rot .= "". "{"add"}."\" style=\"width:100px;\"/>\n";#$tblrow-$devcount.$devrow - + + #my $json = JSON->new->utf8; + #my $jhash0 = eval{ $json->encode( $hash->{DATA}{"command"}{$lbdev} ) }; + #Log3 $name, 1, "\n\n\n\n $lbdev ========>".Dumper($jhash0); + foreach my $place (keys %{$hash->{DATA}{"command"}{$lbdev}}){ foreach my $verb (keys %{$hash->{DATA}{"command"}{$lbdev}{$place}}){ foreach my $target (keys %{$hash->{DATA}{"command"}{$lbdev}{$place}{$verb}}){ @@ -2201,13 +2260,16 @@ sub Babble_Html($)
  • a FHEM Device name
  • an integer 1..3, indication which of the remoteFHEM functions to be called
  • + The Babble device name may contain a *-character. If this is the case, it will be considered a regular expression, with the star replaced by (.*). + When using Babble with a natural language sentence whose device part matches this regular expression, the character group addressed by the star sequence is placed in the variable + $STAR, and used to replace this value in the command sequence.
  • attr <name> helpFunc <function name&rt;
    name of a help function which is used in case no command is found for a certain device. When this function is called, the strings $DEV, $HELP, $PARM[0|1|2...] will be replaced by the devicename identified by Babble, the help text for this device and parameters passed to the Babble_DoIt function
  • attr <name> testParm(0|1|2|3) <string&rt;
    if a command is not really excuted, but only tested, the values of these attributes will be used to substitute the strings $PARM[0|1|2...] - in the tested command
  • + in the tested command
  • attr <name> noChatBot 0|1
    if this attribute is set to 1, a local RiveScript interpreter will be ignored even though it is present in the system
  • attr <name> remoteFHEM(0|1|2|3) <IP address:port&rt; @@ -2218,6 +2280,9 @@ sub Babble_Html($)
    csrfToken for addressing a certain remote FHEM device
  • attr <name> babbleIds ...
    space separated list of identities by which babble may be addressed
  • +
  • attr <name> babbleSubs :,:, ... +
    space separated list of regular expressions and their replacements - this will be used on the initial sentence submitted to Babble + (Note: a space in the regexp must be replaced by \s).
  • attr <name> babblePlaces ...
    space separated list of special places to be identified in speech
  • attr <name> babbleNoPlaces ... diff --git a/fhem/FHEM/95_PostMe.pm b/fhem/FHEM/95_PostMe.pm index e6fdd74e5..e8f77b989 100644 --- a/fhem/FHEM/95_PostMe.pm +++ b/fhem/FHEM/95_PostMe.pm @@ -185,10 +185,10 @@ sub PostMe_Check($$) { for( $loop=1;$loop<=$cnop;$loop++){ $res = ReadingsVal($devname, sprintf("postme%02dName",$loop), undef); last - if($res eq $listname); + if(lc($res) eq lc($listname)); } #-- no PostMe with this name - if( $res ne $listname ){ + if( lc($res) ne lc($listname) ){ return undef; }else{ return $loop; diff --git a/fhem/FHEM/95_YAAHM.pm b/fhem/FHEM/95_YAAHM.pm index edde8a691..e627852c2 100644 --- a/fhem/FHEM/95_YAAHM.pm +++ b/fhem/FHEM/95_YAAHM.pm @@ -47,7 +47,7 @@ my $yaahmname; my $yaahmlinkname = "Profile"; # link text my $yaahmhiddenroom = "ProfileRoom"; # hidden room my $yaahmpublicroom = "Unsorted"; # public room -my $yaahmversion = "1.47"; +my $yaahmversion = "1.48"; my $firstcall = 1; my %yaahm_transtable_EN = ( @@ -731,6 +731,10 @@ sub YAAHM_Set($@) { }elsif ( $cmd =~ /^checkstate.*/ ) { YAAHM_InternalTimer("check",time()+ $args[0], "YAAHM_checkstate", $hash, 0); + #----------------------------------------------------------- + }elsif ( $cmd =~ /^correctstate.*/ ) { + YAAHM_correctstate($hash); + #----------------------------------------------------------- }elsif ( $cmd =~ /^time.*/ ) { return YAAHM_time($name,$args[0],$exec); @@ -839,7 +843,7 @@ sub YAAHM_Set($@) { my $str = ""; return "[YAAHM] Unknown argument " . $cmd . ", choose one of". " manualnext time:".join(',',@times)." mode:".join(',',@modes). - " state:".join(',',@states)." locked:noArg unlocked:noArg save:noArg checkstate:0,5,10 restore:noArg initialize:noArg createWeekly deleteWeekly"; + " state:".join(',',@states)." locked:noArg unlocked:noArg save:noArg correctstate:noArg checkstate:0,5,10 restore:noArg initialize:noArg createWeekly deleteWeekly"; } } @@ -1091,6 +1095,8 @@ sub YAAHM_setParm($@) { # # Parameter name = name of the YAAHM device # +# Careful: $exec=0 is needed in case we want to prevent execution of helper here +# ######################################################################################### sub YAAHM_time { @@ -1178,7 +1184,7 @@ sub YAAHM_time { #-- helper function not executed, e.g. by call from external timer return - if( !defined($exec) ); + if( !defined($exec) || $exec==0); #-- execute the helper function my $xval; @@ -1205,6 +1211,7 @@ sub YAAHM_time { $msg .= "Simulation ".$xval; } if( $exec==1 ){ + Log3 $name,1,"[YAAHM_time] ecxecuting $xval"; fhem($xval); }elsif( $exec==0 ){ Log3 $name,1,"[YAAHM_time] ".$msg; @@ -1460,6 +1467,65 @@ sub YAAHM_checkstate($) { return undef } +######################################################################################### +# +# YAAHM_correctstate - correct state devices +# +# Parameter someHash = either internal hash of timer +# => need to dereference it for getting device hash +# or device hash +# +######################################################################################### + +sub YAAHM_correctstate($) { + my ($someHash) = @_; + + my $hash; + if( defined($someHash->{HASH}) ){ + $hash = $someHash->{HASH}; + }else{ + $hash = $someHash; + } + my $name = $hash->{NAME}; + + Log3 $name, 1,"[YAAHM_correctstate] on device ".$hash->{NAME}." called"; + + my $istate; + my $cstate = defined($hash->{DATA}{"HSM"}{"state"}) ? $hash->{DATA}{"HSM"}{"state"} : ""; + + return undef + if( !defined($attr{$name}{"stateDevices"}) ); + + for($istate=0;$istate{DATA}{"DT"}{$key}[2]) && $hash->{DATA}{"DT"}{$key}[2] ne ""; - my $xval = "{YAAHM_time('".$name."','".$key."')},".$hash->{DATA}{"DT"}{$key}[2]; + #-- uh oh, double execution of functions !!! Do this in YAAHM_time, NOT in timer + #my $xval = "{YAAHM_time('".$name."','".$key."')},".$hash->{DATA}{"DT"}{$key}[2]; + my $xval = "{YAAHM_time('".$name."','".$key."',1)}"; #-- entries in the default table with no entry are single-timers if( !$f1 and !$f2 ){ @@ -1651,12 +1719,12 @@ sub YAAHM_startWeeklyTimer($) { $res .= "\nand ([" .$name. ":housemode] =~ \"".$v4a."\")"; $res .= "\nand ([" .$name. ":todayType] =~ \"".$v4b."\")"; - #-- action + #-- action - explicitly in timer, not in YAAHM_time my $xval = ""; if( $i==0 ){ - $xval = "{YAAHM_time('".$name."','wakeup')},".$hash->{DATA}{"WT"}[$i]{"action"}; + $xval = "{YAAHM_time('".$name."','wakeup',0)},".$hash->{DATA}{"WT"}[$i]{"action"}; }elsif( $i==1 ){ - $xval = "{YAAHM_time('".$name."','sleep')},".$hash->{DATA}{"WT"}[$i]{"action"}; + $xval = "{YAAHM_time('".$name."','sleep',0)},".$hash->{DATA}{"WT"}[$i]{"action"}; }else{ $xval = $hash->{DATA}{"WT"}[$i]{"action"}; } @@ -3664,6 +3732,15 @@ sub YAAHM_Longtable($){ The actual changes to certain devices are made by an external stateHelper function. If these external devices are in their proper state for a particular house (security) state can be checked automatically, see the attribute stateDevices
  • +
  • + set <name> checkstate 0|5|10 + +
    Check the house (security) state for each of the devices defined in the stateDevices attribute in 0, 5 or 10 seconds from now
  • +
  • + set <name> correctstate + +
    Try to correct the house (security) state, by issueing a FHEM command set <device> <targetstate> + for each of the devices defined in the stateDevices attribute and not in the proper state for the given house (security) state
  • set <name> createWeekly <string> diff --git a/fhem/contrib/Babble/general.rive b/fhem/contrib/Babble/general.rive index 5921078cf..f0b7ddb4e 100644 --- a/fhem/contrib/Babble/general.rive +++ b/fhem/contrib/Babble/general.rive @@ -1,6 +1,6 @@ //######################################################################################## // general.rive -// Version 0.1 +// Version 0.2 // See 95_Babble.pm for licensing //######################################################################################## //# Prof. Dr. Peter A. Henning @@ -39,6 +39,15 @@ + wie kannst du * (steuern|schalten) - devhelp ++ wie kannst du (den|das|die) * (steuern|schalten) +- devhelp + ++ was kannst du (mit|bei) * (machen|steuern|schalten) +- devhelp + ++ was kannst du (mit|bei) (dem|der|den) * (machen|steuern|schalten) +- devhelp + + was ist * - devhelp