From f9af07816b57a8995bd09e06aefa617efaaa64a4 Mon Sep 17 00:00:00 2001 From: phenning <> Date: Sun, 8 Oct 2017 17:25:19 +0000 Subject: [PATCH] 95_Astro.pm: Defekter Link Dokumentation korrigiert 95_Alarm.pm: Defekter Link Dokumentation korrigiert 95_YAAHM.pm: Defekter Link Dokumentation korrigiert 95_PostMe.pm: Defekter Link Dokumentation korrigiert git-svn-id: https://svn.fhem.de/fhem/trunk@15213 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/95_Alarm.pm | 421 ++++++++++++++++++++++++++++++++--------- fhem/FHEM/95_Astro.pm | 12 +- fhem/FHEM/95_PostMe.pm | 7 +- fhem/FHEM/95_YAAHM.pm | 90 +++++---- 4 files changed, 394 insertions(+), 136 deletions(-) diff --git a/fhem/FHEM/95_Alarm.pm b/fhem/FHEM/95_Alarm.pm index 77bc6488e..29c921786 100644 --- a/fhem/FHEM/95_Alarm.pm +++ b/fhem/FHEM/95_Alarm.pm @@ -37,11 +37,115 @@ use vars qw($FW_ME); ######################### # Global variables -my $alarmname = "Alarms"; # link text +my $alarmlinkname = "Alarms"; # link text my $alarmhiddenroom = "AlarmRoom"; # hidden room my $alarmpublicroom = "Alarm"; # public room my $alarmno = 8; -my $alarmversion = "2.85"; +my $alarmversion = "3.0"; + +my %alarm_transtable_EN = ( + "ok" => "OK", + "notok" => "Not OK", + "start" => "Start", + "end" => "End", + "status" => "Status", + "notstarted" => "Not started", + "next" => "Next", + "arm " => "Arm", + "disarm" => "Disarm", + "armbutton" => "Arming", + "disarmbutton" => "Disarming", + "cancelbutton" => "Canceling", + "raise" => "Raise", + "wait" => "Wait", + "delay" => "Delay", + "cancel" => "Cancel", + "button" => "Button", + "level" => "Level", + "message" => "Message", + "messagepart" => "Message Part", + "notify" => "Notify", + "notifyto" => "Notify to", + "notifyby" => "Notify by", + "setby" => "Set by", + "regexp" => "RegExp", + "time" => "Time", + "description" => "Description", + "settings" => "Settings", + "sensors" => "Sensors", + "actors" => "Actors", + "action" => "Action", + "setaction" => "Set Action", + "unsetaction" => "Unset Action", + "testaction" => "Test", + "armaction" => "Arm Action", + "disarmaction" => "Disarm Action", + "waitaction" => "Wait Action", + "cancelaction" => "Cancel Action", + "alarm" => "Alarm", + "alarms" => "Alarm System", + #-- + "state" => "Security", + "unlocked" => "Unlocked", + "locked" => "Locked", + "unsecured" => "Not Secured", + "secured" => "Secured", + "protected" => "Geschützt", + "guarded" => "Guarded" + ); + + my %alarm_transtable_DE = ( + "ok" => "OK", + "notok" => "Nicht OK", + "start" => "Start", + "end" => "Ende", + "status" => "Status", + "notstarted" => "Nicht gestartet", + "next" => "Nächste", + "arm" => "Schärfen", + "disarm" => "Entschärfen", + "armbutton" => "Schärfen", + "disarmbutton" => "Entschärfen", + "cancelbutton" => "Widerrufen", + "raise" => "Auslösen", + "wait" => "Warte", + "delay" => "Verzögerung", + "cancel" => "Widerruf", + "button" => "Button", + "level" => "Level", + "message" => "Nachricht", + "messagepart" => "Nachrichtenteil", + "notify" => "Auslösung", + "notifyto" => "Wirkt auf", + "notifyby" => "Auslösung durch", + "setby" => "Gesetzt durch", + "regexp" => "RegExp", + "time" => "Zeit", + "description" => "Beschreibung", + "settings" => "Einstellungen", + "sensors" => "Sensoren", + "actors" => "Aktoren", + "action" => "Wirkung", + "setaction" => "Aktion Setzen", + "unsetaction" => "Aktion Rücksetzen", + "testaction" => "Testen", + "armaction" => "Scharf-Aktion", + "disarmaction" => "Unscharf-Aktion", + "waitaction" => "Warte-Aktion", + "cancelaction" => "Widerruf-Aktion", + "alarm" => "Alarm", + "alarms" => "Alarmanlage", + #-- + "state" => "Sicherheit", + "unlocked" => "Unverschlossen", + "locked" => "Verschlossen", + "unsecured" => "Nicht Gesichert", + "secured" => "Gesichert", + "protected" => "Geschützt", + "guarded" => "Überwacht" + ); + +my $alarm_tt; ######################################################################################### # @@ -59,14 +163,25 @@ sub Alarm_Initialize ($) { $hash->{GetFn} = "Alarm_Get"; $hash->{UndefFn} = "Alarm_Undef"; #$hash->{AttrFn} = "Alarm_Attr"; - my $attst = "lockstate:lock,unlock statedisplay:simple,color,table,none armdelay armwait armact disarmact cancelact"; + my $attst = "lockstate:locked,unlocked testbutton:0,1 statedisplay:simple,color,table,none armdelay armwait armact disarmact cancelact"; for( my $level=0;$level<$alarmno;$level++ ){ $attst .=" level".$level."start level".$level."end level".$level."msg level".$level."xec:0,1 level".$level."onact level".$level."offact "; } $hash->{AttrList} = $attst; + if( !defined($alarm_tt) ){ + #-- in any attribute redefinition readjust language + my $lang = AttrVal("global","language","EN"); + if( $lang eq "DE"){ + $alarm_tt = \%alarm_transtable_DE; + }else{ + $alarm_tt = \%alarm_transtable_EN; + } + } + $alarmlinkname = $alarm_tt->{"alarms"}; + $data{FWEXT}{Alarmx}{LINK} = "?room=".$alarmhiddenroom; - $data{FWEXT}{Alarmx}{NAME} = $alarmname; + $data{FWEXT}{Alarmx}{NAME} = $alarmlinkname; return undef; } @@ -80,19 +195,33 @@ sub Alarm_Initialize ($) { ######################################################################################### sub Alarm_Define ($$) { - my ($hash, $def) = @_; - my $now = time(); - my $name = $hash->{NAME}; - $hash->{VERSION} = $alarmversion; - readingsSingleUpdate( $hash, "state", "Initialized", 1 ); - - $alarmhiddenroom = defined($attr{$name}{"hiddenroom"}) ? $attr{$name}{"hiddenroom"} : $alarmhiddenroom; - $alarmpublicroom = defined($attr{$name}{"publicroom"}) ? $attr{$name}{"publicroom"} : $alarmpublicroom; + my ($hash, $def) = @_; + my $now = time(); + my $name = $hash->{NAME}; + $hash->{VERSION} = $alarmversion; - RemoveInternalTimer($hash); - InternalTimer ($now + 5, 'Alarm_CreateEntry', $hash, 0); + #-- readjust language + my $lang = AttrVal("global","language","EN"); + if( $lang eq "DE"){ + $alarm_tt = \%alarm_transtable_DE; + }else{ + $alarm_tt = \%alarm_transtable_EN; + } + + readingsSingleUpdate( $hash, "state", "Initialized", 1 ); + + $alarmhiddenroom = defined($attr{$name}{"hiddenroom"}) ? $attr{$name}{"hiddenroom"} : $alarmhiddenroom; + $alarmpublicroom = defined($attr{$name}{"publicroom"}) ? $attr{$name}{"publicroom"} : $alarmpublicroom; + $data{FWEXT}{Alarmx}{LINK} = "?room=".$alarmhiddenroom; + $data{FWEXT}{Alarmx}{NAME} = $alarmlinkname; + $attr{$name}{"room"} = $alarmhiddenroom; + + $modules{Alarm}{defptr}{$name} = $hash; + + RemoveInternalTimer($hash); + InternalTimer ($now + 5, 'Alarm_CreateEntry', $hash, 0); - return; + return; } ######################################################################################### @@ -105,8 +234,14 @@ sub Alarm_Define ($$) { sub Alarm_Undef ($$) { my ($hash,$arg) = @_; + my $name = $hash->{NAME}; RemoveInternalTimer($hash); + delete $data{FWEXT}{Alarmx}; + if (defined $defs{$name."_weblink"}) { + FW_fC("delete ".$name."_weblink"); + Log3 $hash, 3, "[".$name. " V".$alarmversion."]"." Weblink ".$name."_weblink deleted"; + } return undef; } @@ -121,6 +256,16 @@ sub Alarm_Undef ($$) { sub Alarm_Attr($$$) { my ($cmd, $name, $attrName, $attrVal) = @_; + + my $hash = $defs{"$name"}; + + #-- in any attribute redefinition readjust language + my $lang = AttrVal("global","language","EN"); + if( $lang eq "DE"){ + $alarm_tt = \%alarm_transtable_DE; + }else{ + $alarm_tt = \%alarm_transtable_EN; + } return; } @@ -155,6 +300,7 @@ sub Alarm_CreateEntry($) { } } } + #-- recover state from stored readings for( my $level=0;$level<$alarmno;$level++ ){ my $val = ReadingsVal($name,"level".$level,""); @@ -246,22 +392,26 @@ sub Alarm_getstate($) { #-------------------------- if( $type eq "simple" ){ for( my $level=0;$level<$alarmno;$level++ ){ - $val = $hash->{READINGS}{"level".$level}{VAL}; - if( ($val eq "disarmed")||($val eq "armed") ){ - $res.='O'; + $val = $hash->{READINGS}{"level".$level}{VAL}; + if( $val eq "disarmed" ){ + $res .= '-'; + }elsif( $val eq "armed" ){ + $res .= 'O'; }else{ - $res.='X'; + $res .= 'X'; } } #-------------------------- }elsif( $type eq "color" ){ - $res = ''; + $res = ''; for( my $level=0;$level<$alarmno;$level++ ){ $val = $hash->{READINGS}{"level".$level}{VAL}; - if( ($val eq "disarmed")||($val eq "armed") ){ - $res.=' '.$level; + if( $val eq "disarmed" ){ + $res .= ' '.$level; + }elsif( $val eq "armed" ){ + $res .= ' '.$level.''; }else{ - $res.=' '.$level.''; + $res .= ' '.$level.''; } } $res.=''; @@ -270,10 +420,12 @@ sub Alarm_getstate($) { $res = ''; for( my $level=0;$level<$alarmno;$level++ ){ $val = $hash->{READINGS}{"level".$level}{VAL}; - if( ($val eq "disarmed")||($val eq "armed") ){ - $res.='
'; + if( $val eq "disarmed" ){ + $res .= ''; + }elsif( $val eq "armed" ){ + $res .= ''; }else{ - $res.=''; + $res .= ''; } } $res.='
'; @@ -282,6 +434,70 @@ sub Alarm_getstate($) { return $res; } +######################################################################################### +# +# Alarm_getsettings - Helper function to assemble the alarm settings for a device +# +# Parameter hash = hash of Alarm device +# dev = name of device addressed +# +######################################################################################### + +sub Alarm_getsettings($$$){ + + my ($hash,$dev,$type) = @_; + my $chg = 0; + my @aval = split('\|',AttrVal($dev, "alarmSettings","|||0:00")); + + if( $type eq "Actor"){ + #-- check delay time + if( !defined($aval[3]) || $aval[3] eq "" ){ + $aval[3] = ""; + $chg = 1; + }elsif( $aval[3] =~ /^\d+$/ ){ + $aval[3] = sprintf("00:%02d",$aval[3]); + $chg = 1; + }elsif( $aval[3] !~ /^(\d\d:)?\d\d:\d\d/ ){ + Log3 $hash, 1, "[Alarm] Delay time $aval[3] ill defined for alarmActor $dev"; + $aval[3] = ""; + $chg = 1; + } + #-- + if( int(@aval) != 4){ + Log3 $hash, 1, "[Alarm] Settings incomplete for alarmActor $dev"; + } + } + + if( $chg==1 ){ + CommandAttr(undef,$dev.'alarmSettings '.join('|',@aval)); + } + return @aval; +} + +######################################################################################### +# +# Alarm_Test - Test an actor +# +# Parameter name = name of the Alarm definition +# cmd = +# +######################################################################################### + +sub Alarm_Test($$){ + + my ($name,$cmd) = @_; + my $hash = $defs{$name}; + + $cmd =~ s/\$NAME/Gerät/g; + $cmd =~ s/\$EVENT/Event/g; + $cmd =~ s/\$SHORT/Kurznachricht/g; + #for( my $i=1;$i<= int(@evtpart);$i++){ + # $cmd =~ s/\$EVTPART$i/$evtpart[$i-1]/g; + #} + fhem($cmd); + +} + ######################################################################################### # # Alarm_Exec - Execute the Alarm @@ -395,8 +611,16 @@ sub Alarm_Exec($$$$$){ #Log3 $hash,1,"[Alarm] Killing delayed action $name"; CommandDelete(undef,"$mga"); } + #-- replace some parts + my @evtpart = split(" ",$evt); #-- calling actors BEFORE state update $cmd = AttrVal($name, "level".$level."offact", 0); + $cmd =~ s/\$NAME/$dev/g; + $cmd =~ s/\$EVENT/$evt/g; + $cmd =~ s/\$SHORT/$mga/g; + for( my $i=1;$i<= int(@evtpart);$i++){ + $cmd =~ s/\$EVTPART$i/$evtpart[$i-1]/g; + } fhem($cmd); $cmd = AttrVal($name, "cancelact", 0); fhem($cmd) @@ -632,29 +856,27 @@ sub Alarm_CreateNotifiers($){ foreach my $d (sort keys %defs ) { next if(IsIgnored($d)); if( AttrVal($d, "alarmDevice","") eq "Actor" ) { - my @aval = split('\|',AttrVal($d, "alarmSettings","")); + my @aval = Alarm_getsettings($hash,$d,"Actor"); if( int(@aval) != 4){ Log3 $hash, 5, "[Alarm $level] Settings incomplete for alarmActor $d"; next; } if( index($aval[0],"alarm".$level) != -1 ){ #-- activate without delay - if(( $aval[3] eq "0" )||($aval[3] eq "0:00")||($aval[3] eq "00:00")){ + if(( $aval[3] eq "" )||($aval[3] eq "00:00")){ $cmd .= $aval[1].';'; #-- activate with delay } else { $nonum++; my @tarr = split(':',$aval[3]); - if( int(@tarr) == 1){ - if( $aval[3] > 59 ){ - Log3 $hash,3,"[Alarm $level] Invalid delay specification for actor $d: $aval[3] > 59"; - $cmd = ''; - } else { - $cmd .= sprintf('define alarm%1ddly%1d at +00:00:%02d %s;',$level,$nonum,$aval[3],$aval[1]); - } - }elsif( int(@tarr) == 2){ - $cmd .= sprintf('define alarm%1ddly%1d at +00:%02d:%02d %s;',$level,$nonum,$tarr[0],$tarr[1],$aval[1]); - } + if( int(@tarr) == 2){ + $cmd .= sprintf('define alarm%1ddly%1d at +00:%02d:%02d %s;',$level,$nonum,$tarr[0],$tarr[1],$aval[1]); + }elsif( int(@tarr) == 3){ + $cmd .= sprintf('define alarm%1ddly%1d at +%02d:%02d:%02d %s;',$level,$nonum,$tarr[0],$tarr[1],$tarr[2],$aval[1]); + }else{ + Log3 $name,1,"[Alarm $level] Invalid delay specification for actor $d, skipped"; + $cmd .= $aval[1].';'; + } } $cmd2 .= $aval[2].';' if( $aval[2] ne '' ); @@ -712,6 +934,16 @@ sub Alarm_Html($) my $hash = $defs{$name}; my $id = $defs{$name}{NR}; + if( !defined($alarm_tt) ){ + #-- readjust language + my $lang = AttrVal("global","language","EN"); + if( $lang eq "DE"){ + $alarm_tt = \%alarm_transtable_DE; + }else{ + $alarm_tt = \%alarm_transtable_EN; + } + } + #-- readingsSingleUpdate( $hash, "state", Alarm_getstate($hash)." ".$hash->{READINGS}{"short"}{VAL}, 1 ); @@ -722,16 +954,16 @@ sub Alarm_Html($) #-- $ret .= "\n"; $ret .= "\n"; @@ -739,25 +971,26 @@ sub Alarm_Html($) #-- settings table my $row=1; - $ret .= ""; + $ret .= ""; $ret .= ""; #-- sensors table $row=1; - $ret .= ""; + $ret .= ""; $ret .= "
Settings
".$alarm_tt->{"settings"}."
\n"; $ret .= ""; - $ret .= "". - "\n"; + $ret .= "". + "\n"; for( my $k=0;$k<$alarmno;$k++ ){ $row++; my $sval = AttrVal($name, "level".$k."start", 0); @@ -771,21 +1004,22 @@ sub Alarm_Html($) if( $mval eq "1"); my $xval = AttrVal($name, "level".$k."xec", 0); - $ret .= sprintf("\n", ($row&1)?"odd":"even"); - $ret .= "". + $ret .= sprintf("\n", ($row&1)?"odd":"even"); + $ret .= "". ""; $ret .= sprintf("\n"; + "{"cancel"}."\" onclick=\"javascript:alarm_cancel('$name','$k')\"/>\n"; } $ret .= "
\n"; - $ret .= ""; - $ret .= ""; + $ret .= "\n"; - $ret .= "\n"; - $ret .="
Arm Button ↠ Wait Action "; + $ret .= "
".$alarm_tt->{"armbutton"}." ↠ ".$alarm_tt->{"waitaction"}." "; $ret .= sprintf("",(AttrVal($name, "armwait","") eq "1")?"":AttrVal($name, "armwait","")); - $ret .= " ↴ Delay
↲"; + $ret .= "
↴ ".$alarm_tt->{"delay"}."
↲"; $ret .= sprintf("",(AttrVal($name, "armdelay","0:00") eq "1")?"":AttrVal($name, "armdelay","0:00")); $ret .= "
Arm Action "; + $ret .= "
".$alarm_tt->{"armaction"}." "; $ret .= sprintf("",(AttrVal($name, "armact","") eq "1")?"":AttrVal($name, "armact","")); $ret .= "
Disarm Button ↠Disarm Action "; + $ret .="
".$alarm_tt->{"disarmbutton"}."↠".$alarm_tt->{"disarmaction"}." "; $ret .= sprintf("",(AttrVal($name, "disarmact","") eq "1")?"":AttrVal($name, "disarmact","")); - $ret .= "
Cancel Button ↠ Cancel Action "; + $ret .= "
".$alarm_tt->{"cancelbutton"}." ↠ ".$alarm_tt->{"cancelaction"}." "; $ret .= sprintf("",(AttrVal($name, "cancelact","") eq "1")?"":AttrVal($name, "cancelact","")); $ret .= "
LevelTime [hh:mm]Message Part IIArmed/Cancel
".$alarm_tt->{"level"}."".$alarm_tt->{"time"}." [hh:mm]
". + $alarm_tt->{"start"}."    ".$alarm_tt->{"end"}." 
".$alarm_tt->{"messagepart"}." II".$alarm_tt->{"arm"}."/".$alarm_tt->{"cancel"}."
Alarm $kStart  ". - "End 
".$alarm_tt->{"alarm"}." $k   ". + "",($xval eq "armed")?"checked=\"checked\"":""). - "
Sensors
".$alarm_tt->{"sensors"}."
\n"; - $ret .= "\n"; + $ret .= "\n"; foreach my $d (sort keys %defs ) { next if(IsIgnored($d)); if( AttrVal($d, "alarmDevice","") eq "Sensor" ) { @@ -795,16 +1029,16 @@ sub Alarm_Html($) } $row++; $ret .= sprintf("", ($row&1)?"odd":"even"); - $ret .= "\n"; + $ret .= "\n"; $ret .= "\n"; - $ret .= sprintf("\n"; + $ret .= sprintf("\n", + $ret .= sprintf(""; + $ret .= ""; $ret .= "\n"; @@ -854,7 +1094,11 @@ sub Alarm_Html($)

Alarm

FHEM module to set up a house alarm system with 8 different alarm levels

+ +

Usage

+ See German Wiki page +

Define

define <name> Alarm @@ -893,7 +1137,7 @@ sub Alarm_Html($) <string>
Room name for hidden alarm room (containing only the Alarm device), default: AlarmRoom -

  • attr <name> hiddenroom +
  • attr <name> publicroom <string>
    Room name for public alarm room (containing sensor/actor devices), default: Alarm
  • @@ -901,14 +1145,16 @@ sub Alarm_Html($) locked|unlocked
    locked means that alarm setups may not be changed, unlocked means that alarm setups may be changed> +
  • attr <name> testbutton 0|1 +
    1 means that a test button is displayed for every actor field
  • attr <name> statedisplay simple,color,table,none
    defines how the state of all eight alarm levels is shown. Example for the case - when only alarm no. 2 is raised:
      -
    • simple = OOXOOOOO
    • -
    • color = 0 1 +
    • simple = -OXOOOOO
    • +
    • color = 0 1 2 3 4 5 6 7
    • -
    • table = HTML mini table with green and red fields for alarms +
    • table = HTML mini table with lightgray, green and red fields for alarms
    • none = no state display
    @@ -939,6 +1185,7 @@ sub Alarm_Html($)

    Alarm

    +Deutsche Dokumentation im Wiki vorhanden, die englische Version gibt es hier: Alarm =end html_DE =cut diff --git a/fhem/FHEM/95_Astro.pm b/fhem/FHEM/95_Astro.pm index d70ca426d..6a2cf680e 100644 --- a/fhem/FHEM/95_Astro.pm +++ b/fhem/FHEM/95_Astro.pm @@ -48,7 +48,7 @@ my $deltaT = 65; # Correction time in s my %Astro; my %Date; -my $astroversion = 1.33; +my $astroversion = 1.35; #-- These we may get on request my %gets = ( @@ -1058,7 +1058,7 @@ sub Astro_Compute($){ $Astro{ObsLat} = $attr{"global"}{"latitude"}; }else{ $Astro{ObsLat} = 50.0; - Log3 $name,1,"[Astro] No latitude attribute set in global device, using 50.0°"; + Log3 $name,3,"[Astro] No latitude attribute set in global device, using 50.0°"; } if( defined($attr{$name}{"longitude"}) ){ $Astro{ObsLon} = $attr{$name}{"longitude"}; @@ -1066,7 +1066,7 @@ sub Astro_Compute($){ $Astro{ObsLon} = $attr{"global"}{"longitude"}; }else{ $Astro{ObsLon} = 10.0; - Log3 $name,1,"[Astro] No longitude attribute set in global device, using 10.0°"; + Log3 $name,3,"[Astro] No longitude attribute set in global device, using 10.0°"; } #-- altitude of observer in meters above WGS84 ellipsoid if( defined($attr{$name}{"altitude"}) ){ @@ -1075,14 +1075,14 @@ sub Astro_Compute($){ $Astro{ObsAlt} = $attr{"global"}{"altitude"}; }else{ $Astro{ObsAlt} = 0.0; - Log3 $name,1,"[Astro] No altitude attribute set in global device, using 0.0 m above sea level"; + Log3 $name,3,"[Astro] No altitude attribute set in global device, using 0.0 m above sea level"; } #-- custom horizon of observer in degrees if( defined($attr{$name}{"horizon"}) ){ $Astro{ObsHor} = $attr{$name}{"horizon"}; }else{ $Astro{ObsHor} = 0.0; - Log3 $name,1,"[Astro] No horizon attribute defined, using 0.0°"; + Log3 $name,5,"[Astro] No horizon attribute defined, using 0.0°"; } #-- internal variables converted to Radians and km @@ -1437,6 +1437,6 @@ sub Astro_Get($@) {

    Astro

    -Keine deutsche Dokumentation vorhanden, die englische Version gibt es hier: Astro +Absichtlich keine deutsche Dokumentation vorhanden, die englische Version gibt es hier: Astro =end html_DE =cut \ No newline at end of file diff --git a/fhem/FHEM/95_PostMe.pm b/fhem/FHEM/95_PostMe.pm index aba3b0d84..4c71952ae 100644 --- a/fhem/FHEM/95_PostMe.pm +++ b/fhem/FHEM/95_PostMe.pm @@ -43,7 +43,7 @@ use Time::Local; ######################### # Global variables -my $postmeversion = "2.03"; +my $postmeversion = "2.04"; my $FW_encoding = "UTF-8"; ######################################################################################### @@ -145,7 +145,7 @@ sub PostMe_Init($) { #-- current number of PostMes my $cnop = ReadingsVal($devname,"postmeCnt",0); - my @std = split(',',AttrVal("$devname","postmeStd",undef)); + my @std = split(',',AttrVal("$devname","postmeStd","")); for( my $i=0;$iDefines the PostMe system, <postit> is an arbitrary name for the system.

    Usage

    - See Wiki documentation + See German Wiki page
    An arbitrary number of lists may be added to the system with the create command.
    List items may consist of one or more words, and are added/removed by the add and @@ -1658,6 +1658,7 @@ sub PostMe_widget($) {

    PostMe

    +Deutsche Dokumentation im Wiki vorhanden, die englische Version gibt es hier: PostMe =end html_DE =cut diff --git a/fhem/FHEM/95_YAAHM.pm b/fhem/FHEM/95_YAAHM.pm index 4aeef0fd9..f8b0c5f7f 100644 --- a/fhem/FHEM/95_YAAHM.pm +++ b/fhem/FHEM/95_YAAHM.pm @@ -48,7 +48,7 @@ my $yaahmname; my $yaahmlinkname = "Profile"; # link text my $yaahmhiddenroom = "ProfileRoom"; # hidden room my $yaahmpublicroom = "Unsorted"; # public room -my $yaahmversion = "1.07"; +my $yaahmversion = "1.09"; my $firstcall=1; my %yaahm_transtable_EN = ( @@ -799,7 +799,7 @@ sub YAAHM_Get($@) { $res .= " }\n}\n"; return $res; } else { - return "Unknown argument $arg choose one of version template"; + return "Unknown argument $arg choose one of version:noArg template:noArg"; } } @@ -885,18 +885,22 @@ sub YAAHM_setParm($@) { $val = $a[3]; if( ($val eq "undef")||($val eq "") ){ $val = undef; - }elsif( $val !~ /\d?\d:\d\d/ ){ - $msg = "wrong time specification next=$val for weekly timer ".$a[1].", must be hh:mm"; - Log 1,"[YAAHM_setParm] ".$msg; - $val = "07:00"; - }else{ + }elsif( $val =~/^off/ ){ + #-- ok + }elsif( $val =~ /\d?\d:\d\d/ ){ + #-- ok my ($hour,$min) = split(':',$val); if( $hour>23 || $min>59 ){ $msg = "wrong time specification next=$val for weekly timer > 23:59".$a[1]; Log 1,"[YAAHM_setParm] ".$msg; - $val = "07:00"; + $val = "off"; } + }else{ + $msg = "wrong time specification next=$val for weekly timer ".$a[1].", must be hh:mm of 'off'"; + Log 1,"[YAAHM_setParm] ".$msg; + $val = "off"; } + $hash->{DATA}{"WT"}[$a[1]]{"next"} = $val; $hash->{DATA}{"WT"}[$a[1]]{"acti_m"} = $a[4]; $hash->{DATA}{"WT"}[$a[1]]{"acti_d"} = $a[5]; @@ -905,20 +909,20 @@ sub YAAHM_setParm($@) { $val = $a[$i+6]; if( ($val eq "undef")||($val eq "") ){ $val = undef; - }elsif( ($i<3) && ($val !~ /\d?\d:\d\d/)){ - $msg = "wrong time specification $val for weekly timer ".$a[1].", must be hh:mm"; - Log 1,"[YAAHM_setParm] ".$msg; - $val = "07:00"; }elsif( $val =~/^off/ ){ #-- ok - }else{ + }elsif( $val =~ /\d?\d:\d\d/ ){ #-- ok my ($hour,$min) = split(':',$val); if( $hour>23 || $min>59 ){ $msg = "wrong time specification $val for weekly timer > 23:59 ".$a[1]; Log 1,"[YAAHM_setParm] ".$msg; - $val = "07:00"; + $val = "off"; } + }else{ + $msg = "wrong time specification $val for weekly timer ".$a[1].", must be hh:mm or 'off'"; + Log 1,"[YAAHM_setParm] ".$msg; + $val = "off"; } $hash->{DATA}{"WT"}[$a[1]]{$weeklytable[$i]} = $val; } @@ -1011,14 +1015,16 @@ sub YAAHM_time { readingsBulkUpdate($hash,"tr_housephase",$yaahm_tt->{$targetphase}); readingsEndUpdate($hash,1); - #-- execute function not required by call from external timer + #-- helper function not executed, e.g. by call from external timer return if( !defined($exec) ); - #-- doit + #-- execute the helper function my $xval; my $ival; my $wupn; + + #-- todo here: what should we do, if the timer is NOT enabled and we get up or go to bed anyhow ??? if( $targettime eq "wakeup" ){ $wupn = $hash->{DATA}{"WT"}[0]{"name"}; $ival = (ReadingsVal($name.".wtimer_0.IF","mode","") ne "disabled"); @@ -1551,7 +1557,7 @@ sub YAAHM_setWeeklyTime($) { #-- now check if next time is already past my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time); my $lga = sprintf("%02d%02d",$hour,$min); - my $nga = $ng; + my $nga = (defined $ng)?$ng:""; $nga =~ s/://; #-- arbitrary today, next off @@ -2335,57 +2341,57 @@ sub YAAHM_timewidget($){ my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time); my $t_now = sprintf("%02d:%02d",$hour,$min); my $a_now = (60*$hour + $min)/1440 * 2 * pi; - my $x_now = -int(sin($a_now)*$radius*10)/10; - my $y_now = int(cos($a_now)*$radius*10)/10; + my $x_now = -int(sin($a_now)*$radius*100)/100; + my $y_now = int(cos($a_now)*$radius*100)/100; my $t_sunrise = defined($hash->{DATA}{"DD"}[0]{"sunrise"}) ? $hash->{DATA}{"DD"}[0]{"sunrise"} : "06:00"; $t_sunrise =~ s/^0//; ($hour,$min) = split(":",$t_sunrise); my $a_sunrise = (60*$hour + $min)/1440 * 2 * pi; - my $x_sunrise = -int(sin($a_sunrise)*$radius*10)/10; - my $y_sunrise = int(cos($a_sunrise)*$radius*10)/10; + my $x_sunrise = -int(sin($a_sunrise)*$radius*100)/100; + my $y_sunrise = int(cos($a_sunrise)*$radius*100)/100; my $t_morning = defined($hash->{DATA}{"DT"}{"morning"}[0]) ? $hash->{DATA}{"DT"}{"morning"}[0] : "08:00"; $t_morning =~ s/^0//; ($hour,$min) = split(":",$t_morning); my $a_morning = (60*$hour + $min)/1440 * 2 * pi; - my $x_morning = -int(sin($a_morning)*$radius*10)/10; - my $y_morning = int(cos($a_morning)*$radius*10)/10; + my $x_morning = -int(sin($a_morning)*$radius*100)/100; + my $y_morning = int(cos($a_morning)*$radius*100)/100; my $t_noon = defined($hash->{DATA}{"DT"}{"noon"}[0]) ? $hash->{DATA}{"DT"}{"noon"}[0] : "12:00"; $t_noon =~ s/^0//; ($hour,$min) = split(":",$t_noon); my $a_noon = (60*$hour + $min)/1440 * 2 * pi; - my $x_noon = -int(sin($a_noon)*$radius*10)/10; - my $y_noon = int(cos($a_noon)*$radius*10)/10; + my $x_noon = -int(sin($a_noon)*$radius*100)/100; + my $y_noon = int(cos($a_noon)*$radius*100)/100; my $t_afternoon = defined($hash->{DATA}{"DT"}{"afternoon"}[0]) ? $hash->{DATA}{"DT"}{"afternoon"}[0] : "14:00"; $t_afternoon =~ s/^0//; ($hour,$min) = split(":",$t_afternoon); my $a_afternoon = (60*$hour + $min)/1440 * 2 * pi; - my $x_afternoon = -int(sin($a_afternoon)*$radius*10)/10; - my $y_afternoon = int(cos($a_afternoon)*$radius*10)/10; + my $x_afternoon = -int(sin($a_afternoon)*$radius*100)/100; + my $y_afternoon = int(cos($a_afternoon)*$radius*100)/100; my $t_sunset = defined($hash->{DATA}{"DD"}[0]{"sunset"}) ? $hash->{DATA}{"DD"}[0]{"sunset"} : "18:00"; $t_sunset =~ s/^0//; ($hour,$min) = split(":",$t_sunset); my $a_sunset = (60*$hour + $min)/1440 * 2 * pi; - my $x_sunset = -int(sin($a_sunset)*$radius*10)/10; - my $y_sunset = int(cos($a_sunset)*$radius*10)/10; + my $x_sunset = -int(sin($a_sunset)*$radius*100)/100; + my $y_sunset = int(cos($a_sunset)*$radius*100)/100; my $t_evening = defined($hash->{DATA}{"DT"}{"evening"}[0]) ? $hash->{DATA}{"DT"}{"evening"}[0] : "19:00"; $t_evening =~ s/^0//; ($hour,$min) = split(":",$t_evening); my $a_evening = (60*$hour + $min)/1440 * 2 * pi; - my $x_evening = -int(sin($a_evening)*$radius*10)/10; - my $y_evening = int(cos($a_evening)*$radius*10)/10; + my $x_evening = -int(sin($a_evening)*$radius*100)/100; + my $y_evening = int(cos($a_evening)*$radius*100)/100; my $t_night = defined($hash->{DATA}{"DT"}{"night"}[0]) ? $hash->{DATA}{"DT"}{"night"}[0] : "22:00"; $t_night =~ s/^0//; ($hour,$min) = split(":",$t_night); my $a_night = (60*$hour + $min)/1440 * 2 * pi; - my $x_night = -int(sin($a_night)*$radius*10)/10; - my $y_night = int(cos($a_night)*$radius*10)/10; + my $x_night = -int(sin($a_night)*$radius*100)/100; + my $y_night = int(cos($a_night)*$radius*100)/100; FW_pO ''. sprintf('',int(-$x_noon/$radius*100),int(-$y_noon/$radius*100)). ''. @@ -2404,19 +2410,19 @@ sub YAAHM_timewidget($){ FW_pO ''; #-- daytime arc - FW_pO ' '; + FW_pO ' '; #-- sunset to sunrise sector - FW_pO ''; + FW_pO ''; #-- sunrise to morning sector - FW_pO ''; + FW_pO ''; #-- morning to evening sector - FW_pO ''; + FW_pO ''; #-- evening to sunset sector - FW_pO ''; + FW_pO ''; #-- midnight line FW_pO ''; @@ -2914,7 +2920,11 @@ sub YAAHM_Longtable($){

    YAAHM

    -

    Yet Another Auto Home Module to set up a cyclic processing of commands (daily, weekly, monthly, yearly profile). See German Wiki page at YAAHM

    +

    Yet Another Auto Home Module to set up a cyclic processing of commands (daily, weekly, monthly, yearly profile)

    + +

    Usage

    + See German Wiki page +

    Define

    @@ -3065,6 +3075,6 @@ sub YAAHM_Longtable($){

    YAAHM

    -Deutsche Dokumentation im Wiki vorhanden, die englische Version gibt es hier: YAAHM +Deutsche Dokumentation im Wiki vorhanden, die englische Version gibt es hier: YAAHM =end html_DE =cut
  • Notify to Alarm Level
    ".join("     ",(0..($alarmno-1)))."
    ". - "Notify on RegExp       Message Part IAction
    ".$alarm_tt->{"notifyto"}." ".$alarm_tt->{"alarm"}." ".$alarm_tt->{"level"}."
    ". + join("     ",(0..($alarmno-1)))."
    ". + $alarm_tt->{"notifyby"}." ".$alarm_tt->{"regexp"}."".$alarm_tt->{"messagepart"}." I".$alarm_tt->{"action"}."
    $d$d\n"; for( my $k=0;$k<$alarmno;$k++ ){ $ret .= sprintf(" ",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":""); } - $ret .= ""; - $ret .= ""; + $ret .= "
    Actors
    ".$alarm_tt->{"actors"}."
    \n"; - $ret .= "\n"; + $ret .= "\n"; foreach my $d (sort keys %defs ) { next if(IsIgnored($d)); if( AttrVal($d, "alarmDevice","") eq "Actor" ) { - my @aval = split('\|',AttrVal($d, "alarmSettings","|||0:00")); - if( int(@aval) != 4){ - Log3 $hash, 1, "[Alarm] Settings incomplete for alarmActor $d"; - @aval=("","","",""); - } + my @aval = Alarm_getsettings($hash,$d,"Actor"); $row++; $ret .= sprintf("", ($row&1)?"odd":"even"); - $ret .= "\n"; + $ret .= "\n"; $ret .= ""; - $ret .= "\n"; + $ret .= "\n"; } } $ret .= "
    Set by Alarm Level
    ".join("     ",(0..($alarmno-1))). - "
    Set Action". - "                  Unset ActionDelay
    ".$alarm_tt->{"setby"}." ".$alarm_tt->{"alarm"}." ".$alarm_tt->{"level"}."
    ".join("     ",(0..($alarmno-1))). + "
    ".$alarm_tt->{"setaction"}; + $ret .= "  (".$alarm_tt->{"testaction"}.")" + if( AttrVal($name,"testbutton",0) == 1); + $ret .= "".$alarm_tt->{"unsetaction"}; + $ret .= "  (".$alarm_tt->{"testaction"}.")" + if( AttrVal($name,"testbutton",0) == 1); + $ret .= "".$alarm_tt->{"delay"}."
    [hh:]mm:ss
    $d$d\n"; for( my $k=0;$k<$alarmno;$k++ ){ $ret .= sprintf(" ",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":""); } - $ret .= ""; - $ret .= "
    "; + $ret .= " " + if( AttrVal($name,"testbutton",0) == 1); + $ret .= ""; + $ret .= ""; + $ret .= " " + if( AttrVal($name,"testbutton",0) == 1); + $ret .= "